飞道的博客

1小时打造HaaS版小小蛮驴智能车

160人阅读  评论(0)

前言

2020年云栖大会上,阿里云发布了一款机器人“小蛮驴”,瞬间激起千层浪,无人车,智能物流,机器人等一些概念又火热了一把。

借“小蛮驴”的东风以及火热的HaaS,我们推出了更加亲民的“小小蛮驴”,丰富HaaS的场景打造,全面开放的云、端、钉示例也能助力开发者学习全链路知识,吸引更多的开发者和企业来加入HaaS的生态建设。

 

1、认识一下小小蛮驴真面目

1.1、组件部分

HaaS100核心板

HaaS100是一款物联网场景中的标准硬件,并配套嵌入到硬件中的软件驱动及功能模块,为用户提供物联网设备高效开发服务。

HaaS100核心板有着丰富的外设接口,如下所示:

详细的资料参考HaaS100 硬件规格

智能车底板电路

  • 红外接收头子,实现红外遥控小车
  • 5V电源稳压芯片
  • 电机驱动芯片,电流可达2A,为小车提供强大的动力
  • 电源指示灯
  • 保护二极管

其他丰富接口

  • 电机接口
  • 超声波模块接口
  • 舵机模块接口
  • 测速模块接口
  • 红外避障模块接口
  • 电池座接口
  • HaaS连接接口

1.2、重要模块介绍

1.2.1、驱动电机

驱动电机芯片是小车最重要的模块之一,2A的强大输出电流为小车提供满满的动力。

驱动模块的接口定义

接口

HaaS100

模式

IN1

GPIO47

O

IN2

GPIO40

O

ENA

GPIO24

O

IN3

GPIO26

O

IN4

GPIO46

O

ENB

GPIO25

O

其中,IN1和IN2是控制小车的左电机,IN3和IN4是控制小车的右电机,ENA和ENB引脚为输出使能管脚,高电平有效,IN1、IN2、IN3和IN4可以通过PWM脉冲调速。

电机控制:

IN1高电平,IN2低电平,左电机正传;

IN1低电平,IN2高电平,左电机反传;

IN3高电平,IN4低电平,右电机正传;

IN3低电平,IN4高电平,右电机反传。

1.2.2、超声波测距模块

超声波测距一般有4个管脚:

GND:接公共地

VCC:供5V电源

Trigger:触发控制,信号输入引脚

Echo:回响信号输出引脚

超声波测距原理是当发送的超声波遇到物体被发射回来,被接收端接收,然后通过发送信号到接收到回响的信号时间间隔可以测算出距离。

测距过程如下:HaaS100给Trigger引脚至少10uS的脉冲触发信号,这时候超声波模块发射8个40KHz的方波,然后模块自动检测是否有信号返回。若检测到回响信号,会通过Echo引脚输出一个高电平脉冲,脉冲的宽度就是超声波从发射到返回的时间t。假设小车距离障碍物距离L,2L=vt,L=vt/2,其中v声音的传播速度340m/s。

1.2.3、红外避障模块

红外避障原理就是当障碍物靠近的时候,红外接收到的发射光强度越来越大,所以增大了输出的模拟信号,模拟信号接入比较器,经过比较器处理,输出数字信号。读取数字信号电平,就可以判断前方是否有障碍物。

1.2.4、测速模块

测速模块主要原理是由码盘结合光电传感器,传感器一端为发射光,另一端接收光,通过测量单位时间内脉冲个数得出小车的速度,本模块采用施密特触发器输出的信号非常稳定( 去抖)。

 

2、云端小小蛮驴产品创建

参考基于《一步步打造能手机远程管理的HaaS花卉养植系统》系列文章,一步步在物联网平台创建产品、对应的物模型以及设备。也可以通过载入TSL文件,一键生成物模型。

 

2.1、云端产品创建展示

创建了HaaS电动车的产品名称,然后定义了前进、后退、暂停、左转、右转等物模型属性。

按照一步步操作,云端创建产品、物模型以及设备以后,我们可以获取对应的四元组信息。

 

3、HaaS电动小车软件开发

3.1、配置初始化

HaaS100设备端电动小车参考代码的路径在:/application/example/auto_demo下。

从物联网云平台创建的产品时候,可以获取调试设备的四元组信息。如下所示:


  
  1. //四元组信息初始化
  2. #define PRODUCT_KEY "*******"
  3. #define PRODUCT_SECRET "*******"
  4. #define DEVICE_NAME "*******"
  5. #define DEVICE_SECRET "*******"

对驱动电机芯片控制引脚配置


  
  1. int auto_gpio_init(void)
  2. {
  3. temp_gpio.port = IN1_PIN;
  4. temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
  5. hal_gpio_init(&temp_gpio);
  6. temp_gpio.port = IN2_PIN;
  7. temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
  8. hal_gpio_init(&temp_gpio);
  9. temp_gpio.port = IN3_PIN;
  10. temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
  11. hal_gpio_init(&temp_gpio);
  12. temp_gpio.port = IN4_PIN;
  13. temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
  14. hal_gpio_init(&temp_gpio);
  15. temp_gpio.port = ENA_PIN;
  16. temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
  17. hal_gpio_init(&temp_gpio);
  18. temp_gpio.port = ENB_PIN;
  19. temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;
  20. hal_gpio_init(&temp_gpio);
  21. GPIO_Set(ENA_PORT, 1); //使能驱动电机左
  22. GPIO_Set(ENB_PORT, 1); //使能驱动电机右
  23. stop_ctl();
  24. }

