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

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

1. 案例简介

阿里在云栖大会上发布第一款机器人“小蛮驴”,瞬间激起千层浪。
无人车,智能物流,机器人等一些概念又火热了一把。
借“小蛮驴”的东风以及火热的HaaS,我们推出了更加亲民的“小小蛮驴”,丰富HaaS的场景打造,吸引更多的开发者和企业来加入HaaS的生态建设。

2. 基础知识

2.1 HaaS100开发板

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

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

详细的资料参考HaaS 100 硬件规格

2.2 驱动电机

驱动电机芯片是小车最重要的模块之一,2A的强大输出电流为小车提供满满的动力。
在驱动模块接口的定义中包括:
IN1和IN2是控制小车的左电机,IN3和IN4是控制小车的右电机,ENA和ENB引脚为输出使能管脚,高电平有效,IN1、IN2、IN3和IN4可以通过PWM脉冲调速。
电机控制:
IN1高电平,IN2低电平,左电机正传;
IN1低电平,IN2高电平,左电机反传;
IN3高电平,IN4低电平,右电机正传;
IN3低电平,IN4高电平,右电机反传。

2.3 超声波测距模块

超声波测距一般有4个管脚:
GND:接公共地
VCC:供5V电源
Trigger:触发控制,信号输入引脚
Echo:回响信号输出引脚
超声波测距原理是当发送的超声波遇到物体被发射回来,被接收端接收,然后通过发送信号到接收到回响的信号时间间隔可以测算出距离。

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

2.4 红外避障模块

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

2.5 测速模块

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

3. 物料清单

智能车底板电路

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

其他丰富接口

  • 电机接口
  • 超声波模块接口
  • 舵机模块接口
  • 测速模块接口
  • 红外避障模块接口
  • 电池座接口
  • HaaS连接接口
    | 物料 | 规格 | 购买链接 |
    | :—: | :—: | :—: |
    | HaaS100开发板 |
    | 阿里云天猫链接 |
    | 智能车套件 | 提供完整一套小车配件,结合HaaS100,可以实现云端钉控制 | 微雪微雪链接 |

4. 案例实现

本案例实现了小车模型中的电机控制部分,其他模块部分开发者可以自己研究摸索。

4.1 硬件连接

驱动电机接口 HaaS100 I/O模式
IN1 GPIO47 O
IN2 GPIO40 O
ENA GPIO24 O
IN3 GPIO26 O
IN4 GPIO46 O
ENB GPIO25 O

4.2 软件设计

4.2.1 云端创建产品

一步步在物联网平台创建产品、对应的物模型以及设备。也可以通过载入TSL文件,一键生成物模型。
创建了HaaS电动车的产品名称,然后定义了前进、后退、暂停、左转、右转等物模型属性。

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

4.2.2 设备端代码

1、 配置初始化
HaaS100设备端电动小车参考代码的路径在:/solution/auto_demo/data_model_basic_demo.c下。
从物联网云平台创建的产品时候,可以获取调试设备的三元组信息。如下所示:

//三元组信息初始化 int demo_main(int argc, char *argv[]) {    int32_t     res = STATE_SUCCESS;    void       *dm_handle = NULL;    void       *mqtt_handle = NULL;    char       *url = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; /* 阿里云平台上海站点的域名后缀 */    char        host[100] = {0}; /* 用这个数组拼接设备连接的云平台站点全地址, 规则是 ${productKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com */    uint16_t    port = 443;      /* 无论设备是否使用TLS连接阿里云平台, 目的端口都是443 */    aiot_sysdep_network_cred_t cred; /* 安全凭据结构体, 如果要用TLS, 这个结构体中配置CA证书等参数 */    /* TODO: 替换为自己设备的三元组 */    char *product_key       = "产品key";    char *device_name       = "设备名";    char *device_secret     = "设备密钥";        ...        /* 主循环进入休眠 */    while (1) {        aos_msleep(1000);    } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2、对驱动电机芯片控制引脚配置
参考代码的路径在:/solution/auto_demo/auto_drv.c下

