12

崔林威 · 2022年05月24日

基于TencentOS Tiny AIoT开发板、腾讯连连小程序的智能轮椅远程感知与控制

引言

笔者在今年上半年参加了2021 TencentOS Tiny AIoT应用创新大赛,比赛采用了腾讯 TencentOS 团队联合恩智浦半导体、厚德物联网设计的一款高性能 AIoT 评估板,处理器为RT1062处理器,可用于 TencentOS tiny 基础内核和 AIoT 应用功能体验和评估。

物联网以及万物互联是智慧城市、智能家居的基础和发展方向,借助物联网、智能硬件和腾讯云对传统轮椅进行改造,能够进一步提升轮椅的智能性和人机交互性能,因此在比赛中基于TencentOS tiny AIOT开发板研究了一款智能轮椅,在比赛中主要完成了以下内容:

1、基于前期开发的软件包完成了TencentOS tiny内核移植;
2、结合目前实验室的智能轮椅项目,基于TencentOS tiny AIOT开发板、腾讯云平台和腾讯连连小程序研究了智能轮椅的远程控制和多模感知功能:
2.1、通过将开发板与腾讯云对接,实现了轮椅上云,并设计腾讯连连微信小程序;
2.2、智能轮椅控制:开发了轮椅脚踏板、靠背的升降控制和灯光控制;
2.3、智能轮椅多模感知:感知自身状态(姿态、定位、速度信息)的和外部环境(温度、湿度、灯光亮度);

进而,用户可以手机控制轮椅脚踏板、座椅靠背的升降,同时也可在小程序上查看轮椅的姿态、定位、速度信息和温湿度信息。
本项目的开发进一步提升了传统轮椅的交互性能、感知性能和远程控制能力,相信随着研究的深入,会拥有广阔的市场前景,推动轮椅智能化研究的进程。
视频链接:https://cloud.tencent.com/dev...

1、项目背景

1.1 TencentOS tiny

腾讯物联网操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,可裁剪等特性。TencentOS tiny提供了最精简的 RTOS 内核,内核组件可裁剪可配置,可灵活移植到多种终端 MCU上;基于RTOS内核提供了COAP/MQTT/TLS/DTLS等常用物联网协议栈及组件,方便用户快速接入腾讯云物联网通信IoT Hub;同时,为物联网终端厂家提供一站式软件解决方案,方便各种物联网设备快速接入腾讯云,可支撑智慧城市、智能穿戴、车联网等多种行业应用。

https://github.com/OpenAtomFo...

1.2 TencentOS tiny AIOT开发板开发板

https://github.com/OpenAtomFoundation/TencentOS-tiny/blob/master/doc/30.TencentOS_Tiny_EVB_AIoT_QuickStart.md
本次大赛使用的开发板为TencentOS Tiny AIoT开发套件,这款开发板性能强大,可应用于物联网、人工智能等多种领域的开发,同时内置TencentOS Tiny开源物联网操作系统,例程等学习资料众多,对于初学者非常友好。
开发板主要有以下特性
1、核心板采用的RT1062处理器属于i.MX RT 系列 MCU,是由 NXP 推出的跨界处理器,跨界是指该系列MCU的定位既非传统的微控制器、也非传统的微处理器,i.MX RT 系列 MCU 则综合了两者的优势,既具备高频率(最高主频600M)、高处理性能,也具备中断响应迅速、实时性高的特点。
2、1M RAM 16M SDRAM 64MB qspi flash 128MB spi flash
3、板载Type-C接口CMSIS DAP仿真器。
4、板载PCIE接口,可扩展4G类物联网模组。
5、板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组。
6、板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器。
7、板载标准24P DVP摄像头接口,可支持最高500万像素摄像头。
8、板载RGB显示接口,可转换HDMI输出。
9、板载高性能音频解码芯片,可做语音识别测试。
10、预留SD卡、用户按键、SPI Flash。
image.png

2、项目设计

2.1 项目架构设计

项目开展了轮椅远程控制、轮椅多模感知、轮椅上云和微信/APP小程序设计四个方面的研究,以实现以下功能:
1、通过将开发板与腾讯云对接,实现了轮椅上云,并设计腾讯连连微信/APP小程序;
2、智能轮椅控制:开发了轮椅脚踏板、靠背的升降控制和灯光控制;
3、智能轮椅多模感知:自身状态(姿态、定位、速度)的和外部环境(温度、湿度、灯光亮度);
为实现上述功能,项目设计了如图2.1所示的架构,主要包括以下几部分:

