Jednoduchá siréna (kvičítko) pro vydávání zvuků námi dané frekvence.
Realizace je primitivní. Na určitý pin (třeba GPIO15) je přiveden PWM signál určité frekvence o střídě 50%. Mezi tento pin a zem je připojen malý reproduktor (nebo pasivní bzučák). Aktivní bzučák nebude fungovat.
Kvičítko kvičí dobře od 350 Hz do 1 KHz, ale dost potichu.
Zdrojové kódy
CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
project(sirena C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(sirena
sirena.c
)
target_link_libraries(
sirena
hardware_pwm
pico_stdlib
)
pico_add_extra_outputs(sirena)
sirena.c
/* sirena.c
* Jednoduché PWM kvičítko
*
*/
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#define PIN_BZUCAK 15
// Funkce pro zvuk sirény
void hraj_ton(uint frekvence)
{
if (frekvence == 0) {
pwm_set_gpio_level(PIN_BZUCAK, 0);
return;
}
uint slice_num = pwm_gpio_to_slice_num(PIN_BZUCAK);
uint32_t clock = 125000000;
uint32_t divider = clock / (frekvence * 4096) + 1;
uint32_t top = clock / (divider * frekvence) - 1;
pwm_set_clkdiv(slice_num, divider);
pwm_set_wrap(slice_num, top);
pwm_set_gpio_level(PIN_BZUCAK, top / 2);
}
int main()
{
gpio_set_function(PIN_BZUCAK, GPIO_FUNC_PWM);
uint slice_num = pwm_gpio_to_slice_num(PIN_BZUCAK);
pwm_set_enabled(slice_num, true);
while(1) {
hraj_ton(600); // kvičítko kvičí tónem 600 Hz
sleep_ms(80); // prodleva 80 milisekund
hraj_ton(500); // kvičítko kvičí tónem 500 Hz
sleep_ms(80);
hraj_ton(450); // kvičítko kvičí tónem 450 Hz
sleep_ms(80);
hraj_ton(0); // kvičítko přestává kvičet
}
}
Sestavení projektu
cd sirena
mkdir build
cd build
cmake ..
make
cp sirena.uf2 /media/jirka/RPI-PICO