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