今天我們來論如何上天,。 也許我們想飛得更高,看得更遠 或是打造一款澎湃動力的電動漂移板: 那我們總離不開用單片機控制電機。 那么,,arduino控制電機跟arduino通過電調控制電機區(qū)別在哪兒呢,? 前者,控制小電機是比較容易的,。然而對于四軸和電動滑板,,電壓太高燒主板! 問題就是,電機連上電調后,,就不受單片機直接控制了,。電調就像是一位機場的安檢員,只有“說服”安檢員,,讓安檢員傳話給電機,,電機才會動。 那怎么樣用Arduino “說服” 電調呢,? Arduino控制高電壓的四軸電機需要電調,,然而坑爹的是電調默認校準方式是實體遙控器校準,電調說明書上并沒寫關于單片機與軟件控制的方法,,且目前網(wǎng)上搜集到的這方面教程比較散亂,。 因此這篇文章的目的就是,一條龍解決Arduino連接電調控制電機,。也就是讓這小家伙通過Arduino而不是實體遙控器轉起來,,這樣可以為自己用手機app遙控(一個實體遙控器幾百呢)、電腦控制和以后其自主編程控制提供方便,。 claim:standing on the shoulders of the giants 接下來以四軸無人機電機為例,,電動滑板輪毅電機同理 要點:
若電機有報障聲音,請參考電調故障申明 值得注意的是,,聲音是從電機上發(fā)出來的,,并不是電調。 其次,,電機的聲音能給我們提供非常多的反饋信息,。 準備就緒后,電機沒有聲音又沒有轉動,,說明電路未連接正確或電壓不夠(要大于7V),。 1.連接方式電路連接方式 總的來說,就是:電源連電調,電調的電源線連電機+電調的信號線連arduino(接有“~”標記的7) 一張圖搞定(只不過這里的接收機為Arduino): 電調與arduino連接時,,因為電調有自動低壓保護措施,,記得要保證電源電壓大于7V,才能正常激活電調,!否則什么反應都沒有,。 有電池的同學用電池,當然電池什么的相比,,還是可直接調壓的直流電源更方便,。 7V以上電壓才能激活 2.電調初始化這電調可高級了,內置獨立的程序和連接馬達的報錯程序,。 最關鍵的是,,電調首次使用,沒調制好油門行程,,也是不能驅動電機的,。想要首次激活電調,就要在Arduino上說一樣的“暗號”,,也就是模仿實體遙控器的程序走一遍,。 說明書上關于實體遙控器校準的方法是這樣的: 于是,我們需要模擬設置油門行程,。 模擬設置油門行程代碼如下,,直接刷入Arduino等待幾秒,若電調發(fā)出滴滴聲音后開始轉動,,表示已激活(正常使用時只需要激活一遍,,當然重復激活也不影響): int sp1=9;//定義舵機接口數(shù)字接口7int pulsewidth;//定義脈寬變量int val;int val1;int myangle1;//下面是servopulse函數(shù)部分(此函數(shù)意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)void servopulse(int sp1,int val1)//定義一個脈沖函數(shù){ myangle1=map(val1,0,180,500,2480); digitalWrite(sp1,HIGH);//將舵機接口電平至高 delayMicroseconds(myangle1);//延時脈寬值的微秒數(shù) digitalWrite(sp1,LOW);//將舵機接口電平至低 delay(20-val1/1000);}//servopulse函數(shù)部分到此結束void setup(){ pinMode(sp1,OUTPUT);//設定舵機接口為輸出接口 //設置兩組串口波特率 Serial.begin(9600); Serial.println('servu=o_seral_simple ready' ) ; //看電調說明書,設置油門行程時,,一開始需要把遙控器打到最高點,。i<=110大概是2杪多 for(int i=0;i<=110;i++) { servopulse(sp1,150);//引用脈沖函數(shù) } //等電機發(fā)出B-B兩聲后(就是兩秒后,大概就是這里了)把油門打到最低點 for(int i=0;i<=55;i++) { servopulse(sp1,20);//引用脈沖函數(shù) } //后面提示后,,就可以控制電機轉動了 for(int i=0;i<=150;i++) { servopulse(sp1,150);//引用脈沖函數(shù) } Serial.println('hello world' ) ; }void loop(){ Serial.print(val1,DEC); Serial.println(); for(int i=0;i<=50;i++)//給予舵機足夠的時間讓它轉到指定角度 { servopulse(sp1,val1);//set the speed } } } 設置好了之后,,電機終于轉起來了!若是正常使用,,以后就不需要再次校準了,。 但是,我們若在初始速度信號不等于0時啟動了電機,,電調就會報錯,,我們需要重新刷入這個程序進行一遍校準。 3.尋找速度的有效信號區(qū)間校準后,,我們就想控制速度了,。下面刷入正式的代碼,,以調速:
我們知道,,arduino的PMW功能其實是通過構造不同電壓和時間,,利用W=P*T來調控功率(速度)的。 我們首先來看一下這個脈沖函數(shù)的構造: 電調PMW信號構造 Arduino可以發(fā)出的PMW的范圍是非常寬的,高達over 2000Hz,而我手上這款電調最高只能識別600,,因此會被電調識別為無信號輸入,產(chǎn)生報警,。我們需要不斷設置電調速度值,,探索出有效信號區(qū)域。 于是,,構造電調可以識別的PMW信號,,代碼如下: int sp1=9;//定義舵機接口數(shù)字接口7int pulsewidth;//定義脈寬變量int val;int val1;int speed1=0;int myangle1;void servopulse(int sp1,int val1)//定義一個脈沖函數(shù){ myangle1=map(val1,0,180,500,2480); digitalWrite(sp1,HIGH);//將舵機接口電平至高 delayMicroseconds(myangle1);//延時脈寬值的微秒數(shù) digitalWrite(sp1,LOW);//將舵機接口電平至低 delay(20-val1/1000);} 構造好后,開始試探出識別的有效區(qū)間,。簡單來說,,用二分法,在電壓7V以上的條件下,,找出min和max,。 一般來說,min<50,max<200,。我的電調很快通過二分法試出有效信號范圍是[27,163]; 這個時候,,我們通過改變speed1的值,加上這條命令
就已經(jīng)可以改變電機速度了,。 直流電源上電壓緩緩調高 Hhh,,小心螺旋槳割到手,打開Arduino的Serial.命令臺,,輸入一個有效區(qū)間內的速度,,比如31,電源電壓調起,,感受風聲吧~ 4.Wifi遙控中讀取到的String型速度轉換為int型可以改變速度后,,我們想著怎樣遙控接收更改的速度值。不論是藍牙還是wifi遙控,,都離不開Arduino中Serial.available 和Serial.read() 幫助我們獲取和讀取我們輸入的速度值,。問題就是,我們接收到的是String,,是不能夠speed=(int)String的 這個時候,,我么需要把String轉化為int??墒窃趺崔D化呢,,由于獲取信號這個本身就涉及到函數(shù)調用,,在調用過程中試圖改變類型是非常難的,于是我們從result想辦法,。找了很久終于找到了: 將接收到的速度信號轉化為int值 代碼有: void loop(){ String inchars=''; while(Serial.available()>0) { char inchar=Serial.read(); if(isDigit(inchar)) { inchars+=inchar; } speed1=inchars.tolnt(); } 記得清空 String要在每一個loop之前,,而賦值要等到有新值輸入后。 轉化為int后,,就可以設置電調速度了
這個時候,,我們已經(jīng)具備了電腦、手機遙控電機速度的能力,,甚至乎可以自己寫app或用已有的app進行控制,,如TCP連接; 6.平滑速度變化(可選)我們改變電機速度的值,比如從10%到90%的時候,,若是太快,,電機會來不及變化,產(chǎn)生暴增或暴減,,后果就是 無人機忽上忽下,,或是電動滑板加速太快人仰馬翻;若是太慢,,會出現(xiàn)控制遲緩,。因此,我們需要平滑速度變化,。 延時函數(shù) 曲線函數(shù) 好,,至此為止,,我們已經(jīng)能夠用Arduino連接電調控制無刷電機,甚至通過wifi進行遙控 最后,,愿大家都能做出像航模協(xié)會大神那樣DIY的成品: Good luck!_ 歡迎關注/交流討論~ 參考資料: 2.Arduino 編程入門到實戰(zhàn)(PWM部分) |
|