標題: 基于Arduino的小平衡車 [打印本頁]

作者: arduino小學徒    時間: 2017-6-17 13:00
標題: 基于Arduino的小平衡車
http://v.youku.com/v_show/id_XMjc5NjMyNDIzMg==.html

http://v.youku.com/v_show/id_XMjc5ODM4MjYxNg==.html
近期考試繁忙,先上視頻熱身熱身!

做平衡需要具備的基本配件:
一.硬件方面:
1.電源:比如航模電池11V或者7V以上,具體看電機供電電壓

2.Arduino推薦2560,因為后面可以加很多有趣的東西,比如語音,無線遙控,超聲波,觸摸屏,顯示器等等,MEGA2560有足夠的引腳
3.關(guān)鍵的東西>>MPU6050

4.電機和輪子+車架(可自制)。建議初學者買帶有編碼測速的車身,電機應帶有兩相測速,目的是可以測出電機正反轉(zhuǎn)。

5.電機驅(qū)動:可用298或者TB6612.建議用TB6612,它體積小,功率夠用。

6.降壓模塊。降壓模塊主要給Arduino供電,把11V的電壓降到8V左右通過Vin供電端給Arduino供電,如果直接接11V,小心芯片Duang機。
小車可平衡之后就可以加點控制器件:比如HC-05/06藍牙模塊或者NRF2.4G無線模塊。
二.軟件方面:
1.最重要的當然是傳說中的PID控制算法(其實不難,真不難,一個學期時不時的拿別人的程序出來看看,總會有理解的那天!)
2.理解測速和檢測方向原理(不管最高最低轉(zhuǎn)速如何,只要轉(zhuǎn)動電機有數(shù)就好,不用擔心數(shù)太小)
3.靈活運用串口監(jiān)視器進行調(diào)試,可以打印數(shù)字觀察角度,PWM等。
4.要知道MEGA2560和UNO的定時器庫不一樣,需注意!
#include //mega2560定時器庫
#include //如果MsTi該庫不變紅色,需更新該庫(UNO定時庫)
5.拿到正確的MPU6050的角度和角速度。為什么說拿到呢?實話說6050不需要你太花費時間去理解它是怎么工作怎么嘰嘰歪歪的,你只需要找到它的出口值(角度和角速度)就行。就比如下面這段程序就可以得出標準的角度(f_angle )和角速度(omega)
當然在主函數(shù)錢還有它的一些定義:如何在一大堆程序里找出哪些才和它相關(guān)呢(先整體復制進來-編譯運行-正確-嘗試屏蔽掉自認為與它無關(guān)的語句以及定義-若報錯,則它有關(guān),恢復回來-若正常編譯,則可去掉該語句)
/********MP6050相關(guān)***************/
float timeChange=10;//濾波法采樣時間間隔毫秒
float dt=timeChange*0.001;//注意:dt的取值為濾波器采樣時間
MPU6050 Mpu6050;//命名 陀螺儀類:Mpu6050
int16_t ax, ay, az, gx, gy, gz;//陀螺儀原始數(shù)據(jù) 3個加速度+3個角速度
float f_angle,angleA,omega,gyroGz,control_v;
float angle0 = 1.80,gy1 = 30;        //因重心導致角度偏置;陀螺儀偏移量

/**************標準角度處理**************/
void jiao_du()
{
        Mpu6050.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//讀取原始6個數(shù)據(jù)
        float ax1 = map(ax,-15924,16629,-16384,16384);     //除去每個軸的漂移量
        float ay1 = map(ay,-16601,16121,-16384,16384);
        float az1 = map(az,-17454,15750,-16384,16384);
        angleA = atan2(ax1,az1) * 180 / PI+ angle0; //加速度計算角度。得到平衡位置的角度
        omega = -(gy - gy1) / 131.00;   //計算角速度
        gyroGz =gz / 131.00;//陀螺儀角速度,注意正負號與放置有關(guān)
        unsigned long now = millis();        // 當前時間(ms)
        float dt = (now - preTime) / 1000.0; // 微分時間(ms)
        preTime = now;  
        float K = 0.8;  //一階濾波
        float A = K / (K + dt);                     
        f_angle = A * (f_angle + omega * dt) + (1-A) * angleA; //得到正常的角度
        }
