Close

Arduino časomíra a ukazatel skóre do tělocvičny

Arduino časomíra a tabule ukazující skóre

Náš čtenář, pan Miroslav Tesař, nám poslal už několik článků. Kromě velice povedeného projektu robotického Sudoku to byl nedávno projekt, který umožňoval používat starou PS/2 klávesnici s Arduinem. PS/2 klávesnice je využita i k ovládání dnešního projektu.


Nápad vytvořit ukazovatel skóre vznikl z požadavků školy SPŠ Poprad. Naše škola pořádá různé sportovní akce, ale neměla možnost zobrazovat čas a informace potřebné pro sportovní soutěže. Nákup komerčně prodávaného ukazatele skóre si škola z finančních důvodů nemohla dovolil a tak jsem pomocí Arduina vytvořil vlastní  časomíru za zlomek její komerční ceny.

Analýza

Analýzou požadavek od učitelů tělocviku jsem připravil koncepci ukazovatele skóre. Ta se skládá z:

  • čas – minuty v rozsahu od 00-99 a vteřiny v rozsahu 0-59 (čtyři zobrazovací prvky)
  • body – dvě dvoumístná čísla v rozsahu 00-99 (čtyři zobrazovací prvky)
  • sety – dvě jednomístná čísla v rozsahu 0-9 (dva zobrazovací prvky)
  • perioda – jednomístné číslo v rozsahu 0-9 (dva zobrazovací prvky)
  • tresty – dvě trojice znaku T
  • směr podání – dvě šípky
  • směr časování – dvě šípky

Celkově jde o 11 sedmi-segmentových čísel, t.j. 77 segmentů, čtyři segmenty ve tvaru šípky a šest segmentů ve tvaru T pro tresty, což tvoří dohromady 87 segmentů.

Ovládací prvky ukazovatele skóre

Pro ovládání tabule jsou potřebné tyto ovládací prvky:

  • Nastavení času časomíry: 
    • +-10 minut
    • +-10 vteřin
    • +-1 minuta
    • +-1 vteřina
  • Nastavení RTC hodin:
    • +-1 hodina
    • +-1 minuta
  • Domácí body:
    • +-1 bod domácí
  • Hosté body:
    • +-1 bod hosté
  • Domácí tresty:
    • +-1 trest domácí
  • Hosté tresty:
    • +-1 trest hosté
  • Domácí fauly/sety:
    • +-1 fauly/sety domácí
  • Hosté fauly/sety:
    • +-1 fauly/sety hosté
  • Perioda:
    • +-1 perioda
  • Změna směru podání:
    • podání vlevo
    • podání vpravo
  • Změna směru času:
    • Směr času nahoru
    • směr času dolu
  • Výmaz:
    • nulování počtu bodů pro domácí
    • nulování počtu bodů pro hosty
    • nulování fauly/sety domácí
    • nulování fauly/sety hosté
    • nulování tabule
  • Změna zobrazení:
    • Časomíra
    • Reálný čas
    • Teplota
  • Start/pauza časomíry
  • Siréna

Celkově jde o 40 povelů pro ukazovatel skóre.

Sumarizace vstupních a výstupních signálů

Tabule má 87 segmentů pro zobrazení informace a 40 signálů pro ovládání, co je dohromady 127 vstupně/výstupních obvodů. Takový počet není možné přímo realizovat Arduinem, proto jsem přistoupil k jejich redukci.

Klávesnice

Pro redukci počtu potřebných ovládacích tlačítek je možné vytvořit novou, speciální klávesnici, ale je to poměrně nevýhodné řešení. Kdyby se poškodila, vyřadili bychom z činnosti celou časomíru. A to by nám na „slávě“ nepřidalo. Rozumným řešením je použít starou PC klávesnici s výstupem PS/2. Táto klávesnice je již nepoužitelná pro PC a představuje tedy její rozumnou recyklaci. Velkou výhodou je, že její zničení lehce nahradíme klávesnici jinou (samozřejmě s výstupem PS/2).

Arduino klávesnice pro časomíru

