找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 15060|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

基于Arduino開源環(huán)境自制小型遙控氣墊船制作

  [復(fù)制鏈接]
回帖獎勵(lì) 1 黑幣 回復(fù)本帖可獲得 1 黑幣獎勵(lì)! 每人限 1 次
跳轉(zhuǎn)到指定樓層
樓主
前幾個(gè)月制作了一款基于Arduino的最小板,上面集成了一些功能,經(jīng)過了幾次的迭代后終于達(dá)到了我想要的效果,緊接著又為這款電路板制作了一個(gè)配套的遙控器,用來操控這塊板子上的一些功能,例如電機(jī)驅(qū)動以及控制一些IO口之類的。這兩個(gè)項(xiàng)目制作過程都可以從如下的鏈接找到:mc.dfrobot點(diǎn)com點(diǎn)cn/thread-273103-1-1.html
http://mc.dfrobot點(diǎn)com點(diǎn)cn/thread-272722-1-1.html
當(dāng)時(shí)調(diào)試完成之后一直就放著落灰了,進(jìn)來準(zhǔn)備使用這套板子來制作一些項(xiàng)目,結(jié)合了板子的資源之后,就選擇了氣墊船的項(xiàng)目,準(zhǔn)備用我設(shè)計(jì)的這套板子制作一個(gè)遙控氣墊船。
首先話不多說,上完成品照片:




接下來我就會帶來整個(gè)氣墊船的開發(fā),制作過程。

靈感來源
首先我端詳了我做的這款板子,上面有三個(gè)L9110s電機(jī)驅(qū)動芯片,以及一個(gè)支持1-2s的鋰電池接口,一個(gè)支持NRF24L01的接口以及報(bào)警電路。對于這個(gè)L9110s驅(qū)動,我使用了幾乎arduino的全部支持硬件PWM的管腳,其中有兩個(gè)驅(qū)動芯片是支持正反轉(zhuǎn)PWM調(diào)速的,有一個(gè)驅(qū)動苦于arduino的PWM管腳不夠,所以只能支持單向PWM調(diào)速,顯然這樣的配置對于一些小車的項(xiàng)目肯定是綽綽有余,而這也是我設(shè)計(jì)這塊板子的設(shè)計(jì)初衷,對于一些車船類的項(xiàng)目,這款板子可以完全適應(yīng)。



所以選擇來選擇去,還是選擇了車船類的項(xiàng)目。但是我對于車船類的項(xiàng)目感覺玩不什么花樣,偶然間在網(wǎng)上看到別人3D打印的氣墊船項(xiàng)目,就動心了。

想法到圖紙

之前玩過一段時(shí)間的航模,所以最開始想用空模的那一套東西來做,用無刷電機(jī)帶動扇葉轉(zhuǎn)動,然后電調(diào)可以用arduino輸出的PWM波來控制,剛好家里也有3D打印機(jī)。但是接著我就發(fā)現(xiàn)那我為啥不用arduino nano板來做,因?yàn)檫@么做的話貌似我板子上的功能一個(gè)都沒用到,簡直就是浪費(fèi)資源,遂放棄。。。。。。

有一天玩那種空心杯的四軸時(shí)候,看到四軸的電機(jī)體格雖然很小,但是力道卻很足,于是想用這個(gè)電機(jī)來做動力,剛好板子上的驅(qū)動芯片應(yīng)該能帶的動。于是上某寶搜索,對比了很多不同型號的空心杯電機(jī)之后,選擇了720電機(jī),店家還給配了螺旋槳,直徑差不多55mm。數(shù)天之后,電機(jī)到貨了,拆開上電之后,感覺風(fēng)還挺大,比得上一個(gè)小電扇了,于是確定了這個(gè)動力系統(tǒng)。720電機(jī)配55mm螺旋槳。



動力總算是確定了,接下來就是結(jié)構(gòu)的問題,在開始繪制圖紙之前,有個(gè)很重要的問題要解決——?dú)鈮|船的轉(zhuǎn)向方式?
于是上百度上查詢氣墊船的圖片,發(fā)現(xiàn)大概分為兩類,一類是使用單個(gè)風(fēng)扇作為推進(jìn),扇葉后方有可動的導(dǎo)流板來控制方向,就是類似船的舵一樣,我開始準(zhǔn)備用這種的,因?yàn)橹恍枰粋(gè)電機(jī),感覺比較省電。但是后來查看了詳細(xì)的結(jié)構(gòu)之后還是放棄了,結(jié)果比較復(fù)雜,實(shí)行起來比較麻煩。另外一類是使用兩個(gè)或者四個(gè)風(fēng)扇作為推進(jìn),使用兩側(cè)風(fēng)扇的速度差來控制船體的方向,這種結(jié)構(gòu)比較簡單,而且兩測風(fēng)扇我還可以使用兩個(gè)支持正反轉(zhuǎn)PWM調(diào)速的驅(qū)動芯片來驅(qū)動,達(dá)到速度差調(diào)速的目的。

