社区编辑申请
注册/登录
基于搭载OpenHarmony避障小车连接华为云心得体会
系统 OpenHarmony
这是一款基于OpenHarmony系统和RK2206小凌派开发板的避障小车。同时,小车搭载了超声波测距模块、舵机模块、红外寻迹模块、直流电机模块。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

一、前言

上次给大家展示了基于OpenHarmony的避障小车,我就在想能不能通过云端来控制小车的工作。正好小凌派板载了WIFI功能,小凌派官方例程中又有通过MQTT协议连接华为云的例程。在不断的尝试下,终于完成了通过华为云给小车下发工作命令的避障小车。戳链接看完整视频👉(https://ost.51cto.com/show/13049)

二、小车介绍

这是一款基于OpenHarmony系统和RK2206小凌派开发板的避障小车。同时,小车搭载了超声波测距模块、舵机模块、红外寻迹模块、直流电机模块。

图1 小车组装图

图2 小凌派开发板

三、华为云配置

在华为云中创建一个新的设备(图3),创建设备的设备密钥一定要牢记,后面要用到。

图3 创建完成界面

总体配置如图4所示。

图4 华为云总体配置

创建了一个“work”属性用来接收小车当前的工作状态(图5)。

图5 “work”参数

创建了两个命令“小车工作控制”(图6)和“小车人工控制”(图7)用来控制小车工作。其中,“小车工作控制”中有三个命令,分别是:ON(工作模式)、OFF(停止模式)、CONTROL(手动控制小车模式)。“小车人工控制”中有五个命令,分别是:STOP(停止)、FORWARD(直行)、TURNLEFT(左转)、TURNRIGHT(右转)、BCAKWARD(后退)。

图6 “小车工作控制”参数

图7 “小车人工控制”参数

四、小车配置

1、连接华为云

利用华为云iot工具(图8)将填写注册设备时生成的设备ID和设备密钥,生成连接信息(ClientId、Username、Password),并修改代码中对应的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和密匙,用于连接网络,设备通过WIFI访问华为云。

#define SSID       
#define PASSWORD

2、小车指令接收配置

从华为云向小车下发工作指令时,可以在设备调试窗口看到华为云发送消息的body信息。“service_id”为设备的服务ID,ID为“智能小车”; “command_name”为设备命令名称,命令为“小车工作控制”;“paras”为设备命令的执行参数,参数为{ “work”:“ON”}(图9)。

图9 华为云发送消息body信息

以下是处理华为云下发命令的部分代码:

obj_cmdname = cJSON_GetObjectItem(obj_root, "command_name");
if (obj_cmdname == NULL)
{
goto EXIT;
}
if (0 == strcmp(cJSON_GetStringValue(obj_cmdname), "小车工作控制"))
{
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), "小车人工控制"))
{
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、小车数据发送配置

小车连接上华为云后,每5秒会向华为云的发送当前小车的状态信息。”serviced”为设备的服务ID,ID为”智能小车”;”data”为设备数据,数据为{“work”:0}(图10)。

图10 小车向华为云发送状态信息

以下是小车上传数据到华为云的部分代码:

oc_mqtt_profile_service_t service;
oc_mqtt_profile_kv_t work;
service.event_time = NULL;
service.service_id = "智能小车";
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);

五、效果

给小车上电之后,等待小车连接华为云,可以看到小车向华为云发送消息。从视频中可以看到华为云接收到的消息为data:{“work”:0},说明小车刚上电后并没有工作。

现在通过华为云向小车下发工作命令。从视频中可以看到在小车的前方和左边都有障碍物。启动小车后小车会先直行,通过超声波传感器获取前方的距离,当距离小于20cm时,小车通过超声波传感器测量左右两边的距离,由于右边的距离比左边大,小车会向右转。从视频中可以看到,小车按照我们预想的方向行动,同时我们可以看到华为云接收到的消息为data:{“work”:1},说明小车现在正在工作。

以下是避障的部分代码:

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();
}

通过华为云下发命令,将小车的工作模式转换成控制模式,我们可以看到华为云接收到的消息为data:{“work”:2},说明小车的行动受我们控制。

  • 通过华为云向小车下发直行命令,可以看到小车直行。
  • 通过华为云向小车下发左转命令,可以看到小车左转。
  • 通过华为云向小车下发右转命令,可以看到小车右转。
  • 通过华为云向小车下发后退命令,可以看到小车后退。

六、心得体会

通过本次项目使用搭载OpenHarmony的小凌派RK2206开发板进行开发。小凌派官方教程简介清晰,便于入门。RK2206芯片接口比较丰富,移植适配稳定性较好,整体开发进度比较顺利。让我学习到了如何使用MQTT协议连接华为云去控制小车的工作。通过这一次的应用开发,体验了OpenHarmony和国产芯片开发,是一次不错的学习体验,特此记录![​​请添加链接描述​​]

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2022-04-15 14:31:02

鸿蒙操作系统

2022-05-11 15:08:52

驱动开发系统移植

2022-05-24 15:06:57

AbilityeTS FA鸿蒙

2022-04-18 10:37:01

鸿蒙操作系统开发工具

2022-04-12 12:06:49

智能小车Wi-Fi IoT鸿蒙

2022-06-15 16:16:21

分布式数据库鸿蒙

2022-06-09 14:40:14

系统移植鸿蒙

2022-06-07 10:33:29

Camera组件鸿蒙

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-06-16 13:44:27

华为云

2022-02-09 19:45:41

2022-06-13 14:18:39

电源管理子系统耗电量服务

2022-06-06 10:55:51

本地服务鸿蒙

2022-04-02 20:45:04

Hi3516开发板操作系统鸿蒙

2022-04-07 15:28:16

HarmonyOS鸿蒙操作系统

2022-05-23 10:45:34

DAYU200鸿蒙

2022-06-13 15:35:53

计算

2022-05-30 15:21:27

Hi3861TCP通信

2022-04-20 20:28:40

HDF 驱动框架鸿蒙操作系统

2022-04-07 14:33:31

操作系统鸿蒙HarmonyOS

同话题下的热门内容

OHOS构建自定义服务实战啃论文俱乐部—数据密集型应用内存压缩HarmonyOS - 自定义组件之计时器基于OpenHarmony3.1的购物车应用的实现HarmonyOS - 方舟开发框架ArkUI 流光按钮效果OpenHarmony3.1-Ace-Formcomponent源码解析HarmonyOS手机遥控Dayu开发板相机(一)华为智慧屏分布式语音音乐软件,可见即可说

编辑推荐

HarmonyOS 2.0鸿蒙第二期开发者Beta公测申请指南HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》鸿蒙HarmonyOS分布式软总线:构建低时延、高带宽的多设备虚拟网络华为HarmonyOS的强势突围: 直面物联网迷宫的蓄力进击鸿蒙HarmonyOS2.0发布会现场回忆录
我收藏的内容
点赞
收藏

51CTO技术栈公众号