Klávesnice pro časomíru

Použití PC klávesnice ale přineslo problém s protokolem PS/2, který neumožňuje přenos dat na větší vzdálenosti. Pro tento účel byl vytvořený převodník PS/2 – RS485, který umožňuje přenos dat až do vzdálenosti 1200 metrů (viz již zmíněný projekt). Další alternativou by bylo použít bezdrátový přenos.

Tímto řešením se nám počet vstupních obvodů zmenšil na jeden vstup RX RS232. Zároveň jsme se zbavili ošetření kláves proti zakmitávání a v konečném důsledku šetříme i strojový čas Arduina.

Adaptér pro připojení PS/2 klávesnice k Arduinu

Adaptér pro připojení PS/2 klávesnice

Zobrazovací segmenty

Redukce počtu potřebných výstupů pro zobrazovací segmenty představovala problém. Statické zobrazení obsazením 87 pinů (které nejsou k dispozici) je nesmysl a to i v případě, že by k dispozici byly. Náhrada statického zobrazování dynamickým by sice přinesla redukci na 23 výstupních pinů, ale ani ty nemáme k dispozici (třináct segmentů a deset společných výstupů pro sedmi-segmenty). V konečném důsledku by segmenty dynamickým přepínáním problikávaly, což by nebylo příjemné. 

Výborným řešením je použití 12 ks obvodů 74HCT595. Jedná se o je 8-bitový sériový posuvný registr s paralelním záchytným výstupným registrem. Tím se požadovaných 87 výstupních pinů zredukovalo jen na 4 výstupní piny. To je úspora 83 výstupních pinů! Nespornou výhodou je, že všechny segmenty budou staticky zobrazované a nebudou problikávat. Pro dodání potřebného výkonu do segmentů jsem použil obvody ULN2803.

Siréna

Dalším problémem byla siréna, která musí poskytovat jednotónový signál dostatečné intenzity (nesehnal jsem). Dostatečnou intenzitu mají komerčně používané sirény pro zabezpečovací techniku, avšak tyto vydávají signál v několika tónových úrovních. A to je nepřijatelné. Proto jsem přistoupil k vytvoření nové elektroniky do staré, vyřazené vícetónové sirény. 

RTC hodiny

Pro funkci reálného času jsem použil RTC shield s obvodem DS3231 z důvodu vyšší přesnosti.

Realizace

Po teoretickém vyřešení jsem přistoupil k realizaci ukazatele skóre.

Převodník protokolu PS/2 – RS485

Převodník tvoří Arduino NANO 168/328P spolu s budičem SN75176. Arduino zabezpečí převod protokolu PS/2 – RS232 a budič tvoří převodník RS232 – RS485.

Arduino převodník PS2 - RS485

Arduino převodník PS2 – RS485

Arduino převodník PS2 - RS485

Schéma Arduino převodníku PS/2 - RS485

Schéma převodníku

/*******************************************************
 * PREVODNIK PS2 KLAVESNICE NA RS485
 * -----------------------------------------------------
 * odeslani stlacene klavesy pomoci RS485
* *****************************************************/

/*******************************************************
 * KNIHOVNY
 *******************************************************/
 #include <PS2Keyboard.h>
 #include <SoftwareSerial.h>

/*******************************************************
 * KONSTANTY PRE PS/2
 *******************************************************/
 #define DATA_PIN  4   // Data
 #define IRQ_PIN   3   // Clock

/*******************************************************
 * KONSTANTY PRE USART
 *******************************************************/
 #define TX      19  
 #define RX      14
 #define Speed 4800

/*******************************************************
 * INSTANCE
 *******************************************************/
 PS2Keyboard    kbd;
 SoftwareSerial mySerial(RX, TX);

/*******************************************************
 * PROMENNE
 *******************************************************/
 byte Klav;

