【背景描述】
出于業(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è)備管理也不用。
-
藍(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)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論