久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[Maker]不握遙控器?Arduino 電調控制四軸飛行器電機

 Jack_HAHA 2020-05-08

今天我們來論如何上天,。

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

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

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

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

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

問題就是,電機連上電調后,,就不受單片機直接控制了,。電調就像是一位機場的安檢員,只有“說服”安檢員,,讓安檢員傳話給電機,,電機才會動。

那怎么樣用Arduino “說服” 電調呢,?

Arduino控制高電壓的四軸電機需要電調,,然而坑爹的是電調默認校準方式是實體遙控器校準,電調說明書上并沒寫關于單片機與軟件控制的方法,,且目前網(wǎng)上搜集到的這方面教程比較散亂,。

因此這篇文章的目的就是,一條龍解決Arduino連接電調控制電機,。也就是讓這小家伙通過Arduino而不是實體遙控器轉起來,,這樣可以為自己用手機app遙控(一個實體遙控器幾百呢)、電腦控制和以后其自主編程控制提供方便,。


claim:standing on the shoulders of the giants

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

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

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

若電機有報障聲音,請參考電調故障申明

值得注意的是,,聲音是從電機上發(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ū)間

校準后,,我們就想控制速度了,。下面刷入正式的代碼,,以調速:

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ù)部分到此結束void setup(){  pinMode(sp1,OUTPUT);//設定舵機接口為輸出接口  //設置兩組串口波特率  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++)//給予舵機足夠的時間讓它轉到指定角度    {      servopulse(sp1,speed1);//引用脈沖函數(shù)    }  }

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

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

就已經(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后,,就可以設置電調速度了

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ù)學建模 弄一個過渡函數(shù),,比如(ax^2+bx+cx) or (a^x),然后再把值賦給speed1.

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

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

Good luck!_

歡迎關注/交流討論~


參考資料:

1.Arduino控制好盈電調

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

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

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

5.Make: Drones: Teach an Arduino to Fly

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多