(1)远程端:包括腾讯云平台和腾讯连连微信小程序,在小程序上可以控制轮椅脚踏板、靠背的升降和灯光的开关,还可查看轮椅的姿态角、定位、速度信息,以及温度、湿度和光照强度信息;
(2)主控层,采用AIOT开发套件,用于向LED灯珠和2个电机驱动板发送控制指令、获取传感器采集的感知数据,另外板载了WIFI模块,用于对接腾讯云;
(3)收发层,搭建传感器与主控制板的通信链路;
(4)感知层,采集姿态角、定位、速度、温度、湿度和光照强度数据;
(5)驱动层:包括电机驱动模块和LED灯珠,用于驱动脚踏板和靠背上的四个电动推杆、控制LED灯珠的亮灭;

另外,系统还配备了电源模块,产生24V电源,为系统供电。
image.png
AIOT开发板上板载了E53接口,包括IIC、SPI、串口以及普通IO口等,可以外接自己的传感器,在使用时利用恩智浦的MCUXpresso IDE生成对应的驱动程序即可进行开发。轮椅的控制和感知采用了E53接口,结构如图2.2所示,其中E53引出的GPIO1-4用于控制驱动板和LED灯珠;E53的串口外接了数据采集板,数据采集板获取到姿态角、定位、速度和温湿度信息后通过串口发送到AIOT开发板;E53的IIC接口用于采集BH1750光照传感器的亮度信息。
image.png

2.2 轮椅实物及电路模块

如下图为轮椅实物图,分别为轮椅的侧视图、俯视图、AIOT开发板及外围电路、传感器模组和轮椅正视图。
image.png

2.3 作品创新点

本作品的研究主要有以下创新点:
(1)本项目结合TencentOS tinyAIOT开发板、腾讯云平台和腾讯连连小程序,创新研究了轮椅的远程控制、多模感知和人机交互技术,实现了物联网轮椅的设计,是对传统轮椅的智能化提升;
(2)现有轮椅的脚踏板和靠背控制多采用遥控器,需要随身携带,通过本作品,仅需一个手机即可完成控制和轮椅状态监控工作。

3、智能轮椅控制

3.1 控制方案设计

轮椅控制部分包括轮椅脚踏板、靠背和LED的控制,采用AIOT开发板的E53接口引出的GPIO1-GPIO4发出控制信号,结构如图3.1所示,具体包括以下:
(1)开发板的GPIO2输出高、低电平控制LED灯珠的亮灭;
(2)开发板的GPIO1和GPIO3连接到电机驱动板1,驱动脚踏板部分的两个电动推杆,以实现脚踏板的升降;
(3)开发板的GPIO2和GPIO4连接到电机驱动板2,驱动靠背部分的两个电动推杆,以实现靠背的升降;
(4)开发板上云,接收来自手机小程序的控制指令。
image.png

3.2 轮椅靠背、脚踏板控制

3.2.1 硬件部分

为了控制轮椅脚踏板和靠背的升起和降落,在轮椅的两个脚踏板和靠背处放置了4个电动推杆,如下图所示,电动推杆采用了直流有刷电机,提供0-24V电压即可控制推杆的升起和降落。
如图3.2为电动推杆和安装图。
image.png
项目采用了如下图所示的单路电机驱动板,对驱动板的IN1和IN2提供提供控制信号可以控制电机正转、反转和刹车,对PWM口输入不同占空比的方波可以控制电机的转速。另外,在项目开发时,为保证脚踏板和靠背控制的同步性,靠背和两个脚踏板的电动推杆均连接到同一个电机驱动板。
image.png
电机驱动板需要提供9-36V的电压来驱动电动推杆,因此采用了24V开关电源,如下图所示,可输出24V 4.5A的电压。
image.png

3.2.2 软件设计

为了控制推杆电机和靠背电机,采用了AIOT开发板板载E53模块的GPIO1-4实现电机方向的控制,方向控制如下表所示:
image.png
IO初始化程序如下:

/* GPIO configuration on GPIO_B1_15 (pin B14) */
  gpio_pin_config_t gpio2_pinB14_config = {
      .direction = kGPIO_DigitalOutput,
      .outputLogic = 0U,
      .interruptMode = kGPIO_NoIntmode
  };
  /* Initialize GPIO functionality on GPIO_B1_15 (pin B14) */
  GPIO_PinInit(GPIO2, 31U, &gpio2_pinB14_config);//GPIO2
  GPIO_PinInit(GPIO2, 30U, &gpio2_pinB14_config);//GPIO3
  GPIO_PinInit(GPIO3, 17U, &gpio2_pinB14_config);//GPIO1
  GPIO_PinInit(GPIO3, 4U, &gpio2_pinB14_config);//GPIO4
  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0U);//GPIO2
  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_14_GPIO2_IO30, 0U);//GPIO3
  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_GPIO3_IO17, 0U);//GPIO1
IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_GPIO3_IO4, 0U);//GPIO1
开发板接收到微信小程序的控制指令后IO口的输出程序:
if(cjson_switch != NULL){ //靠背降下
        power_switch = cjson_switch->valueint;
        if (power_switch == 0) {
            GPIO_PinWrite(GPIO2, 31, 0);
        } else if (power_switch == 1) {
             GPIO_PinWrite(GPIO2, 31, 1);
        }

        }
else if(cjson_switch_jiao != NULL){ //脚踏板升起
           tuigan_jiao_switch = cjson_switch_jiao->valueint;
        if (tuigan_jiao_switch == 0) {
            GPIO_PinWrite(GPIO2, 30, 0);
        } else if (tuigan_jiao_switch == 1) {
            GPIO_PinWrite(GPIO2, 30, 1);
        }
     }
     else if(cjson_switch_jiao_down != NULL){ //脚踏板降下
           tuigan_jiao_down_switch = cjson_switch_jiao_down->valueint;
        if (tuigan_jiao_down_switch == 0) {
            GPIO_PinWrite(GPIO3, 17, 0);
        } else if (tuigan_jiao_down_switch == 1) {
            GPIO_PinWrite(GPIO3, 17, 1);
        }
    }
else if(cjson_switch_bei != NULL){ //靠背升起
        tuigan_bei_switch = cjson_switch_bei->valueint;
        if (tuigan_bei_switch == 0) {
            GPIO_PinWrite(GPIO3, 4, 0);
        } else if (tuigan_bei_switch == 1) {
            GPIO_PinWrite(GPIO3, 4, 1);
        }
    }

3.3 轮椅灯光控制

轮椅灯光的控制采用图3.7的LED灯珠,在使用时设置IO口为输出模式,然后控制IO口电平的高低即可控制其亮灭。
image.png

4、智能轮椅多模感知

4.1 多模感知方案-自身感知与环境感知

项目基于AIOT开发板研究了智能轮椅的多模感知,包括对自身自身状态的感知和对环境的感知,并通过手机小程序进行查看。结构图如图4.1所示,包括以下几部分:
(1)自身感知:
1、定位信息感知:采用ATK S1216F8 BD GPS/北斗模块,采集轮椅的定位信息(经、纬度)和移动速度;
2、姿态信息感知:采用ATK-MPU6050六轴传感器,采集轮椅的姿态角(俯仰角pitch,偏航角yaw和翻滚角roll);
(2)外部环境感知:
1、温度、湿度感知:采用DHT11传感器,输出轮椅所在环境的温湿度;
2、光照强度感知:采用BH1750传感器,输出轮椅所在环境的光强;
(3)开发板上云,在小程序上查看感知上报数据。
image.png

4.2 数据采集板介绍与通信协议设计

为了简便系统设计,在开发的时候采用了数据采集板(Cortex-M3),在采集完MPU6050、GPS和DHT11传感器的数据后,采集板通过串口2发送数据,AIOT开发板通过E53模块的串口5接收数据并处理。
数据协议如下图所示:
image.png
数据采集板端按照上述协议封装数据的函数如下:

//串口2发送1个字符 //c:要发送的字符
void usart2_send_char(u8 c)
{       
    while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
    USART_SendData(USART2,c);  
} 
//fun:功能字. 0XA0~0XAF//data:数据缓存区//len:data区有效数据个数
void usart2_niming_report(u8 fun,u8*data,u8 len)
{
    u8 send_buf[64];
    u8 i;
    send_buf[len+3]=0;    //校验数置零
    send_buf[0]=0X88;    //帧头
    send_buf[1]=fun;    //功能字
    send_buf[2]=len;    //数据长度
    for(i=0;i<len;i++)send_buf[3+i]=data[i];            //复制数据
    for(i=0;i<len+3;i++)send_buf[len+3]+=send_buf[i];    //计算校验和    
    for(i=0;i<len+4;i++)usart2_send_char(send_buf[i]);    //发送数据到串口1 
}

AIOT开发板利用串口5接收数据,数据存储在rx_buff数组中:

