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

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
include(pico_sdk_import.cmake) tak ho musíme zkopírovat.
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
tak nemusíme |
Výsledný program 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