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

IMG 20260224 192637

IMG 20260224 192732

IMG 20260224 192823

IMG 20260224 192854

IMG 20260224 192953

IMG 20260224 192648

IMG 20260224 192736

IMG 20260224 192826

IMG 20260224 192933

IMG 20260224 192957

Zdroje a odkazy