关于openharmony:OpenHarmony有氧拳击之设备端开发

115次阅读

共计 5102 个字符,预计需要花费 13 分钟才能阅读完成。

一、简介

在一个风和日丽,阳光明媚的下午,码农们都像平常一样正在专一地码代码。忽然后面的小哥哥站起来,手握开发板,来回出拳。这是怎么回事?
原来这是一款拳击互动游戏,本文将带你一起解开其中的神秘。开发者从中不仅能体验到学习常识的愉悦,还能享受到健身的乐趣。依靠 OpenAtom OpenHarmony(以下简称“OpenHarmony”)3.2 Beta1 操作系统,样例分为利用端和设施端两局部。本文次要介绍设施端的实现,后续会分享利用端的开发。
设施端:采纳小熊派 BearPi-HM Nano(Hi3861)开发板,解决加速度计传感器数据。
利用端:采纳润和 DAYU200(RK3568)开发板,次要解决显示及音效。
如下图,左侧为设施端,右侧为利用端:开发者手握设施端小熊派开发板,察看屏幕,依据利用端 APP 显示,在指定的工夫实现挥拳动作;挥拳信息经无线传递到利用端,利用端 APP 对挥拳机会有相应的计分规定,最初统计出总分。

二、原理

相比失常状态下,挥拳动作会引起手臂较大的加速度变动。依据这个特色,咱们应用 BearPi-HM_Nano 开发板的扩大模块 E53_SC2,它外部集成了 MPU6050 传感器,可能读取加速度的大小。
做挥拳动作试验,统计数据,失去挥拳时加速度的阈值。程序执行时,把实时的数据与阈值进行比拟,判断是否触发了挥拳动作。再通过无线通信,实时把数据发送到利用端。

三、加速度计传感器应用阐明

设施端的开发要害在对加速度计传感器的应用,次要波及两点:1、重力加速度 g 的了解;2、如何把 MPU6050 寄存器的数据转化为有单位的数据?
1、样例应用的加速度传感器是 MPU6050,它有±2g、±4g、±8g 和±16g 四个量程能够抉择。一个 g 是指一个重力加速度,代表 9.8 米 / 秒²大小。举个例子:如果设施从高处掉落,其减速计测量到的加速度将为 0g,因为传感器没有受到力的挤压,处在失重状态;如果设施程度放在桌面上,则减速计测量出的加速度为 1g(9.8 米 / 秒²),咱们能够了解为受到 1g 的压力;
2、MPU6050 采纳 16 位的 ADC 采样。16 位的 ADC 采样是什么意思?举个例子:如果量程抉择(通过寄存器抉择)是±2g,16 位的 ADC 采样,示意的含意是用 65536(即 2 的 16 次方)种状况去表白 - 2 到 +2g 的状况。如下 datasheet 截图显示,AFS_SEL=0,示意±2g 量程,当数据寄存器的数据为 16384,对应示意受到 1g 的力。例如:数据寄存器读取到的值为 X,对应受到的力的大小为 Y,则 Y =X/16384,单位是 g。

四、代码解析

设施端代码次要分为两个线程:1、传感器数据处理线程;2、TCP 通信线程;它们之间通过事件的形式进行同步通信。
1、传感器数据处理线程次要函数阐明:

//E53_SC2 模块 MPU6050 传感器数据处理次要流程
static void DataHandleTask(void)
{
    uint8_t ret;
    ret = E53SC2Init();//MPU6050 传感器初始化及配置,配置为 +—8g 量程
    if (ret != 0) {printf("E53_SC2 Init failed!\r\n");
        return;
    }
    while (1)  {ret = E53SC2ReadData(&data);//MPU6050 传感器寄存器数据读取
        if (ret != 0)  {printf("E53_SC2 Read Data!\r\n");
            return;
        }
        AccDataHandle(&data);//MPU6050 传感器数据处理,转化为单位为 g 的数据
        if (myCaldata.Accel[ACCEL_X_AXIS] < 0) {myCaldata.Accel[ACCEL_X_AXIS] = myCaldata.Accel[ACCEL_X_AXIS] * -1.0; 
        }
        if (myCaldata.Accel[ACCEL_Y_AXIS] < 0) {myCaldata.Accel[ACCEL_Y_AXIS] = myCaldata.Accel[ACCEL_Y_AXIS] * -1.0; 
        }
        if (myCaldata.Accel[ACCEL_Z_AXIS] < 0) {myCaldata.Accel[ACCEL_Z_AXIS] = myCaldata.Accel[ACCEL_Z_AXIS] * -1.0; 
        }
        // 判断实时数据是否大于拳击阈值 Boxing_ACC,大于则设置事件
       if (myCaldata.Accel[ACCEL_X_AXIS] > Boxing_ACC ||                          myCaldata.Accel[ACCEL_Y_AXIS] > Boxing_ACC || myCaldata.Accel[ACCEL_Z_AXIS] > Boxing_ACC) {printf("MPU set flg\r\n");
            osEventFlagsSet(g_eventFlagsId, FLAGS_MSK1);// 触发拳击事件
        }
        usleep(Delay_10ms);
    }
}
#define MAX_POS_NUM 32767
#define LSB 4096.0
//MPU6050 传感器数据处理,转化为单位为 g 的数据
int AccDataHandle(E53SC2Data *dat)
{    // 量程为 +-8g,所以分辨率为 4096
    if (dat->Accel[ACCEL_X_AXIS] <  MAX_POS_NUM) {myCaldata.Accel[ACCEL_X_AXIS] = dat->Accel[ACCEL_X_AXIS]/LSB;
    } else {myCaldata.Accel[ACCEL_X_AXIS] =(-1)* (dat->Accel[ACCEL_X_AXIS]-MAX_POS_NUM)/LSB;
    }
    if (dat->Accel[ACCEL_Y_AXIS] <  MAX_POS_NUM) {myCaldata.Accel[ACCEL_Y_AXIS] = dat->Accel[ACCEL_Y_AXIS]/LSB;
    } else {myCaldata.Accel[ACCEL_Y_AXIS] = (-1)*(dat->Accel[ACCEL_Y_AXIS]-MAX_POS_NUM)/LSB;
    }
    if (dat->Accel[ACCEL_Z_AXIS] <  MAX_POS_NUM) {myCaldata.Accel[ACCEL_Z_AXIS] = dat->Accel[ACCEL_Z_AXIS]/LSB;
    } else {myCaldata.Accel[ACCEL_Z_AXIS] =(-1)*(dat->Accel[ACCEL_Z_AXIS]-                   MAX_POS_NUM)/LSB;
    }
return 0;
}

2、TCP 通信线程次要函数阐明:
在本样例的网络通信中,小熊派 BearPi-HM Nano(Hi3861)开发板作为客户端,润和 DAYU200(RK3568)开发板作为服务端。它们之间采纳 TCP 机制通信。
如下代码:建设好 TCP 通信后,惯例状态下通信线程处在阻塞态,当拳击事件触发后,则会发送信息给服务端:

static void TCPClientTask(void)
{
    // 在 sock_fd 进行监听,在 new_fd 接管新的链接
    int sock_fd;
    uint32_t flags;
    struct sockaddr_in send_addr;   // 服务器的地址信息
    socklen_t addr_length = sizeof(send_addr);
    char recvBuf[recvLen];
    memset(recvBuf, '\0', sizeof(recvBuf));
    // 连贯 Wifi
    WifiConnect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD); 
    // 创立 socket
    if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {perror("create socket failed!\r\n");
        exit(1);
    }
    // 初始化预连贯的服务端地址
    send_addr.sin_family = AF_INET;
    send_addr.sin_port = htons(CONFIG_SERVER_PORT);
    send_addr.sin_addr.s_addr = inet_addr(CONFIG_SERVER_IP);
    addr_length = sizeof(send_addr);
    // 连贯
    connect(sock_fd,(struct sockaddr *)&send_addr, addr_length);
    printf("TCPClient connect success\r\n");

    while (1) {memset(recvBuf, '\0', sizeof(recvBuf));
  // 期待事件是否触发
        flags = osEventFlagsWait(g_eventFlagsId, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
        printf("TCP get flag\r\n");
        sprintf(sendbuf,"right\r\n");
        send(sock_fd, sendbuf, strlen(sendbuf), 0);//tcp 收回触发信息
        // 线程休眠一段时间
        usleep(Delay_100ms);//100ms
    }
    closesocket(sock_fd);

五、代码构建、编译及烧录

1、OpenHarmony 3.2 Beta1 源码下载,地址参考文章结尾处链接;
2、在源码根目录下的 vendor 目录下,新建 team_x 文件夹;
3、把 boxing 文件夹,拷贝到 team_x 目录下,如下图所示:

4、在源码目录下,输出 hb set,而后抉择以后文件门路,即输出.(点),而后通过方向键选取 team_x 下的 boxing,如下图:

5、输出 hb build -f, 开始编译,编译胜利后,会在根目录下的 out/bearpi_hm_nano/boxing 目录生成 Hi3861_wifiiot_app_allinone.bin,如下图:

6、用 HiBurn 工具烧录程序,烧录参考链接在文章结尾处;
烧录胜利后,能够本地验证我的项目是否胜利:
1、电脑端应用网络调试助手软件,建设 TCP 服务端,电脑端建设服务端须要留神以下几点:
(1)电脑与 BearPi-HM Nano 开发板连入同一个 Wi-Fi 热点,如图:电脑与开发板都连入热点 ”YYYYYY”;
(2)BearPi-HM Nano 开发板程序设置的 IP,电脑的 IP,网络调试助手服务端的 IP,三者保持一致,如下图 ”192.168.1.100″;
(3)点击网络调试助手的 ” 连贯 ” 按钮,即先启动服务端。

2、BearPi-HM Nano 开发板串口接入电脑,设置波特率为 115200;
3、复位 BearPi-HM Nano 开发板,复位后,串口会打印 Wi-Fi 连贯胜利、TCP 连贯胜利等信息,如下图(右侧);
4、手握开发板,尝试出拳(即挥动开发板)。能看到网络助手的 TCP 服务端窗口,胜利接管到同步挥拳信息“right”,如下图(左侧):

六、总结

本文次要讲述了拳击互动游戏中,对于设施端的开发,应用小熊派 BearPi-HM Nano(Hi3861)开发板硬件,在小熊派相干根底例程上做了二次开发。本设施端开发,应用了 OpenHarmony 的线程、事件、GPIO、IIC、TCP 通信等相干基础知识,再联合加速度计传感器的应用,实现与利用端同步交互的性能。
本样例是 OpenHarmony 常识体系工作组(相干链接在文章开端)为宽广开发者分享的样例。常识体系工作组联合日常生活,给开发者布局了各种场景的 Demo 样例,如智能家居场景、影音娱乐场景、静止衰弱场景等;欢送宽广开发者一起参加 OpenHarmony 的开发,更加欠缺样例,互相学习,互相提高。

七、参考连贯

本样例代码下载链接:
https://gitee.com/openharmony…
OpenHarmony 常识体系共建开发仓:
https://gitee.com/openharmony…
OpenHarmony 学习门路:
https://growing.openharmony.c…
小熊派 BearPi-HM Nano 开发板学习门路:
https://growing.openharmony.c…
https://gitee.com/bearpi/bear…
润和 DAYU200(RK3568)开发板介绍:
https://gitee.com/hihope_iot/…
https://growing.openharmony.c…

正文完
 0