1避障小車簡介
這是一款基于OpenHarmony系統(tǒng)和小凌派-RK2206開發(fā)板的避障小車。同時,小車上搭載了超聲波測距模塊、舵機模塊、紅外尋跡模塊、直流電機模塊。
具體實驗成果展示如下:
2避障小車模塊介紹
小凌派-RK2206開發(fā)板的示意圖

小凌派配置了一個E53外接拓展口,這是E53接口的原理圖:

這是E53模塊的原理圖:

1. 直流電機模塊
直流電機模塊由E53模塊上的L9110S驅(qū)動芯片進行驅(qū)動。L9110S驅(qū)動芯片所引出的引腳對應接口的GPIO0_B7、GPIO0_B6,另一塊驅(qū)動芯片對應GPIO1_D0、GPIO0_A5。我們對相應的GPIO引腳進行初始化并設置為上拉模式。
//右直流電機 IA GPIO0_PB7PinctrlSet(GPIO0_PB7, MUX_FUNC0, PULL_UP, DRIVE_KEEP);LzGpioInit(GPIO0_PB7);//右直流電機 IB GPIO0_PB6PinctrlSet(GPIO0_PB6, MUX_FUNC0, PULL_UP, DRIVE_KEEP);LzGpioInit(GPIO0_PB6);//左直流電機 IB GPIO1_PD0PinctrlSet(GPIO1_PD0, MUX_FUNC0, PULL_UP, DRIVE_KEEP);LzGpioInit(GPIO1_PD0);//左直流電機 IA GPIO0_PA5PinctrlSet(GPIO0_PA5, MUX_FUNC0, PULL_UP, DRIVE_KEEP);LzGpioInit(GPIO0_PA5);
(左右移動查看全部內(nèi)容)
通過閱讀L9110S的芯片手冊可以得到以下真值表:

通過真值表,我們可以通過對IO口的輸出來控制直流電機的正轉(zhuǎn)、反轉(zhuǎn)還有停止:

