Zdrojové kódy
tzavora.c
/* Traťový autoblok
* tzavora.c
* (c) Daniel Voborník 2026, vobornik.daniel@sspvc.cz
*/
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/structs/iobank0.h"
#include <stdio.h>
#define POCITADLO1_OUT_PIN 3
#define POCITADLO1_IN_PIN 2
#define POCITADLO2_OUT_PIN 7
#define POCITADLO2_IN_PIN 6
#define ZELENA_PIN 14
#define CERVENA_PIN 15
uint32_t pocitadlo1 = 0;
uint32_t pocitadlo2 = 0;
// přehled událostí na pinu
uint32_t gpio_get_events(uint gpio)
{
int32_t mask = 0xF << 4 * ( gpio % 8 );
return (iobank0_hw->intr[gpio / 8] & mask) >> 4 * ( gpio % 8 );
}
// vymazání událostí na pinu
void gpio_clear_events(uint gpio, uint32_t events)
{
gpio_acknowledge_irq(gpio, events);
}
typedef enum {
stuj = 0,
volno = 1
} SEMAFOR;
SEMAFOR semafor = stuj;
void semafor_na_volno()
{
semafor = volno;
gpio_put(CERVENA_PIN,0);
gpio_put(ZELENA_PIN,1);
}
void semafor_na_stuj()
{
semafor = stuj;
gpio_put(ZELENA_PIN,0);
gpio_put(CERVENA_PIN,1);
}
int main()
{
stdio_init_all();
sleep_ms(1500);
// printf("Pocitadlo1 = %d, pocitadlo2 = %d\n", pocitadlo1,pocitadlo2);
// Počítadlo náprav 1, před návěstidlem
// nastaveni vstupního pinu (fototranzistor)
gpio_set_function(POCITADLO1_IN_PIN, GPIO_FUNC_SIO);
gpio_set_dir(POCITADLO1_IN_PIN,false);
gpio_pull_up(POCITADLO1_IN_PIN); // pull-up rezistor musí být nastaven
// nastavení výstupního pinu - zapnutí závory
gpio_set_function(POCITADLO1_OUT_PIN, GPIO_FUNC_SIO);
gpio_set_dir(POCITADLO1_OUT_PIN, true);
gpio_put(POCITADLO1_OUT_PIN,true); // spouštíme počítadlo
// Počítadlo náprav 2, za návěstidlem
// nastaveni vstupního pinu (fototranzistor)
gpio_set_function(POCITADLO2_IN_PIN, GPIO_FUNC_SIO);
gpio_set_dir(POCITADLO2_IN_PIN,false);
gpio_pull_up(POCITADLO2_IN_PIN); // pull-up rezistor musí být nastaven
// nastavení výstupního pinu - zapnutí závory
gpio_set_function(POCITADLO2_OUT_PIN, GPIO_FUNC_SIO);
gpio_set_dir(POCITADLO2_OUT_PIN, true);
gpio_put(POCITADLO2_OUT_PIN,true); // spouštíme počítadlo
// semafor
gpio_set_function(ZELENA_PIN,GPIO_FUNC_SIO);
gpio_set_dir(ZELENA_PIN,GPIO_OUT);
gpio_set_function(CERVENA_PIN,GPIO_FUNC_SIO);
gpio_set_dir(CERVENA_PIN,GPIO_FUNC_SIO);
// test funkce semaforu
semafor_na_stuj();
sleep_ms(1500);
semafor_na_volno();
gpio_clear_events(POCITADLO1_IN_PIN, GPIO_IRQ_EDGE_RISE);
gpio_clear_events(POCITADLO2_IN_PIN, GPIO_IRQ_EDGE_RISE);
//uint32_t p1 = pocitadlo1;
//uint32_t p2 = pocitadlo2;
while (true) {
if( (gpio_get_events(POCITADLO1_IN_PIN) & GPIO_IRQ_EDGE_RISE) ) {
pocitadlo1++;
gpio_clear_events(POCITADLO1_IN_PIN, GPIO_IRQ_EDGE_RISE);
}
if( (gpio_get_events(POCITADLO2_IN_PIN) & GPIO_IRQ_EDGE_RISE) ) {
pocitadlo2++;
gpio_clear_events(POCITADLO2_IN_PIN, GPIO_IRQ_EDGE_RISE);
}
if(pocitadlo1 > pocitadlo2) { // před návěstidlem jsem napočítal více náprav než za návěstidlem
semafor_na_stuj();
} else {
semafor_na_volno();
pocitadlo1 = 0;
pocitadlo2 = 0;
}
// printf("Pocitadlo1 = %d, pocitadlo2 = %d\r", pocitadlo1,pocitadlo2);
sleep_ms(100);
}
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.12)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
project(tzavora C CXX ASM)
pico_sdk_init()
# pridani zdrojovych kodu
add_executable(tzavora
tzavora.c
)
# enable usb output, disable uart output
pico_enable_stdio_usb(tzavora 1)
pico_enable_stdio_uart(tzavora 0)
# create map/bin/hex/uf2 file etc.
pico_add_extra_outputs(tzavora)
target_link_libraries(tzavora pico_stdlib hardware_gpio)
Sestavení projektu
mkdir build
cd build
cmake ..
make -j4
Obrázky konstrukce









