標(biāo)題: 第二個(gè)Arduino小車 兩輪自平衡 [打印本頁]

作者: 51hei學(xué)習(xí)    時(shí)間: 2016-4-11 02:33
標(biāo)題: 第二個(gè)Arduino小車 兩輪自平衡
   自從做了第一個(gè)Arduino小車興趣大增,于是開始制作第二個(gè)Arduino小車,這次我想做得相對復(fù)雜一點(diǎn)。一直對SEGWAY非常著迷,查了些技術(shù)資料發(fā)現(xiàn)自平衡小車的原理也比較簡單:利用陀螺儀和加速度模塊獲得小車角度,Arduino對獲取的數(shù)據(jù)進(jìn)行處理,然后控制電機(jī)運(yùn)轉(zhuǎn)糾正傾斜,從而達(dá)到平衡的效果。

    先來個(gè)視頻:
http://player.youku.com/player.php/sid/XMzQzNjU1MjQ4/v.swf



    需要準(zhǔn)備的硬件有:
    1、陀螺儀     我選用的是L3G4200D三軸陀螺儀,其實(shí)自平衡小車只用到其中的一軸
    2、加速度計(jì)  我用的是ADXL345三軸加速度計(jì),自平衡小車也只用到其中兩軸
    3、Arduino板子  我用的是 我使用的是 arduino duemilanove 2009  arduino硬件區(qū)別請看這里:http://arduino.cc/en/Main/Hardware
    4、L298N電機(jī)驅(qū)動(dòng)模塊 一個(gè)  需要帶光耦
    5、直流減速電機(jī)兩個(gè)  小車輪胎兩個(gè)  塑料盒子一個(gè)   
    還需要一些杜邦線、 電池、螺絲等輔助的東西

     有朋友問我這些東西哪里能買到,其實(shí)這些材料拜一下淘寶大神就能找到的。

    組裝過程比較簡單,在塑料盒合適的位置打孔,然后用螺絲固定住電路板和電機(jī)即可:




     制作之前我們需要對陀螺儀 + 加速度計(jì) 進(jìn)行測試,看我們獲取的角度數(shù)據(jù)是否滿足要求。網(wǎng)上常用的方法是使用卡爾曼濾波將陀螺儀和加速度計(jì)的數(shù)據(jù)進(jìn)行融合而得到一個(gè)相對穩(wěn)定正確的角度值,具體方法在我前面的文章中提到過:L3G4200D + ADXL345 卡爾曼濾波

   

     獲取到角度以后需要找到小車的平衡點(diǎn),也就是無外力作用的時(shí)候小車能夠立在地面上的角度: 角度差 = 小車角度 - 平衡點(diǎn)角度。

     用小車角度數(shù)據(jù)結(jié)合當(dāng)前的傾斜目標(biāo)值,通過PID運(yùn)算,得出電機(jī)PWM脈寬數(shù)據(jù),指揮電機(jī)運(yùn)行即可。

     PID算法相對比較簡單,而且arduino有現(xiàn)成的PID libraries : http://arduino.cc/playground/Code/PIDLibrary
  1. PID::PID(double* Input, double* Output, double* Setpoint,
  2.         double Kp, double Ki, double Kd, int ControllerDirection)
  3. {
  4.     PID::SetOutputLimits(0, 255);                //default output limit corresponds to
  5.                                                 //the arduino pwm limits

  6.     SampleTime = 100;                            //default Controller Sample Time is 0.1 seconds

  7.     PID::SetControllerDirection(ControllerDirection);
  8.     PID::SetTunings(Kp, Ki, Kd);

  9.     lastTime = millis()-SampleTime;               
  10.     inAuto = false;
  11.     myOutput = Output;
  12.     myInput = Input;
  13.     mySetpoint = Setpoint;
  14.         
  15. }