2. 超聲波測距模塊
超聲波測距模塊用來計算出模塊到前方障礙物的距離。采用IO口TRIG觸發(fā)測距,給最少10us的高電平信號。模塊自動發(fā)送8個40khz的方波,自動檢測是否有信號返回;有信號返回,通過IO口ECHO輸出一個高電平,同時開定時器計時,當此口變?yōu)榈碗娖綍r就可以讀定時器的值,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。
模塊Trig對應引腳GPIO_B0,Echo對應引腳GPIO_B1,對這兩個引腳進行初始化
// Echo 超聲波傳感器PinctrlSet(GPIO0_PB1, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);LzGpioInit(GPIO0_PB1);LzGpioSetDir(GPIO0_PB1, LZGPIO_DIR_IN);// Trig 超聲波傳感器PinctrlSet(GPIO0_PB0, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);LzGpioInit(GPIO0_PB0);LzGpioSetDir(GPIO0_PB0, LZGPIO_DIR_OUT);LzGpioSetVal(GPIO0_PB0, LZGPIO_LEVEL_LOW);
(左右移動查看全部內(nèi)容)
觸發(fā)信號:
//通過Trig發(fā)送觸發(fā)信號LzGpioSetVal(GPIO0_PB0, LZGPIO_LEVEL_HIGH);HAL_DelayUs(20);LzGpioSetVal(GPIO0_PB0, LZGPIO_LEVEL_LOW);
(左右移動查看全部內(nèi)容)
獲取定時器計數(shù)器當前值:
while (1){LzGpioGetVal(GPIO_8, &value);//獲取上升沿的定時器計數(shù)器當前值if (value == LZGPIO_LEVEL_HIGH && flag == 0){m_echo_info.time_rise = *m_ptimer5_current_value_low;m_echo_info.flag = EECHO_FLAG_CAPTURE_FALL;flag = 1;}//獲取下降沿的定時器計數(shù)器當前值if (value == LZGPIO_LEVEL_LOW && flag == 1){m_echo_info.time_fall = *m_ptimer5_current_value_low;m_echo_info.flag = EECHO_FLAG_CAPTURE_SUCCESS;break;}}
(左右移動查看全部內(nèi)容)
上升沿和下降沿的節(jié)拍數(shù)差計算距離。其中,系統(tǒng)時鐘為40MHz,超聲波速度為340米/秒,高電平時間寬度為超聲波的往返之和,所以實際距離 = 節(jié)拍數(shù)差 / 40MHz / 340(米/秒) / 2(往返2次)。具體計算代碼如下:
if (m_echo_info.flag == EECHO_FLAG_CAPTURE_SUCCESS){/* 如果是采集成功,則計算距離 */if (m_echo_info.time_rise <= m_echo_info.time_fall){time_diff = m_echo_info.time_fall - m_echo_info.time_rise;}else{time_diff = 0xFFFFFFFF - m_echo_info.time_rise + m_echo_info.time_fall + 1;}}float f_time = (float)time_diff;float f_freq = (float)ECHO_TIMER_FREQ;distance = f_time / f_freq * 170.0 * 100.0;
(左右移動查看全部內(nèi)容)
3. 舵機模塊
舵機模塊用來控制超聲波測距模塊測量左右方向的距離,舵機引腳為GPIO0_B4,對GPIO0_B4進行初始化。
//舵機PinctrlSet(GPIO0_PB4, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);LzGpioInit(GPIO0_PB4);LzGpioSetDir(GPIO0_PB4, LZGPIO_DIR_OUT);
(左右移動查看全部內(nèi)容)
通過模擬PWM波讓舵機工作。具體代碼如下:
void set_angle(unsigned int duty){LzGpioSetDir(GPIO0_PB4, LZGPIO_DIR_OUT);LzGpioSetVal(GPIO0_PB4, LZGPIO_LEVEL_HIGH);HAL_DelayUs(duty);LzGpioSetVal(GPIO0_PB4, LZGPIO_LEVEL_LOW);HAL_DelayUs(20000 - duty);}
(左右移動查看全部內(nèi)容)
4. 紅外尋跡模塊
紅外尋跡模塊,在避障小車中的功能是防止小車意外掉落。紅外尋跡模塊與小凌派的GPIO0_A2、GPIO0_C4連接,對這兩個引腳進行初始化。
//初始化PA2 紅外傳感器PinctrlSet(GPIO0_PA2, MUX_FUNC0, PULL_UP, DRIVE_KEEP);LzGpioInit(GPIO0_PA2);LzGpioSetDir(GPIO0_PA2, LZGPIO_DIR_IN);LzGpioSetVal(GPIO0_PA2, LZGPIO_LEVEL_HIGH);//初始化PC7 紅外傳感器PinctrlSet(GPIO0_PC4, MUX_FUNC0, PULL_UP, DRIVE_KEEP);LzGpioInit(GPIO0_PC4);LzGpioSetDir(GPIO0_PC4, LZGPIO_DIR_IN);LzGpioSetVal(GPIO0_PC4, LZGPIO_LEVEL_HIGH);
(左右移動查看全部內(nèi)容)
3避障小車功能實現(xiàn)
通過小凌派開發(fā)板自帶的按鍵啟動小車的避障功能
void car_ Obstacle_avoidance(void){float m_distance = 0.0;regress_middle();/*獲取前方物體的距離*/m_distance = GetDistance();car_where_to_go(m_distance);osDelay(20);}
(左右移動查看全部內(nèi)容)
通過超聲波測距模塊測量前方距離來判斷小車接下來要運動的方向。若距離大于等于20cm繼續(xù)前進。若距離小于20cm,先停止再后退0.5s,再繼續(xù)進行測距,再進行判斷。通過兩個紅外尋跡傳感器可以防止小車掉落,當紅外傳感器輸出為高電平時,小車就會停止前進,并且重新尋找安全方向。
static void car_where_to_go(float distance){LzGpioValue io_status_left;LzGpioValue io_status_right;LzGpioGetVal(GPIO0_PA2, &io_status_left);LzGpioGetVal(GPIO0_PC4, &io_status_right);if (io_status_left == 0 || io_status_right == 0){if (io_status_left == 0 && io_status_right != 0){car_stop();LOS_Msleep(500);car_backward();LOS_Msleep(500);car_stop(); // meet wallcar_rightward();LOS_Msleep(800);car_stop(); // meet wall}else if (io_status_left != 0 && io_status_right == 0){car_stop();LOS_Msleep(500);car_backward();LOS_Msleep(500);car_stop(); // meet wallcar_leftward();LOS_Msleep(800);car_stop(); // meet wall}else if (io_status_left == 0 || io_status_right == 0){car_stop();car_backward();LOS_Msleep(500);car_stop(); // meet wall}}else if (distance < DISTANCE_BETWEEN_CAR_AND_OBSTACLE){car_stop();LOS_Msleep(500);car_backward();printf("This is backward ");LOS_Msleep(500);car_stop();unsigned int ret = engine_go_where();printf("ret is %d ", ret);if (ret == CAR_TURN_LEFT){car_left();LOS_Msleep(800);}else if (ret == CAR_TURN_RIGHT){car_right();LOS_Msleep(800);}car_stop();}else{car_forward();printf("This is forward ");}}
(左右移動查看全部內(nèi)容)
4心得體會
通過使用OpenHarmony操作系統(tǒng) + 小凌派-RK2206開發(fā)板來控制小車完成距離檢測、前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、判斷算法等功能,實現(xiàn)了避障小車的基本功能。經(jīng)過這一次實驗測試,加強我個人對OpenHarmony的理解,實在是一次不錯的學習體驗,特此記錄!
原文標題:基于搭載 OpenHarmony 避障小車心得體會
文章出處:【微信公眾號:HarmonyOS官方合作社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
-
開發(fā)板
+關注
關注
26文章
6288瀏覽量
118004 -
OpenHarmony
+關注
關注
33文章
3952瀏覽量
21089 -
RK2206
+關注
關注
0文章
38瀏覽量
2542 -
小凌派
+關注
關注
0文章
28瀏覽量
1623
原文標題:基于搭載 OpenHarmony 避障小車心得體會
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發(fā)燒友開源社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于OpenHarmony+小凌派RK2206開發(fā)板制作的簡易示波器
基于搭載 OpenHarmony 避障小車心得體會
輕量系統(tǒng)開發(fā)套件介紹:凌睿智捷 | 小凌派-RK2206 開發(fā)板套件
【小凌派RK2206開發(fā)板試用體驗】第2章 源碼編譯與固件下載
【小凌派RK2206開發(fā)板試用體驗】第3章 應用開發(fā)
小凌派-RK2206開發(fā)板:UART控制案例
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制ADC外設
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO外設
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制GPIO中斷
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制UART外設
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制FLASH外設
基于OpenHarmony系統(tǒng)和小凌派RK2206開發(fā)板的避障小車
評論