0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教你輕松DIY藍(lán)牙遙控平衡小車

lPCU_elecfans ? 來源:未知 ? 作者:李倩 ? 2018-07-31 11:44 ? 次閱讀

【背景描述】

出于業(yè)余愛好,以及學(xué)習(xí)自動(dòng)化控制PID理論,經(jīng)過多種選擇后決定制作平衡車進(jìn)行實(shí)際操練。剛開始試著用單純的裸機(jī),完成直立控制,然后慢慢的又增加了屏幕顯示,用于參數(shù)調(diào)整顯示,再然后用藍(lán)牙透?jìng)鬟M(jìn)行串口遙控,并且增加用遙控器進(jìn)行PID參數(shù)調(diào)增。增加這些功能以后,再進(jìn)一步逐漸的增加功能,就需要進(jìn)行在多任務(wù)的時(shí)間調(diào)配上進(jìn)行更嚴(yán)格分配,每增加一個(gè)功能,都需要重新調(diào)整在這個(gè)上面花費(fèi)了不少時(shí)間。

例如,在屏幕的顯示上,由于需要較多時(shí)間進(jìn)行數(shù)據(jù)端口模擬,耗費(fèi)大量時(shí)間,如果需要增加多個(gè)參數(shù)顯示,相應(yīng)的屏幕程序就需要更多時(shí)間,就會(huì)改變整個(gè)程序的時(shí)間分配,平衡車直立控制就會(huì)不穩(wěn)定,難與調(diào)試。由于上面的困擾,并且之前2010年的時(shí)候一個(gè)偶然機(jī)會(huì)了解到了RT-Thread實(shí)時(shí)操作系統(tǒng),決定試著用操作系統(tǒng)的理念進(jìn)行編寫,可以省去在裸機(jī)調(diào)試時(shí)間分配的困擾。由于裸機(jī)我用了STM32F103C8T6芯片只有64KB,我本人懶于修改硬件,嘗試修剪RTT,用盡可能少的組件,手動(dòng)的把3.0.4版本去掉外圍,只用內(nèi)核。

在內(nèi)核上把平衡車的控制分為直立控制、藍(lán)牙控制、屏幕控制、以及原來的LED控制,后續(xù)增加超聲波,指南模塊等。盡可能使用現(xiàn)成的元件搭建起實(shí)物原型,然后再不斷增加功能,從擴(kuò)充的過程中完成控制理論的學(xué)習(xí)和對(duì)實(shí)時(shí)操作系統(tǒng)的掌握。由于有限的代碼空間也進(jìn)一步鍛煉代碼的精簡(jiǎn)訓(xùn)練。

【開發(fā)環(huán)境】

主控:STM32F103C8T6

編譯環(huán)境:MDK5.23

RT-Thread版本:RT-Thread 3.0.4內(nèi)核

【硬件設(shè)計(jì)】

電池:用的是圓柱鋰電池??梢灾苯佑贸潆妼毨锩娴匿囯姵?,外加三串保護(hù)板。做成12V鋰電。

主控板:最小系統(tǒng)板

電機(jī)驅(qū)動(dòng)模塊: 利用了里面的5V電源

LCD模塊:12684

電機(jī):

電機(jī)用的GB37電機(jī),是一款使用霍爾傳感器編碼器的測(cè)速模塊,配有13 線強(qiáng)磁碼盤,A B 雙相輸出共同利用下,通過計(jì)算可得出車輪轉(zhuǎn)一圈時(shí),脈沖數(shù)可達(dá)30132=780 個(gè),單相也可以達(dá)到390 個(gè),精度足夠能讓平衡小車無所不能。

其實(shí)霍爾編碼器還是不夠精確的,會(huì)在快速轉(zhuǎn)動(dòng)的時(shí)候漏掉編碼,為此我調(diào)試了很久。

遙控器用組成:ARDUINO2560+joystick+hc05藍(lán)牙組成。

超聲波模塊:

三軸傳感器:MPU6050

硬件系統(tǒng)用搭模塊的方式組成,之間的連接可以全部用杜邦線連接。

電路原理圖由于手工需要的時(shí)候接上去的,沒有畫,其實(shí)完全可以自己動(dòng)手手動(dòng)連接一下。

總的功能原理圖如下:

原理功能圖,用的是老圖了?;径际沁@個(gè)原理。器件上,陀螺儀用的是MPU6050。主控:STM32F103CT8最小系統(tǒng)板。

【軟件設(shè)計(jì)】

工程概覽:

線程初始化:

主要線程定義:

小車控制線程

藍(lán)牙遙控協(xié)議解析:

超聲波線程:

目前代碼優(yōu)化不夠,還很多用全局變量傳遞參數(shù)。

器件驅(qū)動(dòng)(參考部分開源代碼)->直立控制->速度控制->方向控制->無線藍(lán)牙控制(含遙控對(duì)控制參數(shù)的調(diào)整)

