成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開發板鴻蒙Hi3861之俄羅斯方塊 += 遙控器

系統
紅外遙控器是個很實用的鍵盤擴展,即能擴展鍵盤還能遠程操作!首先在我的小游戲上試一下!

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

Hi3861解碼紅外遙控器

紅外遙控器是個很實用的鍵盤擴展,即能擴展鍵盤還能遠程操作!

首先在我的小游戲上試一下!

先前發布的小游戲:https://harmonyos.51cto.com/posts/1995

視頻:https://harmonyos.51cto.com/show/2063

先上圖:


一、紅外遙控器原理(簡述)

紅外遙控器是通過940nm-950nm的紅外線傳輸的,載波頻率是38K,傳輸協議也比較簡單:


  • 首先發送一個9ms的引導碼,引起接收方注意,我要發送數據了!
  • 停止4.5ms;
  • 開始發送數據(發560us停560us代表一個bit 0,發560us停1680us代表發送一個bit 1);
  • 每次傳輸發送4個字節 0-15是用戶碼(一個控制器這個碼是固定的)16-23是命令碼,24-31是命令碼的反碼,以上都是低位在前。

上圖左是紅外發光二極管

上圖右是紅外接收器(HS0038B),會自動過濾掉38K的載波留下數據信息

我壓上了杜邦頭可以直接插在開發板的引腳上。

二、解析原理

接收器有三個管腳(左:輸出,中:電源負,右:電源正)

配置該管腳為普通輸入、啟用內部上拉電阻、并注冊中斷函數;

  1. IoSetFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_FUNC_GPIO_6_GPIO); 
  2.    GpioSetDir(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_GPIO_DIR_IN); 
  3.    IoSetPull(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_IO_PULL_UP); 
  4.    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_6, WIFI_IOT_INT_TYPE_EDGE, WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOW, rc_decode, NULL); 

 有輸出(下降沿)的時候觸發中斷,中斷里讀取us時鐘;

  • 然后判斷本次中斷與上一次中斷的時間間隔;
  • 如果在13500(9000+4500)左右,說明接收到了一個引導信號,準備接收數據;
  • 如果在1120(560+560)左右,說明接收到一個 bit 0,接收數據不變,接收序號++;
  • 如果在2240(560+1680)左右,說明接收到一個 bit 1,接收數據與上接收序號所在的位為1;
  • 如果接收序號=32說明該次接收結束
  • 判斷第3個字節與第4個字節是否剛好是互補的,成功可執行命令解析執行相關操作。
  1. static void rc_decode(char *arg) 
  2.  
  3.  
  4. (void) arg; 
  5.  
  6. time_r = hi_get_us(); 
  7.  
  8. // t = 13500 
  9.  
  10. if(time_r - time_c > 13000 && time_r - time_c < 14000) 
  11.  
  12.  
  13. n = 0; 
  14.  
  15. data.Int = 0; 
  16.  
  17.  
  18. // t = 1120 
  19.  
  20. if(time_r - time_c > 920 && time_r - time_c < 1320) 
  21.  
  22.  
  23. ++n; 
  24.  
  25.  
  26. // t = 2250 
  27.  
  28. if(time_r - time_c > 2050 && time_r - time_c < 2450) 
  29.  
  30.  
  31. data.Int |= 1< 
  32.  
  33. ++n; 
  34.  
  35.  
  36. if(n == 32) 
  37.  
  38.  
  39. if ((data.Char[2] ^ data.Char[3]) == 0xff) 
  40.  
  41.  
  42. //printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]); 
  43.  
  44. switch_key(data.Char[2]); 
  45.  
  46.  
  47. data.Int = 0; 
  48.  
  49.  
  50. time_c = time_r; 
  51.  

 要獲取每個按鍵的命令碼是什么,可以直接打印到串口

  1. printf("user_code:%x\tcom_code:%x\n", data.Short[0], data.Char[2]); 

