開發(fā)板漂流計劃之小車控制由簡入繁之按鍵控制
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
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
- # CONFIG_PWM_SUPPORT is not set
改為
- CONFIG_PWM_SUPPORT=y
3.2 電機的控制代碼
電機控制代碼是從潤和Gitee小車樣例代碼car_control.c和car_control.h 修改而來。
主要修改如下
將car_control.c中
- #include <app_demo_robot_car.h>
- extern hi_u32 g_car_speed;
移除app_demo_robot_car.h和extern ,改為如下
- hi_u16 g_car_speed;
在car_control.h中添加以下define
- #define MAX_SPEED (100)
- #define MIN_SPEED (30000)
- #define PWM_DUTY_LEFT_RIGHT (5000)
- #define PWM_DUTY_FORWARD_BACK (10000)
小車前進
- /*car go forward */
- hi_void car_go_forward(hi_void)
- {
- correct_car_speed();
- gpio_control(HI_IO_NAME_GPIO_0, HI_GPIO_IDX_0, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_0_GPIO);
- pwm_control(HI_IO_NAME_GPIO_1,HI_IO_FUNC_GPIO_1_PWM4_OUT,HI_PWM_PORT_PWM4, g_car_speed);
- gpio_control(HI_IO_NAME_GPIO_9, HI_GPIO_IDX_9, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_9_GPIO);
- pwm_control(HI_IO_NAME_GPIO_10,HI_IO_FUNC_GPIO_10_PWM1_OUT,HI_PWM_PORT_PWM1, g_car_speed);
- }
小車后退
- /*car go back */
- hi_void car_go_back(hi_void)
- {
- correct_car_speed();
- pwm_control(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_PWM3_OUT,HI_PWM_PORT_PWM3, g_car_speed);
- gpio_control(HI_IO_NAME_GPIO_1, HI_GPIO_IDX_1, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_1_GPIO);
- pwm_control(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT,HI_PWM_PORT_PWM0, g_car_speed);
- 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)
- /*car turn left */
- hi_void car_turn_left(hi_void)
- {
- correct_car_speed();
- pwm_control(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_PWM3_OUT,HI_PWM_PORT_PWM3, PWM_DUTY_LEFT_RIGHT);
- gpio_control(HI_IO_NAME_GPIO_1, HI_GPIO_IDX_1, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_1_GPIO);
- gpio_control(HI_IO_NAME_GPIO_9, HI_GPIO_IDX_9, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_9_GPIO);
- pwm_control(HI_IO_NAME_GPIO_10,HI_IO_FUNC_GPIO_10_PWM1_OUT,HI_PWM_PORT_PWM1, PWM_DUTY_LEFT_RIGHT);
- }
小車右轉(zhuǎn)
- /*car turn right */
- hi_void car_turn_right(hi_void)
- {
- correct_car_speed();
- gpio_control(HI_IO_NAME_GPIO_0, HI_GPIO_IDX_0, HI_GPIO_DIR_OUT, HI_GPIO_VALUE1, HI_IO_FUNC_GPIO_0_GPIO);
- pwm_control(HI_IO_NAME_GPIO_1,HI_IO_FUNC_GPIO_1_PWM4_OUT,HI_PWM_PORT_PWM4, PWM_DUTY_LEFT_RIGHT);
- pwm_control(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT,HI_PWM_PORT_PWM0,PWM_DUTY_LEFT_RIGHT);
- gpio_control(HI_IO_NAME_GPIO_10, HI_GPIO_IDX_10, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_10_GPIO);
- }
小車停止
- /*car stop */
- hi_void car_stop(hi_void)
- {
- correct_car_speed();
- pwm_control(HI_IO_NAME_GPIO_0,HI_IO_FUNC_GPIO_0_PWM3_OUT,HI_PWM_PORT_PWM3, PWM_DUTY_STOP);
- gpio_control(HI_IO_NAME_GPIO_1, HI_GPIO_IDX_1, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_1_GPIO);
- pwm_control(HI_IO_NAME_GPIO_9,HI_IO_FUNC_GPIO_9_PWM0_OUT,HI_PWM_PORT_PWM0, PWM_DUTY_STOP);
- gpio_control(HI_IO_NAME_GPIO_10, HI_GPIO_IDX_10, HI_GPIO_DIR_OUT, HI_GPIO_VALUE0, HI_IO_FUNC_GPIO_10_GPIO);
- }
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中
- /*
- Description:
- Key event callback function pointer type.
- Parameter:
- id -- key id
- event -- key event type
- Return Value:
- 0 -- Success
- other -- Failure
- */
- typedef void (*PKeyEventCallback)(KEY_ID_TYPE keyid, KEY_EVENT_TYPE event);
- /*
- Description:
- initialize key event process context.
- Parameter:
- None
- Return Value:
- 0 -- Success
- other -- Failure
- */
- int KeyEvent_Init(void);
- /*
- Description:
- To register callback functions for a GPIO key.
- Parameter:
- name -- target GPIO port name for a phisical key
- callback -- callback function for key event
- event -- the target key event to trigger callback
- Return Value:
- 0 -- Success
- other -- Failure
- */
- int KeyEvent_Connect(const char* name, PKeyEventCallback callback, unsigned int event);
- /*
- Description:
- To unregister callback functions for a GPIO key.
- Parameter:
- name -- target GPIO port name for a phisical key
- Return Value:
- None
- */
- void KeyEvent_Disconnect(const char* name);
- /*
- Description:
- To close key event process context.
- Parameter:
- None
- Return Value:
- None
- */
- void KeyEvent_Close(void);
4.2 使用范例
先初始化按鍵事件處理、并注冊回調(diào)函數(shù)和所需的事件
- ret += KeyEvent_Init(); // 初始化按鍵事件處理上下文
- /* 設置GPIO_5按鍵的回調(diào)函數(shù),同時需要響應按下,釋放以及長按三個事件 */
- /* 按鍵觸發(fā)順序: Pressed -> LongPressed(optional) -> Released */
- ret += KeyEvent_Connect("GPIO_5", KeyEvent_Callback, KEY_EVENT_PRESSED | KEY_EVENT_LONG_PRESSED | KEY_EVENT_RELEESED);
如只需要按下的功能只需要注冊KEY_EVENT_PRESSED
- ret += KeyEvent_Connect("GPIO_5", KeyEvent_Callback, KEY_EVENT_PRESSED);
接著實現(xiàn)KeyEvent_Callback回調(diào)
- static void KeyEvent_Callback(KEY_ID_TYPE keyid, KEY_EVENT_TYPE event)
- {
- printf("[CarDemo] KeyEvent_Callback() : keyid=%d event= %d\n", (int)keyid, (int)event);
- int ret = -1;
- switch (keyid)
- {
- case KEY_ID_USER:
- printf("[CarDemo] KEY_ID_USER\n");
- if( event == KEY_EVENT_PRESSED ) { /* 按下事件處理代碼 */
- car_stop();
- }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 長按事件處理代碼 */
- }
- if( event == KEY_EVENT_RELEESED ) { /* 松開事件處理代碼 */
- }
- break;
- case KEY_ID_S1:
- printf("[CarDemo] KEY_ID_S1\n");
- if( event == KEY_EVENT_PRESSED ){ /* 按下事件處理代碼 */
- car_go_forward();
- }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 長按事件處理代碼 */
- car_turn_left();
- }
- if( event == KEY_EVENT_RELEESED ){ /* 松開事件處理代碼 */
- }
- break;
- case KEY_ID_S2:
- printf("[CarDemo] KEY_ID_S2\n");
- if( event == KEY_EVENT_PRESSED ) { /* 按下事件處理代碼 */
- car_go_back();
- }
- if( event == KEY_EVENT_LONG_PRESSED ) { /* 長按事件處理代碼 */
- car_turn_right();
- }
- if( event == KEY_EVENT_RELEESED ){ /* 松開事件處理代碼 */
- }
- break;
- default:
- break;
- }
- }
5.附上完整的代碼如附件car.zip
5.1解壓附件將car目錄放到applications/sample/wifi-iot/app/下

5.2修改applications/sample/wifi-iot/app/BUILD.gn
- import("//build/lite/config/component/lite_component.gni")
- lite_component("app") {
- features = [
- "car",
- ]
- }
文章相關(guān)附件可以點擊下面的原文鏈接前往下載
https://harmonyos.51cto.com/resource/1286
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)