void LPUART5_IRQHandler(void){
    /* If new data arrived. */
    int i=0;
    if ((kLPUART_RxDataRegFullFlag)&LPUART_GetStatusFlags(LPUART5)){
        data = LPUART_ReadByte(LPUART5);
        if(len<19){
            rx_buff[len++]=data;
            if(rx_buff[0]!=0x88)
                len=0;
        }
        else if(len>=19)
            len=0;
    }
    SDK_ISR_EXIT_BARRIER;
}

4.3 自身状态感知

轮椅自身状态的感知包括姿态角信息、定位信息和速度信息,接下来对各个模块的开发过程进行介绍。

4.3.1 姿态信息感知

在轮椅移动过程中,采用正点原子的ATK-MPU6050六轴传感器模块采集轮椅的实时姿态角信息,传感器如下图所示:
image.png
ATK-MPU6050 模块具有体积小、自带 DMP、自带温度传感器、支持IIC从机地址设置和中断、兼容3.3V/5V系统、使用方便等特点,基本特性如下图所示。模块仅通过一个IIC接口与外部通信,并可以通过MPU_AD0设置模块的IIC地址,当MPU_AD0悬空接GND的时候,模块的IIC从机地址为:0X68;当MPU_AD0接VCC的时候,模块的IIC从机地址为:0X69。
image.png
获取姿态角的程序如下:

//pitch:俯仰角 精度:0.1°   范围:-90.0° <---> +90.0°
//roll:横滚角  精度:0.1°   范围:-180.0°<---> +180.0°
//yaw:航向角   精度:0.1°   范围:-180.0°<---> +180.0°
u8 mpu_dmp_get_data(float *pitch,float *roll,float *yaw)
{
    float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;
    unsigned long sensor_timestamp;
    short gyro[3], accel[3], sensors;
    unsigned char more;
    long quat[4]; 
    if(dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more))return 1;     
    if(sensors&INV_WXYZ_QUAT) 
    {
        q0 = quat[0] / q30;    //q30格式转换为浮点数
        q1 = quat[1] / q30;
        q2 = quat[2] / q30;
        q3 = quat[3] / q30; 
        //计算得到俯仰角/横滚角/航向角
        *pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;    // pitch
        *roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3;    // roll
        *yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;    //yaw
    }else return 2;
    return 0;
}

4.3.2 定位信息、速度信息感知

项目采用正点原子的ATK-S1216F8 BD GPS北斗模块采集轮椅的经纬度定位信息和移动速度,模块如下图所示:
image.png
模块特性如下图所示,该模块能够通过串口输出NMEA 0183协议的定位数据,包括经度、纬度、UTC时间、速度、可见GPS/北斗卫星数量等信息。
image.png
数据采集板通过串口4接收到传感器数据后,将数据存放在USART1_TX_BUF数组中,然后利用GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF)函数分析字符串,并将模块提供的信息存储到gpsx数据结构中,在使用时读取该结构的数据即可。

4.4 外部环境感知

轮椅在移动过程中,还需要对外部环境进行感知,项目结合温湿度传感器和光照传感器开发了轮椅的外部感知功能。

4.4.1 温度、湿度感知

温度、湿度数据采集采用DHT11传感器,该传感器采用单总线数据格式发送数据,数据格式为8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和。
image.png
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。
数据结构定义如下:

typedef struct _DHT11
{
    char Tem_H;        //温度整数部分
    char Tem_L;        //温度小数部分
    char Hum_H;        //湿度整数部分
    char Hum_L;        //湿度小数部分
}DHT11_TypeDef;
int DHT11_GetTem(void)//获取温度
{
    return (DHT11.Tem_H << 8 | DHT11.Tem_L);
}
int DHT11_GetHum(void)//获取湿度
{
    return (DHT11.Hum_H << 8 | DHT11.Hum_L);
}

4.4.2 光照强度感知

轮椅外部环境的光照强度感知采用AIOT开发板板载的BH1750传感器,该传感器是一种用于两线式串行总线接口的数字型光强度传感器,具有接近视觉灵敏度的光谱灵敏度特性,利用它的高分辨率可以探测较大范围的光强度变化。传感器内置16bit AD转换器,可对亮度进行1勒克斯的高精度测定。
image.png
读取传感器数据的程序如下:

