自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

開發(fā)板漂流計劃之小車控制由簡入繁之按鍵控制

開發(fā)
實現(xiàn)最簡單的按鍵控制小車前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止的Demo,代碼在openharmonny1.10 和openharmony3.00 測試可以正常工作。

[[427555]]

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1.簡介

實現(xiàn)最簡單的按鍵控制小車前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、停止的Demo,代碼在openharmonny1.10 和openharmony3.00 測試可以正常工作。

2. 功能介紹

1).短按 OLED 擴展板S1按鍵 - 前進

2).長按 OLED 擴展板S1按鍵 - 左轉(zhuǎn)

3).短按 OLED 擴展板S2按鍵 - 后退

4).長按 OLED 擴展板S2按鍵 - 右轉(zhuǎn)

5).短按核心板User按鍵 - 停止

3.電機的控制代碼

3.1 電機的控制需要用到PWM,所以需要先將PWM 功能開啟,開啟方式如下

device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk

  1. # CONFIG_PWM_SUPPORT is not set 

 改為

  1. CONFIG_PWM_SUPPORT=y 

 3.2 電機的控制代碼

電機控制代碼是從潤和Gitee小車樣例代碼car_control.c和car_control.h 修改而來。

主要修改如下

將car_control.c中

  1. #include <app_demo_robot_car.h> 
  2.  
  3. extern hi_u32  g_car_speed; 

 移除app_demo_robot_car.h和extern ,改為如下

  1. hi_u16  g_car_speed; 

 在car_control.h中添加以下define

  1. #define     MAX_SPEED                         (100) 
  2. #define     MIN_SPEED                         (30000) 
  3. #define     PWM_DUTY_LEFT_RIGHT               (5000) 
  4. #define     PWM_DUTY_FORWARD_BACK             (10000) 

 小車前進

  1. /*car go forward */ 
  2. hi_void car_go_forward(hi_void) 
  3.     correct_car_speed(); 
  4.     gpio_control(HI_IO_NAME_GPIO_0, HI_GPIO_IDX_0, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_0_GPIO); 
  5.     pwm_control(HI_IO_NAME_GPIO_1,HI_IO_FUNC_GPIO_1_PWM4_OUT,HI_PWM_PORT_PWM4, g_car_speed); 
  6.     gpio_control(HI_IO_NAME_GPIO_9, HI_GPIO_IDX_9, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_9_GPIO); 
  7.     pwm_control(HI_IO_NAME_GPIO_10,HI_IO_FUNC_GPIO_10_PWM1_OUT,HI_PWM_PORT_PWM1, g_car_speed); 

 小車后退

  1. /*car go back */ 
  2. hi_void car_go_back(hi_void) 
  3.     correct_car_speed(); 
  4.     pwm_control(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_PWM3_OUT,HI_PWM_PORT_PWM3, g_car_speed);  
  5.     gpio_control(HI_IO_NAME_GPIO_1, HI_GPIO_IDX_1, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_1_GPIO); 
  6.     pwm_control(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT,HI_PWM_PORT_PWM0, g_car_speed);  
  7.     gpio_control(HI_IO_NAME_GPIO_10, HI_GPIO_IDX_10, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_10_GPIO); 

 小車左轉(zhuǎn)

  1. /*car turn left */ 
  2. hi_void car_turn_left(hi_void) 
  3.     correct_car_speed(); 
  4.     pwm_control(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_PWM3_OUT,HI_PWM_PORT_PWM3, PWM_DUTY_LEFT_RIGHT);  
  5.     gpio_control(HI_IO_NAME_GPIO_1, HI_GPIO_IDX_1, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_1_GPIO); 
  6.     gpio_control(HI_IO_NAME_GPIO_9, HI_GPIO_IDX_9, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_9_GPIO); 
  7.     pwm_control(HI_IO_NAME_GPIO_10,HI_IO_FUNC_GPIO_10_PWM1_OUT,HI_PWM_PORT_PWM1, PWM_DUTY_LEFT_RIGHT); 

 小車右轉(zhuǎn)

  1. /*car turn right */ 
  2. hi_void car_turn_right(hi_void) 
  3.     correct_car_speed(); 
  4.     gpio_control(HI_IO_NAME_GPIO_0, HI_GPIO_IDX_0, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_0_GPIO); 
  5.     pwm_control(HI_IO_NAME_GPIO_1,HI_IO_FUNC_GPIO_1_PWM4_OUT,HI_PWM_PORT_PWM4, PWM_DUTY_LEFT_RIGHT); 
  6.     pwm_control(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT,HI_PWM_PORT_PWM0,PWM_DUTY_LEFT_RIGHT); 
  7.     gpio_control(HI_IO_NAME_GPIO_10, HI_GPIO_IDX_10, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_10_GPIO); 

 小車停止

  1. /*car stop */ 
  2. hi_void car_stop(hi_void) 
  3.     correct_car_speed(); 
  4.     pwm_control(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_PWM3_OUT,HI_PWM_PORT_PWM3, PWM_DUTY_STOP);  
  5.     gpio_control(HI_IO_NAME_GPIO_1, HI_GPIO_IDX_1, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_1_GPIO); 
  6.     pwm_control(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT,HI_PWM_PORT_PWM0, PWM_DUTY_STOP); 
  7.     gpio_control(HI_IO_NAME_GPIO_10, HI_GPIO_IDX_10, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_10_GPIO); 
  8.  