終于是確定了使用的動力以及轉(zhuǎn)向方式,下面就是埋頭畫圖紙了。作為CAD小白,我學(xué)習(xí)了幾節(jié)課程之后終于是能勉強(qiáng)畫圖了。下面是畫好的圖紙,一共有四頁,使用的軟件是迅捷的CAD。



整個(gè)機(jī)身一共有四個(gè)電機(jī),兩個(gè)負(fù)責(zé)推進(jìn)兩個(gè)負(fù)責(zé)起升,這樣剛好用光了我設(shè)計(jì)板子上面所有的電機(jī)接口,后續(xù)還想加什么功能的話也有多余的端口來使用。
畫好之后,我想能夠在電腦上先模擬一下完成之后的樣子就好了,于是沒有建過模的我又去學(xué)了建模,將CAD中畫好的圖片導(dǎo)入到建模軟件之后,經(jīng)過簡單的拉伸操作就得到了大致完成的樣子,我用的建模軟件是犀牛,剛剛學(xué)習(xí),只會簡單的幾個(gè)操作,請各位看官輕拍。



終于是完成了圖紙的設(shè)計(jì)了,導(dǎo)入到建模軟件的效果也還滿意,于是準(zhǔn)備下一步的切割了。

圖紙到實(shí)物
我在某寶上找了個(gè)加工KT板的廠家,將圖紙發(fā)過去了。之前確實(shí)考慮過使用木板,但是輕木太軟,桐木太脆,椴木太重,權(quán)衡下來還是切kt板,因?yàn)橹巴婧侥4_實(shí)很多飛機(jī)都是用KT板做的,很結(jié)實(shí)也很輕。
等待了幾天之后,切割好的kt板送到了,查看了一下,沒有問題,由于切割KT板的時(shí)候切割機(jī)會燒灼KT板的邊緣導(dǎo)致一些尺寸會對不上,幸好我在設(shè)計(jì)圖紙的時(shí)候預(yù)留了一些余量,這點(diǎn)也提醒大家注意。

隨后急忙的組裝了起來,這時(shí)候門鈴響了,原來是買的電機(jī)到貨了。正好趕上組裝,于是迅速的安裝上了電機(jī),成品如下:

下面就是安裝我設(shè)計(jì)的電路板了,設(shè)計(jì)圖紙時(shí)給氣墊船設(shè)計(jì)了一個(gè)設(shè)備艙,正好可以容納電路板。

電路板裝進(jìn)去,將電機(jī)插頭插到板子上,到這里所有的結(jié)構(gòu)搭建以及硬件電路都連接好了,下面就是給氣墊船注入靈魂——編寫代碼了!

程序的編寫

其實(shí)控制程序非常簡單,首先說接受端,其實(shí)就是將無線模塊接收到的數(shù)據(jù)轉(zhuǎn)換成對應(yīng)引腳輸出的PWM占空比來控制電機(jī)的轉(zhuǎn)速。于是一段時(shí)間過后,我編好了接受端的代碼。
  1. //接收端程序
  2.   
  3. #include <SPI.h>
  4. #include <Mirf.h>
  5. #include <nRF24L01.h>
  6. #include <MirfHardwareSpiDriver.h>
  7.   
  8. unsigned int value;
  9. unsigned int CH1,CH3,left,right,qi;
  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   Mirf.spi = &MirfHardwareSpi;
  14.   Mirf.init();
  15.   
  16.   Mirf.setRADDR((byte *)"FGHIJ"); //設(shè)置自己的地址(接收端地址),使用5個(gè)字符
  17.   Mirf.payload = sizeof(value);   
  18.   Mirf.channel = 90;   //設(shè)置使用的信道
  19.   Mirf.config();
  20.   Serial.println("Listening...");  //開始監(jiān)聽接收到的數(shù)據(jù)

  21.   pinMode(10,OUTPUT);
  22.   pinMode(5,OUTPUT);
  23.   pinMode(6,OUTPUT);
  24.   pinMode(3,OUTPUT);
  25.   pinMode(9,OUTPUT);
  26.   digitalWrite(5,0);
  27.   digitalWrite(6,0);
  28.   digitalWrite(9,0);
  29.   digitalWrite(3,0);
  30.   digitalWrite(10,0);
  31. }
  32.   
  33. void loop()
  34. {
  35.   if(Mirf.dataReady()) {  //當(dāng)接收到程序,便從串口輸出接收到的數(shù)據(jù)
  36.     Mirf.getData((byte *) &value);

  37.     CH3=(unsigned int)value&255;
  38.     CH1=(unsigned int)value>>8;
  39.      

  40.     if(CH1>140)
  41.     {
  42.        qi=CH1;
  43.        if(CH3>135)       //左轉(zhuǎn)彎
  44.        {
  45.          right=CH1;
  46.          
  47.          if(CH1<CH3)     
  48.            left=0;
  49.          else
  50.            left=CH1-CH3/3.5;
  51.        }
  52.        else if(CH3<120)    //右轉(zhuǎn)彎
  53.        {
  54.          if(CH1<(255-CH3))
  55.            right=0;
  56.          else
  57.            right=CH1-((255-CH3)/3.5);
  58.             
  59.          left=CH1;
  60.        }
  61.        else
  62.        {
  63.          right=CH1;
  64.          left=CH1;
  65.        }
  66.     }
  67.     else
  68.     {
  69.       left=0;
  70.       right=0;
  71.       qi=0;
  72.     }
  73.      
  74.     analogWrite(3,left);
  75.     analogWrite(9,right);
  76.     analogWrite(10,qi);

  77.     Serial.print("Got data: ");
  78.     Serial.print(CH1);
  79.     Serial.print(" ");
  80.     Serial.print(CH3);
  81.     Serial.print(" ");
  82.     Serial.print(left);
  83.     Serial.print(" ");
  84.     Serial.println(right);
  85.   }
  86. }
