Pin It

Otváranie brány cez telefón


Strict Standards: Only variables should be passed by reference in /home2/dzookyeu/public_html/wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/nextgen_basic_singlepic/package.module.nextgen_basic_singlepic.php on line 35

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é

 
  • Petr Lank

    Moc hezká práce autora. Brána funguje jako víno, jen v čechách je potřeba zadat čísla celá, včetně +420, pak to jede.
    Ještě jednou moc děkuji a přeji hodně úspěchů v další tvořivé činnosti.

    • ambroz 666

      Dobrý deň mám arduino UNO GSM TX-na pin arduina 4 , GSM RX-na
      pin arduina 5.

      /tak som v súbore GSM.cpp
      od komentoval rx,tx

      Keď dám seriál monitor tak mi vypíše že je GSM aktívne a keď
      pre zvoním modul tak vypíše že volá autorizované číslo +421xxxxxxxxx a relé zopne. Ale
      druhý krát už to nefunguje. Znovu to ide vtedy ak odpojím seriál monitor a pripojím
      naspäť ale zasa iba prvý krát , druhý krát keď pre zvoním tak to zasa nezopína
      iba zvoní alebo nerobí nič.

      Ledka D2 /RING/ nesvieti trvale ale každých cca 15 sekúnd
      zhasne na 1 sekundu a ledka D6 v pravidelných intervaloch pre blikáva.
      Napájam to cez stabilizátor 5V/1,5A a GND arduina a GSM modulu sú
      prepojené.

      VDD a RST nemám zapojené !

      Prosím Vás neviete mi poradiť kde môže byť chyba? Ďakujem za
      odpoveď Vladimír Minár.

      p.s volal som aj z autorom
      článku ale nevie mi poradiť.

      • Na rychlo som sa dopatral k tomu VDD, ma tam byt 3.3V ale kvoli comu a ci je potrebne netusim.

        Pri rozbiehavani som bral inspiraciu od tohto pana https://www.youtube.com/watch?v=XqoeqG2j-ik a s nim som to nakoniec aj konzultoval. Nema tam niekde napisany pinout ale tak zbezne VDD nie je zapojene

        • ambroz 666

          Vám to funguje ?

          Dňa 25.12.2016 22:06 používateľ “Disqus” napísal:

          • Aktualne to nemam zapojene, len som to na prazdno testoval, realne to osadene nemam, lebo arduino ma mat na starosti viac nez len branu. Ale na necisto to fungovalo (spinalo rele)

          • ambroz 666

            Zajtra keď vám pošlem kód pozriete mi to mne to ide iba raz potom už nie.
            Dňa 25.12.2016 22:59 používateľ “Disqus” napísal:

      • Prave som narychlo cekol veci okolo samotneho chipu. Niekde dokonca odporucaju az 2A napajaci zdroj co moze mat pri spickach, teda pri prihlasovani do siete alebi prijimani hovoru.

        Co sa tyka lediek podla toho co pise D2 by mala svietit pri prijimani hovoru ci sms len niekde som sa docital ze je to power. A D6 (net) by mala blikat (vzdy). Ak je pripojeny do siete kazde 3s ked nie je kazdych 0.8s http://wiki.seeedstudio.com/wiki/LoNet_-_GSM/GPRS_Breakout takze podla tohoo co pises asi nieje v sieti

        • ambroz 666

          Trafo je 12v6A a napája stabilizátor 7805

          Dňa 25.12.2016 23:25 používateľ “Disqus” napísal:

        • ambroz 666

          Keď odpojil sériový kábel z arduina do notebooku a znovu ho pripojím tak to zas ide ale len raz,potom už iba vyzváňa ale nezopne

          Dňa 25.12.2016 23:28 používateľ “ambroz 666” napísal:

        • ambroz 666

          Musím kúpiť aj tak nový modul včera som mu omylom dal namiesto 5V 9V

          Dňa 25.12.2016 23:30 používateľ “ambroz 666” napísal:

        • ambroz 666

          Môžete mi poslať Váš e-mail.
          Ďakujem Vlado.

          Dňa 25.12.2016 23:36 používateľ “ambroz 666” napísal:

  • Jaroslav Urban

    ahoj rad by som spravil nieco podobne ale som zaciatocnik mozes mi poradit?

    • Ahoj, v com by si potreboval poradit?

      • Jaroslav Urban

        Ahoj až teraz som si všimol že si mi odpísal na žiadosť o pomoc. Som v programovaní arduina začiatočník a potreboval by som pomôcť z knižnicou.

        • No skus konkretne nieco, aby sme nepreslapovali na mieste

          • Jaroslav Urban

            ahoj mam nano a potreboval by som ovládať 4 relatka cez internet. Mám aj ethernet shield no neviem to rozchodiť. relatka ovladaju mor na naviaku.

          • Takze chces cez internet ovladat relatka?
            To som zatial nerobil, skusal som len ten ethernet shield a jednoduche pripojenie. Napis mi na mail tam skusime toto je tu mimo temy.

          • Jaroslav Urban

            vôbec sa mi nedarí to spojazdniť som v tom úplný začiatočník