x資金充值
暢學電子網支付寶充值
充值最小金額:10元
  • <code id="6aqw0"></code>
  • <bdo id="6aqw0"></bdo>
  • <input id="6aqw0"><samp id="6aqw0"></samp></input>
  • <bdo id="6aqw0"><label id="6aqw0"></label></bdo>
  • <bdo id="6aqw0"></bdo>
  • <bdo id="6aqw0"></bdo>
  • 開源項目>智能車>兩輪自平衡小車

    [開源項目] 兩輪自平衡小車

    (審核中,該項目暫時只有您自己可見)

    (該項目未通過審核,只有您自己可見)

    時間:06-23 17:31瀏覽:49760次
    程序采用的是互補濾波與PID控制,感覺程序還是有一定的問題與改進空間,想著以后慢慢優化。無奈半成品狀態后一直無心繼續改進,期間還出現了硬盤出現故障,差點所有成果毀滅的事故;雖然作品不是很完美,跟大家共享交流一下。
    資料下載
    附件:兩輪自平衡小車資料.rar
    立即下載 文件大小:7.53 MB

    最新下載( 下載次數:653次 )

    • liu122haha
    • 老頭苦練代碼
    • 清風習習
    • kyawtunaung
    • 李莉啊
    • Newbie
    • 不過如此
    • 耳鬢廝磨
    • 參才才才才
    • 兜瑞米飯

    分享到:

    詳細介紹

    一、前言

      好多年前,看到電視新聞上介紹segway,很是驚嘆。然后大概是2、3年前吧,看到網上有人做出了2輪自平衡小車,然后我也很想自己也做一個來玩。無奈于自己的水平有限,對硬件一竅不通,動手能力有限,故也沒有做成。(那時候的加速度傳感器還是每個ic一個維度的,不像現在的MPU6050一個ic就集成了6個輸出量,對電路設計和手工焊接能力要求都挺高的)。
      去年的時候吧,網上發現出現了很多加速傳感器的集成模塊,cortex-m3風頭正盛,自己工作也算比較穩定清閑,感覺時機成熟了,便開始了兩輪自平衡小車的制作,到去年底大概成型。程序采用的是互補濾波與PID控制,感覺程序還是有一定的問題與改進空間,想著以后慢慢優化。無奈半成品狀態后一直無心繼續改進,期間還出現了硬盤出現故障,差點所有成果毀滅的事故;雖然作品不是很完美,跟大家共享交流一下。

    成品效果圖:

    二、硬件選擇與方案設計

      膠槍、電轉、電表等耐用品工具的價格不計算在內,下列原件總共花了我大概450元吧。無意給淘寶商家做廣告,所以請大家自動略過圖片中的商家logo。

    1. 控制板采用原子的STM32 MINI開發板,不帶屏的話138元吧。遙控使用板上的紅外接收器,當然理論上也可以使用板上的rf無線模塊接口。



    2. 方位傳感器采用iic接口的9軸模塊,花了我88大洋。包括加速度、角速度、氣壓、地磁傳感器,主要是考慮到以后別的用途,如果采用6軸模塊的話,應該可以降到50元以內吧。
      自平衡小車需要使用到1個角速度分量和2個加速度分量,通過融合濾波得到較為準確的小車傾斜角度值。查看網上幾年前的小車,都是使用3個獨立ic搭建的,而且還是使用模擬量輸入;查找網上資料,現在都是集成ic,接口主要有spi和iic,而且還有中斷輸入。我買的這個模塊只有iic接口,而且沒有中斷輸出,iic接口,故只能采用周期性查詢方式;加速度傳感器采用的是ADXL345,角速度傳感器采用L3G4200D,這兩個ic的手冊資料是比較齊全的,便于學習。



    3. 采用9v減速電機與鋁合金支架、輪胎,指導價格98元。賣家給的資料有限,電機的參數不明,減速比都是自己測的。
      經過實測,電機的減速比大概為150。感覺小車的力矩還是比較大的,但是反應速度不夠快;采用減速比100的電機或是大輪胎,應該能夠改善小車的動力性能。電機有兩個電源輸入端口,通過改變電壓的正負極,可以改變電機的轉動方向;通過改變驅動電壓的大小,可以改變電機的轉速。




    4. 電機驅動模塊采用全隔離的L298N驅動板,抗干擾,30元。如果不是光耦隔離的話會便宜很多。賣家給的實物和照片不太一樣,有一條pwm控制線5v有效,3.3v無效,說明商家賣出之前沒完整的做過測試。我自己并了個電阻搞定了,也便沒有跟賣家糾纏了。
      模塊有4個邏輯控制輸入端口,接控制器的4個io口,控制2個電機的轉向與停止;2個pwm輸入,接控制器的pwm輸出,控制2個電機的轉速;1個邏輯電源輸入接口,從stm32控制板上取電。驅動部分,2個電源輸入端口,接聚合物鋰電池,考慮到5v穩壓模塊從電池取電,減速電機又是9v的,建議采用9v以上的電池(我采用的是12v);4個驅動輸出接2個減速電機的4個輸入口。



    5. 電池采用12v 3000mah的聚合物鋰電池,65大洋,不包括充電器的價格。恒定放電電流可達4A,瞬間可達40A。不知道用9v的電池可不可以,當時怕電壓太小,所以就沒有買。據說普通的電池不能用在小車上,因為電機的瞬間電流很大,普通電池無法提供。



    6. 邏輯電路5V供電模塊,采用LM2596降壓模塊從12v鋰電池取電,6元。
      該模塊的輸出電壓可調,我調整到了5v輸出。



    7. 測速碼盤,1個18元。
      為了省錢省地方,我只用了1個,有了這個就可以得到電機的速度反饋,再通過控制調整小車的速度、位置。小車的動力部分其實不一定要使用減速電機,而可以使用步進電機,這樣就可以省掉編碼器,而且控制性能更加良好。但這樣帶來的是需要采用專門的步進電機控制板,還有成本的攀升。不差錢的同志可以考慮采用步進電機方案。



    8. 銅柱、洞洞板、連接線等若干。

    三、 STM32F103RBT6 資源的使用:

    (一)控制小車需要的端口如下:

    1、2個pwm輸出,用于控制2個電機的轉速,我們用pwm1和pwm2表示。在此使用定時器0的兩個pwm輸出端口PA0和PA1。
    2、4個數字gpio輸出,用于控制2個電機的正方轉與停止,我們用motor1-1、motor1-2、motor2-1和motor2-2表示。
    3、1個數字gpio輸入,用于接收紅外遙控器發出的信號,我們用ir表示。
    4、2個iic模擬gpio端口,用于控制獲取9軸模塊的數據,我們用iic-scl和iic-sda表示。
    5、2個編碼器信號輸入接口。每個編碼器需要2個接口,我只使用了1個編碼器,故需要2個端口。使用了定時器4的編碼器模式,故需連接到定時器4的t4ch1和t4ch2端口。

      以上端口共11個。為了減少和板上資源的沖突,使板上的SD卡、FLASH和EEPROM等可以同時使用,11個端口經過盡心挑選,比如ir使用跳線連接到了PC1,使用與FLASH、SD卡同一個模擬iic端口等。當然,也犧牲了一些板上的功能,如:觸摸屏、WK_UP按鍵等。如果要使用2個編碼器的話,可以考慮另外使用定時器1的t1ch1和t1ch2端口或者是t1ch1n和t1ch2n。通過一定的編程技巧,理論上可以使液晶屏能夠顯示圖像,同時不影響2個編碼器的使用。

    (二)板上資源的使用:

      開發板所使用的芯片采用64管腳封裝,51個可用IO。
    51個IO包括:PA 0-15、PB 0-15、PC 0-15、PD 0-2。板上io的使用情況與小車io對應情況如下(加*標志的表示樓主“盡量”不去占用的io端口,避免與板上資源沖突):


    PA0 -WK_UP/溫度傳感器  ---------------------- pwm1
    PA1 -紅外傳感器/JF24_FIFO*  ------------------ pwm2
    PA2 -FLASH_CS/U2TX*
    PA3 -SD_CS/U2RX*
    PA4 -SPI1_NSS/NRF_CE/JF24_RST
    PA5 -SPI1_SCK
    PA6 -SPI1_MISO
    PA7 -SPI1_MOSI
    PA8-LED0*  ------------t1ch1
    PA9-串口1RX* ----------t1ch2
    PA10-串口1TX*
    PA11-USB_D- -------------------
    PA12-USB_D+ --------------------
    PA13-KEY0/JTAG/SWDIO/SP2*
    PA14-JTAG-----------------------
    PA15-KEY1/JTAG/PS2*

    PB0~15-液晶數據端口
    PB6   ------------t4ch1
    PB7   ------------t4ch2
    PB13  ------------t1ch1n
    PB14  ------------t2ch2n

    PC0 -T_SCK ---------- motor2-1
    PC1 -T_PEN ---------- ir
    PC2 -T_MISO --------- motor1-2
    PC3 -T_MOSI --------- motor1-1
    PC4 -NRF_CS  JF24_CS
    PC5 -NRF_IRQ JF24_BKT
    PC6 -LCD_RD*
    PC7 -LCD_WR*
    PC8 -LCD_RS*
    PC9 -LCD_CS*
    PC10-LCD_BL*
    PC11-IIC_SDA ------------------------------- iic-sda
    PC12-IIC_SCL -------------------------------- iic-scl
    PC13-T_CS/侵入檢測/RTC輸出* ----------- motor2-2
    PC14-RTC晶振*
    PC15-RTC晶振*

    PD0 -系統晶振*
    PD1 -系統晶振*
    PD2 -LED1*

    可以輸入模擬量的io:PA0-7,PB0-1,PC0-5

    四、主程序框架

      其實一開始是想使用rt-thread操作系統的,不過這樣以來就增加了程序的復雜性了。程序處于調試階段,還是老老實實的使用大循環吧。帖幾段偽代碼,還有一些注釋,作為程序框架的介紹。
    ----------------------------------------
    int main(void)
    {
        ~~~~//各種系統資源的初始化
        while(1)
        {
            if(tick_flag)// SysTick時鐘中斷每10ms使tick_flag置1。
            {//大部分程序都采用10ms的控制周期,不過也可以考慮更高的控制頻率,畢竟cortex-m3的運算能力比起前人的51、avr強太多了。
                tick_flag = 0;
                balance_proc();//根據9軸模塊的數據,PID調整pwm的輸出
                control_proc();//讀取ir輸入,調整pwm的輸出
            }
        }
        return 0;
    }
    ----------------------------------------
    void control_proc(void)
    {
    //----------遙控器反饋控制部分----------
        int i = ir_key_proc(); // 將紅外接收到的按鍵值,轉換為小車控制的相應按鍵值。

        switch(i)
        {
            ~~~~//根據按鍵值,修改pwm_speed和pwm_turn的值。
        }

        pwm_turn *= 0.9; // pwm_turn的值以0.9的比例衰減,使小車在接收到一個轉向信號后只轉動一定的時間后停止轉動。


    //----------編碼器反饋控制部分----------
        speed = speed*0.7 +0.3*(encoder_read()); // 定周期(10ms)讀取編碼器數值得到實時速度,再對速度進行平滑濾波
        encoder_write(0);       // 編碼器值重新設為0

        distance += speed;       // 對速度進行積分,得到移動距離

        if(distance>6000) distance = 6000;   // 減少小車懸空、空轉對控制的影響
        else if(distance<-6000) distance = -6000;

    }

    ----------------------------------------

    void balance_proc(void)
    {
        static unsigned int err_cnt=0;

        int pwm_balance;
        float radian, radian_pt;   // 當前弧度及弧度的微分(角速度,角度值用弧度表示)


        adxl345_read(&acc);   // 讀取當前加速度。由于傳感器按照的位置原因,傳感器的值在函數內部經過處理,變為小車的虛擬坐標系。
        l3g4200d_read(&gyr);  // 讀取當前角速度。同樣經過坐標系變換。


    // 此段程序用于傳感器出錯時停止小車
        err_cnt = err_cnt*115>>7; // err_cnt以0.9的比例系數衰減(115>>7的值約為0.9,避免浮點數,提高速度)
        if(acc.flag != 0x0F || gyr.flag != 0x0F)   // 讀取的角度、角速度值有誤。可能是電磁干擾、iic線太長等導致出錯。
        {
             LED0_ON();  // 亮紅燈
             err_cnt +=100; // 等比數列,比例系數0.9(115>>7),常數項100;根據公式,連續10項的和約為657
             if(err_cnt>657) goto err; // 當連續發生約10次(約0.1秒)錯誤則超過657而溢出。
        }


    // 此段程序用于倒立或失重時停止小車
        if(acc.z<=0)
        {
             goto err;
        }


    // 小車的虛擬x軸方向為小車前進方向,虛擬y軸為小車左邊,虛擬z軸為小車上升方向。
    // 前傾角度為負,后傾角度為正。
    // 通過計算加速度分量,得到小車傾斜弧度(未濾波)
        radian = (float)(acc.x)/acc.z; //  一階展開:Q =f(x)=x-x^3/3+x^5/5+...+(-1)^k*x^(2k+1)/(2k+1)+...
    // 通過角速度傳感器,得到小車的角速度(單位為 弧度/秒)
        radian_pt = gyr.y*RADPT;
        radian_filted = ofme_filter(radian_filted, radian, radian_pt);  // 互補濾波得到小車的傾斜角度

    // 此段程序用于小車傾斜角度過大時,停止小車
        if(radian_filted> ANGLE_RANGE_MAX || radian_filted<ANGLE_RANGE_MIN)
        {
             goto err;
        }

    // 通過PID計算,得到保持小車角度為零所需要的電機pwm輸出
        pwm_balance = pid_proc(&sPID, radian_filted, radian_pt);
    //小車角度為零不代表小車重心為零,還需要通過小車移動速度與移動距離等信息,調整小車平衡所需的pwm輸出
        pwm_balance += (speed*6+distance*0.1);

    // 在pwm_balance的基礎上,加上速度分量與轉動分量,調整小車兩個電機的轉速。
        pwm_control(pwm_balance+pwm_speed+pwm_turn, pwm_balance+pwm_speed-pwm_turn);

    // 如果pwm超出有效值,紅燈亮。用于調試,了解系統狀態。
        if(pwm_balance>=1000||pwm_balance<=-1000) LED1_ON();
        LED0_OFF();
        return;
    err:
        puts("balance error.\r\n");
        pwm_control(0, 0);       // 關閉電機
        return;
    }

    ----------------------------------------
    程序列表說明:

     

     

    已有20條評論

    • 塵影
      塵影04-20 09:47

      為什么下載不了

    • shine23
      shine2311-26 09:24

      666666666

    • HAHP
      HAHP08-18 15:47

          回復 凱瑞:您好,今年我做自平衡的車,可是最后沒能得到有效的指導,自平衡一直沒有實現。可以的話,您可以指導一下我嗎?謝謝了

    • HAHP
      HAHP08-18 15:45

          回復 中國漢字:你在做飛思卡爾?

    • 智能硬件Jeo
      智能硬件Jeo05-27 09:29

      我最近在做這個小車,但是出現的現狀就是站立的平穩,但是給它一個擾動的時候就會向一個方向加速運動倒下,不知道是什么原因,調了好長時間的參數,都是這個效果。求大神指點一下。

    • 中國漢字
      中國漢字11-17 13:00

          回復 凱瑞:我的QQ1319540839 我想做平衡小車

    • 中國漢字
      中國漢字11-17 12:59

          回復 凱瑞:你參加過飛思卡爾?

    • 第二仲
      第二仲10-09 20:17

      初學,繼續深造

    • Princeb
      Princeb09-30 00:20

      有意思啊

    • 西點
      西點09-07 21:16

      做的不錯呀!!!!贊一個

    • 小嗡嗡
      小嗡嗡08-11 16:46

      飛思卡爾比賽的直立車都已經跑的飛快了~~

    • 3w之王少
      3w之王少08-04 23:51

      不會是國賽題吧!!?

    • ljy00199
      ljy0019904-30 20:11

          回復 凱瑞:這個還是看不懂,求教

    • 凱瑞
      凱瑞04-16 08:40

      我做過飛思卡爾的平衡車比賽,有需要的話可以找我交流

    • 夜未央
      夜未央03-11 19:23

      牛逼!

    添加一條評論

    只有登錄用戶才能評論,請先登錄注冊哦!

    項目分享者

    永不止步步
    金幣:67285個|學分:215593分

    立即注冊
    暢學電子網,帶你進入電子開發學習世界
    專業電子工程技術學習交流社區,加入暢學一起充電加油吧!

    x

    暢學電子網訂閱號

    31选7复式中奖计算器
  • <code id="6aqw0"></code>
  • <bdo id="6aqw0"></bdo>
  • <input id="6aqw0"><samp id="6aqw0"></samp></input>
  • <bdo id="6aqw0"><label id="6aqw0"></label></bdo>
  • <bdo id="6aqw0"></bdo>
  • <bdo id="6aqw0"></bdo>
  • <code id="6aqw0"></code>
  • <bdo id="6aqw0"></bdo>
  • <input id="6aqw0"><samp id="6aqw0"></samp></input>
  • <bdo id="6aqw0"><label id="6aqw0"></label></bdo>
  • <bdo id="6aqw0"></bdo>
  • <bdo id="6aqw0"></bdo>
  • 塑胶贸易 赚钱吗 股票分析师一个月多少钱 成都麻将规则 96人体艺术摄影 快速时时走势图 乌鲁木齐红灯区一览表2019 国内读mba需要多少钱 什么游戏可以卖金币材料赚钱 新时时彩 威龙娱乐 山东十一选五开奖 捕鱼达人是哪个公司开发的 泰国人体艺术 福彩新快3怎么玩 腾游娱乐中心捕鱼 国内mba读出来有用吗