Zkonstruujeme semafor pro řízení kyvadlové dopravy, který se používá třeba při frézování vozovky.

Schéma zapojení

Schéma zapojení v programu KiCAD

semafor schema

Funkce použité v programu

void gpio_init(uint gpio)   (1)
static void gpio_set_dir(uint gpio, bool out) (2)
gpio_put(uint gpio, bool value) (3)
sleep_ms(uint milisekundy)  (4)
1 Počáteční nastavení pinu; gpio je číslo pinu.
2 Nastavení směru pinu; gpio je číslo pinu, parametr out nastaven na true znamená výstup (output). Nebo se to dá udělat pomocí direktivy preprocesoru GPIO_OUT (výstup) a GPIO_IN (vstup).
3 Nastavení hodnoty na pinu číslo gpio. value 1 znamená, že na pinu se objeví vysoká hodnota (3.3V), value 0 znamená, že pin bude přizemněn (0V).
4 Pauza programu v milisekundách.

Program

/* semafor.c    (c) Jirka Chráska <jirka@lixis.cz> 2025, BSD licence */
#include "pico/stdlib.h"
// piny 1. semaforu (červená,oranžová,zelená)
#define C1  18
#define O1  17
#define Z1  16
// piny 2. semaforu (červená,oranžová,zelená)
#define C2  13
#define O2  14
#define Z2  15

void on(int s)  { gpio_put(s,true); }   // rozsvítit
void off(int s) { gpio_put(s,false); }  // zhasnout

int main( void )
{
    gpio_init(C1);      gpio_set_dir(C1, true); // inicializace pinů
    gpio_init(O1);      gpio_set_dir(O1, true);
    gpio_init(Z1);      gpio_set_dir(Z1, true);
    gpio_init(C2);      gpio_set_dir(C2, true);
    gpio_init(O2);      gpio_set_dir(O2, true);
    gpio_init(Z2);      gpio_set_dir(Z2, true);

    on(C1); on(C2);     // počáteční stav semaforu (oba směry stojí)
    sleep_ms(10000);
    while( true ) {
        on(O1);         // změna stavu pojede 1. směr
        sleep_ms(3000);
        off(C1); off(O1); on(Z1);   // jede 1. směr
        sleep_ms(20000);
        on(O1); off(Z1); // zastavujeme 1. směr
        sleep_ms(6000);
        off(O1); on(C1); // 1. směr stojí, čekáme na uvolnění silnice
        sleep_ms(10000);
        on(O2);          // silnice je volná, pojede 2. směr
        sleep_ms(3000);
        off(C2);off(O2);on(Z2); // 2. směr jede
        sleep_ms(20000);
        on(O2); off(Z2); // zastavuje 2. směr
        sleep_ms(6000);
        on(C2); off(O2); // 2. směr stojí, čekáme na uvolnění silnice
        sleep_ms(10000);
    }
}
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)

project(semafor C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(semafor
    semafor.c
)
target_link_libraries(semafor pico_stdlib)
pico_add_extra_outputs(semafor)
Sestavení programu
$ cd semafor1
$ mkdir build
$ cd build
$ cmake ..
$ make -j8

Důležitý soubor pico_sdk_import.cmake, který slouží k nastavení projektu pro Pico, je potřeba buď

  • zkopírovat z adresáře /opt/pico/pico-sdk/external/pico_sdk_import.cmake do adresáře s projektem. Pokud máme CMakeLists.txt řádek:

include(pico_sdk_import.cmake)

tak ho musíme zkopírovat.

  • Nebo se dá využít trik, že bude cmake pico_sdk_import.cmake načítat přímo. Pokud máme CMakeLists.txt řádek:

include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)

tak nemusíme pico_sdk_import.cmake kopírovat, program cmake při sestavování projektu si soubor načte přímo z adresáře Pico SDK ( v našem případě je to /opt/pico/pico-sdk)

Výsledný program semafor.uf2

semafor/semafor.uf2

Výsledky

Fungující prototyp semaforu
Otočení videa o 90˚ pomocí programu ffmpeg
$ ffmpeg -i VID_20250208_154907.mp4 -vf "transpose=2" -acodec copy semafor1.mp4

Zdroje a odkazy