Bezkontaktné otváranie brán

Keďže som mal doma viac voľného času, pokračoval som v programovaní Arduina. Tentokrát som si urobil bezkontaktné otváranie garážovej brány. Dôvod výroby je ten, že nie vždy mám pri sebe diaľkové ovládanie a keďže mam len 2 kusy a situácia, keď som potreboval otvoriť bránu a nemohol som, bola veľmi častá, tak som sa rozhodol túto situáciu riešiť. Riešením bola pre mňa technológia RFID, teda Radio-frequency identification (Radio-frekvenčná identifikácia).

rfid

Pre presnejšiu ilustráciu situácie. Mám doma garážovú bránu, ku ktorej som dostal dva diaľkové ovládače. Jeden zvyčajne mám vo svojom aute a druhý ako záloha doma. Nerád nosím ovládač so sebou zavesený na kľúči od auta. Pretože je veľký a nechcem byť ako školník či upratovačka a tých ovládačov mam viac, teda jeden pre spomínanú garážovú bránu a druhý pre vonkajšiu bránu. Veľa krát sa mi stavalo, že sme boli s druhým autom na nákup v meste a nákup bolo treba vyložiť v garáži, ale kľúče boli v prvom aute alebo podobne. A tak som musel normálne vojsť do domu cez vchodové dvere a z vnútra otvoriť bránu.

Keďže brána, presnejšie motor brány má kontakty na otváranie/zatváranie brány, najprv som si urobil manuálne otváranie brány. Teda namontoval tlačidlo, ktorým sa brána otvára a zatvára. To používam, keď pracujem v garáži a potrebujem isť von. Rovnaké riešenie som bohužiaľ nemohol/nechcel použiť pre otváranie brány z vonku. Dôvod? Bezpečnosť!

Riešením je pre mňa bez kontaktné ovládanie, ako som už spomenul pomocou RFID. Teda priložením RFID kľúča (tagu) k čítačke sa identifikujete a arduino zopne relé (namiesto tlačidla) a otvorí či zatvorí bránu.

tag

Potrebné komponenty

Pre zostrojenie takéhoto ovládania brány som použil znova arduino v jeho nano verzii, jedno relé a čítačku no a samozrejme a kľúče ktoré budem používať.

Arduino Nano – 1.95 €
RFID RC-522 – 1.24 €
10x RFID – 1.57 €
Relé – 0.48 €
Spolu – 5.24 €

A pridal som ešte

2x odpor 4K7 ohmov
1x odpor 150 ohmov
1x mikrospínač
2x led
čokoladky
drôtiky

Pýtate sa prečo? Keďže mám tlačidlo na otváranie garážovej brány aj v dome, viac krát sa mi stalo, že deti omylom stlačili nesprávne tlačidlo a otvorili bránu a nikto o tom nevedel. Takže mikrospínač na zistenie či je zavretá brána a led diody na jej zobrazenie. Odpory sú pre diódy a pre spínače.

RFID-RC522-pinout

Zapojenie

Zapojenie čítačky je komplikovanejšie. Záleží od použitého arduina. Čítačka sa pripája na 5 kontaktov, SDA, SCK, MOSI, MISO, RST a samozrejme napájanie. Ako zapojiť jednotlivé piny som našiel v príkladoch knižnice pre RC522. Inak pozor čítačka je napájaná s 3.3V nie 5V!

rfid

No a takto som začal so zapajaním komponentov.

IMG_20170316_134118

Čítačku kariet a arduino som osadil vonku do krabičky, kde arduino som prilepil na čítačku pomocou tavnej pištole. Relé je uložene vo vnútri v druhej krabičke.

Pôvodné tlačidlá na otváranie a zatváranie brány som napojil priamo na arduino. Keďže mám dve tlačidlá (jeden v dome a druhé v garáži) tak sú zapojené paralelne a na pin 3. Na pin 4 som pripojil mikrospínač, ktorý detekuje či je zavretá brána. Dané piny ešte treba prepojiť cez odpor na zem (GND).