4. 按鍵長按短按功能能的實現(xiàn)

按鍵功能的實現(xiàn)唐佐林老師已經(jīng)做了很深入的分享,我這邊也是參考唐老師的分享來實現(xiàn)的,

附上唐老師的帖子鏈接:

實現(xiàn)按鍵“按下事件”和“釋放事件”的通用框架(V0.0.1)

實現(xiàn)物理按鍵的“長按事件”(按鍵通用框架 V0.0.2)

實現(xiàn)S1,S2,User三個物理按鍵的獨立事件-上(解決思路分析)

實現(xiàn)S1,S2,User三個物理按鍵的獨立事件-下(DTButton-V0.0.3)

本案例中按鍵功能實現(xiàn)在KeyEvent.c和KeyEvent.h

4.1 主要函數(shù)介紹在KeyEvent.h中

  1. /* 
  2.   Description:  
  3.       Key event callback function pointer type. 
  4.  
  5.   Parameter: 
  6.       id --  key id 
  7.       event  -- key event type 
  8.  
  9.   Return Value: 
  10.       0     -- Success 
  11.       other -- Failure 
  12. */ 
  13. typedef void (*PKeyEventCallback)(KEY_ID_TYPE keyid, KEY_EVENT_TYPE event); 
  14.  
  15. /* 
  16.   Description:  
  17.        initialize key event process context. 
  18.  
  19.   Parameter: 
  20.       None 
  21.  
  22.   Return Value: 
  23.       0     -- Success 
  24.       other -- Failure 
  25. */ 
  26. int KeyEvent_Init(void); 
  27.  
  28. /* 
  29.   Description:  
  30.       To register callback functions for a GPIO key
  31.  
  32.   Parameter: 
  33.       name     -- target GPIO port name for a phisical key 
  34.       callback -- callback function for key event 
  35.       event    -- the target key event to trigger callback 
  36.  
  37.   Return Value: 
  38.       0     -- Success 
  39.       other -- Failure 
  40. */ 
  41. int KeyEvent_Connect(const charname, PKeyEventCallback callback, unsigned int event); 
  42.  
  43. /* 
  44.   Description:  
  45.       To unregister callback functions for a GPIO key
  46.  
  47.   Parameter: 
  48.       name -- target GPIO port name for a phisical key 
  49.  
  50.   Return Value: 
  51.       None 
  52. */ 
  53. void KeyEvent_Disconnect(const charname); 
  54.  
  55. /* 
  56.   Description:  
  57.       To close key event process context. 
  58.  
  59.   Parameter: 
  60.       None 
  61.  
  62.   Return Value: 
  63.       None 
  64. */ 
  65. void KeyEvent_Close(void); 

4.2 使用范例

先初始化按鍵事件處理、并注冊回調(diào)函數(shù)和所需的事件

  1. ret += KeyEvent_Init(); // 初始化按鍵事件處理上下文 
  2.   /* 設置GPIO_5按鍵的回調(diào)函數(shù),同時需要響應按下,釋放以及長按三個事件 */ 
  3.   /* 按鍵觸發(fā)順序: Pressed -> LongPressed(optional) -> Released */ 
  4.   ret += KeyEvent_Connect("GPIO_5", KeyEvent_Callback, KEY_EVENT_PRESSED | KEY_EVENT_LONG_PRESSED | KEY_EVENT_RELEESED); 

如只需要按下的功能只需要注冊KEY_EVENT_PRESSED

  1. ret += KeyEvent_Connect("GPIO_5", KeyEvent_Callback, KEY_EVENT_PRESSED); 

