<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 智能機(jī)器人魚的設(shè)計(jì)

          智能機(jī)器人魚的設(shè)計(jì)

          作者: 時間:2024-04-10 來源:EEPW編譯 收藏

          該項(xiàng)目的主要目的是設(shè)計(jì)一種智能,通過檢測水中的有害污染物以及檢測水下管道的泄漏,可以有效對抗水污染。

          本文引用地址:http://www.ex-cimer.com/article/202404/457364.htm

          今天我們向您介紹一種能夠游泳并識別缸邊緣和障礙物的機(jī)器。我們將了解如何使用普通的絕緣材料和一些由  控制的伺服電機(jī)輕松創(chuàng)建它。

          機(jī)械部分

          對于魚體,我們使用普通的聚苯乙烯作為墻壁的絕緣材料。價(jià)格低廉,非常堅(jiān)固且重量輕:它易于漂浮且易于成型。大量。

          機(jī)器魚3

          為了使魚的游泳更加逼真,我們需要在軀干和尾鰭之間建立三個關(guān)節(jié)。作為執(zhí)行器,我們選擇了常見的建模伺服系統(tǒng):體積小,功能強(qiáng)大,易于微控制器控制。
          舵機(jī)是理想的選擇,因?yàn)橛辛怂鼈?,您可以管理連接魚所有部分的小軸的運(yùn)動,隨意改變位置,甚至幾度。
          魚體分為中央部分和三個部分,每個部分由伺服器移動。尾鰭由從超市商品包裝中回收的塑料制成。

          機(jī)器魚5

          鰭片的靈活性使您可以為運(yùn)動賦予更多真實(shí)感。為了獲得諧波運(yùn)動,每個零件都通過舵機(jī)連接到下一個零件:伺服機(jī)的主體應(yīng)粘在體段上,而伺服臂(連接到軸)應(yīng)粘在下一個體段上。

          機(jī)器魚6

          顯然,Robofish 需要一個系統(tǒng)來檢測障礙物,例如水箱邊緣。為了實(shí)現(xiàn)這一點(diǎn),我們使用了兩個具有數(shù)字輸出的夏普GP2Y0D805PCB紅外傳感器。這些組件可以檢測最遠(yuǎn) 5 厘米的物體,并且非常易于管理。一旦裝在塑料袋中,即可在水中操作。

          機(jī)器人魚10

          將傳感器放在前面,傾斜 45°,一個在左邊,一個在右邊。然后為控制、電池和傳感器騰出空間。
          魚的輪廓由您選擇。不要太擔(dān)心重量,因?yàn)樵谖覀兊脑椭?,我們增加?460 克的重量,以確保正確的浮動水平。

           

          電氣連接

          ROBOFISH2

          作為控制,我們選擇了 Seeedstudio 生產(chǎn)的兼容 的板,但任何 板都可以。四節(jié)簡單的 AA 電池將提供與伺服饋電兼容的電壓,而 Arduino 板則通過其內(nèi)部 5 伏穩(wěn)壓器獲得張力。
          由于很難使用傳統(tǒng)的開關(guān)(因?yàn)樗袞|西都被塑料覆蓋,所以無法處理它),因此我們使用了一個小的磁接觸,例如用于檢測窗戶打開的磁接觸。它由一個由小磁鐵激活的簧片觸點(diǎn)組成。將觸點(diǎn)放在的外邊緣,這樣通過接近磁鐵,您就可以激活電路。這解釋了視頻中看到的頭上的小凸起。
          當(dāng)然,機(jī)器魚會一直工作,直到磁鐵在他的頭上。聰明又便宜。

          固件

          // 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)椴季€既簡單又直接,草圖的實(shí)現(xiàn)也非常簡單。
          伺服運(yùn)動是重復(fù)的,并遵循精確的方案。我們提供了個性化幾個變量的功能,以便您可以測試不同類型的游泳。游泳是通過同步移動三個舵機(jī)來進(jìn)行的,根據(jù)類似于字母 s 的模式:每個部分相對于前一個部分略有異相變化。
          對于伺服運(yùn)動,我們使用了 servo.h 庫,該庫已在 Arduino IDE 上可用。您只需使用舵機(jī)聲明舵機(jī)和多點(diǎn)觸控對應(yīng)的輸出即可。連接(引腳)。servo.detach() 方法允許釋放舵機(jī)的輸出,最終將其用作 PWM 輸出。管理舵機(jī)運(yùn)動的命令有兩個。
          第一個是 ServoWriteMicroseconds,它允許您通過指定以微秒為單位的長度來設(shè)置伺服命令的位置。在這種情況下,該值應(yīng)介于 1,000 和 2,000 μs 之間。1500 的中點(diǎn)對應(yīng)于軸線的中立位置。第二個語句 Write 允許通過指定角度(以度為單位)進(jìn)行定位:角度的值必須在 0 到 180° 之間,90° 中間值對應(yīng)于舵機(jī)的中立位置。

          兩個sens_SX和sens_DX命名的傳感器分別連接到引腳 5 和 6 上。在主循環(huán)中,它們是一個 for 循環(huán),在由變量速度定義的總時間內(nèi),以固定的間隔從 0 循環(huán)到 360 遞增 i 變量。
          i 變量的值與相位變量的值一起決定了伺服電機(jī)的位置。該值是指一個完整的 360° 環(huán)路,然后必須進(jìn)行偏移,同時牢記舵機(jī)的中立位置、潛在位移和您希望賦予運(yùn)動的最大偏轉(zhuǎn)。
          后者由變量 maxDeflexion(十進(jìn)制度)定義,并定義每個行程的最大偏轉(zhuǎn):該值越高,魚的三個樹干的運(yùn)動就越寬。

          機(jī)器魚9

          當(dāng)相位設(shè)置為 0 郵件時,所有舵機(jī)都將移動;增加該值會在伺服位置之間引入相移。結(jié)果,您將得到一個類似于字母 S 的運(yùn)動,越明顯,相位值越大。

          機(jī)器魚8

          當(dāng)檢測到障礙物時,舵機(jī)的中立位置在障礙物的另一側(cè)逐漸移動。這樣,魚將描述遠(yuǎn)離障礙物的圓弧。
          弧度可以通過 maxDefobs 變量進(jìn)行控制:該值越高,游泳線曲率就越大。當(dāng)不再檢測到障礙物時(使用 lostTime 控制時間),伺服運(yùn)動恢復(fù)正常。每個伺服 PIN 的范圍介于 -maxDeflexion 和 + maxDeflexion 之間,而如果檢測到障礙物,則介于 -maxDeflexion + maxDefobs 和 maxDeflexion + maxDefobs 的值之間。

          測試:

          在將機(jī)器人測試到水中之前,您必須仔細(xì)檢查每個機(jī)械和電氣連接。打開魚并控制運(yùn)動,并確保兩個傳感器都向Arduino提供信號。使用萬用表測量其輸出端的電壓:在沒有障礙物的情況下,信號應(yīng)為高電平。檢查電壓供應(yīng)不是一個壞主意:確保至少為 5.5 V。

          在這一點(diǎn)上,我們準(zhǔn)備對機(jī)器人進(jìn)行防水:有很多解決方案,我們用塑料袋介紹了機(jī)器人(在里面呼吸,看看它是否有孔,并用膠帶密封)。使用橡皮筋將袋子靠近機(jī)器人的身體,并確保舵機(jī)可以自由移動。
          游泳將在地表水中進(jìn)行:您可能需要用足夠的賴特來壓住機(jī)器人的重量,以使其保持在正確的高度。如上所述,在我們的原型中,我們添加了 460 克。一旦機(jī)器人以正確的方式漂浮,你就可以通過放置小磁鐵來打開它,讓他在數(shù)字自由中蜿蜒游泳。



          關(guān)鍵詞: 機(jī)器人 Arduino

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();