然后對不同的鍵碼進行一個switch操作就OK了!

  1. void switch_key(unsigned char key
  2.     switch(key
  3.     { 
  4.         case 0x99: block_left();break; 
  5.         case 0xc1: block_right();break; 
  6.         case 0xca: game_stop();break; 
  7.         case 0xd2: block_down();break; 
  8.         case 0xce: block_turn();break; 
  9.     } 

 三、同時也實現了紅外編碼

  1. void rc_encode(unsigned user_code, unsigned com_code) 
  2.     PwmInit(PWM); 
  3.     PwmStart(PWM, 1404, 4212); 
  4.     hi_udelay(9000); 
  5.     PwmStop(PWM); 
  6.     hi_udelay(4500); 
  7.     unsigned int data = user_code | com_code<<16 | ~com_code<<24; 
  8.     for(unsigned char i=0;i<32;++i) 
  9.     { 
  10.         PwmStart(PWM, 1404, 4212); 
  11.         hi_udelay(560); 
  12.         PwmStop(PWM); 
  13.         hi_udelay((data&0x0001)==0x0001?1680:560); 
  14.         data >>= 1; 
  15.     }   
  16.     PwmStart(PWM, 1404, 4212); 
  17.     hi_udelay(560); 
  18.     PwmStop(PWM); 
  19.     hi_udelay(3000); 
  20.     PwmStart(PWM, 1404, 4212); 
  21.     hi_udelay(560); 
  22.     PwmStop(PWM); 

 編碼就是解碼的反操作,相關簡單

  • 函數接收用戶碼和命令碼;
  • 發送9000us的引導碼,停4500us
  • 將用戶碼與命令碼整理成一個32位的數據,方便發送;
  • 依次按位進行開關PWM進行發送;38k = (160M/4212), 1/3的占空比(4212/3=1404)
  • 32位發送完后,再發送一個結束碼

發送間隔本應該用定時器進行操作,但Hi3861的定時器都是ms級的,無法完成us級延時;

開始我用usleep延時操作,發現誤差有一兩個數量級,根本無法使用,還好我找到了hi_udelay(),位于hi_time.h可以滿足需求!

以上只是介紹最常見的紅外遙控器的解碼及編碼!有些廠家自己定義了請多非標編碼就不一一介紹了!

最近必須付上代碼!!!

©著作權歸作者和HarmonyOS技術社區共同所有,如需轉載,請注明出處,否則將追究法律責任

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

 

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2020-12-11 12:45:04

鴻蒙Hi3861游戲

2015-01-22 15:36:46

游戲源碼

2011-06-13 18:21:12

2021-01-12 12:16:55

鴻蒙HarmonyOS游戲

2014-10-08 10:04:14

代碼解釋俄羅斯方塊

2020-05-19 17:26:21

Python俄羅斯方塊游戲開發

2020-02-27 13:43:14

Emacs俄羅斯方塊應用

2021-12-29 11:56:16

Linux俄羅斯方塊

2020-11-06 10:15:16

HiBurn

2014-05-26 10:07:18

Javascript俄羅斯方塊

2016-06-13 10:21:49

二維碼條形碼二進制

2015-04-28 09:21:28

JSJS俄羅斯方塊游戲帝國

2021-02-01 13:58:51

鴻蒙HarmonyOS應用開發

2020-10-14 09:37:03

HiBurn鴻蒙.bin文件

2020-10-30 17:12:05

Hi3861

2009-06-08 09:59:24

谷歌俄羅斯方塊版權

2021-09-16 10:03:39

鴻蒙HarmonyOS應用

2020-11-18 11:56:06

鴻蒙Hi3861

2020-11-06 11:32:11

NV操作

2020-12-09 09:44:29

Hi3861硬件介紹鴻蒙開發板
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧洲亚洲一区二区三区 | 涩涩视频在线看 | 亚洲精品乱码久久久久久黑人 | 成人精品区 | av在线一区二区 | 欧美久久视频 | 国产在线观看一区二区三区 | 色就是色欧美 | 日日夜夜精品视频 | 中文字幕免费视频 | 91麻豆产精品久久久久久夏晴子 | 亚洲一区欧美一区 | 国产一二三区精品视频 | 欧美一级观看 | 国产精品久久久久久久久久久久久 | 草草草草视频 | 欧美久久精品 | 999www视频免费观看 | 天天久久| 中文字幕 国产 | 国产精品夜夜夜一区二区三区尤 | 日韩一级黄色毛片 | 亚洲高清久久 | av电影一区二区 | 欧洲一区二区三区 | 中文字幕在线播放第一页 | 日韩一区在线播放 | 日本在线精品视频 | 久久精品一区 | 人操人人 | 99久热| 就操在线 | 少妇诱惑av | 久久久精品 | 日批免费在线观看 | 麻豆一区二区三区 | 成人av观看| 亚洲一区二区三区免费在线观看 | 亚洲麻豆| 中文字幕中文字幕 | 日韩电影中文字幕 |