Otváranie brány cez telefón

Už dlhšiu dobu máme doma bránu, ktorá zamedzuje vstup na náš pozemok a tá je ovládaná pomocou vlastného diaľkového ovládača. Nevýhodou však je, že vstup na pozemok je hneď z hlavnej cesty. Takže počas otvárania brány (čo niečo trvá) blokujem premávku na ceste. Preto som začal hľadať riešenie ako otvoriť bránu tak (s predstihom) aby už bola otvorená, keď k nej prídem. No a našiel som.
Arduino logo

Vízia

Tento článok je pokračovaním alebo inak povedané ako využiť spojenie arduina a GSM shieldu. Ako som už v úvode spomenul a načrtol pôjde o otváranie garážovej brány prostredníctvom GSM. Máme namontovanú bránu od fy. Wiśniowski aj s ich pohonom. Elektronika pohonu umožňuje otváranie brány nie len pomocou diaľkového ovládania ale aj pomocou nejakého tlačidla. A mňa napadlo čo takto to tlačilo diaľkovo ovládať. A takto to celé vzniklo.

Ingrediencie

Na úvod si povieme čo všetko budeme potrebovať a prečo.

  • Arduino
  • GSM shield
  • SIM karta
  • Relay shield
  • Adaptér
  • Kabeláž

Arduino – Ako som už spomenul ja som si ho objednal z činy a ide o verziu s micro USB konektorom a mňa vyšla £6.60
GSM shield – Vybral som si lacný modul (£9.51), ktorý je postavený na čipe SIM800L
SIM karta – Ja som si zobral od telekomu na paušál bez záväzkov. Ide o paušal, kde platíte toľko koľko pretelefonujete. Obdoba O2 Fer.
Relay shield – Modul s relátkami, ktorý bude slúžiť na spínanie kontaktu, teda ako vypínač, vyšiel ma £2.59
Adaptér – Bude slúžiť na napájanie celého projektu. Ide o 12V adaptér s 1A. Cena £1.55
Kabeláž – prepojenie jednotlivých komponentov

Obstarávacia cena tohto je necelých 30€. Arduino Uno som si zvolil preto, že je to najpoužívanejšie Arduino a bude toho ovládať viac a taktiež to bolo aj s tým Relay Shieldom. Zobral som si so štyrmi relátkami aby som ho mohol využiť aj na iné veci. Ale o tom neskôr.

SIM Karta

Ešte sa však vrátim k SIM karta, pri ktorej som sa prerátal. Chcel som od Telekomu kartu, keďže u nich mam viac služieb, ale ako som už spomenul, prerátal som sa a urobil som chybu alebo inak poriadne som to preplatil. Prečo? Ceny volania a SMS sú približne rovnaké (rozdiely asi len v centoch) ale problém je, že Telekom si za aktiváciu zapýta 10€ a potom pri prvej faktúre ešte nejaký poplatok vo výške viac než 3€. O2 pri kúpe SIM karty si tých 10 euro zapýta (ak nieste ich zákazník) ale po polroku vám ich vráti. Takže som o 13€ ľahší.

Relé

Podľa slovenskej Wikipédie, relé je súčiastka, ktorá pozostáva zo spínača a cievky (elektromagnetu), ktorá pôsobením elektrického prúdu (prípadne svetla alebo tepla) v jednom obvode zapne alebo preruší elektrický prúd v druhom elektrickom obvode. Relé sa používa na riadenie malých záťaží ako osvetlenie alebo signálne systémy. Vynašiel ho v roku 1835 americký fyzik Joseph Henry. No a ja ho budem používať na ovládanie brány. Ako som už uviedol, zadovážil som si modul pre Arduino s štyroma relátkami.

Relé
Schéma a princíp činnosti (neutrálneho) relé: 1. cievka s jadrom z magneticky mäkkej ocele, 2. kotva, 3. pružný prepínací kontakt. Cievka s jadrom tvorí elektromagnet, ktorý pri priechode prúdu pritiahne kovovú kotvu, mechanicky spriahnutú s pružným kontaktom.

Na doske plošného spoja nájdete samotné relátka s potrebnými súčiastkami a piny pre napájanie a ovládanie relátok. Tí ktorý sa s relé ešte nestretli môžu byť prekvapený prečo ma relé 3 kontakty, vysvetlím. Relé má jeden vstup a dva výstupy. Prečo dva? V angličtine sú označované ako Normaly Closed a Normaly Open, teda po slovensky rozopnutý kľudnom stave  alebo zopnutý. Ako to využívať si povieme pri rozoberaní programu.

Vlastná funkcia

Podľa informácii z knižníc, ktoré som použil pre GSM Shield tak Uno má 2KB Ram a pri ich použití sa zaplní cca 80%. Preto na stiahnutie ponúkam len osekanú verziu, tak aby to všetko fungovalo spolu s funkciou, ktorú som si sám vytvoril. Najjednoduchší a najlacnejší spôsob ako zaslať príkaz na otvorenie brány, je prezvoniť. Keďže som nechcel aby sa brána otvárala na hocaké prezvonenie musel som zabezpečiť kontrolu prichádzajúcich hovorov. Pôvodné knižnice to obsahujú ale mne nevyhovovali. Knižnice zabezpečovali kontrolu prichádzajúceho čísla s číslami uloženými na SIM karte. Mne to prišlo ťažkopádne a urobil som si vlastnú funkciu, ktorá zabezpečuje kontrolu čísel zadaných priamo v kóde. Mne to príde jednoduchšie a jednoduchšie na aktualizáciu.

