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