Použil som jednoduchý mikrospínač, ktorý ma dva výstupné kontakty, rovnako ako relé. Teda jeden v kľudovom stave rozopnutý a jeden zopnutý. Zapojenie treba zohľadniť aj v samotnom programe, ja som použil ten rozopnutý v kľudovom stave. Snímač zavretia brány som uložil do podlahy, pod bránu, tak že keď sa brána zavrie, zopne spínač. Do podlahy som vysekal malú dierku, do ktorej som ho osadil a zafixoval so silikónom.

Zobrazovanie stavu brány mam urobené cez dvojfarebné led, s dvoma kontaktmi a tie sú zapojené na PINy 5 a 6. Tie stači len prepólovať a zmenia farbu a to treba ošetriť v programe. K led ešte som zapojil aj ochranný odpor. Ledky, som umiestnil do vypínača. Konkrétne ide o tlačidlo značky Legrand z modelovej rady Valena s priehľadným prúžkom, cez ktoré je vidieť svietenie diod.

Programovanie

Po nainštalovaní Arduino IDE, je potrebné ho doplniť o knižnice pre čítačku kariet. Tie si doplníte takto. Sketch > Include Library > Manage Libraries… Tam si dáte vyhľadať MFRC522 a kliknete na Install. Nainštalovaním knižníc sa nainštalujú aj príklady použitia, ktoré som využil aj ja.

Najprv som použil príklad s názvom DumpInfo. Ten vypisuje informácie z načítanej karty. Je potrebne zistiť si „Card UID“, ktoré budete používať. Tie je potrebné následne zapísať do svojho programu. Tento príklad zobrazuje daný kód v tvare s medzerami a s veľkými písmenami (HEX tvar). Porovnávanie v programe sa deje bez medzier a tuším musia to byť malé písmená, teda treba ich upraviť.

Samotný program je veľmi jednoduchý, stačí načítať kartu, porovnať ju so svojimi kódmi v databáze a na základe toho urobiť akciu.

Teraz prejdem k popisu samotné programu. Na úvod je potrebné načítať si potrebné knižnice. Čítačka potrebuje SPI a MFRC522. Ja kvôli tlačidlu používam ešte knižnicu pre ošetrenie zákmitu tlačidla Bounce2 a SoftwareSerial pre ladenie.

#include <SPI.h>
#include <MFRC522.h>
#include <SoftwareSerial.h>
#include <Bounce2.h>

Po tomto sú zadefinované jednotlivé piny pre relé a tlačidlá, ledky a voliteľné pre čítačku. Taktiež vytváram inštancie pre ošetrenie zákmitov a čítačku kariet. No a posledné čo mam v úvode je databáza kódov povolených kariet. Svoje kódy môžete mať uložene samostatne každú v inej premennej, ako to mam ja kvôli prehľadu, alebo urobiť si jednú premnenú ako pole.

#define RST_PIN         9                       // Reset PIN
#define SS_PIN          10                      // 

#define LED_ZELENA      6               // Pin pre zelenu diodu
#define LED_CERVENA     5               // Pin pre cervenu diodu
#define ZAVRETIE        4               // Pin pre zistenie zavretia brany
#define TLACIDLO        3               // Pin pre tlacidlo na manualne otvaranie brany
#define RELAY           2               // Pin pre spinacie relatko
#define RELAY_ON        0           
#define RELAY_OFF       1   

Bounce debouncer1 = Bounce(); 
Bounce debouncer2 = Bounce(); 

MFRC522 mfrc522(SS_PIN, RST_PIN);               // vytvorenie instancie pre RFID

String read_rfid;                               // nacitane ID karty

// Povolene kody klucov
String kod1 = "hex_kod";
String kod2 = "hex_kod";
String kod3 = "hex_kod";

Po tomto nastáva inicializácia pre sériovú linku a pre spojenie s čítačkou kariet a všetkého ostatného.