6.(不需要)卡爾曼濾波。其實用了上面的角度處理程序,就不要卡爾曼了
因為要得到正常的角度和角速度有兩種方式:
1.算法融合得到(簡單)
2.卡爾曼濾波得到(復雜)
總接線圖:




作者: admin    時間: 2017-6-19 03:29
好東東,樓主能分享點制作資料嗎?
作者: arduino小學徒    時間: 2017-6-20 15:10
admin 發(fā)表于 2017-6-19 03:29
好東東,樓主能分享點制作資料嗎?

后面整理出來會有的,近期實在太忙。。。
作者: lengrang911    時間: 2017-6-21 00:28
做得真不錯,反應很靈敏,期待分享相關(guān)資料
作者: 偶游QHD    時間: 2017-6-21 21:29
樓主真會吊胃口,寢食難安了!期待樓主的精彩分享
作者: 偶游QHD    時間: 2017-6-23 06:06
樓主,收徒吧,太佩服了,我每天都來論壇里等你的消息。
作者: 偶游QHD    時間: 2017-6-25 06:31
收到樓主的回復,好雞凍
作者: arduino小學徒    時間: 2017-6-25 22:56
實在是忙!但在這先給車友們一些思想指導,做平衡之前我也是屬于小白,但堅持了兩個月,不會就查,邊查邊嘗試。然后做得厭倦了就先玩其他的,反反復復的弄來弄去,直到后面看了一個PID視頻,頓時恍然大悟,最后稍作思路整理、重振旗鼓,終于看到了希望。因為了解了PID,再也不怕平衡,后面就可對其進行任意改裝,目前正在給它加新功能。等暑假打個比賽后就可以整理資料,F(xiàn)在的建議是車友們最好先玩起來,等有了一定印象后就好辦了,要是很白很白的小白,建議先玩4輪的小車!
作者: 偶游QHD    時間: 2017-6-27 05:05
正在走樓主走過的路,PID尚未悟出,心情好的時候會拿出來邊調(diào)邊悟,悟到心情急躁了就趕緊放下了,要不真受不了。感謝樓主的建議。
作者: 偶游QHD    時間: 2017-6-27 05:08
祝樓主比賽順利!
作者: arduino小學徒    時間: 2017-8-7 01:46
由于在這個網(wǎng)站找不到繼續(xù)編輯的入口,只好在其他網(wǎng)站繼續(xù)更新平衡車內(nèi)容,請移步
Arduino平衡小車——開始不斷更新

作者: arduino小學徒    時間: 2017-8-7 13:13
三.萬事俱備只欠東風
1.第一步,測試電機控制。
        根據(jù)上面的接線圖,把電機,驅(qū)動,電源,Arduino接好,然后用下面這段程序測試,電機是否能轉(zhuǎn),轉(zhuǎn)的方向?qū)Σ粚,若出現(xiàn)不正常則檢查相關(guān)信號線,比如轉(zhuǎn)向反了(只需在程序里把IN對調(diào)或者把接線調(diào)即可)
電機測試程序:
//LM298
#define EA 5//左  UNO的PWM引腳為3、5、6、9、10、11
#define EB 6//右

#define IN1 11  //左輪
#define IN2 12
#define IN3 9   //右輪
#define IN4 10
void setup(){
      pinMode(EA,OUTPUT);
      pinMode(EB,OUTPUT);
      pinMode(IN1,OUTPUT);
      pinMode(IN2,OUTPUT);
      pinMode(IN3,OUTPUT);
      pinMode(IN4,OUTPUT);
                  }