接著實現(xiàn)KeyEvent_Callback回調(diào)

  1. static void KeyEvent_Callback(KEY_ID_TYPE keyid, KEY_EVENT_TYPE event) 
  2.     printf("[CarDemo] KeyEvent_Callback() : keyid=%d event= %d\n", (int)keyid, (int)event); 
  3.  
  4.     int ret = -1; 
  5.     switch (keyid) 
  6.     { 
  7.     case KEY_ID_USER: 
  8.          printf("[CarDemo] KEY_ID_USER\n"); 
  9.         if( event == KEY_EVENT_PRESSED ) { /*  按下事件處理代碼 */  
  10.             car_stop(); 
  11.         } 
  12.         if( event == KEY_EVENT_LONG_PRESSED ) { /*  長按事件處理代碼 */ 
  13.  
  14.         } 
  15.         if( event == KEY_EVENT_RELEESED ) { /*  松開事件處理代碼 */  
  16.  
  17.         } 
  18.         break; 
  19.     case KEY_ID_S1: 
  20.          printf("[CarDemo] KEY_ID_S1\n"); 
  21.         if( event == KEY_EVENT_PRESSED ){  /*  按下事件處理代碼 */  
  22.             car_go_forward(); 
  23.         } 
  24.         if( event == KEY_EVENT_LONG_PRESSED ) { /*  長按事件處理代碼 */ 
  25.             car_turn_left(); 
  26.         } 
  27.         if( event == KEY_EVENT_RELEESED ){ /*  松開事件處理代碼 */  
  28.  
  29.         } 
  30.         break; 
  31.     case KEY_ID_S2: 
  32.          printf("[CarDemo] KEY_ID_S2\n"); 
  33.         if( event == KEY_EVENT_PRESSED )      { /*  按下事件處理代碼 */  
  34.             car_go_back(); 
  35.         } 
  36.         if( event == KEY_EVENT_LONG_PRESSED ) { /*  長按事件處理代碼 */  
  37.             car_turn_right(); 
  38.         } 
  39.         if( event == KEY_EVENT_RELEESED ){ /*  松開事件處理代碼 */  
  40.  
  41.         } 
  42.         break; 
  43.      
  44.     default
  45.         break; 
  46.     } 
  47.  

5.附上完整的代碼如附件car.zip

5.1解壓附件將car目錄放到applications/sample/wifi-iot/app/下

#開發(fā)板漂流計劃#小車控制由簡入繁之按鍵控制-鴻蒙HarmonyOS技術(shù)社區(qū)

5.2修改applications/sample/wifi-iot/app/BUILD.gn

  1. import("//build/lite/config/component/lite_component.gni"
  2.  
  3. lite_component("app") { 
  4.     features = [ 
  5.         "car"
  6.     ] 

文章相關(guān)附件可以點擊下面的原文鏈接前往下載

https://harmonyos.51cto.com/resource/1286

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-10-08 14:48:03

鴻蒙HarmonyOS應用

2021-10-22 10:41:18

鴻蒙HarmonyOS應用

2020-12-16 10:05:48

鴻蒙開發(fā)板Onenet平臺

2020-11-09 10:04:40

鴻蒙

2021-09-28 10:02:26

鴻蒙HarmonyOS應用

2021-01-08 10:00:53

鴻蒙訊飛平臺語音控制

2021-09-09 10:06:09

鴻蒙HarmonyOS應用

2021-12-15 15:28:18

鴻蒙HarmonyOS應用

2020-11-30 10:18:02

鴻蒙小車

2022-04-19 11:09:13

Wi-Fi IoT智能小車鴻蒙

2021-02-01 13:58:51

鴻蒙HarmonyOS應用開發(fā)

2020-11-23 09:32:43

WIFI連接

2013-12-19 09:32:01

SDN南向網(wǎng)絡控制

2020-12-29 09:59:01

鴻蒙HarmonyOS智能家居

2019-06-13 11:50:41

Python面向?qū)ο?/a>編程語言

2022-09-07 15:35:49

設備開發(fā)鴻蒙

2020-12-17 10:02:16

鴻蒙Hi3861開發(fā)板

2020-10-27 10:08:19

Hi3861ADC驅(qū)動

2019-11-25 15:32:30

虛擬化IO故障

2020-10-20 09:32:43

HiSparkWi-FiIoT
點贊
收藏

51CTO技術(shù)棧公眾號