1@page auto_demo 智能小车:用钉钉小程序通过HaaS100控制驱动电机示例 2 3[更正文档](https://gitee.com/alios-things/auto_demo/edit/master/README.md)      [贡献说明](https://help.aliyun.com/document_detail/302301.html) 4 5# 1. 案例简介 6阿里在云栖大会上发布第一款机器人“小蛮驴”,瞬间激起千层浪。 7无人车,智能物流,机器人等一些概念又火热了一把。 8借“小蛮驴”的东风以及火热的HaaS,我们推出了更加亲民的“小小蛮驴”,丰富HaaS的场景打造,吸引更多的开发者和企业来加入HaaS的生态建设。 9 10<div align=left display=flex> 11 <img src="https://img.alicdn.com/imgextra/i4/O1CN015lnEkx1YPrSlCgbt1_!!6000000003052-2-tps-1494-836.png" style="max-width:800px;" /> 12</div> 13 14# 2. 基础知识 15## 2.1 HaaS100开发板 16**HaaS100** 是一款物联网场景中的标准开发板,并配套嵌入到硬件中的软件驱动及功能模块,为用户提供物联网设备高效开发服务。 17 18<div align=left display=flex> 19 <img src="https://img.alicdn.com/imgextra/i2/O1CN014x98oj1VvVzSI77gV_!!6000000002715-2-tps-443-443.png" style="max-width:800px;" /> 20</div> 21 22HaaS100核心板有着丰富的外设接口,如下所示: 23 24<div align=left display=flex> 25 <img src="https://img.alicdn.com/imgextra/i2/O1CN01AkNnOF1Xjj1eTBpQC_!!6000000002960-2-tps-586-886.png" style="max-width:800px;" /> 26</div> 27 28详细的资料参考[HaaS 100 硬件规格](https://help.aliyun.com/document_detail/184186.html?spm=a2c4g.11186623.6.645.718015814zDYZt)。 29## 2.2 驱动电机 30驱动电机芯片是小车最重要的模块之一,2A的强大输出电流为小车提供满满的动力。 31在驱动模块接口的定义中包括: 32IN1和IN2是控制小车的左电机,IN3和IN4是控制小车的右电机,ENA和ENB引脚为输出使能管脚,高电平有效,IN1、IN2、IN3和IN4可以通过PWM脉冲调速。 33**电机控制:** 34IN1高电平,IN2低电平,左电机正传; 35IN1低电平,IN2高电平,左电机反传; 36IN3高电平,IN4低电平,右电机正传; 37IN3低电平,IN4高电平,右电机反传。 38## 2.3 超声波测距模块 39 40<div align=left display=flex> 41 <img src="https://img.alicdn.com/imgextra/i3/O1CN01AtDCHG1RGyT25beU1_!!6000000002085-2-tps-306-224.png" style="max-width:800px;" /> 42</div> 43 44超声波测距一般有4个管脚: 45GND:接公共地 46VCC:供5V电源 47Trigger:触发控制,信号输入引脚 48Echo:回响信号输出引脚 49超声波测距原理是当发送的超声波遇到物体被发射回来,被接收端接收,然后通过发送信号到接收到回响的信号时间间隔可以测算出距离。 50 51<div align=left display=flex> 52 <img src="https://img.alicdn.com/imgextra/i4/O1CN01HlxSHP1uPmwqZNECA_!!6000000006030-2-tps-529-301.png" style="max-width:800px;" /> 53</div> 54 55测距过程如下:HaaS100给Trigger引脚至少10uS的脉冲触发信号,这时候超声波模块发射8个40KHz的方波,然后模块自动检测是否有信号返回。若检测到回响信号,会通过Echo引脚输出一个高电平脉冲,脉冲的宽度就是超声波从发射到返回的时间t。假设小车距离障碍物距离L,2L=vt,L=vt/2,其中v声音的传播速度340m/s。 56## 2.4 红外避障模块 57 58<div align=left display=flex> 59 <img src="https://img.alicdn.com/imgextra/i2/O1CN01mnq7sM1VcHM2MvPg1_!!6000000002673-2-tps-357-287.png" style="max-width:800px;" /> 60</div> 61 62红外避障原理就是当障碍物靠近的时候,红外接收到的发射光强度越来越大,所以增大了输出的模拟信号,模拟信号接入比较器,经过比较器处理,输出数字信号。读取数字信号电平,就可以判断前方是否有障碍物。 63## 2.5 测速模块 64 65<div align=left display=flex> 66 <img src="https://img.alicdn.com/imgextra/i3/O1CN01hD5RKK23hUnn3dVj7_!!6000000007287-2-tps-211-190.png" style="max-width:800px;" /> 67</div> 68 69测速模块主要原理是由码盘结合光电传感器,传感器一端为发射光,另一端接收光,通过测量单位时间内脉冲个数得出小车的速度,本模块采用施密特触发器输出的信号非常稳定( 去抖)。 70 71# 3. 物料清单 72 73<div align=left display=flex> 74 <img src="https://img.alicdn.com/imgextra/i4/O1CN01GKC2T91ypfnRGftsi_!!6000000006628-2-tps-1432-660.png" style="max-width:800px;" /> 75</div> 76 77**智能车底板电路** 78 79- 红外接收头子,实现红外遥控小车 80- 5V电源稳压芯片 81- 电机驱动芯片,电流可达2A,为小车提供强大的动力 82- 电源指示灯 83- 保护二极管 84 85**其他丰富接口** 86 87- 电机接口 88- 超声波模块接口 89- 舵机模块接口 90- 测速模块接口 91- 红外避障模块接口 92- 电池座接口 93- HaaS连接接口 94| **物料** | **规格** | **购买链接** | 95| :---: | :---: | :---: | 96| HaaS100开发板 | - | 阿里云[天猫链接](https://detail.tmall.com/item.htm?spm=a230r.1.14.16.13123b209835rz&id=627354125244&ns=1&abbucket=16) | 97| 智能车套件 | 提供完整一套小车配件,结合HaaS100,可以实现云端钉控制 | 微雪[微雪链接](https://www.waveshare.net/shop/AlphaBot.htm) | 98 99# 4. 案例实现 100本案例实现了小车模型中的电机控制部分,其他模块部分开发者可以自己研究摸索。 101## 4.1 硬件连接 102| **驱动电机接口** | **HaaS100** | **I/O模式** | 103| :---: | :---: | :---: | 104| **IN1** | **GPIO47** | **O** | 105| **IN2** | **GPIO40** | **O** | 106| **ENA** | **GPIO24** | **O** | 107| **IN3** | **GPIO26** | **O** | 108| **IN4** | **GPIO46** | **O** | 109| **ENB** | **GPIO25** | **O** | 110 111## 4.2 软件设计 112### 4.2.1 云端创建产品 113参考[《一步步打造能手机远程管理的HaaS花卉养植系统》](https://blog.csdn.net/HaaSTech/article/details/110505659)等系列文章,一步步在物联网平台创建产品、对应的物模型以及设备。也可以通过载入[TSL文件](https://github.com/alibaba/AliOS-Things/blob/dev_3.1.0_haas/application/miniapp/pages/HaasCar/HaasCar.TSL.json),一键生成物模型。 114创建了HaaS电动车的产品名称,然后定义了前进、后退、暂停、左转、右转等物模型属性。 115 116<div align=left display=flex> 117 <img src="https://img.alicdn.com/imgextra/i3/O1CN01tNoBdP1mKjeNiQT66_!!6000000004936-2-tps-2620-1624.png" style="max-width:800px;" /> 118</div> 119 120按照一步步操作,云端创建产品、物模型以及设备以后,我们可以获取对应的三元组信息。 121### 4.2.2 设备端代码 1221、 配置初始化 123HaaS100设备端电动小车参考代码的路径在:/solution/auto_demo/data_model_basic_demo.c下。 124从物联网云平台创建的产品时候,可以获取调试设备的三元组信息。如下所示: 125```c 126//三元组信息初始化 127int demo_main(int argc, char *argv[]) 128{ 129 int32_t res = STATE_SUCCESS; 130 void *dm_handle = NULL; 131 void *mqtt_handle = NULL; 132 char *url = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; /* 阿里云平台上海站点的域名后缀 */ 133 char host[100] = {0}; /* 用这个数组拼接设备连接的云平台站点全地址, 规则是 ${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com */ 134 uint16_t port = 443; /* 无论设备是否使用TLS连接阿里云平台, 目的端口都是443 */ 135 aiot_sysdep_network_cred_t cred; /* 安全凭据结构体, 如果要用TLS, 这个结构体中配置CA证书等参数 */ 136 137 /* TODO: 替换为自己设备的三元组 */ 138 char *product_key = "产品key"; 139 char *device_name = "设备名"; 140 char *device_secret = "设备密钥"; 141 142 ... 143 144 /* 主循环进入休眠 */ 145 while (1) { 146 aos_msleep(1000); 147 } 148} 149``` 1502、对驱动电机芯片控制引脚配置 151参考代码的路径在:/solution/auto_demo/auto_drv.c下 152```c 153int auto_gpio_init(void) 154{ 155 int ret = 0; 156 157 temp_gpio.port = IN1_PIN; 158 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP; 159 hal_gpio_init(&temp_gpio); 160 temp_gpio.port = IN2_PIN; 161 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP; 162 hal_gpio_init(&temp_gpio); 163 temp_gpio.port = IN3_PIN; 164 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP; 165 hal_gpio_init(&temp_gpio); 166 temp_gpio.port = IN4_PIN; 167 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP; 168 hal_gpio_init(&temp_gpio); 169 170 temp_gpio.port = ENA_PIN; 171 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP; 172 hal_gpio_init(&temp_gpio); 173 temp_gpio.port = ENB_PIN; 174 temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP; 175 hal_gpio_init(&temp_gpio); 176 177 //gpio open 178 fd = open("/dev/gpio", 0); 179 printf("open gpio %s, fd:%d\r\n", fd >= 0 ? "success" : "fail", fd); 180 181 GPIO_Set(ENA_PORT,1); 182 GPIO_Set(ENB_PORT,1); 183 stop_ctl(); 184 185 aos_cli_register_command(&haas_cmd); 186 return ret; 187} 188``` 1893、接收云端控制命令 190接受处理云端的控制命令,包括后退、左转、右转、停止、前进等。 191参考代码的路径在:/solution/auto_demo/data_model_basic_demo.c下 192```c 193static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata) 194{ 195 uint8_t i; 196 printf("demo_dm_recv_handler, type = %d\r\n", recv->type); 197 198 switch (recv->type) { 199 /* 云端下发的属性设置 */ 200 case AIOT_DMRECV_PROPERTY_SET: { 201 printf("msg_id = %ld, params = %.*s\r\n", 202 (unsigned long)recv->data.property_set.msg_id, 203 recv->data.property_set.params_len, 204 recv->data.property_set.params); 205 206 char *auto_temp[5]={"back","left","right","stop","front"}; 207 cJSON *root = cJSON_Parse(recv->data.property_set.params); 208 for(i = 0 ;i<5 ;i++){ 209 cJSON *value = cJSON_GetObjectItem(root,auto_temp[i]); 210 if (value != NULL && cJSON_IsNumber(value)) { 211 printf("%s is find!\r\n",auto_temp[i]); 212 break; 213 } 214 } 215 switch(i){ 216 case 0: 217 back_ctl(); //后退 218 printf("---back\r\n"); 219 break; 220 221 case 1: 222 left_ctl(); //左转 223 printf("---left\r\n"); 224 break; 225 226 case 2: 227 right_ctl(); //右转 228 printf("---right\r\n"); 229 break; 230 231 case 3: 232 stop_ctl(); //停止 233 printf("---stop\r\n"); 234 break; 235 236 case 4: 237 front_ctl(); //前进 238 printf("---front\r\n"); 239 break; 240 241 default: 242 break; 243 } 244 } 245 break; 246 247 .... 248 249 default: 250 break; 251 } 252} 253 254``` 255### 4.2.3 小程序开发 2561、 云端钉一体小程序SDK获取 257``` 258git clone -b dev_3.1.0_haas https://github.com/alibaba/AliOS-Things.git 259``` 260SDK相关代码及操作readme在application/miniapp/目录下。 2612、 SDK目录结构 262 263```sh 264. 265├─ lib (存放依赖库的文件夹,用户无需关心) 266│ ├─ @alicloud/pop-core ([https://github.com/aliyun/openapi-core-nodejs-sdk](https://github.com/aliyun/openapi-core-nodejs-sdk)) 267│ ├─ kitx 268│ └─ iot-packet.js (封装给用户的文件) 269├─ pages (页面文件夹,用户在这里自定义页面,示例持续更新中) 270│ └─ index (首页 选择进入不同示例) 271│ ├─ index.axml 272│ ├─ index.js 273│ ├─ index.acss 274│ └─ index.json 275│ └─ HaasCar (示例1 HaaS小小蛮驴) 276│ ├─ HaasCar.axml (页面布局文件) 277│ ├─ HaasCar.js (控制逻辑,用户在这里定义交互行为) 278│ ├─ HaasCar.acss (页面样式) 279│ ├─ HaasCar.json (页面配置,用于配置页面标题等) 280│ └─ HaasCar.TSL.json (示例对应的TSL文件,用户可以在物联网平台上导入该文件生成物模型) 281│ └─ HaasFlower (示例2 HaaS养花,目录结构同 HaasCar) 282├─ app.js (注册小程序,在这里进行全局参数配置,如 AccessKey) 283├─ app.acss (小程序全局样式) 284├─ app.json (小程序全局配置,可以在这里设置小程序打开的默认页面) 285└─ others 286``` 287 2883、 SDK使用 289使用小程序开发工具打开miniapp这个工程。 290 291<div align=left display=flex> 292 <img src="https://img.alicdn.com/imgextra/i3/O1CN01NUP1qt1IDvHvjuES2_!!6000000000860-2-tps-2144-1236.png" style="max-width:800px;" /> 293</div> 294 295- step1 在app.js填写 AccessKeyID 以及 AccessKeySecret , 获取云端API调用权限 296- step2 填写目标设备 DeviceName 以及 ProductKey,这里是待控制的设备 297 298```javascript 299// app.js 300let accessKey = { 301 accessKeyId: '<- accessKeyId ->', // 填入阿里云平台生成的 assessKeyId 以及 Secret 302 accessKeySecret: '<- accessKeySecret ->', 303} 304 305// HaasCar.js 306let device = { 307 DeviceName: '<- DeviceName ->', // 填入目标设备 DeviceName 以及 ProductKey 308 ProductKey: '<- ProductKey ->' 309} 310``` 311 312 313代码中提到的几个关键参数: 314 315- AccessKeyID AccessKeySecret 316 317云账号AccessKey是用户访问阿里云API的密钥。([https://usercenter.console.aliyun.com/#/manage/ak](https://usercenter.console.aliyun.com/#/manage/ak)) 318安全起见,我们可以采取创建[RAM子账号](https://ram.console.aliyun.com/users)的形式,来对权限进行分离。 319 320<div align=left display=flex> 321 <img src="https://img.alicdn.com/imgextra/i2/O1CN01hm2IH61lWoTqkAotr_!!6000000004827-2-tps-3584-732.png" style="max-width:800px;" /> 322</div> 323 324创建完成后,需要手动分配权限,点击右侧,添加权限。我这里直接选择了 **AdministratorAccess。 **添加完成后如下。 325 326<div align=left display=flex> 327 <img src="https://img.alicdn.com/imgextra/i4/O1CN01CdYh1g1WuQfLoiQ6r_!!6000000002848-2-tps-3584-1920.png" style="max-width:800px;" /> 328</div> 329 330- DeviceName ProducKey 331 332这两个参数在[创建设备](#jSkOe)时生成。 3334、 编译验证 334点击小程序IDE右上角“真机调试”按钮,等待二维码生成后,使用钉钉APP扫码,即可发起小程序。 335 336<div align=left display=flex> 337 <img src="https://img.alicdn.com/imgextra/i4/O1CN01PebvC71ZoQJrKF3yG_!!6000000003241-2-tps-948-156.png" style="max-width:800px;" /> 338</div> 339 340<div align=left display=flex> 341 <img src="https://img.alicdn.com/imgextra/i2/O1CN01kBLGwa1HGqBzof2CS_!!6000000000731-2-tps-338-678.png" style="max-width:800px;" /> 342</div> 343 344## 4.3 开发环境搭建、编译、烧入、运行 345### 4.3.1 AliOS Things开发环境搭建 346开发环境的搭建请参考[《AliOS Things集成开发环境使用说明之搭建开发环境》](https://help.aliyun.com/document_detail/302378.html),其中详细的介绍了AliOS Things 3.3的IDE集成开发环境的搭建流程。 347 348### 4.3.2 电动小车代码下载 349智能语音播放器的代码下载请参考 [《AliOS Things集成开发环境使用说明之创建工程》](https://help.aliyun.com/document_detail/302379.html),其中, 350> 选择解决方案: “电动小车案例” 351> 选择开发板: HaaS100 352 353### 4.3.3 代码编译、烧录 354 355编译auto_demo的过程如下: 356 357-- 编译固件可参考[《AliOS Things集成开发环境使用说明之编译固件》](https://help.aliyun.com/document_detail/302384.html)。 358 359-- 烧录固件可参考[《AliOS Things集成开发环境使用说明之烧录固件》](https://help.aliyun.com/document_detail/302383.html)。 360 361 362### 4.3.4 运行 363运行打印信息 364 365<div align=left display=flex> 366 <img src="https://img.alicdn.com/imgextra/i3/O1CN013jSfJZ1ZvkeoMIXXa_!!6000000003257-2-tps-1836-1224.png" style="max-width:800px;" /> 367</div> 368 369# 5. 总结 370这么丰富详细的操作步骤,开发者朋友是不是也用了1小时就打造出自己的小小蛮驴电动小车了呢^_^ 371 372 373我相信有上面这么详细的一步步说明,大家都自己独立完成了电动小车的打造,并且实现了云端钉控制。大家以此为出发点,挖掘越多有意思的智能硬件,通过借助HaaS这样丰富的生态,让很多不智能的设备也很容易的智能化起来。 374