void loop()
{
  PWM_Motor(200,-200);//測試電機,應看到左輪前進,右輪后退
}
/***********電機驅(qū)動子程序*************/
void PWM_Motor(int PWM_L,int PWM_R)
{
  if(PWM_L<0)
  {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
  else
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
   }
  if(PWM_R<0)
  {
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
  }
  else
  {
   digitalWrite(IN3, LOW);
   digitalWrite(IN4, HIGH);
  }

analogWrite(EA,abs(PWM_L));//5腳
analogWrite(EB,abs(PWM_R));//6腳
}
不知道大家有沒有注意到:在這里判斷正反轉(zhuǎn)是通過判斷PWM的正負來確定正反轉(zhuǎn)的,而不是用角度來判斷,
比如
錯誤的方向判斷方式:
if(角度<0) {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
else......
正確的方向判斷方式:
if(PWM_L<0) {
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
  else
  {
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
   }
作者: 偶游QHD    時間: 2017-8-13 20:16
樓主超級棒,小學徒的學徒開始學習中。
作者: 偶游QHD    時間: 2017-8-13 20:29
arduino小學徒 發(fā)表于 2017-8-7 01:46
由于在這個網(wǎng)站找不到繼續(xù)編輯的入口,只好在其他網(wǎng)站繼續(xù)更新平衡車內(nèi)容,請移步
Arduino平衡小車——開 ...

這個“Arduino平衡小車”我找不到,請發(fā)個鏈接吧。謝謝!
作者: 闊愛的釗釗    時間: 2017-8-23 13:49
好玩的東東。
作者: lemon0210    時間: 2017-9-27 10:29
期待完整的資料,可以好好學習一下
作者: s5b690    時間: 2017-10-4 16:55
新人加入,等級夠了再來下載學習
作者: 1156479136    時間: 2017-11-8 00:02
在學習中
作者: 1156479136    時間: 2017-11-10 00:15
什么時候更新?
作者: fanfanyu    時間: 2017-11-13 21:46
好贊啊,厲害
作者: 輪回之境    時間: 2018-1-9 15:04
樓主還在嗎  我的平衡小車PID怎么調(diào)總是往一邊歪  直立環(huán)的P怎么調(diào) 小車總是往固定一邊慢慢滑,然后跑著跑著就倒了, 輕輕的往另一邊推它會往那邊滑一小段距離越來越慢然后又往固定那邊跑了,然后越跑越快直到倒地 樓主造這是什么原因嗎 求助
作者: 亞克先東    時間: 2018-8-20 17:11
arduino小學徒 發(fā)表于 2017-8-7 13:13
三.萬事俱備只欠東風
1.第一步,測試電機控制。
        根據(jù)上面的接線圖,把電機,驅(qū)動,電源,Arduino ...

樓主,我的程序判斷方向就是用你說的錯誤方式寫的,運行時跟抽風一樣,想問一下為什么這個方式錯誤呢
作者: JACKLI    時間: 2019-1-17 22:17
請問能不能分享下原理圖跟源碼呢?
作者: hello_51hei    時間: 2019-3-25 14:33
感謝樓主總結(jié)并分享!
作者: 周珍富    時間: 2019-11-22 12:00
輪回之境 發(fā)表于 2018-1-9 15:04
樓主還在嗎  我的平衡小車PID怎么調(diào)總是往一邊歪  直立環(huán)的P怎么調(diào) 小車總是往固定一邊慢慢滑,然后跑著跑 ...

平衡車實驗成功了嗎?成功的話能給大家分享一下代碼嗎?
作者: arduino小學徒    時間: 2020-12-4 16:10
arduino平衡車代碼

13.平衡車編程演示.zip

6.64 KB, 下載次數(shù): 42, 下載積分: 黑幣 -5

arduino平衡車代碼


作者: d18608776050    時間: 2021-4-16 17:30
樓主的作品現(xiàn)在怎么樣了?
最近也是做平衡車遇到問題了,向你學習




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1