1避障小車(chē)簡(jiǎn)介
這是一款基于OpenHarmony系統(tǒng)和小凌派-RK2206開(kāi)發(fā)板的避障小車(chē)。同時(shí),小車(chē)上搭載了超聲波測(cè)距模塊、舵機(jī)模塊、紅外尋跡模塊、直流電機(jī)模塊。
具體實(shí)驗(yàn)成果展示如下:
2避障小車(chē)模塊介紹
小凌派-RK2206開(kāi)發(fā)板的示意圖
小凌派配置了一個(gè)E53外接拓展口,這是E53接口的原理圖:
這是E53模塊的原理圖:
1. 直流電機(jī)模塊
直流電機(jī)模塊由E53模塊上的L9110S驅(qū)動(dòng)芯片進(jìn)行驅(qū)動(dòng)。L9110S驅(qū)動(dòng)芯片所引出的引腳對(duì)應(yīng)接口的GPIO0_B7、GPIO0_B6,另一塊驅(qū)動(dòng)芯片對(duì)應(yīng)GPIO1_D0、GPIO0_A5。我們對(duì)相應(yīng)的GPIO引腳進(jìn)行初始化并設(shè)置為上拉模式。
//右直流電機(jī) IA GPIO0_PB7
PinctrlSet(GPIO0_PB7, MUX_FUNC0, PULL_UP, DRIVE_KEEP);
LzGpioInit(GPIO0_PB7);
//右直流電機(jī) IB GPIO0_PB6
PinctrlSet(GPIO0_PB6, MUX_FUNC0, PULL_UP, DRIVE_KEEP);
LzGpioInit(GPIO0_PB6);
//左直流電機(jī) IB GPIO1_PD0
PinctrlSet(GPIO1_PD0, MUX_FUNC0, PULL_UP, DRIVE_KEEP);
LzGpioInit(GPIO1_PD0);
//左直流電機(jī) IA GPIO0_PA5
PinctrlSet(GPIO0_PA5, MUX_FUNC0, PULL_UP, DRIVE_KEEP);
LzGpioInit(GPIO0_PA5);
(左右移動(dòng)查看全部?jī)?nèi)容)
通過(guò)閱讀L9110S的芯片手冊(cè)可以得到以下真值表:
通過(guò)真值表,我們可以通過(guò)對(duì)IO口的輸出來(lái)控制直流電機(jī)的正轉(zhuǎn)、反轉(zhuǎn)還有停止:
2. 超聲波測(cè)距模塊
超聲波測(cè)距模塊用來(lái)計(jì)算出模塊到前方障礙物的距離。采用IO口TRIG觸發(fā)測(cè)距,給最少10us的高電平信號(hào)。模塊自動(dòng)發(fā)送8個(gè)40khz的方波,自動(dòng)檢測(cè)是否有信號(hào)返回;有信號(hào)返回,通過(guò)IO口ECHO輸出一個(gè)高電平,同時(shí)開(kāi)定時(shí)器計(jì)時(shí),當(dāng)此口變?yōu)榈碗娖綍r(shí)就可以讀定時(shí)器的值,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。
模塊Trig對(duì)應(yīng)引腳GPIO_B0,Echo對(duì)應(yīng)引腳GPIO_B1,對(duì)這兩個(gè)引腳進(jìn)行初始化
// 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);
(左右移動(dòng)查看全部?jī)?nèi)容)
觸發(fā)信號(hào):
//通過(guò)Trig發(fā)送觸發(fā)信號(hào)
LzGpioSetVal(GPIO0_PB0, LZGPIO_LEVEL_HIGH);
HAL_DelayUs(20);
LzGpioSetVal(GPIO0_PB0, LZGPIO_LEVEL_LOW);
(左右移動(dòng)查看全部?jī)?nèi)容)
獲取定時(shí)器計(jì)數(shù)器當(dāng)前值:
while (1)
{
LzGpioGetVal(GPIO_8, &value);
//獲取上升沿的定時(shí)器計(jì)數(shù)器當(dāng)前值
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í)器計(jì)數(shù)器當(dāng)前值
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;
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
上升沿和下降沿的節(jié)拍數(shù)差計(jì)算距離。其中,系統(tǒng)時(shí)鐘為40MHz,超聲波速度為340米/秒,高電平時(shí)間寬度為超聲波的往返之和,所以實(shí)際距離 = 節(jié)拍數(shù)差 / 40MHz / 340(米/秒) / 2(往返2次)。具體計(jì)算代碼如下:
if (m_echo_info.flag == EECHO_FLAG_CAPTURE_SUCCESS)
{/* 如果是采集成功,則計(jì)算距離 */
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;
(左右移動(dòng)查看全部?jī)?nèi)容)
3. 舵機(jī)模塊
舵機(jī)模塊用來(lái)控制超聲波測(cè)距模塊測(cè)量左右方向的距離,舵機(jī)引腳為GPIO0_B4,對(duì)GPIO0_B4進(jìn)行初始化。
//舵機(jī)
PinctrlSet(GPIO0_PB4, MUX_FUNC0, PULL_KEEP, DRIVE_KEEP);
LzGpioInit(GPIO0_PB4);
LzGpioSetDir(GPIO0_PB4, LZGPIO_DIR_OUT);
(左右移動(dòng)查看全部?jī)?nèi)容)
通過(guò)模擬PWM波讓舵機(jī)工作。具體代碼如下:
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);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
4. 紅外尋跡模塊
紅外尋跡模塊,在避障小車(chē)中的功能是防止小車(chē)意外掉落。紅外尋跡模塊與小凌派的GPIO0_A2、GPIO0_C4連接,對(duì)這兩個(gè)引腳進(jìn)行初始化。
//初始化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);
(左右移動(dòng)查看全部?jī)?nèi)容)
3避障小車(chē)功能實(shí)現(xiàn)
通過(guò)小凌派開(kāi)發(fā)板自帶的按鍵啟動(dòng)小車(chē)的避障功能
void car_ Obstacle_avoidance(void)
{
float m_distance = 0.0;
regress_middle();
/*獲取前方物體的距離*/
m_distance = GetDistance();
car_where_to_go(m_distance);
osDelay(20);
}
(左右移動(dòng)查看全部?jī)?nèi)容)
通過(guò)超聲波測(cè)距模塊測(cè)量前方距離來(lái)判斷小車(chē)接下來(lái)要運(yùn)動(dòng)的方向。若距離大于等于20cm繼續(xù)前進(jìn)。若距離小于20cm,先停止再后退0.5s,再繼續(xù)進(jìn)行測(cè)距,再進(jìn)行判斷。通過(guò)兩個(gè)紅外尋跡傳感器可以防止小車(chē)掉落,當(dāng)紅外傳感器輸出為高電平時(shí),小車(chē)就會(huì)停止前進(jìn),并且重新尋找安全方向。
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 wall
car_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 wall
car_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 ");
}
}
(左右移動(dòng)查看全部?jī)?nèi)容)
4心得體會(huì)
通過(guò)使用OpenHarmony操作系統(tǒng) + 小凌派-RK2206開(kāi)發(fā)板來(lái)控制小車(chē)完成距離檢測(cè)、前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、判斷算法等功能,實(shí)現(xiàn)了避障小車(chē)的基本功能。經(jīng)過(guò)這一次實(shí)驗(yàn)測(cè)試,加強(qiáng)我個(gè)人對(duì)OpenHarmony的理解,實(shí)在是一次不錯(cuò)的學(xué)習(xí)體驗(yàn),特此記錄!
原文標(biāo)題:基于搭載 OpenHarmony 避障小車(chē)心得體會(huì)
文章出處:【微信公眾號(hào):HarmonyOS官方合作社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5121瀏覽量
97988 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3744瀏覽量
16491 -
RK2206
+關(guān)注
關(guān)注
0文章
34瀏覽量
1814 -
小凌派
+關(guān)注
關(guān)注
0文章
27瀏覽量
1229
原文標(biāo)題:基于搭載 OpenHarmony 避障小車(chē)心得體會(huì)
文章出處:【微信號(hào):HarmonyOS_Community,微信公眾號(hào):電子發(fā)燒友開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于OpenHarmony+小凌派RK2206開(kāi)發(fā)板制作的簡(jiǎn)易示波器
小凌派RK2206鴻蒙開(kāi)發(fā)板新品首發(fā)試用
基于搭載 OpenHarmony 避障小車(chē)心得體會(huì)
輕量系統(tǒng)開(kāi)發(fā)套件介紹:凌睿智捷 | 小凌派-RK2206 開(kāi)發(fā)板套件
【小凌派RK2206開(kāi)發(fā)板試用體驗(yàn)】2、開(kāi)箱及hello
【小凌派RK2206開(kāi)發(fā)板試用體驗(yàn)】第2章 源碼編譯與固件下載
【小凌派RK2206開(kāi)發(fā)板試用體驗(yàn)】第3章 應(yīng)用開(kāi)發(fā)
【小凌派RK2206開(kāi)發(fā)板試用體驗(yàn)】二運(yùn)行
【小凌派RK2206開(kāi)發(fā)板試用體驗(yàn)】OpenHarmony華為云IoT應(yīng)用開(kāi)發(fā)-智慧井蓋
RK2206開(kāi)發(fā)板搭載OpenHarmony操作系統(tǒng)簡(jiǎn)介
小凌派RK2206開(kāi)發(fā)板順利通過(guò)開(kāi)放原子開(kāi)源基金會(huì)XTS認(rèn)證
![小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開(kāi)發(fā)板</b>順利通過(guò)開(kāi)放原子開(kāi)源基金會(huì)XTS認(rèn)證](https://file.elecfans.com//web2/M00/37/5F/poYBAGI69ASANg9sAACERL8OvJ8977.jpg)
基于小凌派RK2206開(kāi)發(fā)板所制作的簡(jiǎn)易示波器
![基于小<b class='flag-5'>凌</b><b class='flag-5'>派</b><b class='flag-5'>RK2206</b><b class='flag-5'>開(kāi)發(fā)板</b>所制作的簡(jiǎn)易示波器](https://file.elecfans.com//web2/M00/41/32/pYYBAGJ05dqAOJeBAAGBvZ-n1mA255.png)
凌智電子:小凌派-RK2206開(kāi)發(fā)板順利通過(guò)開(kāi)放原子開(kāi)源基金會(huì)兼容性測(cè)評(píng)
![<b class='flag-5'>凌</b>智電子:小<b class='flag-5'>凌</b><b class='flag-5'>派</b>-<b class='flag-5'>RK2206</b><b class='flag-5'>開(kāi)發(fā)板</b>順利通過(guò)開(kāi)放原子開(kāi)源基金會(huì)兼容性測(cè)評(píng)](https://file.elecfans.com/web2/M00/37/65/pYYBAGI69KeAVVx0AAt_urtAmL4932.png)
基于搭載OpenHarmony避障小車(chē)連接華為云心得體會(huì)
![基于搭載<b class='flag-5'>OpenHarmony</b><b class='flag-5'>避</b><b class='flag-5'>障</b><b class='flag-5'>小車(chē)</b>連接華為云心得體會(huì)](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
小凌派-RK2206開(kāi)發(fā)板:UART控制案例
![小<b class='flag-5'>凌</b><b class='flag-5'>派</b>-<b class='flag-5'>RK2206</b><b class='flag-5'>開(kāi)發(fā)板</b>:UART控制案例](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
評(píng)論