一、前言
上次給大家展示了基于OpenHarmony的避障小車(chē),我就在想能不能通過(guò)云端來(lái)控制小車(chē)的工作。正好小凌派板載了WIFI功能,小凌派官方例程中又有通過(guò)MQTT協(xié)議連接華為云的例程。在不斷的嘗試下,終于完成了通過(guò)華為云給小車(chē)下發(fā)工作命令的避障小車(chē)。
二、小車(chē)介紹
這是一款基于OpenHarmony系統(tǒng)和RK2206小凌派開(kāi)發(fā)板的避障小車(chē)。同時(shí),小車(chē)搭載了超聲波測(cè)距模塊、舵機(jī)模塊、紅外尋跡模塊、直流電機(jī)模塊。
![]() |
圖1 小車(chē)組裝圖
?????????
圖2 小凌派開(kāi)發(fā)板
三、華為云配置
在華為云中創(chuàng)建一個(gè)新的設(shè)備(圖3),創(chuàng)建設(shè)備的設(shè)備密碼一定要牢記,后面要用到。
圖3 創(chuàng)建完成界面
總體配置如圖4所示。
圖4 華為云總體配置
創(chuàng)建了一個(gè)“work”屬性用來(lái)接收小車(chē)當(dāng)前的工作狀態(tài)(圖5)。
![]() |
圖5 “work”參數(shù)
![]() |
創(chuàng)建了兩個(gè)命令“小車(chē)工作控制”(圖6)和“小車(chē)人工控制”(圖7)用來(lái)控制小車(chē)工作。其中,“小車(chē)工作控制”中有三個(gè)命令,分別是:ON(工作模式)、OFF(停止模式)、CONTROL(手動(dòng)控制小車(chē)模式)。“小車(chē)人工控制”中有五個(gè)命令,分別是:STOP(停止)、FORWARD(直行)、TURNLEFT(左轉(zhuǎn))、TURNRIGHT(右轉(zhuǎn))、BCAKWARD(后退)。
圖6 “小車(chē)工作控制”參數(shù)
?????
圖7 “小車(chē)人工控制”參數(shù)
四、小車(chē)配置
1.小車(chē)連接華為云
利用華為云iot工具(圖8)將填寫(xiě)注冊(cè)設(shè)備時(shí)生成的設(shè)備ID和設(shè)備密鑰,生成連接信息(ClientId、Username、Password),并修改代碼中對(duì)應(yīng)的CLIENT_ID、USERNAME、PASSWORD。
圖8 華為云iot工具
將代碼中的CLIENT_ID、USERNAME和PASSWORD改為生成的ClientId、Username和Password。
#define CLIENT_ID
#define USERNAME
#define PASSWORD
修改/device/rockchip/rk2206/sdk_liteos/board/src/config_network.c代碼中的SSID和PASSWORD為使用WIFI的SSID和密匙,用于連接網(wǎng)絡(luò),設(shè)備通過(guò)WIFI訪問(wèn)華為云。
#define SSID
#define PASSWORD
2.小車(chē)指令接收配置
![]() |
從華為云向小車(chē)下發(fā)工作指令時(shí),可以在設(shè)備調(diào)試窗口看到華為云發(fā)送消息的body信息。“service_id”為設(shè)備的服務(wù)ID,ID為“智能小車(chē)”;“command_name”為設(shè)備命令名稱(chēng),命令為“小車(chē)工作控制”;“paras”為設(shè)備命令的執(zhí)行參數(shù),參數(shù)為{ “work”:“ON”}(圖9)。
圖9 華為云發(fā)送消息body信息
以下是處理華為云下發(fā)命令的部分代碼:
obj_cmdname = cJSON_GetObjectItem(obj_root, "command_name");
if (obj_cmdname == NULL)
{
goto EXIT;
}
if (0 == strcmp(cJSON_GetStringValue(obj_cmdname), "小車(chē)工作控制"))
{
obj_paras = cJSON_GetObjectItem(obj_root, "paras");
if (obj_paras == NULL)
{
goto EXIT;
}
obj_para = cJSON_GetObjectItem(obj_paras, "work");
if (obj_para == NULL)
{
goto EXIT;
}
if (0 == strcmp(cJSON_GetStringValue(obj_para), "ON"))
{
m_app_status.work = 1;
g_car_status = CAR_TRACE_STATUS;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_para), "OFF"))
{
m_app_status.work = 0;
g_car_status = CAR_STOP_STATUS;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_para), "CONTROL"))
{
m_app_status.work = 2;
g_car_status = CAR_MANUAL_OPERATION_STATUS;
}
cmdret = 0;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_cmdname), "小車(chē)人工控制"))
{
obj_paras = cJSON_GetObjectItem(obj_root, "paras");
if (obj_paras == NULL)
{
goto EXIT;
}
obj_para = cJSON_GetObjectItem(obj_paras, "control");
if (obj_para == NULL)
{
goto EXIT;
}
if (0 == strcmp(cJSON_GetStringValue(obj_para), "STOP"))
{
g_car_control = CAR_STOP;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_para), "FORWARD"))
{
g_car_control = CAR_FORWARD;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_para), "TURNLEFT"))
{
g_car_control = CAR_TURNLEFT;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_para), "TURNRIGHT"))
{
g_car_control = CAR_TURNRIGHT;
}
else if (0 == strcmp(cJSON_GetStringValue(obj_para), "BCAKWARD"))
{
g_car_control = CAR_BCAKWARD;
}
cmdret = 0;
}
3.小車(chē)數(shù)據(jù)發(fā)送配置
![]() |
小車(chē)連接上華為云后,每5秒會(huì)向華為云的發(fā)送當(dāng)前小車(chē)的狀態(tài)信息。”serviced”為設(shè)備的服務(wù)ID,ID為”智能小車(chē)”;”data”為設(shè)備數(shù)據(jù),數(shù)據(jù)為{“work”:0}(圖10)。
圖10 小車(chē)向華為云發(fā)送狀態(tài)信息
以下是小車(chē)上傳數(shù)據(jù)到華為云的部分代碼:
oc_mqtt_profile_service_t service;
oc_mqtt_profile_kv_t work;
service.event_time = NULL;
service.service_id = "智能小車(chē)";
service.service_property = &work;
service.nxt = NULL;
work.key = "Work";
work.value = &report->work;
work.type = EN_OC_MQTT_PROFILE_VALUE_INT;
work.nxt = NULL;
oc_mqtt_profile_propertyreport(USERNAME, &service);
五、效果
給小車(chē)上電之后,等待小車(chē)連接華為云,可以看到小車(chē)向華為云發(fā)送消息。從視頻中可以看到華為云接收到的消息為data:{“work”:0},說(shuō)明小車(chē)剛上電后并沒(méi)有工作。
現(xiàn)在通過(guò)華為云向小車(chē)下發(fā)工作命令。從視頻中可以看到在小車(chē)的前方和左邊都有障礙物。啟動(dòng)小車(chē)后小車(chē)會(huì)先直行,通過(guò)超聲波傳感器獲取前方的距離,當(dāng)距離小于20cm時(shí),小車(chē)通過(guò)超聲波傳感器測(cè)量左右兩邊的距離,由于右邊的距離比左邊大,小車(chē)會(huì)向右轉(zhuǎn)。從視頻中可以看到,小車(chē)按照我們預(yù)想的方向行動(dòng),同時(shí)我們可以看到華為云接收到的消息為data:{“work”:1},說(shuō)明小車(chē)現(xiàn)在正在工作。
以下是避障的部分代碼:
if (distance < DISTANCE_BETWEEN_CAR_AND_OBSTACLE)
{
car_stop();
LOS_Msleep(500);
car_backward();
printf("This is backward\r\n");
LOS_Msleep(500);
car_stop();
unsigned int ret = engine_go_where();
printf("ret is %d\r\n", ret);
if (ret == CAR_TURN_LEFT)
{
car_left();
LOS_Msleep(800);
}
else if (ret == CAR_TURN_RIGHT)
{
car_right();
LOS_Msleep(800);
}
car_stop();
}
通過(guò)華為云下發(fā)命令,將小車(chē)的工作模式轉(zhuǎn)換成控制模式,我們可以看到華為云接收到的消息為data:{“work”:2},說(shuō)明小車(chē)的行動(dòng)受我們控制。
通過(guò)華為云向小車(chē)下發(fā)直行命令,可以看到小車(chē)直行。
通過(guò)華為云向小車(chē)下發(fā)左轉(zhuǎn)命令,可以看到小車(chē)左轉(zhuǎn)。
通過(guò)華為云向小車(chē)下發(fā)右轉(zhuǎn)命令,可以看到小車(chē)右轉(zhuǎn)。
通過(guò)華為云向小車(chē)下發(fā)后退命令,可以看到小車(chē)后退。
六、心得體會(huì)
通過(guò)本次項(xiàng)目使用搭載OpenHarmony的小凌派RK2206開(kāi)發(fā)板進(jìn)行開(kāi)發(fā)。小凌派官方教程簡(jiǎn)介清晰,便于入門(mén)。RK2206芯片接口比較豐富,移植適配穩(wěn)定性較好,整體開(kāi)發(fā)進(jìn)度比較順利。讓我學(xué)習(xí)到了如何使用MQTT協(xié)議連接華為云去控制小車(chē)的工作。通過(guò)這一次的應(yīng)用開(kāi)發(fā),體驗(yàn)了OpenHarmony和國(guó)產(chǎn)芯片開(kāi)發(fā),是一次不錯(cuò)的學(xué)習(xí)體驗(yàn),特此記錄!
-
OpenHarmony
+關(guān)注
關(guān)注
26文章
3820瀏覽量
18102
發(fā)布評(píng)論請(qǐng)先 登錄
AGV機(jī)器人如何實(shí)現(xiàn)毫秒級(jí)避障?深度解析多傳感器融合的核心技術(shù)

