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

2022-08-01 19:28:01 浏览数 (2)

产品介绍

产品的软件部分基于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.pngimage.png

硬件设备

001.jpg001.jpg
003.jpg003.jpg

硬件简介

开发板

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

CH32V_EVB.pngCH32V_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.png008.png

电机控制板

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

产品软件

软件框架

image.pngimage.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:rn");
    printf("---------------------------------------------------------rn");
    printf("ttopic:%srn", msg->topic);
    printf("tpayload:%srn", msg->payload);
    printf("---------------------------------------------------------rn");

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

    // 2. 解析出method
    method = cJSON_GetObjectItem(root, "method");
    if (!method){
        printf("Invalid json methodrn");
        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 paramsrn");
        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 %drn", 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 failn");
    } else {
        printf("module mqtt conn successn");
    }

    if (tos_tf_module_mqtt_state_get(&state) != -1) {
        printf("MQTT: %sn", 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 failn");
    } else {
        printf("module mqtt sub successn");
    }

    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.png009.png

定义功能参数

010.png010.png

显示配置

使用标准类型 面板

011.png011.png

设备调试

012.png012.png

腾讯连连APP运行界面

打开状态

013.jpg013.jpg

关闭状态

014.jpg014.jpg

功能演示视频

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

程序代码

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

0 人点赞