智能機(jī)器人魚(yú)的設(shè)計(jì)
該項(xiàng)目的主要目的是設(shè)計(jì)一種智能魚(yú)類(lèi)機(jī)器人,通過(guò)檢測(cè)水中的有害污染物以及檢測(cè)水下管道的泄漏,可以有效對(duì)抗水污染。
本文引用地址:http://2s4d.com/article/202404/457364.htm今天我們向您介紹一種能夠游泳并識(shí)別魚(yú)缸邊緣和障礙物的機(jī)器魚(yú)。我們將了解如何使用普通的絕緣材料和一些由 Arduino 控制的伺服電機(jī)輕松創(chuàng)建它。
機(jī)械部分
對(duì)于魚(yú)體,我們使用普通的聚苯乙烯作為墻壁的絕緣材料。價(jià)格低廉,非常堅(jiān)固且重量輕:它易于漂浮且易于成型。大量。
為了使魚(yú)的游泳更加逼真,我們需要在軀干和尾鰭之間建立三個(gè)關(guān)節(jié)。作為執(zhí)行器,我們選擇了常見(jiàn)的建模伺服系統(tǒng):體積小,功能強(qiáng)大,易于微控制器控制。
舵機(jī)是理想的選擇,因?yàn)橛辛怂鼈儯梢怨芾磉B接魚(yú)所有部分的小軸的運(yùn)動(dòng),隨意改變位置,甚至幾度。
魚(yú)體分為中央部分和三個(gè)部分,每個(gè)部分由伺服器移動(dòng)。尾鰭由從超市商品包裝中回收的塑料制成。
鰭片的靈活性使您可以為運(yùn)動(dòng)賦予更多真實(shí)感。為了獲得諧波運(yùn)動(dòng),每個(gè)零件都通過(guò)舵機(jī)連接到下一個(gè)零件:伺服機(jī)的主體應(yīng)粘在體段上,而伺服臂(連接到軸)應(yīng)粘在下一個(gè)體段上。
顯然,Robofish 需要一個(gè)系統(tǒng)來(lái)檢測(cè)障礙物,例如水箱邊緣。為了實(shí)現(xiàn)這一點(diǎn),我們使用了兩個(gè)具有數(shù)字輸出的夏普GP2Y0D805PCB紅外傳感器。這些組件可以檢測(cè)最遠(yuǎn) 5 厘米的物體,并且非常易于管理。一旦裝在塑料袋中,即可在水中操作。
將傳感器放在前面,傾斜 45°,一個(gè)在左邊,一個(gè)在右邊。然后為控制、電池和傳感器騰出空間。
魚(yú)的輪廓由您選擇。不要太擔(dān)心重量,因?yàn)樵谖覀兊脑椭?,我們?cè)黾恿?460 克的重量,以確保正確的浮動(dòng)水平。
電氣連接
作為控制,我們選擇了 Seeedstudio 生產(chǎn)的兼容 Arduino 的板,但任何 Arduino 板都可以。四節(jié)簡(jiǎn)單的 AA 電池將提供與伺服饋電兼容的電壓,而 Arduino 板則通過(guò)其內(nèi)部 5 伏穩(wěn)壓器獲得張力。
由于很難使用傳統(tǒng)的開(kāi)關(guān)(因?yàn)樗袞|西都被塑料覆蓋,所以無(wú)法處理它),因此我們使用了一個(gè)小的磁接觸,例如用于檢測(cè)窗戶(hù)打開(kāi)的磁接觸。它由一個(gè)由小磁鐵激活的簧片觸點(diǎn)組成。將觸點(diǎn)放在機(jī)器人的外邊緣,這樣通過(guò)接近磁鐵,您就可以激活電路。這解釋了視頻中看到的機(jī)器人頭上的小凸起。
當(dāng)然,機(jī)器魚(yú)會(huì)一直工作,直到磁鐵在他的頭上。聰明又便宜。
固件
// ROBOFISH
// di Segatello Mirco
#include <Servo.h>
Servo Servo1, Servo2, Servo3; // create servo object to control a servo
int i, time, obstacle;
int pos1, pos2, pos3;
int pos1R, pos2R, pos3R;
int phase=45;
int velocity=2000;
int maxDeflexion=20;
int maxDefobs=20;
int actualTime;
float shift;
const int center1=98;
const int center2=90;
const int center3=105;
const int sens_SX=5;
const int sens_DX=6;
const int lostTime=3000;
void setup()
{
Servo1.attach(4);
Servo2.attach(3);
Servo3.attach(2);
pinMode(sens_SX, INPUT);
pinMode(sens_DX, INPUT);
pinMode(13, OUTPUT);
time=velocity/360;
shift=0;
}
void loop()
{
for (i=0; i<360; i++) {
pos1 = i+2*phase;
pos2 = i+phase;
pos3 = i;
if (pos1>359) pos1-=360;
if (pos2>359) pos2-=360;
if (pos3>359) pos3-=360;
if (pos1>179) pos1=360-pos1;
if (pos2>179) pos2=360-pos2;
if (pos3>179) pos3=360-pos3;
pos1R=map(pos1,0,180,center1-maxDeflexion-obstacle,center1+maxDeflexion-obstacle);
pos2R=map(pos2,0,180,center2-maxDeflexion-obstacle,center2+maxDeflexion-obstacle);
pos3R=map(pos3,0,180,center3-maxDeflexion-obstacle,center3+maxDeflexion-obstacle);
Servo1.write(pos1R);
Servo2.write(pos2R);
Servo3.write(pos3R);
delay(time);
obstacle=int(shift);
if (digitalRead(sens_DX)==0) {
if (obstacle<maxDefobs) shift=shift+0.05;
actualTime=millis();
}
if (digitalRead(sens_SX)==0) {
if (obstacle > (-maxDefobs)) shift=shift-0.05;
actualTime=millis();
}
if (digitalRead(sens_SX)==1 && digitalRead(sens_SX)==1 && obstacle!=0)
if (millis()>actualTime+lostTime) {
if (shift>0) shift=shift-0.05;
if (shift<0) shift=shift+0.05;
}
}
}
使用Arduino更容易,因?yàn)椴季€既簡(jiǎn)單又直接,草圖的實(shí)現(xiàn)也非常簡(jiǎn)單。
伺服運(yùn)動(dòng)是重復(fù)的,并遵循精確的方案。我們提供了個(gè)性化幾個(gè)變量的功能,以便您可以測(cè)試不同類(lèi)型的游泳。游泳是通過(guò)同步移動(dòng)三個(gè)舵機(jī)來(lái)進(jìn)行的,根據(jù)類(lèi)似于字母 s 的模式:每個(gè)部分相對(duì)于前一個(gè)部分略有異相變化。
對(duì)于伺服運(yùn)動(dòng),我們使用了 servo.h 庫(kù),該庫(kù)已在 Arduino IDE 上可用。您只需使用舵機(jī)聲明舵機(jī)和多點(diǎn)觸控對(duì)應(yīng)的輸出即可。連接(引腳)。servo.detach() 方法允許釋放舵機(jī)的輸出,最終將其用作 PWM 輸出。管理舵機(jī)運(yùn)動(dòng)的命令有兩個(gè)。
第一個(gè)是 ServoWriteMicroseconds,它允許您通過(guò)指定以微秒為單位的長(zhǎng)度來(lái)設(shè)置伺服命令的位置。在這種情況下,該值應(yīng)介于 1,000 和 2,000 μs 之間。1500 的中點(diǎn)對(duì)應(yīng)于軸線的中立位置。第二個(gè)語(yǔ)句 Write 允許通過(guò)指定角度(以度為單位)進(jìn)行定位:角度的值必須在 0 到 180° 之間,90° 中間值對(duì)應(yīng)于舵機(jī)的中立位置。
兩個(gè)sens_SX和sens_DX命名的傳感器分別連接到引腳 5 和 6 上。在主循環(huán)中,它們是一個(gè) for 循環(huán),在由變量速度定義的總時(shí)間內(nèi),以固定的間隔從 0 循環(huán)到 360 遞增 i 變量。
i 變量的值與相位變量的值一起決定了伺服電機(jī)的位置。該值是指一個(gè)完整的 360° 環(huán)路,然后必須進(jìn)行偏移,同時(shí)牢記舵機(jī)的中立位置、潛在位移和您希望賦予運(yùn)動(dòng)的最大偏轉(zhuǎn)。
后者由變量 maxDeflexion(十進(jìn)制度)定義,并定義每個(gè)行程的最大偏轉(zhuǎn):該值越高,魚(yú)的三個(gè)樹(shù)干的運(yùn)動(dòng)就越寬。
當(dāng)相位設(shè)置為 0 郵件時(shí),所有舵機(jī)都將移動(dòng);增加該值會(huì)在伺服位置之間引入相移。結(jié)果,您將得到一個(gè)類(lèi)似于字母 S 的運(yùn)動(dòng),越明顯,相位值越大。
當(dāng)檢測(cè)到障礙物時(shí),舵機(jī)的中立位置在障礙物的另一側(cè)逐漸移動(dòng)。這樣,魚(yú)將描述遠(yuǎn)離障礙物的圓弧。
弧度可以通過(guò) maxDefobs 變量進(jìn)行控制:該值越高,游泳線曲率就越大。當(dāng)不再檢測(cè)到障礙物時(shí)(使用 lostTime 控制時(shí)間),伺服運(yùn)動(dòng)恢復(fù)正常。每個(gè)伺服 PIN 的范圍介于 -maxDeflexion 和 + maxDeflexion 之間,而如果檢測(cè)到障礙物,則介于 -maxDeflexion + maxDefobs 和 maxDeflexion + maxDefobs 的值之間。
測(cè)試:
在將機(jī)器人測(cè)試到水中之前,您必須仔細(xì)檢查每個(gè)機(jī)械和電氣連接。打開(kāi)魚(yú)并控制運(yùn)動(dòng),并確保兩個(gè)傳感器都向Arduino提供信號(hào)。使用萬(wàn)用表測(cè)量其輸出端的電壓:在沒(méi)有障礙物的情況下,信號(hào)應(yīng)為高電平。檢查電壓供應(yīng)不是一個(gè)壞主意:確保至少為 5.5 V。
在這一點(diǎn)上,我們準(zhǔn)備對(duì)機(jī)器人進(jìn)行防水:有很多解決方案,我們用塑料袋介紹了機(jī)器人(在里面呼吸,看看它是否有孔,并用膠帶密封)。使用橡皮筋將袋子靠近機(jī)器人的身體,并確保舵機(jī)可以自由移動(dòng)。
游泳將在地表水中進(jìn)行:您可能需要用足夠的賴(lài)特來(lái)壓住機(jī)器人的重量,以使其保持在正確的高度。如上所述,在我們的原型中,我們添加了 460 克。一旦機(jī)器人以正確的方式漂浮,你就可以通過(guò)放置小磁鐵來(lái)打開(kāi)它,讓他在數(shù)字自由中蜿蜒游泳。
評(píng)論