static int bh1750_read_dat(uint8_t* dat)
{
    status_t reVal = kStatus_Fail;
    if (kStatus_Success != LPI2C_MasterStart(BH1750_I2C_MASTER, BH1750_DEVICE_ADDR_7BIT, kLPI2C_Read)) {
        return -1;
    }
    reVal = LPI2C_MasterReceive(BH1750_I2C_MASTER, dat, 2);
    if (reVal != kStatus_Success)
    {
        if (reVal == kStatus_LPI2C_Nak)
        {
            LPI2C_MasterStop(BH1750_I2C_MASTER);
        }
        return -1;
    }
    reVal = LPI2C_MasterStop(BH1750_I2C_MASTER);
    if (reVal != kStatus_Success)
    {
        return -1;
    }
    return 0;
}

5、轮椅数据上云与腾讯连连小程序

5.1 轮椅上云方案

腾讯云物联网开发平台为设备上云提供了一站式服务,开发者根据自己的开发需求在平台上设计设备模型,从而轻松实现设备数据上云、读取云下发的数据。为了实现设备与物联网开发平台的交互,采用了板载的ESP8266 WIFI模块,该模块是由乐鑫公司出品的一款物联网芯片,因为价格较低,性能稳定等收到很大关注,可工作于三种种模式下,分别是:AP模式,station模式以及混合模式,通过常用的AT指令进行控制。
如图5.1为WIFI模块以及上云流程。
image.png

5.2 物联网开发平台及微信/APP小程序设计

为了实现轮椅与小程序的交互,项目基于腾讯云物联网开发平台和腾讯连连设计了可在微信和腾讯连连APP上使用的小程序。物联网开发平台网址为https://console.cloud.tencent.com/iotexplorer,参考https://github.com/OpenAtomFoundation/TencentOS-tiny/blob/master/doc/30.TencentOS_Tiny_EVB_ AIoT_QuickStart.md
本项目的小程序开发采用下述流程:
(1)物模型设计,包括:
控制部分:轮椅脚踏板的升、降,靠背的升、降,灯珠的亮、灭;
感知部分:亮度、温度、湿度、经度、纬度、速度、俯仰角、翻滚角和偏航角;
另外,还包括计数器功能,从而用户在小程序中按下对应的按钮,即可发布带有对应标识符的控制信息、订阅数据。
image.png
image.png
(2)交互开发,设计小程序界面

可以直接使用模板,也可以进行H5开发设计小程序界面,基于模板调整了元素的布局,保证了美观和可读性。

image.png
(3)设备调试,点击设备名称(dev01)可以进入设备界面,可以看到设备名称、设备密钥和产品ID,进而利用python脚本mqtt_config_gen.py,一次输入产品ID、设备名称、设备密钥,就可以生成对用的mqtt信息。
image.png
(4)完成后使用腾讯连连小程序扫描设备二维码可以在微信小程序上看到图5.5左图的界面,另外如果使用腾讯连连APP可以看到图5.5右图的画面。
image.png
image.png

6、基于TencentOS tiny MDK软件包的移植功能

在移植TencentOS tiny到keil工程时,需要从github下载TencentOS tiny,然后逐个文件夹进行复制,并在工程中添加头文件和源文件,操作相对来说比较繁琐,作者在21年暑假制作了TencentOS tiny的MDK软件包,能够以安装的方式将TencentOS tiny移植到Keil上,比较方便,相关内容在链接https://cloud.tencent.com/dev...(AIoT应用创新大赛-使用MDK软件包移植TencentOS tiny)

7、项目测试

在完成设计后,进行了实验,如下为成果视频:
智能轮椅 - 云+社区 - 腾讯云 (tencent.com)
下图为调试过程中串口助手的界面,可以看到上报、下发数据,以及数据采集板采集的数据:
image.png
在腾讯云物联网平台上可以看到设备详细的上行、下行信息:
image.png
在小程序上也能看到设备持续上报的信息,发送指令等:
image.png

8、总结、展望

本文基于TencentOS tiny物联网操作系统和AIOT开发板,介绍了轮椅的系统功能架构,并结合腾讯连连小程序完成了智能轮椅的远程控制和多模感知功能,轮椅的使用者可以在手机上轻松控制轮椅的脚踏板、靠背和灯光,还可以看到轮椅自身的定位、速度、姿态信息,以及外部的温度、湿度和光照强度。
相信结合物联网进行轮椅的开发,会使轮椅的控制便捷性、可视化水平和人机交互能力得到进一步的提升,在接下来,还可以结合激光雷达、摄像头等模块提高轮椅的智能性,方便轮椅使用者的监护人进一步掌握轮椅的安全状态、下发紧急控制指令等。

推荐阅读
关注数
5
内容数
3
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息