一、
扬声器是一种将电信号转化为声信号的装置,其中的电磁转换原理大家感兴趣可以找下相关资料了解。本文实现的功能是使用PICO驱动OWS扬声器发声。
扬声器外部有两根引脚,将其中一根引脚接地,另一个引脚接信源就构成完成信号回路,信源频率大小、幅度将使扬声器发出不同音调及声音大小。经查找资料,原来PICO主控没有集成DAC功能,这意味着PICO难以实现驱动扬声器播放音乐这一功能,只能将其作为普通的蜂鸣器使用。而树莓派官方推出有一款PyBoard开发板,其集成有DAC专用芯片,PICO可以结合PyBoard使用就能够播放简单的音乐。
二、
2.1
硬件BOM表:
PICO开发板 1个
OWS扬声器 1个
BJT晶体管 PNP 1个
2.2
PNP晶体管用于将信号放大,由于PICO主控不带有DAC,这里PNP晶体管也没有太大用途。但是这里会给出一套扬声器结合晶体管的放大电路方案,可应用于其他带有DAC的主控开发板。结合本次活动的小游戏开发背景,扬声器由一系列不等频率脉冲来驱动。
三、程序设计
将PICO的21引脚设为信源输出引脚,将扬声器其中一个引脚连接至PICO GPIO21引脚,另一个引脚接地。
示例程序:
#include "pico/stdlib.h" #include "perf_counter.h" #include "bsp/bsp.h" #include <stdio.h> #include "RTE_Components.h" #if defined(RTE_Compiler_EventRecorder) && defined(RTE_Compiler_IO_STDOUT_EVR) # include <EventRecorder.h> #endif #if defined(RTE_Script_PikaScript) # include "pikaScript.h" #endif void SysTick_Handler(void) { } static void system_init(void) { extern void SystemCoreClockUpdate(); SystemCoreClockUpdate(); init_cycle_counter(false); #if defined(RTE_Compiler_EventRecorder) && defined(RTE_Compiler_IO_STDOUT_EVR) EventRecorderInitialize(0, 1); #endif stdio_init_all(); bsp_init(); } const uint LED_PIN = PICO_DEFAULT_LED_PIN; void LED_Init(){ gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); } void LED_Run(){ gpio_put(LED_PIN, 1); sleep_ms(250); gpio_put(LED_PIN, 0); sleep_ms(250); printf("QuansirX.\n"); } void user_pin_init(uint16_t pin){ gpio_init(pin); gpio_set_dir(pin,GPIO_OUT); gpio_set_pulls(pin,0,1); } void user_pin_run(uint16_t pin,uint16_t t){ gpio_put(pin,1); delay_us(t); gpio_put(pin,0); delay_us(t); } int main(void) { system_init(); user_pin_init(21); while (true) { for(uint16_t i=0;i<250;i++){ user_pin_run(21,i); } } }
四、实验效果
硬件连接图
灰色线连接GND,红色线连接GPIO21引脚,通电后可以听到嘀嘀嘀声音