一、簡介
在一個風(fēng)和日麗,陽光明媚的下午,碼農(nóng)們都像往常一樣正在專注地碼代碼。突然前面的小哥哥站起來,手握開發(fā)板,來回出拳。這是怎么回事?
這是一款拳擊互動游戲,本文將帶你一同解開其中的奧秘。開發(fā)者從中不僅能體驗到學(xué)習(xí)知識的愉悅,還能享受到健身的樂趣。依托OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)3.2 Beta1操作系統(tǒng),樣例分為應(yīng)用端和設(shè)備端兩部分。本文主要介紹設(shè)備端的實現(xiàn),后續(xù)會分享應(yīng)用端的開發(fā)。
設(shè)備端:采用小熊派BearPi-HM Nano(Hi3861)開發(fā)板,處理加速度計傳感器數(shù)據(jù)。
應(yīng)用端:采用潤和DAYU200(RK3568)開發(fā)板,主要處理顯示及音效。
如下圖,左側(cè)為設(shè)備端,右側(cè)為應(yīng)用端:開發(fā)者手握設(shè)備端小熊派開發(fā)板,觀察屏幕,根據(jù)應(yīng)用端APP顯示,在指定的時間完成揮拳動作;揮拳信息經(jīng)無線傳遞到應(yīng)用端,應(yīng)用端APP對揮拳時機(jī)有相應(yīng)的計分規(guī)則,最后統(tǒng)計出總分。
二、原理
相比正常狀態(tài)下,揮拳動作會引起手臂較大的加速度變化。根據(jù)這個特征,我們使用BearPi-HM_Nano開發(fā)板的擴(kuò)展模塊E53_SC2,它內(nèi)部集成了MPU6050傳感器,能夠讀取加速度的大小。做揮拳動作實驗,統(tǒng)計數(shù)據(jù),得到揮拳時加速度的閾值。程序執(zhí)行時,把實時的數(shù)據(jù)與閾值進(jìn)行比較,判斷是否觸發(fā)了揮拳動作。再經(jīng)過無線通信,實時把數(shù)據(jù)發(fā)送到應(yīng)用端。
三、加速度計傳感器使用說明
設(shè)備端的開發(fā)關(guān)鍵在對加速度計傳感器的使用,主要涉及兩點(diǎn):1、重力加速度g的理解;2、如何把MPU6050寄存器的數(shù)據(jù)轉(zhuǎn)化為有單位的數(shù)據(jù)?1、樣例使用的加速度傳感器是MPU6050,它有±2g、±4g、±8g和±16g四個量程可以選擇。一個g是指一個重力加速度,代表9.8米/秒2大小。舉個例子:假如設(shè)備從高處掉落,其加速計測量到的加速度將為0g,因為傳感器沒有受到力的擠壓,處在失重狀態(tài);假如設(shè)備水平放在桌面上,則加速計測量出的加速度為1g(9.8米/秒2),我們可以理解為受到1g的壓力;
2、MPU6050采用16位的ADC采樣。16位的ADC采樣是什么意思?舉個例子:如果量程選擇(通過寄存器選擇)是±2g,16位的ADC采樣,表示的含義是用65536(即2的16次方)種情況去表達(dá)-2到+2g的情況。如下datasheet截圖顯示,AFS_SEL=0,表示±2g量程,當(dāng)數(shù)據(jù)寄存器的數(shù)據(jù)為16384,對應(yīng)表示受到1g的力。例如:數(shù)據(jù)寄存器讀取到的值為X,對應(yīng)受到的力的大小為Y,則Y=X/16384,單位是g。
四、代碼解析
設(shè)備端代碼主要分為兩個線程:1、傳感器數(shù)據(jù)處理線程;2、TCP通信線程;它們之間通過事件的方式進(jìn)行同步通信。1、傳感器數(shù)據(jù)處理線程主要函數(shù)說明:
//E53_SC2模塊MPU6050傳感器數(shù)據(jù)處理主要流程
static void DataHandleTask(void)
{
uint8_t ret;
ret = E53SC2Init();//MPU6050傳感器初始化及配置,配置為+—8g量程
if (ret != 0) {
printf("E53_SC2 Init failed! ");
return;
}
while (1) {
ret = E53SC2ReadData(&data);//MPU6050傳感器寄存器數(shù)據(jù)讀取
if (ret != 0) {
printf("E53_SC2 Read Data! ");
return;
}
AccDataHandle(&data);//MPU6050傳感器數(shù)據(jù)處理,轉(zhuǎn)化為單位為g的數(shù)據(jù)
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;
}
//判斷實時數(shù)據(jù)是否大于拳擊閾值Boxing_ACC,大于則設(shè)置事件
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 ");
osEventFlagsSet(g_eventFlagsId, FLAGS_MSK1);//觸發(fā)拳擊事件
}
usleep(Delay_10ms);
}
}
//MPU6050傳感器數(shù)據(jù)處理,轉(zhuǎn)化為單位為g的數(shù)據(jù)
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通信線程主要函數(shù)說明:
在本樣例的網(wǎng)絡(luò)通信中,小熊派BearPi-HM Nano(Hi3861)開發(fā)板作為客戶端,潤和DAYU200(RK3568)開發(fā)板作為服務(wù)端。它們之間采用TCP機(jī)制通信。
如下代碼:建立好TCP通信后,常規(guī)狀態(tài)下通信線程處在阻塞態(tài),當(dāng)拳擊事件觸發(fā)后,則會發(fā)送信息給服務(wù)端:
static void TCPClientTask(void)
{
// 在sock_fd 進(jìn)行監(jiān)聽,在 new_fd 接收新的鏈接
int sock_fd;
uint32_t flags;
struct sockaddr_in send_addr; // 服務(wù)器的地址信息
socklen_t addr_length = sizeof(send_addr);
char recvBuf[recvLen];
memset(recvBuf, '', sizeof(recvBuf));
// 連接Wifi
WifiConnect(CONFIG_WIFI_SSID, CONFIG_WIFI_PWD);
// 創(chuàng)建socket
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("create socket failed! ");
exit(1);
}
// 初始化預(yù)連接的服務(wù)端地址
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 ");
while (1) {
memset(recvBuf, '', sizeof(recvBuf));
//等待事件是否觸發(fā)
flags = osEventFlagsWait(g_eventFlagsId, FLAGS_MSK1, osFlagsWaitAny, osWaitForever);
printf("TCP get flag ");
sprintf(sendbuf,"right ");
send(sock_fd, sendbuf, strlen(sendbuf), 0);//tcp發(fā)出觸發(fā)信息
// 線程休眠一段時間
usleep(Delay_100ms);//100ms
}
closesocket(sock_fd);
}
五、代碼構(gòu)建、編譯及燒錄
1、OpenHarmony 3.2 Beta1源碼下載,地址參考文章結(jié)尾處鏈接; 2、在源碼根目錄下的vendor目錄下,新建team_x文件夾;3、把boxing文件夾,拷貝到team_x目錄下,如下圖所示:
3、在源碼目錄下,輸入hb set,然后選擇當(dāng)前文件路徑,即輸入.(點(diǎn)),然后通過方向鍵選取team_x下的boxing,如下圖:
4、輸入hb build -f,開始編譯,編譯成功后,會在根目錄下的out/bearpi_hm_nano/boxing目錄生成Hi3861_wifiiot_app_allinone.bin,如下圖:
5、用HiBurn工具燒錄程序,燒錄參考鏈接在文章結(jié)尾處;
燒錄成功后,可以本地驗證項目是否成功:
1、電腦端使用網(wǎng)絡(luò)調(diào)試助手軟件,建立TCP服務(wù)端,電腦端建立服務(wù)端需要注意以下幾點(diǎn);
(1)電腦與BearPi-HM Nano開發(fā)板連入同一個Wi-Fi熱點(diǎn),如圖:電腦與開發(fā)板都連入熱點(diǎn)"YYYYYY";
(2)BearPi-HM Nano開發(fā)板程序設(shè)置的IP,電腦的IP,網(wǎng)絡(luò)調(diào)試助手服務(wù)端的IP,三者保持一致,如下圖"192.168.1.100";
(3)點(diǎn)擊網(wǎng)絡(luò)調(diào)試助手的"連接"按鈕,即先啟動服務(wù)端。
2、BearPi-HM Nano開發(fā)板串口接入電腦,設(shè)置波特率為115200;
3、復(fù)位BearPi-HM Nano開發(fā)板,復(fù)位后,串口會打印Wi-Fi連接成功、TCP連接成功等信息,如下圖(右側(cè));
4、手握開發(fā)板,嘗試出拳(即揮動開發(fā)板)。能看到網(wǎng)絡(luò)助手的TCP服務(wù)端窗口,成功接收到同步揮拳信息“right”,如下圖(左側(cè)):
六、總結(jié)
本文主要講述了拳擊互動游戲中,關(guān)于設(shè)備端的開發(fā),使用小熊派BearPi-HM Nano(Hi3861)開發(fā)板硬件,在小熊派相關(guān)基礎(chǔ)例程上做了二次開發(fā)。本設(shè)備端開發(fā),使用了OpenHarmony的線程、事件、GPIO、IIC、TCP通信等相關(guān)基礎(chǔ)知識,再結(jié)合加速度計傳感器的使用,實現(xiàn)與應(yīng)用端同步交互的功能。本樣例是OpenHarmony知識體系工作組(相關(guān)鏈接在文章末尾)為廣大開發(fā)者分享的樣例。知識體系工作組結(jié)合日常生活,給開發(fā)者規(guī)劃了各種場景的Demo樣例,如智能家居場景、影音娛樂場景、運(yùn)動健康場景等;歡迎廣大開發(fā)者一同參與OpenHarmony的開發(fā),更加完善樣例,相互學(xué)習(xí),相互進(jìn)步。
七、參考連接
本樣例代碼下載鏈接:
https://gitee.com/openharmony-sig/knowledge_demo_entainment/tree/master/dev/team_x/boxing
OpenHarmony知識體系共建開發(fā)倉:
https://gitee.com/openharmony-sig/knowledge/blob/master/docs/co-construct_demos/README_zh.md
OpenHarmony學(xué)習(xí)路徑:
https://growing.openharmony.cn/mainPlay/learnPath
小熊派BearPi-HM Nano開發(fā)板學(xué)習(xí)路徑:
https://growing.openharmony.cn/mainPlay/learnPathMaps?id=19
https://gitee.com/bearpi/bearpi-hm_nano/tree/master
潤和DAYU200(RK3568)開發(fā)板介紹:
https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/docs/README.md
https://growing.openharmony.cn/mainPlay/learnPathMaps?id=27
審核編輯 :李倩
-
傳感器
+關(guān)注
關(guān)注
2566文章
53008瀏覽量
767503 -
寄存器
+關(guān)注
關(guān)注
31文章
5434瀏覽量
124514 -
OpenHarmony
+關(guān)注
關(guān)注
29文章
3854瀏覽量
18623
原文標(biāo)題:OpenHarmony有氧拳擊之設(shè)備端開發(fā)
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
ArkUI-X通過Stage模型開發(fā)Android端應(yīng)用指南(一)
開源鴻蒙開發(fā)必備!OpenHarmony替換Full SDK全攻略

請問下,openharmony支持哪一款龍芯的開發(fā)板?有沒有開源的龍芯的openharmony源碼?
鴻蒙北向開發(fā)OpenHarmony5.0 DevEco Studio開發(fā)工具安裝與配置

北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動開發(fā)內(nèi)核HDF驅(qū)動框架架構(gòu)

【北京迅為】itop-3568 開發(fā)板openharmony鴻蒙燒寫及測試-第1章 體驗OpenHarmony—燒寫鏡像

鴻蒙北向開發(fā)OpenHarmony4.1 DevEco Studio開發(fā)工具安裝與配置

鴻蒙原生開源庫ViewPool在OpenHarmony社區(qū)正式上線
第三屆OpenHarmony技術(shù)大會 “OpenHarmony開發(fā)者激勵計劃”授牌儀式圓滿舉行

基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony

OpenHarmony 明星開發(fā)板和應(yīng)用招募啟動,等你來!
基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony
第二屆大會回顧第25期 | OpenHarmony上的Python設(shè)備應(yīng)用開發(fā)

評論