復(fù)制代碼

發(fā)送端也是很簡單,我使用搖桿作為控制桿,用arduino的ADC引腳讀取搖桿輸出的電壓來獲得當(dāng)前的搖桿位置,然后將搖桿位置的數(shù)據(jù)通過無線模塊發(fā)送出去。
  1. //發(fā)射端程序
  2.   
  3. #include <SPI.h>
  4. #include <Mirf.h>
  5. #include <nRF24L01.h>
  6. #include <MirfHardwareSpiDriver.h>
  7.   
  8. unsigned int value,value1;
  9. unsigned int data;

  10. unsigned int CH1,CH3;
  11. void setup()
  12. {
  13.   Mirf.spi = &MirfHardwareSpi;
  14.   Mirf.init();
  15.   Mirf.setRADDR((byte *)"ABCDE"); //設(shè)置自己的地址(發(fā)送端地址),使用5個(gè)字符
  16.   Mirf.payload = sizeof(value);
  17.   Mirf.channel = 90;              //設(shè)置所用信道
  18.   Mirf.config();

  19.   Serial.begin(9600);
  20. }
  21.   
  22. void loop()
  23. {
  24.   Mirf.setTADDR((byte *)"FGHIJ");           //設(shè)置接收端地址
  25.   value = analogRead(1);                      //0-255的隨機(jī)數(shù)
  26.   value1 = analogRead(6);

  27.   CH1=value/4;
  28.   CH3=value1/4;

  29.   data=((unsigned int)(CH1<<8)+CH3);
  30.   Serial.print(CH1);
  31.   Serial.print(" ");
  32.   Serial.print(CH3);
  33.   Serial.print(" ");
  34.   Serial.println(data);
  35.   //Serial.println(value1);
  36.   Mirf.send((byte *)&data);                //發(fā)送指令,發(fā)送隨機(jī)數(shù)value
  37.   while(Mirf.isSending()) delay(1);         //直到發(fā)送成功,退出循環(huán)
  38.   delay(10);
  39. }
復(fù)制代碼
下載程序到氣墊船和遙控器中:


上電!我使用的電池是550mah的3.7v鋰電池,帶這四個(gè)電機(jī)大概可以玩10分鐘的時(shí)間。于是》》》迫不及待的上電開始玩耍!



需要的一些改進(jìn)