復(fù)制代碼



       PID LIB的參數(shù)分別是這樣的:
           Input        輸入值(這里輸入卡爾曼融合獲取的角度值)
           Output      PID計(jì)算的結(jié)果,供電機(jī)驅(qū)動(dòng)的PWM使用
           Setpoint    期望值(這里輸入小車平衡點(diǎn)的角度值)
           Kp、Ki、Kd 這是KPI的三個(gè)重要參數(shù)

    這三個(gè)參數(shù)的詳細(xì)說明我從網(wǎng)上摘錄了一段:

    比例(P)控制
    比例控制是一種最簡單的控制方式。其控制器的輸出與輸入誤差信號(hào)成比例關(guān)系。當(dāng)僅有比例控制時(shí)系統(tǒng)輸出存在穩(wěn)態(tài)誤差(Steady-state error)。

    積分(I)控制
    在積分控制中,控制器的輸出與輸入誤差信號(hào)的積分成正比關(guān)系。對一個(gè)自動(dòng)控制系統(tǒng),如果在進(jìn)入穩(wěn)態(tài)后存在穩(wěn)態(tài)誤差,則稱這個(gè)控制系統(tǒng)是有穩(wěn)態(tài)誤差的或簡稱有差系統(tǒng)(System with Steady-state Error)。為了消除穩(wěn)態(tài)誤差,在控制器中必須引入“積分項(xiàng)”。積分項(xiàng)對誤差取決于時(shí)間的積分,隨著時(shí)間的增加,積分項(xiàng)會(huì)增大。這樣,即便誤差很小,積分項(xiàng)也會(huì)隨著時(shí)間的增加而加大,它推動(dòng)控制器的輸出增大使穩(wěn)態(tài)誤差進(jìn)一步減小,直到等于零。因此,比例+積分(PI)控制器,可以使系統(tǒng)在進(jìn)入穩(wěn)態(tài)后無穩(wěn)態(tài)誤差。

    微分(D)控制

    在微分控制中,控制器的輸出與輸入誤差信號(hào)的微分(即誤差的變化率)成正比關(guān)系。自動(dòng)控制系統(tǒng)在克服誤差的調(diào)節(jié)過程中可能會(huì)出現(xiàn)振蕩甚至失穩(wěn)。其原因是由于存在有較大慣性組件(環(huán)節(jié))或有滯后(delay)組件,具有抑制誤差的作用,其變化總是落后于誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時(shí),抑制誤差的作用就應(yīng)該是零。這就是說,在控制器中僅引入 “比例”項(xiàng)往往是不夠的,比例項(xiàng)的作用僅是放大誤差的幅值,而目前需要增加的是“微分項(xiàng)”,它能預(yù)測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能夠提前使抑制誤差的控制作用等于零,甚至為負(fù)值,從而避免了被控量的嚴(yán)重超調(diào)。所以對有較大慣性或滯后的被控對象,比例+微分(PD)控制器能改善系統(tǒng)在調(diào)節(jié)過程中的動(dòng)態(tài)特性。


      PID計(jì)算相關(guān)代碼如下:
  1. PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT); //PID對象聲明

  2. setupPID();  //PID初始化

  3. ....
  4. Kalman_Filter(Adxl_angle, Gyro_sensor); //卡爾曼融合獲取angle
  5. Input = angle;
  6. myPID.Compute();  //PID計(jì)算獲取 Output
  7. Drive(Output);   //根據(jù)Output驅(qū)動(dòng)電機(jī)

  8. void setupPID(){
  9.   Input = 0;
  10.   Setpoint = 17;  //我的小車自平衡角度為17
  11.   myPID.SetSampleTime(100);  //控制器的采樣時(shí)間100ms
  12.   //myPID.SetOutputLimits(0, 2000);
  13.   myPID.SetMode(AUTOMATIC);
  14. }
復(fù)制代碼

       如果你做完這些小車也能成功站起來了,我的小車抖動(dòng)得比較厲害,是因?yàn)槲业闹绷麟姍C(jī)減速太多了(減速比1:220的單軸電機(jī)),而且PID的kp,ki,kd三個(gè)參數(shù)沒調(diào)整好。等有時(shí)間換個(gè)電機(jī)再仔細(xì)調(diào)整一下參數(shù),最好能做成可以控制前景、后退、轉(zhuǎn)彎的小車。 弄個(gè)體積大點(diǎn)的就能騎著上下班了,哈。


作者: gyy4606    時(shí)間: 2019-3-5 09:15
學(xué)習(xí)了,比我制作的平衡車穩(wěn)定




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