驱动microROS控制板上的有源蜂鸣器,每间隔500毫秒响一声。
如下图所示,蜂鸣器为板载元器件,所以不需要外接其他设备,只需要把type-C数据线连接电脑与microROS控制板作为烧录固件功能即可。
microROS控制板上的蜂鸣器为有源蜂鸣器,当GPIO引脚电平为高电平开启鸣笛,当GPIO引脚电平为低电平关闭鸣笛。
程序源码对应的虚拟机路径为:
~/esp/Samples/esp32_samples/beep
初始化蜂鸣器的GPIO,其中BEEP_GPIO对应硬件电路的GPIO46,GPIO模式设置为输出模式。
xxxxxxxxxx
static 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();
}
开启蜂鸣器,蜂鸣器一直鸣笛。
xxxxxxxxxx
void Beep_On(void)
{
beep_state = BEEP_STATE_ON_ALWAYS;
beep_on_time = 0;
gpio_set_level(BEEP_GPIO, BEEP_ACTIVE_LEVEL);
}
关闭蜂鸣器。
xxxxxxxxxx
void 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则自动关闭蜂鸣器。
xxxxxxxxxx
void 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毫秒后自动关闭。
xxxxxxxxxx
void 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毫秒后自动关闭。
xxxxxxxxxx
void 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 second
while(1)
{
Beep_On_Time(500);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
使用Type-C数据线连接虚拟机/电脑与microROS控制板,如果系统弹窗选择连接到虚拟机上。
激活ESP-IDF开发环境,注意每次打开新终端都需要先激活ESP-IDF开发环境才可以编译固件。
xxxxxxxxxx
source ~/esp/esp-idf/export.sh
进入项目目录
xxxxxxxxxx
cd ~/esp/Samples/esp32_samples/beep
编译、烧录、打开串口模拟器
xxxxxxxxxx
idf.py build flash monitor
如果需要退出串口模拟器,请按Ctrl+]。
串口模拟器打印"hello yahboom"欢迎词,此时我们可以听到蜂鸣每间隔500毫秒响一声。