在玩耍中發(fā)現(xiàn)由于氣墊船的阻力非常。◣缀醪缓偷孛娼佑|),所以推進(jìn)電機(jī)要是速度不一樣就會導(dǎo)致氣墊船偏航,但是由于驅(qū)動芯片的誤差以及電機(jī)之間的誤差問題,即使我使用相同占空比的PWM方波驅(qū)動他們,仍然會導(dǎo)致他們轉(zhuǎn)速不同以致氣墊船容易偏航(很難跑直線),這個(gè)問題比較影響玩耍的體驗(yàn)感,需要改進(jìn)。
計(jì)劃是使用一個(gè)電子羅盤,也就是磁力計(jì)來確定現(xiàn)在氣墊船船頭的指向,然后引入PID算法來通過電子羅盤的數(shù)據(jù)來校正控制每個(gè)推進(jìn)電機(jī)的PWM波,這樣應(yīng)該會改善到整體的操控性。
不過這有需要一段時(shí)間的研究,主要是軟件方面,現(xiàn)在板子上預(yù)留了IIC的通信接口,想必找到一個(gè)IIC通信的電子羅盤應(yīng)該不是什么難事,問題就在PID算法以及一些濾波算法上,我還對PID算法不太了解。而且是否運(yùn)轉(zhuǎn)的電機(jī)或者電機(jī)內(nèi)的磁鐵會對電子羅盤的數(shù)據(jù)產(chǎn)生干擾也不是很確定。                           
成功的讓這個(gè)氣墊船跑起來達(dá)到了我的目的,對于 其的一些改進(jìn)應(yīng)該會放在之后,應(yīng)為近期準(zhǔn)備開始做室內(nèi)玩的遙控飛機(jī)的板子,是基于51單片機(jī)和LT8920的,所以這個(gè)改進(jìn)應(yīng)該會等到做完那個(gè)項(xiàng)目之后。如果你對這個(gè)氣墊船有什么改進(jìn)的建議,歡迎提出來。


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:473907 發(fā)表于 2019-6-13 14:32 | 只看該作者
很好的嘗試, 夏天到了,可以找有水的地方試試~  期待樓主的更新方案
回復(fù)

使用道具 舉報(bào)

板凳
ID:614250 發(fā)表于 2019-9-20 23:08 | 只看該作者
怎么防水啊
回復(fù)

使用道具 舉報(bào)

地板
ID:300101 發(fā)表于 2019-9-25 10:01 | 只看該作者
很好的玩具車可以聯(lián)系廠家量產(chǎn)了
回復(fù)

使用道具 舉報(bào)

5#
ID:608673 發(fā)表于 2019-9-26 11:43 | 只看該作者
有視頻就好了  看看你的驅(qū)動成果
回復(fù)

使用道具 舉報(bào)

6#
ID:613217 發(fā)表于 2019-9-27 07:17 來自觸屏版 | 只看該作者
太帥了,有朝一日必做一個(gè)
回復(fù)

使用道具 舉報(bào)

7#
ID:617327 發(fā)表于 2019-9-28 02:19 | 只看該作者
感謝分享,厲害
回復(fù)

使用道具 舉報(bào)

8#
ID:618532 發(fā)表于 2019-10-1 08:31 | 只看該作者
求氣墊船開源
回復(fù)

使用道具 舉報(bào)

9#
ID:620186 發(fā)表于 2019-10-7 20:03 | 只看該作者
厲害 想搞一個(gè)
回復(fù)

使用道具 舉報(bào)

10#
ID:631549 發(fā)表于 2019-10-31 14:18 | 只看該作者
大師太牛了,值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

11#
ID:632343 發(fā)表于 2019-10-31 18:07 | 只看該作者
很不錯(cuò)~不過想看一下視頻是怎么走動的。
回復(fù)

使用道具 舉報(bào)

12#
ID:92231 發(fā)表于 2020-2-16 18:18 來自觸屏版 | 只看該作者
太厲害了,贊
回復(fù)

使用道具 舉報(bào)

13#
ID:675619 發(fā)表于 2020-2-19 16:05 | 只看該作者
這個(gè)設(shè)計(jì)不錯(cuò)哦,模塊化就可以組裝了
回復(fù)

使用道具 舉報(bào)

14#
ID:29972 發(fā)表于 2020-7-29 14:17 | 只看該作者
跑直線的問題解決了嗎?
回復(fù)

使用道具 舉報(bào)

15#
ID:384013 發(fā)表于 2020-7-30 08:53 | 只看該作者

大師實(shí)在太牛了,值得學(xué)習(xí)!!
回復(fù)

使用道具 舉報(bào)

16#
ID:557566 發(fā)表于 2020-10-13 14:05 | 只看該作者
很好的玩具車,可以量產(chǎn)了
回復(fù)

使用道具 舉報(bào)

17#
ID:842962 發(fā)表于 2020-12-22 09:09 | 只看該作者
里邊的氣體填充是什么
回復(fù)

使用道具 舉報(bào)

18#
ID:108361 發(fā)表于 2023-10-25 13:30 | 只看該作者
010706 發(fā)表于 2020-12-22 09:09
里邊的氣體填充是什么

看起來就是兩個(gè)電扇再往里面吹風(fēng)
回復(fù)

使用道具 舉報(bào)

19#
ID:1084716 發(fā)表于 2023-10-25 16:49 | 只看該作者
不錯(cuò)。支持一下
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表