您無聊嗎?還可以建造一個激光炮塔。您知道嗎?一個會 pew pew 發(fā)射,向許多不同方向發(fā)射紅光的光束,甚至可能會扔進煙霧機嗎?是的,其中之一。
您需要什么
2個伺服器
激光模塊,例如該傳感器套件
壓電蜂鳴器或其他小型輸出設備
用于固定
長母-公跳線以及常規(guī)跳線的金屬電纜扎帶
可選地,需要一臺煙霧機–激光的功率非常低,因此即使在黑暗的房間中也無法看到無煙的光束。
構建計劃
轉塔的基本思想是將激光模塊放在一個伺服器的頂部以提供水平旋轉。然后將該封裝安裝到另一個呈90度角放置的伺服器上,以提供垂直移動。我們有一個壓電揚聲器來提供 pew pew 聲音效果,我正在扔煙機以達到良好的效果。
伺服測試
視您的伺服器而定,導線的顏色可能會有所不同,但是通常:
紅色是正極線,在我的兩個伺服器上,它都是三芯線的中心-連接到+ 5v
棕色或黑色是負極,要連接到Arduino的GND。
白色或橙色是信號線,要連接到具有PWM功能的數(shù)字I/O針(在下面的演示中為9和10)。
連接好兩個伺服器后,請上傳以下示例代碼。我已經(jīng)命名了一個伺服“ hori”來控制水平運動,另一個命名為“ vert”。每個人都應執(zhí)行全方位的運動掃描(在我的情況下約為60度)。
#include
Servo vert,hori; // create servo object to control a servo
// a maximum of eight servo objects can be created
int pos = 0; // variable to store the servo position
void setup()
{
hori.attach(9);
vert.attach(10); // attaches the servo on pin 9,10 to the servo objects
vert.write(0);
hori.write(0);
}
void loop()
{
for(pos = 0; pos 《 180; pos += 10) // goes from 0 degrees to 180 degrees
{ // in steps of 10 degrees
vert.write(pos);
hori.write(pos); // tell servo to go to position in variable ‘pos’
delay(100); // waits 100ms for the servo to reach the position
}
for(pos = 180; pos》=1; pos-=10) // goes back from 180 degrees to 0 degrees
{
vert.write(pos); // tell servo to go to position in variable ‘pos’
hori.write(pos);
delay(100); // waits 100ms for the servo to reach the position
}
}
一切都好嗎?然后繼續(xù)前進。
測試激光和 Pew Pew 聲音
激光模塊就像一個LED,但是模塊中內(nèi)置了一個電阻器。因此我們可以將其直接連接到數(shù)字I/O-非常簡單。如果您使用的激光模塊與我相同,則“ – ”將進入 GND , S 將進入引腳12。上面的示例代碼使第12針成為輸出:
int laser = 12;
pinMode(laser,OUTPUT);
然后使用標準的 digitalWrite()方法在每個循環(huán)中使該引腳閃爍,每次循環(huán)閃爍。
我們將僅使用PWM以舒適的聲音水平驅動壓電蜂鳴器-如果需要,您可以嘗試使用音調(diào)庫,但是我只需要一個簡單的噪音即可。將黑線接地,將紅線連接到引腳11。在相關引腳上定義您的蜂鳴器,設置為輸出模式,然后使用 analogWrite(buzzer,100)進行激活(或您想要的最多254個數(shù)字);和 analogWrite(buzzer,0)(關閉模擬音頻)。
完整的示例代碼已修改為掃描兩個伺服,激活激光并播放令人討厭的聲音。
您的所有組件都應該正常工作-現(xiàn)在我們需要將所有組件綁在一起。
創(chuàng)建轉塔
使用電纜扎帶,將一個伺服器連接到另一個;哪一個都沒關系,只需確保其中一個在水平方向上移動而另一個在垂直方向上移動即可。如果角度不正確,您可以在測試期間拔下轉子葉片并重新安裝。
使用一些堅固的造型線來固定激光器
最后,我將整個設備連接到帶有更多電纜扎帶的桌腿上一點廢木頭。
對炮塔編程
我不認識你,但是我的想法是激光炮塔來自無數(shù)的科幻電影和《星際迷航》劇集。總是有人會飛越炮塔,而 pew-pew 的小射門會以掃掠的模式飛出,總是太慢了幾毫秒,所以我們的主角實際上并沒有受到打擊。這就是我要復制的內(nèi)容,盡管可以隨意調(diào)整主例程以適合您對轉塔應該做什么的想法。
這是我最終在主循環(huán)中使用的偽代碼:
隨機化脈沖之間的時間,以及每次射擊之間的時間。
隨機化每個伺服,垂直和水平方向的開始和結束位置。
隨機化拍攝數(shù)量。
計算出每次拍攝后的變化程度,以開始和結束位置之間的差除以拍攝數(shù)量。
將伺服器移至開始位置,并稍等一會兒到達目的地(100毫秒)
循環(huán),直到拍攝完所有鏡頭為止,每次按先前計算的方式稍微移動伺服器;
重復。
我還添加了一個單獨的 fire()方法來稍微構建代碼更好。調(diào)整所有 random()函數(shù)的范圍,以加快或減慢每個參數(shù);或增加鏡頭數(shù)量以增加舞蹈俱樂部的氛圍。向下滾動以查看操作中的代碼的視頻!
#include
Servo vert,hori; // create servo object to control a servo
int pos = 0; // variable to store the servo position
int laser = 12;
int buzzer = 11;
void setup()
{
hori.attach(9);
vert.attach(10); // attaches the servo on pin 9 to the servo object
pinMode(laser,OUTPUT);
pinMode(buzzer,OUTPUT);
}
void loop()
{
int timeBetweenBursts = random(200,1000);
int timeBetweenShots = random(50,200);
int vertStart = random(1,180);
int vertEnd = random(1,180);
int horiStart = random(1,180);
int horiEnd = random(1,180);
int numShots = random(5,20);
int vertChange = (vertEnd - vertStart) / numShots; //how much to move vertical axis by each shot
int horiChange = (horiEnd - horiStart) / numShots;
vert.write(vertStart);//let it get to start position first, wait a little
hori.write(horiStart);
delay(100);
for(int shot = 0; shot vert.write(vertStart);
hori.write(horiStart);
vertStart += vertChange;//increment the vert value for next time
horiStart += horiChange;
fire();
delay(timeBetweenShots); //add a bit of variety to the speed of shots
}
delay(timeBetweenBursts);
}
void fire(){
digitalWrite(laser,HIGH);
analogWrite(buzzer,100);
delay(20);//adjust this to change length of turret shot
digitalWrite(laser,LOW);
analogWrite(buzzer, 0);
}
操作中
我認為這個小玩具沒有實際用途,但這確實很有趣,而且您可以調(diào)整很多變量以獲得理想的效果。也許對于自制樂高電影會派上用場嗎?
責任編輯:wv
-
激光
+關注
關注
19文章
3213瀏覽量
64566 -
Arduino
+關注
關注
188文章
6471瀏覽量
187293
發(fā)布評論請先 登錄
相關推薦
評論