驱动microROS控制板上的有源蜂鸣器,每间隔500毫秒响一声。
如下图所示,蜂鸣器为板载元器件,所以不需要外接其他设备,只需要把type-C数据线连接电脑与microROS控制板作为烧录固件功能即可。

microROS控制板上的蜂鸣器为有源蜂鸣器,当GPIO引脚电平为高电平开启鸣笛,当GPIO引脚电平为低电平关闭鸣笛。
程序源码对应的虚拟机路径为:
~/esp/Samples/esp32_samples/beep
初始化蜂鸣器的GPIO,其中BEEP_GPIO对应硬件电路的GPIO46,GPIO模式设置为输出模式。
xxxxxxxxxxstatic void Beep_GPIO_Init(void){// zero-initialize the config structure.gpio_config_t io_conf = {};//disable interrupt 禁用中断io_conf.intr_type = GPIO_INTR_DISABLE;//set as output mode 设置为输出模式io_conf.mode = GPIO_MODE_OUTPUT;//bit mask of the pins that you want to set 引脚编号设置io_conf.pin_bit_mask = (1ULL<<BEEP_GPIO);//disable pull-down mode 禁用下拉io_conf.pull_down_en = 0;//disable pull-up mode 禁用上拉io_conf.pull_up_en = 0;//configure GPIO with the given settings 配置GPIO口gpio_config(&io_conf);// 关闭蜂鸣器Beep_Off();}
开启蜂鸣器,蜂鸣器一直鸣笛。
xxxxxxxxxxvoid Beep_On(void){beep_state = BEEP_STATE_ON_ALWAYS;beep_on_time = 0;gpio_set_level(BEEP_GPIO, BEEP_ACTIVE_LEVEL);}
关闭蜂鸣器。
xxxxxxxxxxvoid Beep_Off(void){beep_state = BEEP_STATE_OFF;beep_on_time = 0;gpio_set_level(BEEP_GPIO, !BEEP_ACTIVE_LEVEL);}
为了将蜂鸣器做到鸣笛超时自动关闭,需要在初始化蜂鸣器时开启蜂鸣器任务来管理蜂鸣器鸣笛时间。
xstatic void Beep_Task(void *arg){ESP_LOGI(TAG, "Start Beep_Task with core:%d", xPortGetCoreID());while (1){Beep_Handle();vTaskDelay(pdMS_TO_TICKS(10));}vTaskDelete(NULL);}
Beep_Handle函数主要任务是在BEEP_STATE_ON_DELAY状态时自动减少beep_on_time的值,直到等于0则自动关闭蜂鸣器。
xxxxxxxxxxvoid Beep_Handle(void){if (beep_state == BEEP_STATE_ON_DELAY){if (beep_on_time > 0){beep_on_time--;}else{Beep_Off();beep_state = BEEP_STATE_OFF;}}}
设置蜂鸣器开启时间,time=0时关闭,time=1时一直响,time>=10,延迟xx毫秒后自动关闭。
xxxxxxxxxxvoid Beep_On_Time(uint16_t time){ if (time == 1) { beep_state = BEEP_STATE_ON_ALWAYS; beep_on_time = 0; Beep_On(); } else if (time == 0) { beep_state = BEEP_STATE_OFF; beep_on_time = 0; Beep_Off(); } else { if (time < 10) time = 10; if (time > 10000) time = 10000; beep_state = BEEP_STATE_ON_DELAY; beep_on_time = (time / 10); gpio_set_level(BEEP_GPIO, BEEP_ACTIVE_LEVEL); }}在app_main里调用Beep_Init函数初始化蜂鸣器,并在循环中(每1000毫秒)设置蜂鸣器鸣笛500毫秒后自动关闭。
xxxxxxxxxxvoid app_main(void){printf("hello yahboom\n");ESP_LOGI(TAG, "Nice to meet you!");Beep_Init();vTaskDelay(pdMS_TO_TICKS(1000));// 每1秒响一次蜂鸣器 The buzzer sounds every 1 secondwhile(1){Beep_On_Time(500);vTaskDelay(pdMS_TO_TICKS(1000));}}
使用Type-C数据线连接虚拟机/电脑与microROS控制板,如果系统弹窗选择连接到虚拟机上。
激活ESP-IDF开发环境,注意每次打开新终端都需要先激活ESP-IDF开发环境才可以编译固件。
xxxxxxxxxxsource ~/esp/esp-idf/export.sh
进入项目目录
xxxxxxxxxxcd ~/esp/Samples/esp32_samples/beep
编译、烧录、打开串口模拟器
xxxxxxxxxxidf.py build flash monitor
如果需要退出串口模拟器,请按Ctrl+]。
串口模拟器打印"hello yahboom"欢迎词,此时我们可以听到蜂鸣每间隔500毫秒响一声。