【關(guān)鍵代碼解析】

我所做的不同是,角度用的是PI控制、速度用PID、方向用了PI,我在角度、速度、方向上都加進(jìn)了PID控制。程序代碼難理解的部分也是PID部分。后期會(huì)在進(jìn)一步改進(jìn)中模糊控制相應(yīng)的PID控制參數(shù)。根據(jù)不同速度、角度判斷是否進(jìn)行積分。這是最耗費(fèi)時(shí)間的。例如目前小車碰到障礙物時(shí),無法前進(jìn),速度的積分控制在這時(shí)應(yīng)當(dāng)停止,目前還未做改進(jìn)。

以下是控制直立的關(guān)鍵代碼。保證每5毫米執(zhí)行一次,完成角度采集,角度控制,方向控制,速度控制的周期。

int car_run(void) { float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f; unsigned char more=0; long quat[4];// unsigned long sensor_timestamp=0; float Pitch; // short gyro[3], accel[3], sensors;// int stop=0; float angle_out,speed_out,direction_out; float car_zero_angle=-1.78; // static int run_err=0; char numf[20]; dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors, &more); if ((sensors & INV_WXYZ_QUAT))//&&(more<10) ? ?{ ? ? ? ? ? q0=quat[0] / q30; ? ? ? ? ? q1=quat[1] / q30; ? ? ? ? ? q2=quat[2] / q30; ? ? ? ? ? q3=quat[3] / q30; ? ? ? ? ? ? ? ? ? ? ? Pitch ?= asin(2 * q1 * q3 - 2 * q0* q2)* 57.3; ? ? ? ? ? sprintf(numf,"A:%2.3f*",Pitch); ? ? ? ? ? sping_english8x8(0 , 2 ,numf) ; ? ? ? if (Pitch>20||Pitch<-20) stop = 1; ? ? ? ? ? angle_out = AngleControl(Pitch,gyro[1],car_zero_angle,stop); ? ? ? ? ? velocity_proc(&speed_out,&direction_out,speed_set,direction_set,stop); ? ? ? ? ? ? ? ? ? MotorOutput(angle_out,speed_out,direction_out,stop); ? } ? ? else ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ?if ((sensors & INV_WXYZ_QUAT)&&(more==0))run_err++; ? ? ? ? ? ? ?} ?return run_err; }

Rt_thread由于資源限制,僅僅用了內(nèi)核部分,利用了內(nèi)核的線程調(diào)度功能,共創(chuàng)建了三個(gè)線程。關(guān)鍵點(diǎn)是在于三個(gè)線程的優(yōu)先級(jí)別設(shè)置,這也是在設(shè)計(jì)平衡車對(duì)實(shí)時(shí)要求的一種體現(xiàn)。最關(guān)鍵的是車的平衡,設(shè)置為最高優(yōu)先級(jí),并且MPU6050的硬件要求5MS進(jìn)行一次讀數(shù)據(jù)??臻e時(shí)間之外可以進(jìn)行藍(lán)牙串口傳輸?shù)慕馕龉ぷ鳎堰b控指令傳給速度控制進(jìn)程。

/* init hxlcd thread */ init_thread = rt_thread_create("hxlcd", hxlcd_thread_entry,RT_NULL,256, 15, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); /* init car control thread */ init_thread = rt_thread_create("car_run", car_control_thread,RT_NULL, 512, 10, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread); /* init car Protocol thread */ init_thread = rt_thread_create("car_Pro", car_Protocol_thread, RT_NULL,2024, 11, 20); if (init_thread != RT_NULL) rt_thread_startup(init_thread);

【RT-Thread使用情況介紹】

該小車僅僅使用了RT-Thread內(nèi)核,原本打算使用設(shè)備管理,但是編譯后發(fā)現(xiàn)代碼量大了后決定設(shè)備管理也不用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 藍(lán)牙
    +關(guān)注

    關(guān)注

    114

    文章

    5683

    瀏覽量

    168065
  • 平衡小車
    +關(guān)注

    關(guān)注

    1

    文章

    39

    瀏覽量

    12473

原文標(biāo)題:一文教你輕松DIY藍(lán)牙遙控平衡小車——周四RTOS專欄

