Zmiana sygnału na semaforze

Ten wpis dotyczy kolejowych modułów Arduino. Dowiesz się z niego:

Zmiana sygnału na semaforze świetlnym w kodzie programu

Wyświetlenie wybranego sygnału na semaforze odbywa się poprzez wysłanie do urządzenia odpowiedniej ramki danych. Możesz to zrobić z wykorzystaniem odpowiedniego programu w urządzeniu do którego podłączony jest sterownik.

Opcja 1: Wyświetlenie wstępnie ustalonego obrazu sygnałowego

Do wyboru jest kilkanaście różnych wstępnie ustalonych obrazów sygnałowych odpowiadających sygnałom wyświetlanym na semaforach PKP. Możesz jednak określić także swoje własne obrazy sygnałowe.

Aby wysłać ramkę danych do zmiany sygnału na semaforze świetlnym wykonujemy polecenie setSignalAspect podając wybrany semafor oraz definicję obrazu sygnałowy.

C++
#include <Arduino.h>
#include "TrainbrainsModules.h"
#include "PKPSignalAspects.h"

TrainbrainsModules *modules = new TrainbrainsModules();
LightSignalRef signalC = new LightSignal(12, "Signal C");

void setup()
{
  modules->init();
  modules->setSignalAspect(signalC, SignalAspectS1);
}

Definicje gotowych obrazów sygnałowych zdefiniowane są w pliku PKPSignalAspects.h, który znajduje się w bibliotece, wystarczy dołączyć do swojego projektu (patrz linia #3).
Można odwoływać się do nich wprost:

C++
  modules->setSignalAspect(signalC, SignalAspectS1);

lub wykorzystując predefiniowaną tablicę aspects:

C++
byte index = 1;
modules->setSignalAspect(signalC, aspects[index]);

Opcja 2: Wyświetlenie wstępnie ustalonego sygnału po indeksie

Można także wyświetlić sygnał po jego numerze zdefiniowanym przez konkretny model sterownika semafora. Robimy to korzystając z polecenia setSignalAspectIndex i podając wybrany semafor oraz numer wybranego sygnału.

C++
#include <Arduino.h>
#include "TrainbrainsModules.h"
#include "PKPSignalAspects.h"

TrainbrainsModules *modules = new TrainbrainsModules();
LightSignalRef signalC = new LightSignal(12, "Signal C");

void setup()
{
  modules->init();
  modules->setSignalAspectIndex(signalC, 2); //PKP S2 - green light
}

Wykazy sygnałów znajduje się w instrukcjach obsługi.

Opcja 3: Wyświetlenie własnego obrazu sygnałowego

Jeśli potrzebujesz możesz także określić własne obrazy sygnałowe i wysłać polecenie ich wyświetlenia. Możesz np. zdefiniować sygnały wątpliwe, lub inne, które z jakiegoś powodu nie są jeszcze zdefiniowane.

W tym celu trzeba zdefiniować jak wygląda obraz sygnałowy. Wymaga to podania 3 informacji:

  • które latarnie mają być wykorzystane
  • które z wykorzystywanych latarni mają migać;
  • co oznacza dany sygnał.

Pierwsze dwie informacje podajemy w formie maski binarnej. Jedynka na konkretnej pozycji wskazuje odpowiednio wykorzystanie latarni lub jej miganie.
Trzecią podajemy jako jedną z dostępnych wartości. Do wyboru kilka możliwości:

Przykładowo obraz sygnałowy składający się z migającej trzeciej latarni semafora zdefiniujemy tak:

C++
SignalAspect customSignalAspect = SignalAspect(B00000100, B00000100, SignalType::STOP);

Aby wyświetlić taki aspekt na zdefiniowanym wcześniej semaforze C wysyłamy polecenie:

C++
modules->setSignalAspectIndex(signalC, customSignalAspect);

Przykład

W tym przykładzie wykorzystamy płytkę z podłączonymi 3 sterownikami. Do napisania programu sterującego semaforami wykorzystamy bibliotekę trainbrains SDK. W tym celu należy pobrać bibliotekę i dołączyć ją do projektu. Zależnie od środowiska programistycznego (IDE) będzie się to odbywało nieco inaczej.

Pełny kod do tego przykładu możesz pobrać z repozytorium trainbrains.

Projekt

Załóżmy, że budujemy makietę z 3 semaforami. Wykorzystamy 3 jednokanałowe moduły sterowników semaforów świetlnych. Modele semaforów są podłączone do sterowników w następujący sposób:

  • Semafor A jest podłączony do sterownika pod adresem 10, kanał 1;
  • Semafor B jest podłączony do sterownika pod adresem 11, kanał 1;
  • Semafor C jest podłączony do sterownika pod adresem 12, kanał 1;

Celem programu niech będzie naprzemienne podawanie sygnału do jazdy pociągowej na jednym z trzech semaforów. Mało realistyczne, ale to tylko ćwiczenie 😉

Krok 1. Deklaracja urządzeń przytorowych

Deklarujemy w kodzie programu jakimi urządzeniami przytorowymi będziemy sterować. Można to zrobić na przykład w ten sposób:

C++
#include <Arduino.h>
#include "TrainbrainsModules.h"
#include "PKPSignalAspects.h"

TrainbrainsModules *modules = new TrainbrainsModules();

LightSignalRef signalA = new LightSignal(10, "Signal A");
LightSignalRef signalB = new LightSignal(11, "Signal B");
LightSignalRef signalC = new LightSignal(12, "Signal C");

void setup()
{
  modules->init();
}

Domyślnym numerem kanału jest 1. W tym przypadku nie trzeba podawać go ręcznie.

Krok 2. Wysłanie polecenia ustawiającego sygnał

Cykliczną zmianę sygnałów zrealizujemy w najprostszy sposób. Na początek wyślemy polecenia wyświetlenia sygnału S1 “Stój!” do każdego sterownika:

C++
void setup()
{
  modules->init();

  modules->setSignalAspect(signalA, SignalAspectS1);
  modules->setSignalAspect(signalB, SignalAspectS1);
  modules->setSignalAspect(signalC, SignalAspectS1);
}

A następnie, w pętli głównej programu wykonamy:

  • wysłanie poleceń wyświetlenia sygnału do wybranych urządzeń;
  • odczekanie kilku sekund;
  • powtórzenie tego procesu dla kolejnych sygnałów.
C++
void loop()
{
  // Display proceed signal on Signal A
  modules->setSignalAspect(signalC, SignalAspectS1);  //Stop
  modules->setSignalAspect(signalA, SignalAspectS12); //Proceed
  delay(4000);

  // Display proceed signal on Signal B
  modules->setSignalAspect(signalA, SignalAspectS1);  //Stop
  modules->setSignalAspect(signalB, SignalAspectS12); //Proceed
  delay(4000);

  // Display proceed signal on Signal C
  modules->setSignalAspect(signalB, SignalAspectS1);  //Stop
  modules->setSignalAspect(signalC, SignalAspectS12); //Proceed
  delay(4000);
}

A oto co wyszło z realizacji tego przykładu:

Pełny kod tego przykładu możesz pobrać tutaj.

To już prawie wszystko

Hej!

Mam nadzieję, że ten wpis jest dla Ciebie wartościowy. Może chcesz pomóc w rozwoju tych materiałów? Wystarczy, że zostawisz poniżej komentarz co o nim myślisz, czego Ci zabrakło lub co Twoim zdaniem trzeba poprawić albo dasz mu łapkę w gorę 👍

Otrzymuj informacje o nowych ciekawych materiałach. Dołącz do newslettera trainbrains!

Leave a Reply