Na úvod si zadefinujeme knižnice, ktoré budeme potrebovať, relé a jeho port a triedu pre telefonovanie. Keďže relé je spínané nulou a rovnako vtedy aj dióda svieti, umelo si v kóde nastavujem, že zopnutie RELAY_ON je 0 a naopak RELAY_OFF 1 je 1.

#include <SoftwareSerial.h>           //kniznica pre seriovu komunikaciu
#include "SIM900.h"     //zakladna kniznica pre pracu s chipom SIM900
#include "call.h"       //kniznica zabezpecujuca telefonovanie

#define RELAY_ON 0      //zapnutie
#define RELAY_OFF 1     //vypnutie
#define Relay_1 2       //zadefinovanie pinu pre rele

CallGSM call;           //trieda pre hovor

Následne si zadefinujeme premenne a ich typy. Premenná my_numbers je pole telefónnych čísel. Zadávajte ich v úvodzovkách a oddeľujte čiarkou. V premennej call_delay je určené po akom čase ma zrušiť hovor (v milisekundách) a taktiež to používam aj ako dlho podržať zopnuté kontakty.

char number[10];           //volane tel cislo
char *my_numbers[]={"0901234567","0902345678"};   //pole telefonnych cisiel
byte stat;             //stav prichadzajuceho hovoru 
int call_delay = 500;      //dlzka pre hovor a zopnutie rele

Pri inicializácii si nastavíme, že pin pre relé bude výstup a nastavíme ho do nulovej hodnoty. Nastavíme si sériovú komunikáciu a spojíme sa s GSM modulom.

void setup() 
  {
    pinMode(Relay_1, OUTPUT);     //nastavenie relatka 1 ako vystup
    digitalWrite(Relay_1, RELAY_OFF);     //vypnutie relatka
    
    Serial.begin(9600);     //nastavenie seriovej komunikacie
    
    //spojenie s GSM shieldom
    Serial.print("Spajanie s GSM modulom.");
    if (gsm.begin(2400))     //uspesna komunikacia s GSM modulom
      {
        Serial.print("\nStav: spojenie uspesne");
      } 
    else     //komunikacia s GSM modulom sa nepodarila
      {
        Serial.print("\nStav: spojenie neuspesne");
      }          
  }

No a dostávame sa k hlavnému kódu. V ňom používam dve funkcie z knižníc pre GSM modul. Jednu, ktorá tam už bola a jednu svoju. Prvá je pôvodná, CallStatus. Tá zisťuje či niekto volá. Ak áno vo cykle for zisťujem, respektíve porovnávam či volá mnou povolené číslo. Ak áno prerušujem cyklus, počkám zadefinovaný čas (0.5s) a ruším hovor a pokračujem ďalej. V mojom prípade zopnem relé a po krátkej chvíli ho vypínam. Teraz mi začne otvárať bránu. Pre menej skúsených neodporúčam jednoduché zopnutie a rozopnutie relé, lebo je veľmi rýchle a asi málo čo na to zareaguje.

V prípade, že volané číslo sa nezhoduje s ani jedným z mojich zadaných čísem, taktiež počká 0.5s a ruší hovor.

Pre pochopenie v cykle for som použil zaujímavú funkciu, sizeof. Tá mi zistí koľko čísel mam v databáze, teda koľko čísel (cyklov) ma porovnávať. Keďže nezisťuje presne koľko čísel mám, ale koľko bajtov mam obsadených, a premenná check_number je typu char a tá zaberá 2 bajty. To znamená, že jedno číslo je uložená na dvoch bajtoch preto to delím dvojkou aby som zistil počet zadaných čísel.

void loop()
  {
    //zistuje ci niekto vola
    if(call.CallStatus() == CALL_INCOM_VOICE)   
      {
        //porovnava cisla
        for (byte i = 0; i < (sizeof(check_number)/2); i++)
          {
            stat = call.CallStatusNumber(number,my_numbers[i]);
            //ak sa zhoduju cisla prerusuje porovnavanie cisel
            if(stat == CALL_INCOM_VOICE_AUTH) break;            
          }
        delay(call_delay);   //caka zadany cas
        call.HangUp();       //rusi prichadzajuci hovor
        //ak volalo povolene cislo
        if(stat == CALL_INCOM_VOICE_AUTH)                       
          {
            Serial.print("\nVolalo autorizovane cislo: ");
            digitalWrite(Relay_1, RELAY_ON);   //spajam kontakt
            delay(call_delay);                 //drzim
            digitalWrite(Relay_1, RELAY_OFF);  //odpajam kontakt
          }
       //ak volalo nepovolene cislo
       else                                                     
          {
            Serial.print("\nVolalo neautorizovane cislo: ");
          }
        Serial.print(number);
        Serial.println("\n#######################");
      }
    //ak nikto nevola
    else Serial.println("\nZiaden prichadzajuci hovor");
    delay(1000);   //opakujem kazdu sekundu
  }
Keďže som s projektom trochu ďalej a Arduino Uno mi už nepostačovalo testoval som ho už na Arduino Mega, teda aj kód a knižnice sú pre neho upravene. Ako to prerobiť na Arduino Uno sa môžete dočítať v mojom predchádzajúcom článku.

Na stiahnutie

Zdrojový kód + potrebné knižnice

Odkazy

Arduino a GSM shield
Arduino
eBay
Wiśniowski
Telekom
O2 Slovensko
Wikipédie – Relé