/*******************************************************
 * SETUP
 *******************************************************/
 void setup() {
   Serial.begin(9600);  // Inicializace pro kontrolu kodu

   while (!Serial) { }; // Pockej na pripojeni klavesnice

   kbd.begin(DATA_PIN,IRQ_PIN);
   mySerial.begin(Speed);

   pinMode(RX,INPUT);
   pinMode(TX,OUTPUT);
   digitalWrite(TX,HIGH);
 }

/*******************************************************
 * HLAVNI PROGRAM
 *******************************************************/
 void loop() {
   if(kbd.available()) {
     Klav = toupper(kbd.read());  // Konvertuj na velke pismena 
     mySerial.write(Klav);        // Posli na RS232    
     // Serial.println(Klav);     // Pro kontrolu kodu
   } 
 }

Sběrnice RS485 umožňuje přenášet data až do vzdálenosti 1200 metrů, což pro naši aplikaci plně vyhovuje.

Řídící jednotka

Řídící jednotku tvoří Arduino NANO 168/328P, převodník SN75176 pro konverzi zběrnice RS485 na RS232, posuvné registry 74HCT595, budiče LED ULN2803, RTC shield s obvodem DS3231 a relé pro sirénu. 

Hlavní program je vytvořený „operačním systémem s vlákny“, které se spouštějí na základě událostí. Vlákna zajišťují tyto funkce:

  • aktualizace údaje na při změně času
  • reakce na přijatý kód z klávesnice
  • aktualizace údajů jako reakce na kód z klávesnice
  • aktualizace reálného času od RTC
  • aktualizace teploty
  • aktualizace při změně režimu na Reálný čas
  • aktualizace při změně režimu na Časomíra
  • aktualizace při změně režimu na Teplota
  • výstup na můstek sirény
  • buzení sirény

Toto řešení umožňuje vytvořit modulový programový systém, který je přehledný a poměrně lehko modifikovatelný. Každý modul je možné spouštět z jakékoli časti programu.

Arduino časomíra - Schéma hlavní jednotky

Schéma hlavní jednotky

DPS hlavní jednotky

DPS hlavní jednotky

Siréna

Siréna je naprogramovaná pro variabilní použití. Pokud máme sirénu, která vydává tón, nepotřebujeme použít výstupy Hz1 a Hz2, ale stačí jen její aktivace pomocí relé. V případě, že si vytvoříme vlastní budič sirény, výstupy Hz1 a Hz2 vyvolají příslušný tón. Předřadné odpory k Hz1 a Hz2 mají hodnotu 10K a kolektorové odpory 4K7.

DPS řízení sirény

DPS řízení sirény

DPS řízení sirény

DPS řízení sirény

Schéma řízení sirény

Schéma řízení sirény

Zdroje napájení

Pro elektroniku výsledkové tabule byl použitý impulzní průmyslový zdroj 230V/5V 20A z důvodu vhodného výstupního napětí, proudové zatížitelnosti, spolehlivosti a hlavně z důvodu bezpečnosti proti úrazu elektrickým proudem. 

Siréna je napájená z nezávislého zdroje 230V/12V 4A. Jeho volba závisí na parametrech konkrétní sirény.

Segmenty displeje

Segmenty displeje jsou osazené vysokosvítivými LED diodami s velkým vyzařovacím úhlem a s průměrem 10mm ve dvou řadách.  Každá dioda má svůj předřadný odpor, jeho odporovou hodnotu je vhodné si dopředu vyzkoušet, aby proud diodou nepřekročil mezní hodnoty. Je třeba dbát i na výkonovou zatížitelnost. Alternativou by mohl být LED pás.

Barva LED diod je pro časomíru a sety zelená. Ostatní zobrazovací segmenty mají červenou barvu.

Při instalaci tabule je nutné před ní dát ochanou síť, aby nedošlo k zamáčknutí LED dovnitř tabule.

Závěr

Časomíra pracuje několik roků bez problému a představuje významný přínos pro zkvalitnění informovanosti o výsledku zápasu. Kód, schémata a DPS ke stažení zde.


Děkujeme za velice zajímavý článek! Máte i vy článek, se kterým se chcete pochlubit? Přečtěte si, jak na to.

Zbyšek Voda

Napsat komentář