产品介绍
产品的软件部分基于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通信模块和电机控制板。
硬件框图
硬件设备
硬件简介
开发板
CH32V_EVB是腾讯物联网操作系统TencentOS tiny 团队联合沁恒微电子设计的一款物联网评估板,用于TencentOS tiny 基础内核、RISC-V IP核架构和IoT组件功能体验和评估。 开发板实物如下图:
开发板特性
• 内置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接口的定义来设计的转接板。模块电路图如下:
电机控制板
电机控制板是执行电机控制的中间转接板,通过中间继电器扩展交流接触器,可以控制大功率电机设备。以CAN通信的方式与开发板连接通信,接收开发板的控制命令和上传电机运行的状态和参数。
产品软件
软件框架
程序主要代码
创建任务
创建两个信号量和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));
}
}
物联网平台
创建设备
定义功能参数
显示配置
使用标准类型 面板
设备调试
腾讯连连APP运行界面
打开状态
关闭状态
功能演示视频
https://cloud.tencent.com/developer/video/32285?sharedUid=4136378
程序代码
https://gitee.com/gtizhanghui/tencent-os-tiny-motor.git