// Inicializacia
void setup() 
  {
    Serial.begin(9600);                         // Inicializacia seriovej komunikacie
    while (!Serial);                            // Caka na dokoncenie inicializacie
    
    SPI.begin();                                // Inicializacia SPI zbernice
    mfrc522.PCD_Init();                         // Inicializacia MFRC522 citacky

    pinMode(RELAY, OUTPUT);                     // nastavenie pinu rele ako vystup
    digitalWrite(RELAY, RELAY_OFF);             // nastavenie vychodzieho stavu


    // inicializacia pre osetrenie zakmitu
    debouncer1.attach(TLACIDLO);
    debouncer1.interval(5);
    debouncer2.attach(ZAVRETIE);
    debouncer2.interval(5);

    pinMode(LED_ZELENA, OUTPUT);    // nastavenie pre zelenu diodu
    pinMode(LED_CERVENA, OUTPUT);   // nastavenie pre cervenu diodu
  }

Hlavný program je v skutku krátky. Ten neustále kontroluje, či našiel kartu. Ak ju nájde skontroluje jej kód v databáze. Ak tam je, vykoná akciu ak nie znovu vyčkáva. Ja ešte používam aj tlačidlo (stav brány) tak kontrolujem aj jeho stlačenie.

void loop() 
  {
    // hladanie novej karty
    if ( ! mfrc522.PICC_IsNewCardPresent()) 
      {
      button();
      zavretie();
      return;
      }

    if ( ! mfrc522.PICC_ReadCardSerial()) return;

    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);

    Serial.println(read_rfid);
    
    // Porovnanie kodu s databazou
    if (read_rfid==kod1 || 
        read_rfid==kod2 || 
        read_rfid==kod3) 
        
      { // akcia pri nacitani spravnej karty
        Serial.println("Spravny kod");
        button();
      }
    
// akcia pri nacitani nespravnej karty
    else
      { 
        Serial.println("Nespravny kod");
      }
  }

void dump_byte_array(byte *buffer, byte bufferSize) 
  {
    read_rfid="";
    for (byte i = 0; i < bufferSize; i++) 
      {
        read_rfid=read_rfid + String(buffer[i], HEX);
      }
  }

// podprogram pre ovladanie tlacidlom
void button()
  {
    debouncer1.update();
    if(debouncer1.read() == HIGH) otvor_branu();
  }

// podprogram na zistenie stavu brany a rozvietenie prislusnej led
void zavretie()
  {
    debouncer2.update();
    if(debouncer2.read() == HIGH)
      {
        digitalWrite(LED_ZELENA, LOW);
        digitalWrite(LED_CERVENA, HIGH); 
      }
    else
      {
        digitalWrite(LED_ZELENA, HIGH);
        digitalWrite(LED_CERVENA, LOW); 
      }     
  }

// podprogram pre ovladanie brany, zopnutia rele
void otvor_branu() 
  {
    digitalWrite(RELAY, RELAY_ON);
    delay(500);
    digitalWrite(RELAY, RELAY_OFF); 
    delay(3000);
  }

Samotné vykonanie akcie je tvorené zopnutím kontaktov relátka na určitý čas. Ten je závislý od ovladaného zariadenia. Ja to mam nastavené na 0.5s čo je dostatočný čas pre moju bránu, no s určitosťou viem povedať, že by to bolo málo pre moju vonkajšiu bránu, tam by som potreboval dlhší čas zopnutia. To si treba vyskúšať.

Na záver som ešte pridal čakanie 3 sekudny. To preto aby pri dlhšom priložení kľúča nezareagovalo relé viac krát. To by mohlo spúsobiť zastavenie pohybu brány. Nevýhodou je, že system zareaguje na povel až po troch sekúndách. To môže byť problém, ak chcete s bránou len trochu pohnúť.

// funkcia pre ovladanie brany
void otvor_branu() 
  {
    digitalWrite(RELAY, RELAY_ON);
    delay(500);
    digitalWrite(RELAY, RELAY_OFF); 
  }

Na záver ponúkam na stiahnutie obe verzie programu. Buď len čisto riešenie cez RFID alebo ako mam aj ja pomocou vnútorného tlačidla a so snímačom zavretia brány a so zobrazovaním pomocou led diódy.

A na úplný záver podotknem, že arduino som musel napájať s 12V. Keď som ho dal na 5V nefungovalo to korektne. A ako perličlu uvediem, že na otváranie možete použiť aj vašu platobnú kartu, Paywave.

 

Odkazy
RFID (Wiki)