int auto_gpio_init(void) {    int ret = 0;    temp_gpio.port = IN1_PIN;    temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;    hal_gpio_init(&temp_gpio);    temp_gpio.port = IN2_PIN;    temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;    hal_gpio_init(&temp_gpio);    temp_gpio.port = IN3_PIN;    temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;    hal_gpio_init(&temp_gpio);    temp_gpio.port = IN4_PIN;    temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;    hal_gpio_init(&temp_gpio);    temp_gpio.port = ENA_PIN;    temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;    hal_gpio_init(&temp_gpio);    temp_gpio.port = ENB_PIN;    temp_gpio.config = OUTPUT_OPEN_DRAIN_PULL_UP;    hal_gpio_init(&temp_gpio);    //gpio open    fd = open("/dev/gpio", 0);    printf("open gpio %s, fd:%d\r\n", fd >= 0 ? "success" : "fail", fd);    GPIO_Set(ENA_PORT,1);    GPIO_Set(ENB_PORT,1);    stop_ctl();    aos_cli_register_command(&haas_cmd);    return ret; }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

3、接收云端控制命令
接受处理云端的控制命令,包括后退、左转、右转、停止、前进等。
参考代码的路径在:/solution/auto_demo/data_model_basic_demo.c下

static void demo_dm_recv_handler(void *dm_handle, const aiot_dm_recv_t *recv, void *userdata) {    uint8_t i;    printf("demo_dm_recv_handler, type = %d\r\n", recv->type);    switch (recv->type) {        /* 云端下发的属性设置 */        case AIOT_DMRECV_PROPERTY_SET: {            printf("msg_id = %ld, params = %.*s\r\n",                   (unsigned long)recv->data.property_set.msg_id,                   recv->data.property_set.params_len,                   recv->data.property_set.params);                        char *auto_temp[5]={"back","left","right","stop","front"};            cJSON *root = cJSON_Parse(recv->data.property_set.params);            for(i = 0 ;i<5 ;i++){                cJSON *value = cJSON_GetObjectItem(root,auto_temp[i]);                if (value != NULL && cJSON_IsNumber(value)) {                    printf("%s is find!\r\n",auto_temp[i]);                      break;                      }            }            switch(i){                case 0:                    back_ctl(); //后退                    printf("---back\r\n");                break;                case 1:                    left_ctl(); //左转                    printf("---left\r\n");                break;                case 2:                    right_ctl(); //右转                    printf("---right\r\n");                break;                case 3:                    stop_ctl(); //停止                    printf("---stop\r\n");                break;                case 4:                    front_ctl(); //前进                    printf("---front\r\n");                break;                default:                    break;            }        }        break;                        ....                        default:            break;    } }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

4.2.3 小程序开发

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

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

  • 1

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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

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

// app.js let accessKey = {  accessKeyId: '<- accessKeyId ->', // 填入阿里云平台生成的 assessKeyId 以及 Secret  accessKeySecret: '<- accessKeySecret ->', } // HaasCar.js let device = {  DeviceName: '<- DeviceName ->',   // 填入目标设备 DeviceName 以及 ProductKey  ProductKey: '<- ProductKey ->' }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

  • AccessKeyID AccessKeySecret

云账号AccessKey是用户访问阿里云API的密钥。(https://usercenter.console.aliyun.com/#/manage/ak
安全起见,我们可以采取创建RAM子账号的形式,来对权限进行分离。

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

  • DeviceName ProducKey

这两个参数在创建设备时生成。
4、 编译验证
点击小程序IDE右上角“真机调试”按钮,等待二维码生成后,使用钉钉APP扫码,即可发起小程序。

4.3 开发环境搭建、编译、烧入、运行

4.3.1 AliOS Things开发环境搭建

开发环境的搭建请参考《aos-studio使用说明之搭建开发环境》,其中详细的介绍了AliOS Things 3.3的IDE集成开发环境的搭建流程。

4.3.2 电动小车代码下载

智能语音播放器的代码下载请参考 《aos-studio使用说明之创建工程》,其中,

选择解决方案: “电动小车案例”
选择开发板: HaaS100

4.3.3 代码编译、烧录

编译auto_demo的过程如下:

– 编译固件可参考《aos-studio使用说明之编译固件》

– 烧录固件可参考《aos-studio使用说明之烧录固件》

4.3.4 运行

运行打印信息

5. 总结

这么丰富详细的操作步骤,开发者朋友是不是也用了1小时就打造出自己的小小蛮驴电动小车了呢_

我相信有上面这么详细的一步步说明,大家都自己独立完成了电动小车的打造,并且实现了云端钉控制。大家以此为出发点,挖掘越多有意思的智能硬件,通过借助HaaS这样丰富的生态,让很多不智能的设备也很容易的智能化起来。

开发者支持

HaaS官方:https://haas.iot.aliyun.com/
HaaS技术社区:https://blog.csdn.net/HaaSTech
开发者钉钉群和公众号见下图,开发者钉钉群每天都有技术支持同学值班。
在这里插入图片描述

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
142965 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
16569 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
5天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1289 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3407 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
8天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
5天前
|
人工智能 自然语言处理 程序员
如何在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型?
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
925 14
|
12天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1932 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
|
12天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。