|
前幾個(gè)月制作了一款基于Arduino的最小板,上面集成了一些功能,經(jīng)過(guò)了幾次的迭代后終于達(dá)到了我想要的效果,緊接著又為這款電路板制作了一個(gè)配套的遙控器,用來(lái)操控這塊板子上的一些功能,例如電機(jī)驅(qū)動(dòng)以及控制一些IO口之類(lèi)的。這兩個(gè)項(xiàng)目制作過(guò)程都可以從如下的鏈接找到: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)來(lái)準(zhǔn)備使用這套板子來(lái)制作一些項(xiàng)目,結(jié)合了板子的資源之后,就選擇了氣墊船的項(xiàng)目,準(zhǔn)備用我設(shè)計(jì)的這套板子制作一個(gè)遙控氣墊船。
首先話(huà)不多說(shuō),上完成品照片:
圖35.jpg (389.61 KB, 下載次數(shù): 192)
下載附件
2019-6-10 14:11 上傳
接下來(lái)我就會(huì)帶來(lái)整個(gè)氣墊船的開(kāi)發(fā),制作過(guò)程。
靈感來(lái)源 首先我端詳了我做的這款板子,上面有三個(gè)L9110s電機(jī)驅(qū)動(dòng)芯片,以及一個(gè)支持1-2s的鋰電池接口,一個(gè)支持NRF24L01的接口以及報(bào)警電路。對(duì)于這個(gè)L9110s驅(qū)動(dòng),我使用了幾乎arduino的全部支持硬件PWM的管腳,其中有兩個(gè)驅(qū)動(dòng)芯片是支持正反轉(zhuǎn)PWM調(diào)速的,有一個(gè)驅(qū)動(dòng)苦于arduino的PWM管腳不夠,所以只能支持單向PWM調(diào)速,顯然這樣的配置對(duì)于一些小車(chē)的項(xiàng)目肯定是綽綽有余,而這也是我設(shè)計(jì)這塊板子的設(shè)計(jì)初衷,對(duì)于一些車(chē)船類(lèi)的項(xiàng)目,這款板子可以完全適應(yīng)。
圖31.jpg (410 KB, 下載次數(shù): 194)
下載附件
2019-6-10 14:11 上傳
所以選擇來(lái)選擇去,還是選擇了車(chē)船類(lèi)的項(xiàng)目。但是我對(duì)于車(chē)船類(lèi)的項(xiàng)目感覺(jué)玩不什么花樣,偶然間在網(wǎng)上看到別人3D打印的氣墊船項(xiàng)目,就動(dòng)心了。
想法到圖紙
之前玩過(guò)一段時(shí)間的航模,所以最開(kāi)始想用空模的那一套東西來(lái)做,用無(wú)刷電機(jī)帶動(dòng)扇葉轉(zhuǎn)動(dòng),然后電調(diào)可以用arduino輸出的PWM波來(lái)控制,剛好家里也有3D打印機(jī)。但是接著我就發(fā)現(xiàn)那我為啥不用arduino nano板來(lái)做,因?yàn)檫@么做的話(huà)貌似我板子上的功能一個(gè)都沒(méi)用到,簡(jiǎn)直就是浪費(fèi)資源,遂放棄。。。。。。
有一天玩那種空心杯的四軸時(shí)候,看到四軸的電機(jī)體格雖然很小,但是力道卻很足,于是想用這個(gè)電機(jī)來(lái)做動(dòng)力,剛好板子上的驅(qū)動(dòng)芯片應(yīng)該能帶的動(dòng)。于是上某寶搜索,對(duì)比了很多不同型號(hào)的空心杯電機(jī)之后,選擇了720電機(jī),店家還給配了螺旋槳,直徑差不多55mm。數(shù)天之后,電機(jī)到貨了,拆開(kāi)上電之后,感覺(jué)風(fēng)還挺大,比得上一個(gè)小電扇了,于是確定了這個(gè)動(dòng)力系統(tǒng)。720電機(jī)配55mm螺旋槳。
圖2_看圖王.jpg (92.25 KB, 下載次數(shù): 191)
下載附件
2019-6-10 14:11 上傳
動(dòng)力總算是確定了,接下來(lái)就是結(jié)構(gòu)的問(wèn)題,在開(kāi)始繪制圖紙之前,有個(gè)很重要的問(wèn)題要解決——?dú)鈮|船的轉(zhuǎn)向方式?
于是上百度上查詢(xún)氣墊船的圖片,發(fā)現(xiàn)大概分為兩類(lèi),一類(lèi)是使用單個(gè)風(fēng)扇作為推進(jìn),扇葉后方有可動(dòng)的導(dǎo)流板來(lái)控制方向,就是類(lèi)似船的舵一樣,我開(kāi)始準(zhǔn)備用這種的,因?yàn)橹恍枰粋(gè)電機(jī),感覺(jué)比較省電。但是后來(lái)查看了詳細(xì)的結(jié)構(gòu)之后還是放棄了,結(jié)果比較復(fù)雜,實(shí)行起來(lái)比較麻煩。另外一類(lèi)是使用兩個(gè)或者四個(gè)風(fēng)扇作為推進(jìn),使用兩側(cè)風(fēng)扇的速度差來(lái)控制船體的方向,這種結(jié)構(gòu)比較簡(jiǎn)單,而且兩測(cè)風(fēng)扇我還可以使用兩個(gè)支持正反轉(zhuǎn)PWM調(diào)速的驅(qū)動(dòng)芯片來(lái)驅(qū)動(dòng),達(dá)到速度差調(diào)速的目的。
終于是確定了使用的動(dòng)力以及轉(zhuǎn)向方式,下面就是埋頭畫(huà)圖紙了。作為CAD小白,我學(xué)習(xí)了幾節(jié)課程之后終于是能勉強(qiáng)畫(huà)圖了。下面是畫(huà)好的圖紙,一共有四頁(yè),使用的軟件是迅捷的CAD。
圖3.png (21.72 KB, 下載次數(shù): 208)
下載附件
2019-6-10 14:12 上傳
整個(gè)機(jī)身一共有四個(gè)電機(jī),兩個(gè)負(fù)責(zé)推進(jìn)兩個(gè)負(fù)責(zé)起升,這樣剛好用光了我設(shè)計(jì)板子上面所有的電機(jī)接口,后續(xù)還想加什么功能的話(huà)也有多余的端口來(lái)使用。
畫(huà)好之后,我想能夠在電腦上先模擬一下完成之后的樣子就好了,于是沒(méi)有建過(guò)模的我又去學(xué)了建模,將CAD中畫(huà)好的圖片導(dǎo)入到建模軟件之后,經(jīng)過(guò)簡(jiǎn)單的拉伸操作就得到了大致完成的樣子,我用的建模軟件是犀牛,剛剛學(xué)習(xí),只會(huì)簡(jiǎn)單的幾個(gè)操作,請(qǐng)各位看官輕拍。
圖4.png (315.57 KB, 下載次數(shù): 217)
下載附件
2019-6-10 14:12 上傳
終于是完成了圖紙的設(shè)計(jì)了,導(dǎo)入到建模軟件的效果也還滿(mǎn)意,于是準(zhǔn)備下一步的切割了。
圖紙到實(shí)物 我在某寶上找了個(gè)加工KT板的廠家,將圖紙發(fā)過(guò)去了。之前確實(shí)考慮過(guò)使用木板,但是輕木太軟,桐木太脆,椴木太重,權(quán)衡下來(lái)還是切kt板,因?yàn)橹巴婧侥4_實(shí)很多飛機(jī)都是用KT板做的,很結(jié)實(shí)也很輕。
等待了幾天之后,切割好的kt板送到了,查看了一下,沒(méi)有問(wèn)題,由于切割KT板的時(shí)候切割機(jī)會(huì)燒灼KT板的邊緣導(dǎo)致一些尺寸會(huì)對(duì)不上,幸好我在設(shè)計(jì)圖紙的時(shí)候預(yù)留了一些余量,這點(diǎn)也提醒大家注意。
圖5_看圖王.jpg (406.54 KB, 下載次數(shù): 208)
下載附件
2019-6-10 14:11 上傳
隨后急忙的組裝了起來(lái),這時(shí)候門(mén)鈴響了,原來(lái)是買(mǎi)的電機(jī)到貨了。正好趕上組裝,于是迅速的安裝上了電機(jī),成品如下:
圖34.jpg (511.57 KB, 下載次數(shù): 195)
下載附件
2019-6-10 14:11 上傳
下面就是安裝我設(shè)計(jì)的電路板了,設(shè)計(jì)圖紙時(shí)給氣墊船設(shè)計(jì)了一個(gè)設(shè)備艙,正好可以容納電路板。
微信圖片_20190508212929.jpg (456.47 KB, 下載次數(shù): 207)
下載附件
2019-6-10 14:13 上傳
電路板裝進(jìn)去,將電機(jī)插頭插到板子上,到這里所有的結(jié)構(gòu)搭建以及硬件電路都連接好了,下面就是給氣墊船注入靈魂——編寫(xiě)代碼了!
圖33_看圖王.jpg (498.95 KB, 下載次數(shù): 196)
下載附件
2019-6-10 14:11 上傳
程序的編寫(xiě)
其實(shí)控制程序非常簡(jiǎn)單,首先說(shuō)接受端,其實(shí)就是將無(wú)線(xiàn)模塊接收到的數(shù)據(jù)轉(zhuǎn)換成對(duì)應(yīng)引腳輸出的PWM占空比來(lái)控制電機(jī)的轉(zhuǎn)速。于是一段時(shí)間過(guò)后,我編好了接受端的代碼。- //接收端程序
-
- #include <SPI.h>
- #include <Mirf.h>
- #include <nRF24L01.h>
- #include <MirfHardwareSpiDriver.h>
-
- unsigned int value;
- unsigned int CH1,CH3,left,right,qi;
- void setup()
- {
- Serial.begin(9600);
- Mirf.spi = &MirfHardwareSpi;
- Mirf.init();
-
- Mirf.setRADDR((byte *)"FGHIJ"); //設(shè)置自己的地址(接收端地址),使用5個(gè)字符
- Mirf.payload = sizeof(value);
- Mirf.channel = 90; //設(shè)置使用的信道
- Mirf.config();
- Serial.println("Listening..."); //開(kāi)始監(jiān)聽(tīng)接收到的數(shù)據(jù)
-
- pinMode(10,OUTPUT);
- pinMode(5,OUTPUT);
- pinMode(6,OUTPUT);
- pinMode(3,OUTPUT);
- pinMode(9,OUTPUT);
- digitalWrite(5,0);
- digitalWrite(6,0);
- digitalWrite(9,0);
- digitalWrite(3,0);
- digitalWrite(10,0);
- }
-
- void loop()
- {
- if(Mirf.dataReady()) { //當(dāng)接收到程序,便從串口輸出接收到的數(shù)據(jù)
- Mirf.getData((byte *) &value);
-
- CH3=(unsigned int)value&255;
- CH1=(unsigned int)value>>8;
-
-
- if(CH1>140)
- {
- qi=CH1;
- if(CH3>135) //左轉(zhuǎn)彎
- {
- right=CH1;
-
- if(CH1<CH3)
- left=0;
- else
- left=CH1-CH3/3.5;
- }
- else if(CH3<120) //右轉(zhuǎn)彎
- {
- if(CH1<(255-CH3))
- right=0;
- else
- right=CH1-((255-CH3)/3.5);
-
- left=CH1;
- }
- else
- {
- right=CH1;
- left=CH1;
- }
- }
- else
- {
- left=0;
- right=0;
- qi=0;
- }
-
- analogWrite(3,left);
- analogWrite(9,right);
- analogWrite(10,qi);
-
- Serial.print("Got data: ");
- Serial.print(CH1);
- Serial.print(" ");
- Serial.print(CH3);
- Serial.print(" ");
- Serial.print(left);
- Serial.print(" ");
- Serial.println(right);
- }
- }
復(fù)制代碼
發(fā)送端也是很簡(jiǎn)單,我使用搖桿作為控制桿,用arduino的ADC引腳讀取搖桿輸出的電壓來(lái)獲得當(dāng)前的搖桿位置,然后將搖桿位置的數(shù)據(jù)通過(guò)無(wú)線(xiàn)模塊發(fā)送出去。- //發(fā)射端程序
-
- #include <SPI.h>
- #include <Mirf.h>
- #include <nRF24L01.h>
- #include <MirfHardwareSpiDriver.h>
-
- unsigned int value,value1;
- unsigned int data;
-
- unsigned int CH1,CH3;
- void setup()
- {
- Mirf.spi = &MirfHardwareSpi;
- Mirf.init();
- Mirf.setRADDR((byte *)"ABCDE"); //設(shè)置自己的地址(發(fā)送端地址),使用5個(gè)字符
- Mirf.payload = sizeof(value);
- Mirf.channel = 90; //設(shè)置所用信道
- Mirf.config();
-
- Serial.begin(9600);
- }
-
- void loop()
- {
- Mirf.setTADDR((byte *)"FGHIJ"); //設(shè)置接收端地址
- value = analogRead(1); //0-255的隨機(jī)數(shù)
- value1 = analogRead(6);
-
- CH1=value/4;
- CH3=value1/4;
-
- data=((unsigned int)(CH1<<8)+CH3);
- Serial.print(CH1);
- Serial.print(" ");
- Serial.print(CH3);
- Serial.print(" ");
- Serial.println(data);
- //Serial.println(value1);
- Mirf.send((byte *)&data); //發(fā)送指令,發(fā)送隨機(jī)數(shù)value
- while(Mirf.isSending()) delay(1); //直到發(fā)送成功,退出循環(huán)
- delay(10);
- }
復(fù)制代碼 下載程序到氣墊船和遙控器中:
圖32.jpg (478.28 KB, 下載次數(shù): 203)
下載附件
2019-6-10 14:11 上傳
上電!我使用的電池是550mah的3.7v鋰電池,帶這四個(gè)電機(jī)大概可以玩10分鐘的時(shí)間。于是》》》迫不及待的上電開(kāi)始玩耍!!
圖36_看圖王.jpg (509.47 KB, 下載次數(shù): 207)
下載附件
2019-6-10 14:15 上傳
需要的一些改進(jìn)
在玩耍中發(fā)現(xiàn)由于氣墊船的阻力非常小(幾乎不和地面接觸),所以推進(jìn)電機(jī)要是速度不一樣就會(huì)導(dǎo)致氣墊船偏航,但是由于驅(qū)動(dòng)芯片的誤差以及電機(jī)之間的誤差問(wèn)題,即使我使用相同占空比的PWM方波驅(qū)動(dòng)他們,仍然會(huì)導(dǎo)致他們轉(zhuǎn)速不同以致氣墊船容易偏航(很難跑直線(xiàn)),這個(gè)問(wèn)題比較影響玩耍的體驗(yàn)感,需要改進(jìn)。
計(jì)劃是使用一個(gè)電子羅盤(pán),也就是磁力計(jì)來(lái)確定現(xiàn)在氣墊船船頭的指向,然后引入PID算法來(lái)通過(guò)電子羅盤(pán)的數(shù)據(jù)來(lái)校正控制每個(gè)推進(jìn)電機(jī)的PWM波,這樣應(yīng)該會(huì)改善到整體的操控性。
不過(guò)這有需要一段時(shí)間的研究,主要是軟件方面,現(xiàn)在板子上預(yù)留了IIC的通信接口,想必找到一個(gè)IIC通信的電子羅盤(pán)應(yīng)該不是什么難事,問(wèn)題就在PID算法以及一些濾波算法上,我還對(duì)PID算法不太了解。而且是否運(yùn)轉(zhuǎn)的電機(jī)或者電機(jī)內(nèi)的磁鐵會(huì)對(duì)電子羅盤(pán)的數(shù)據(jù)產(chǎn)生干擾也不是很確定。
成功的讓這個(gè)氣墊船跑起來(lái)達(dá)到了我的目的,對(duì)于 其的一些改進(jìn)應(yīng)該會(huì)放在之后,應(yīng)為近期準(zhǔn)備開(kāi)始做室內(nèi)玩的遙控飛機(jī)的板子,是基于51單片機(jī)和LT8920的,所以這個(gè)改進(jìn)應(yīng)該會(huì)等到做完那個(gè)項(xiàng)目之后。如果你對(duì)這個(gè)氣墊船有什么改進(jìn)的建議,歡迎提出來(lái)。
|
|