前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【开发者成长激励计划-基于TencentOS Tiny 云控制转CAN通信控制电机】

【开发者成长激励计划-基于TencentOS Tiny 云控制转CAN通信控制电机】

原创
作者头像
用户4136378
修改2022-08-01 19:28:01
6570
修改2022-08-01 19:28:01
举报
文章被收录于专栏:TencentOS-aiotTencentOS-aiot

产品介绍

产品的软件部分基于TencentOS Tiny开源物联网操作系统平台和使用腾讯云物联网开发平台Iot Explorer和腾讯连连小程序。硬件部分是基于沁恒自研RISC-V架构微处理器青稞V4系列的TencentOS Tiny CH32V_EVB RISC-V开发套件来实现。

实现的功能是使用腾讯连连APP,远程控制TencentOS Tiny CH32V_EVB RISC-V开发套件,协议解析后,通过CAN通信方式,将控制命令发送给电机控制终端,收到启停命令后,来控制的电机的启停,同时实时将电机的运行状态、电压和电流信息反馈到开发板,开发板解析后发送到云端,在腾讯连连APP上显示。

通过外扩交流接触器可以实现大功率电机的控制。

产品硬件平台

产品的硬件有以下几部分组成,CH32V_EVB开发板、E53接口CAN通信模块和电机控制板。

硬件框图

image.png
image.png

硬件设备

001.jpg
001.jpg
003.jpg
003.jpg

硬件简介

开发板

CH32V_EVB是腾讯物联网操作系统TencentOS tiny 团队联合沁恒微电子设计的一款物联网评估板,用于TencentOS tiny 基础内核、RISC-V IP核架构和IoT组件功能体验和评估。 开发板实物如下图:

CH32V_EVB.png
CH32V_EVB.png

开发板特性

• 内置TencentOS Tiny开源物联网操作系统

• 开发板采用沁恒RISC-V MCU CH32V307VCT6芯片,CH32V305/7系列是基于沁恒自研RISC-V架构微处理器青稞V4系列设计的32位工业级互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,定时器到10组,其中4组高级定时器。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。

• 64KB SRAM,256KB Flash

• 板载Type-C接口WCH-LINK仿真器

• 板载esp8266 WiFi模组,支持腾讯云固件

• 板载以太网接口

• 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组

• 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器以及音频模块;

• 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头;

• 板载1.54寸 IPS高清显示屏,支持240*240分辨率;

• 预留SD卡、用户按键、SPI Flash,

• 扩展IO口,方便开发者扩展硬件模块

E53接口CAN通信模块

CAN通信模式是使用MCP2515芯片,按照E53接口的定义来设计的转接板。模块电路图如下:

008.png
008.png

电机控制板

电机控制板是执行电机控制的中间转接板,通过中间继电器扩展交流接触器,可以控制大功率电机设备。以CAN通信的方式与开发板连接通信,接收开发板的控制命令和上传电机运行的状态和参数。

产品软件

软件框架

image.png
image.png

程序主要代码

创建任务

创建两个信号量和4个任务。

代码语言:javascript
复制
void application_entry(void *arg)
{
    tos_sem_create(&canrx, 0);
    tos_sem_create(&cjson_hdl, 0);
    tos_task_create(&lcddisp, "lcddisp", lcddisp_entry, NULL, 7, lcddisp_stk, LCDDISP_STK_SIZE, 0); // Create task1
    tos_task_create(&can_tx, "can_tx", cantx_entry, NULL, 4, can_tx_stk, CAN_TX_STK_SIZE, 0);// Create task2
    tos_task_create(&can_rx, "can_rx", canrx_entry, NULL, 5, can_rx_stk, CAN_RX_STK_SIZE, 0);// Create task3
    tos_task_create(&mqtt_task, "mqtt_task", mqtt_task_entry, NULL, 6, mqtt_task_stk, MQTT_TASK_STK_SIZE, 0);// Create task4
}

MQTT数据解析

代码语言:javascript
复制
void default_message_handler(mqtt_message_t* msg)   //\\\"brightness\\\":%d\\,
{
    cJSON *root;
    cJSON *params;
//    cJSON *token;
    cJSON *method;
    cJSON *power_switch;
//    cJSON *brightness_level;

    printf("callback:\r\n");
    printf("---------------------------------------------------------\r\n");
    printf("\ttopic:%s\r\n", msg->topic);
    printf("\tpayload:%s\r\n", msg->payload);
    printf("---------------------------------------------------------\r\n");

    // 1. 解析从云端收到的控制信息,示例控制信息为
    //payload:"{"method":"control","clientToken":"clientToken-4902Qhq74","params":{"switch_1":1}}"
    root = cJSON_Parse(msg->payload +1);
    if (!root){
        printf("Invalid json root\r\n");
        return;
    }

    // 2. 解析出method
    method = cJSON_GetObjectItem(root, "method");
    if (!method){
        printf("Invalid json method\r\n");
        cJSON_Delete(root);
        return;
    }

    // 3. 仅处理云端下发的 control 数据,report_reply暂不处理
    if (0 != strncmp(method->valuestring, "control", sizeof("control") - 1)){
        cJSON_Delete(root);
        return;
    }

    // 4. 解析出params
    params = cJSON_GetObjectItem(root, "params");
    if (!params){
        printf("Invalid json params\r\n");
        cJSON_Delete(root);
        return;
    }
    // 1. 解析出 power_switch
    power_switch = cJSON_GetObjectItem(params, "switch_1");
    // 2. 根据 power_switch 控制实际硬件开关
    if (power_switch){
        iot_explorer_handle_power_switch(power_switch->valueint);
    }

    cJSON_Delete(root);
}