3.2、接收云端控制命令

接受处理云端的控制命令,包括后退、左转、右转、停止、前进等。


  
  1. char *auto_temp[ 5]={ "back", "left", "right", "stop", "front"};
  2. static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
  3. {
  4. int res = 0;
  5. char i = 0,*auto_c;
  6. cJSON *root = cJSON_Parse(request)
  7. for(i= 0;i< 5;i++){
  8. auto_c = auto_temp[i];
  9. cJSON *value = cJSON_GetObjectItem(root,auto_c);
  10. if (value == NULL || !cJSON_IsNumber(value)) {
  11. EXAMPLE_TRACE( "not find %d",i);
  12. }
  13. else{
  14. goto hass_send;
  15. }
  16. }
  17. cJSON_Delete(root);
  18. if(i == 5){
  19. EXAMPLE_TRACE( "not find %d",i);
  20. return -1;
  21. }
  22. hass_send:
  23. switch(i){
  24. case 0:
  25. back_ctl();
  26. EXAMPLE_TRACE( "---back");
  27. break;
  28. case 1:
  29. left_ctl();
  30. EXAMPLE_TRACE( "---left");
  31. break;
  32. case 2:
  33. right_ctl();
  34. EXAMPLE_TRACE( "---right");
  35. break;
  36. case 3:
  37. stop_ctl();
  38. EXAMPLE_TRACE( "---stop");
  39. break;
  40. case 4:
  41. front_ctl();
  42. EXAMPLE_TRACE( "---front");
  43. break;
  44. default:
  45. break;
  46. }
  47. res = IOT_Linkkit_Report(EXAMPLE_MASTER_DEVID, ITM_MSG_POST_PROPERTY,
  48. ( unsigned char *)request, request_len);
  49. return 0;
  50. }

 

3.3、HaaS电动车小程序开发

3.3.1、云端钉一体小程序SDK获取

git clone -b dev_3.1.0_haas https://github.com/alibaba/AliOS-Things.git

SDK相关代码及操作readme在application/miniapp/目录下。

3.3.2、SDK目录结构


  
  1. /
  2. ├─ lib (存放依赖库的文件夹,用户无需关心)
  3. │ ├─ @alicloud/pop-core (https://github.com/aliyun/openapi-core-nodejs-sdk)
  4. │ ├─ kitx
  5. │ └─ iot-packet.js (封装给用户的文件)
  6. ├─ pages (页面文件夹,用户在这里自定义页面,示例持续更新中)
  7. │ └─ index (首页 选择进入不同示例)
  8. │ ├─ index.axml
  9. │ ├─ index.js
  10. │ ├─ index.acss
  11. │ └─ index.json
  12. │ └─ HaasCar (示例1 HaaS小小蛮驴)
  13. │ ├─ HaasCar.axml (页面布局文件)
  14. │ ├─ HaasCar.js (控制逻辑,用户在这里定义交互行为)
  15. │ ├─ HaasCar.acss (页面样式)
  16. │ ├─ HaasCar.json (页面配置,用于配置页面标题等)
  17. │ └─ HaasCar.TSL.json (示例对应的TSL文件,用户可以在物联网平台上导入该文件生成物模型)
  18. │ └─ HaasFlower (示例2 HaaS养花,目录结构同 HaasCar)
  19. ├─ app.js (注册小程序,在这里进行全局参数配置,如 AccessKey)
  20. ├─ app.acss (小程序全局样式)
  21. ├─ app.json (小程序全局配置,可以在这里设置小程序打开的默认页面)
  22. └─ others

3.3.3、SDK使用

使用小程序开发工具打开miniapp这个工程。

  • step1 在app.js填写AccessKeyID 以及 AccessKeySecret , 获取云端API调用权限
  • step2 填写目标设备 DeviceName 以及 ProductKey,这里是待控制的设备

  
  1. // app.js
  2. let accessKey = {
  3. accessKeyId: '<- accessKeyId ->', // 填入阿里云平台生成的 assessKeyId 以及 Secret
  4. accessKeySecret: '<- accessKeySecret ->',
  5. }
  6. // HaasCar.js
  7. let device = {
  8. DeviceName: '<- DeviceName ->', // 填入目标设备 DeviceName 以及 ProductKey
  9. ProductKey: '<- ProductKey ->'
  10. }

代码中提到的几个关键参数:

  • AccessKeyID AccessKeySecret

云账号AccessKey是用户访问阿里云API的密钥。(https://usercenter.console.aliyun.com/#/manage/ak

安全起见,我们可以采取创建RAM子账号的形式,来对权限进行分离

创建完成后,需要手动分配权限,点击右侧,添加权限。我这里直接选择了 AdministratorAccess。 添加完成后如下。

  • DeviceName ProducKey

这两个参数在创建设备时生成。

3.3.4、编译验证

点击小程序IDE右上角“真机调试”按钮,等待二维码生成后,使用钉钉APP扫码,即可发起小程序。

 

3.4、效果展示

 

4、开发者技术支持

如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号

更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/


转载:https://blog.csdn.net/HaaSTech/article/details/111466507
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场