小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

[Maker]不握遙控器?Arduino 電調(diào)控制四軸飛行器電機

 Jack_HAHA 2020-05-08

今天我們來論如何上天。

也許我們想飛得更高,看得更遠

或是打造一款澎湃動力的電動漂移板:

那我們總離不開用單片機控制電機。

那么,arduino控制電機跟arduino通過電調(diào)控制電機區(qū)別在哪兒呢?

前者,控制小電機是比較容易的。然而對于四軸和電動滑板,電壓太高燒主板!
由于電池電壓過高(四軸無人機電壓14.1V,電動漂移板28.8V),若是直接連接單片機,會燒壞。
這個時候便需要連接電調(diào)(speed controler)作為中轉(zhuǎn)橋梁。

問題就是,電機連上電調(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

接下來以四軸無人機電機為例,電動滑板輪毅電機同理

要點:
1.電路連接方式
2.PWM控制
3.電調(diào)初始化
4.轉(zhuǎn)速的有效信號區(qū)間查找
5.Wifi遙控時Arduino中 Serial.read() 的char轉(zhuǎn)換為 速度的 int
5.過渡與漸變

材料
四軸20A電調(diào)1
四軸2212電機1
4S電池或直流電源1
連接若干

若電機有報障聲音,請參考電調(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)速:

int sp1=9;//定義舵機接口數(shù)字接口7int pulsewidth;//定義脈寬變量int val;int val1;int speed1=0;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' ) ;        Serial.println('hello world' ) ;}void loop(){      String inchars='';  while(Serial.available()>0)  {    char inchar=Serial.read();    if(isDigit(inchar))    {      inchars+=inchar;    }      speed1=inchars.toInt();  }Serial.println(speed1);        for(int i=0;i<=50;i++)//給予舵機足夠的時間讓它轉(zhuǎn)到指定角度    {      servopulse(sp1,speed1);//引用脈沖函數(shù)    }  }

我們知道,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的值,加上這條命令

      servopulse(sp1,speed1);//set the speed

就已經(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)速度了

speed1=inchars.tolnt();servopulse(sp1,speed1);//set the speed

這個時候,我們已經(jīng)具備了電腦、手機遙控電機速度的能力,甚至乎可以自己寫app或用已有的app進行控制,如TCP連接;

6.平滑速度變化(可選)

我們改變電機速度的值,比如從10%到90%的時候,若是太快,電機會來不及變化,產(chǎn)生暴增或暴減,后果就是 無人機忽上忽下,或是電動滑板加速太快人仰馬翻;若是太慢,會出現(xiàn)控制遲緩。因此,我們需要平滑速度變化。

延時函數(shù)
線性速度增長函數(shù)。

曲線函數(shù)
想要速度變得更加平滑的,比如先慢后快,可以用數(shù)學(xué)建模 弄一個過渡函數(shù),比如(ax^2+bx+cx) or (a^x),然后再把值賦給speed1.

好,至此為止,我們已經(jīng)能夠用Arduino連接電調(diào)控制無刷電機,甚至通過wifi進行遙控
這意味著我們具備了arduino驅(qū)動電機的基礎(chǔ),加上自己編寫或應(yīng)用手機軟件,將在四軸無人機飛行和電動滑板上大顯神通。

最后,愿大家都能做出像航模協(xié)會大神那樣DIY的成品:

Good luck!_

歡迎關(guān)注/交流討論~


參考資料:

1.Arduino控制好盈電調(diào)

2.Arduino 編程入門到實戰(zhàn)(PWM部分)

3.Arduino串口數(shù)據(jù)分割字符串和數(shù)字

4.單片機控制無刷電機轉(zhuǎn)速——Arduino篇(詳細代碼)

5.Make: Drones: Teach an Arduino to Fly

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多