char payload[256] = {0};
static char report_topic_name[TOPIC_NAME_MAX_SIZE] = {0};
static char report_reply_topic_name[TOPIC_NAME_MAX_SIZE] = {0};

void mqtt_demo_task(void)
{
    int ret = 0;
    int size = 0;
    //int lightness = 0;
    //int color=0;
    //float voltage = 0.0;
    mqtt_state_t state;

    char *product_id = PRODUCT_ID;
    char *device_name = DEVICE_NAME;
    char *key = DEVICE_KEY;

    device_info_t dev_info;
    memset(&dev_info, 0, sizeof(device_info_t));

    /**
     * Please Choose your AT Port first, default is HAL_UART_2(USART2)
    */
    ret = esp8266_tencent_firmware_sal_init(HAL_UART_PORT_2);

    if (ret < 0) {
        printf("esp8266 tencent firmware sal init fail, ret is %d\r\n", ret);
    }

    //esp8266_tencent_firmware_join_ap("TP-LINK_0F58", "hhyf1bhhyf1b");
    esp8266_tencent_firmware_join_ap("CU_VSVC", "iya8j5tt");

    strncpy(dev_info.product_id, product_id, PRODUCT_ID_MAX_SIZE);
    strncpy(dev_info.device_name, device_name, DEVICE_NAME_MAX_SIZE);
    strncpy(dev_info.device_serc, key, DEVICE_SERC_MAX_SIZE);
    tos_tf_module_info_set(&dev_info, TLS_MODE_PSK);

    mqtt_param_t init_params = DEFAULT_MQTT_PARAMS;
    if (tos_tf_module_mqtt_conn(init_params) != 0) {
        printf("module mqtt conn fail\n");
    } else {
        printf("module mqtt conn success\n");
    }

    if (tos_tf_module_mqtt_state_get(&state) != -1) {
        printf("MQTT: %s\n", state == MQTT_STATE_CONNECTED ? "CONNECTED" : "DISCONNECTED");
    }

    size = snprintf(report_reply_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/down/property/%s/%s", product_id, device_name);

    if (size < 0 || size > sizeof(report_reply_topic_name) - 1) {
        printf("sub topic content length not enough! content size:%d  buf size:%d", size, (int)sizeof(report_reply_topic_name));
    }
    if (tos_tf_module_mqtt_sub(report_reply_topic_name, QOS0, default_message_handler) != 0) {
        printf("module mqtt sub fail\n");
    } else {
        printf("module mqtt sub success\n");
    }

    memset(report_topic_name, 0, sizeof(report_topic_name));
    size = snprintf(report_topic_name, TOPIC_NAME_MAX_SIZE, "$thing/up/property/%s/%s", product_id, device_name);

    if (size < 0 || size > sizeof(report_topic_name) - 1) {
        printf("pub topic content length not enough! content size:%d  buf size:%d", size, (int)sizeof(report_topic_name));
    }
}

物联网平台

创建设备

009.png
009.png

定义功能参数

010.png
010.png

显示配置

使用标准类型 面板

011.png
011.png

设备调试

012.png
012.png

腾讯连连APP运行界面

打开状态

013.jpg
013.jpg

关闭状态

014.jpg
014.jpg

功能演示视频

https://cloud.tencent.com/developer/video/32285?sharedUid=4136378

程序代码

https://gitee.com/gtizhanghui/tencent-os-tiny-motor.git

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 产品介绍
  • 产品硬件平台
    • 硬件框图
      • 硬件设备
        • 硬件简介
          • 开发板
          • 开发板特性
          • E53接口CAN通信模块
          • 电机控制板
      • 产品软件
        • 软件框架
          • 程序主要代码
            • 创建任务
            • MQTT数据解析
          • 物联网平台
            • 创建设备
            • 定义功能参数
            • 显示配置
            • 设备调试
          • 腾讯连连APP运行界面
            • 打开状态
            • 关闭状态
          • 功能演示视频
            • 程序代码
            相关产品与服务
            TencentOS Server
            TencentOS Server 是腾讯云推出的 Linux 操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云 CVM 全规格实例上,包括黑石物理服务器2.0。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档