【硬核項(xiàng)目】STM32F103 智能小車(chē)全棧開(kāi)發(fā):紅外循跡 / 避障算法 + WiFi 遠(yuǎn)程控制,附原理圖與代碼

肇觀電子兩款無(wú)人機(jī)視覺(jué)避障模組量產(chǎn)交付
云平臺(tái)連接(SC171開(kāi)發(fā)套件V3)
【零基礎(chǔ)逆襲軟硬件工程師】華清遠(yuǎn)見(jiàn)STM32F103智能小車(chē)開(kāi)發(fā)實(shí)戰(zhàn),手把手帶你從硬件組裝到WiFi遠(yuǎn)程控制,解鎖

潤(rùn)和的Hi3861開(kāi)發(fā)版如何連接華為云
潤(rùn)和的Hi3861開(kāi)發(fā)板如何連接華為云
INDEMIND:AI視覺(jué)賦能服務(wù)機(jī)器人,“零”碰撞避障技術(shù)實(shí)現(xiàn)全天候安全

云電腦 華為,云電腦 華為好用嗎,云電腦搭建工具怎么連接

AG32開(kāi)發(fā)板使用的幾點(diǎn)心得體會(huì)
機(jī)智云開(kāi)源自動(dòng)化控制篇-避障式舵機(jī)轉(zhuǎn)向系統(tǒng)

第七章-V1.5 STM32超聲波測(cè)距STM32F103C8t6超聲波避障小車(chē) 超聲波避障模塊 STM32超聲波測(cè)距

第六章-V1.5 STM32 ADC讀取電壓 ADC采樣電壓 STM32f103c8t6adc采集電壓

智行者——視聽(tīng)障礙者出行輔助AI小車(chē)設(shè)計(jì)

評(píng)論