文章出處:【微信號(hào):elecfans,微信公眾號(hào):電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    DIY 制作藍(lán)牙遙控小車

    `大學(xué)畢業(yè)后,就利用業(yè)余時(shí)間做一個(gè)藍(lán)牙遙控小車,就在網(wǎng)上找資料及購(gòu)買配件。用STC89S52單片機(jī)控制小車, LN298電機(jī)驅(qū)動(dòng)模塊驅(qū)動(dòng)小車
    發(fā)表于 05-05 22:53

    藍(lán)牙平衡小車

    藍(lán)牙控制兩輪平衡小車
    發(fā)表于 06-09 10:54

    自己diy的自平衡小車玩具

    參照飛思卡爾智能車的方案,diy了一臺(tái)兩輪自平衡小車,小車上電后能停在一點(diǎn)不動(dòng),收到干擾可以自動(dòng)平衡。另外我發(fā)現(xiàn),配合速度環(huán),即使重心不在
    發(fā)表于 04-19 12:39

    小蛋黃派迷你自平衡小車

    `中秋期間做好的硬件,小車+遙控器;看到網(wǎng)上有位大神做的蛋黃派自平衡小車,很喜歡很可愛;就DIY了這個(gè),硬件做好了,軟件我頭疼了,依據(jù)硬件需
    發(fā)表于 09-09 00:07

    STM32主控紅外遙控雙輪平衡小車設(shè)計(jì)

    我的STM32主控紅外遙控雙輪平衡小車 (2015-05-28 17:38:27)[編輯][刪除]轉(zhuǎn)載▼ 我的紅外遙控雙輪平衡
    發(fā)表于 08-17 09:26

    最簡(jiǎn)單DIY的51藍(lán)牙遙控小車設(shè)計(jì)方案是什么

    51單片機(jī)物聯(lián)網(wǎng)智能小車系列文章目錄第一篇:最簡(jiǎn)單DIY的51藍(lán)牙遙控小車設(shè)計(jì)方案文章目錄51單片機(jī)物聯(lián)網(wǎng)智能
    發(fā)表于 12-01 08:13

    如何通過手機(jī)APP和藍(lán)牙模塊實(shí)現(xiàn)對(duì)平衡小車的控制

    ??大家好,我是小政。本篇文章我將針對(duì)藍(lán)牙遙控平衡小車進(jìn)行詳細(xì)的講解,讓每位小伙伴能夠通過手機(jī)APP和藍(lán)牙模塊實(shí)現(xiàn)對(duì)
    發(fā)表于 01-21 10:14

    教你怎樣去挑選藍(lán)牙遙控小車的元器件

    教你怎樣去挑選藍(lán)牙遙控小車的元器件
    發(fā)表于 03-01 06:45

    藍(lán)牙遙控小車教程

    遙控小車教程,你可以點(diǎn)擊打開學(xué)習(xí),有程序,藍(lán)牙控制。
    發(fā)表于 06-03 16:16 ?0次下載

    DIY:iPhone變身遙控小車

    DIY:iPhone變身遙控小車
    發(fā)表于 01-12 22:41 ?21次下載

    藍(lán)牙遙控小車程序

    藍(lán)牙遙控小車程序
    發(fā)表于 03-31 17:42 ?32次下載

    圖文結(jié)合DIY制作遙控火車

    如何完成自制遙控火車?本文提供詳細(xì)的圖文教程,教你一步步DIY制作遙控火車頭模型。下面將會(huì)介紹自制遙控火車的主要材料,讓你
    的頭像 發(fā)表于 01-18 18:38 ?7551次閱讀
    圖文結(jié)合<b class='flag-5'>DIY</b>制作<b class='flag-5'>遙控</b>火車

    基于單片機(jī)的藍(lán)牙小車藍(lán)牙遙控的程序

    基于單片機(jī)的藍(lán)牙小車藍(lán)牙遙控
    發(fā)表于 06-05 10:00 ?95次下載
    基于單片機(jī)的<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>小車</b>帶<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>遙控</b>的程序

    最簡(jiǎn)單DIY的51藍(lán)牙遙控小車設(shè)計(jì)方案

    51單片機(jī)物聯(lián)網(wǎng)智能小車系列文章目錄第一篇:最簡(jiǎn)單DIY的51藍(lán)牙遙控小車設(shè)計(jì)方案文章目錄51單片機(jī)物聯(lián)網(wǎng)智能
    發(fā)表于 11-23 16:22 ?41次下載
    最簡(jiǎn)單<b class='flag-5'>DIY</b>的51<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>遙控</b><b class='flag-5'>小車</b>設(shè)計(jì)方案

    第14章-藍(lán)牙遙控小車 藍(lán)牙串口通訊講解藍(lán)牙APP遙控小車 藍(lán)牙串口通訊講解

    第14章-藍(lán)牙遙控小車 手把手做藍(lán)牙APP遙控小車 藍(lán)牙
    的頭像 發(fā)表于 08-21 16:24 ?248次閱讀
    第14章-<b class='flag-5'>藍(lán)牙</b><b class='flag-5'>遙控</b><b class='flag-5'>小車</b> <b class='flag-5'>藍(lán)牙</b>串口通訊講解<b class='flag-5'>藍(lán)牙</b>APP<b class='flag-5'>遙控</b><b class='flag-5'>小車</b> <b class='flag-5'>藍(lán)牙</b>串口通訊講解