开发板漂移方案小车控制由简单到复杂按钮控制Buttons控制小车前进、后退、左转、右转、停止Demo。代码在openharmony1.10和openharmony3.00测试中均能正常运行。二、功能介绍1).短按OLED扩展板的S1键-前进2)。长按OLED扩展板的S1键-左转3)。短按OLED扩展板的S2键-返回4)。长按OLED扩展板的S2按钮-右转5)。短按核心板上的User键-停止3.电机控制代码3.1电机控制需要使用PWM,所以需要先开启PWM功能,开启方式如下:device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk#CONFIG_PWM_SUPPORTisnotset改为CONFIG_PWM_SUPPORT=y3.2电机控制代码电机控制代码修改自Run和Gitee小车的示例代码car_control.c和car_control.h。主要修改如下将car_control.c中#includeexternhi_u32g_car_speed;移去app_demo_robot_car.h和extern,修改为如下hi_u16g_car_speed;在car_control.h中添加以下define#defineMAX_SPEED(100)#defineMIN_0PLEGHTDU(3defineMIN_0PLEGHTDU)(5000)#definePWM_DUTY_FORWARD_BACK(10000)小车前进/*cargoforward*/hi_voidcar_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);}小车后退/*cargoback*/hi_voidcar_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);}小车左转/*carturnleft*/hi_voidcar_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);}小车右转/*carturnright*/hi_voidcar_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);}小车停止/*carstop*/hi_voidcar_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.点击长按短按键功能的现实按键功能的唐作霖老师已经做了很深入的分享。也是参考了唐老师的分享来实现的。附上唐老师帖子的链接:实现按钮“按下事件”和“释放事件”的通用框架(V0.0.1)实现物理按钮的“长按事件”(按钮通用框架V0.0.2)实现独立S1、S2和User三个物理按键的事件-上面(方案分析)实现S1、S2和User三个物理按键的独立事件-下面(DTButton-V0.0.3)本例实现的是按键功能在KeyEvent.c和KeyEvent.h4.1中KeyEvent.h中引入了main函数/*说明:Keyeventcallbackfunctionpointertype.Parameter:id--keyidevent--keyeventtypeReturnValue:0--Successother--Failure*/typedefvoid(*PKeyEventCallback)(KEY_ID_TYPEkeyid,KEY_EVENT_TYPEevent);/*说明:initializekeyeventprocesscontext.Parameter:NoneReturnValue:0--Successother--FailureIn*/intKeyEvent_);/*描述:为GPIOkey注册回调函数。参数:名称--targetGPIOportnameforaphisicalkeycallback--callbackfunctionforkeyeventevent--thatargetkeyeventtotriggercallbackReturnValue:0--Successother--Failure*/intKeyEvent_Connect(constchar*name,PKeyEventCallbackcallback,unsignedintevent);/*Description:TounregistercallbackfunctionsPforameter:GPIOname--targetGPIOportnameforaphisicalkeyReturnValue:None*/voidKeyEvent_Disconnect(constchar*name);/*Description:Toclosekeyeventprocesscontext.Parameter:NoneReturnValue:None*/voidKeyEvent_Close(void);4.2使用例子先初始化按键事件处理,并注册回调函数和需要的事件ret+=KeyEvent_Init();//初始化按键事件处理上下文/*设置GPIO_5按键的回调函数,需要响应按下、松开、长按三个事件*//*按键触发顺序:Pressed->LongPressed(optional)->已发布*/ret+=KeyEvent_Connect("GPIO_5",KeyEvent_Callback,KEY_EVENT_PRESSED|KEY_EVENT_LONG_PRESSED|KEY_EVENT_RELEESED);如果只需要按下功能,只需要注册KEY_EVENT_PRESSEDret+=KeyEvent_REConnect("GPIO_5",KeyEvent_Callback_PESSED,那么KESSCallbackstaticvoidKeyEvent_Callback(KEY_ID_TYPEkeyid,KEY_EVENT_TYPEevent){printf("[CarDemo]KeyEvent_Callback():keyid=%devent=%d\n",(int)keyid,(int)event);intret=-1;switch(keyid){caseKEY_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;caseKEY_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;caseKEY_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.zip5.1解压附件,将car目录放到applications/sample/wifi-iot/app/下5.2修改applications/sample/wifi-iot/app/BUILD.gnimport("//build/lite/config/component/lite_component.gni")lite_component("app"){features=["car",]}文章相关附件即可可点击下方原文链接下载https://harmonyos.51cto.com/resource/1286更多信息请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com