Ovládanie zariadenia s Arduinom mobilnou aplikáciou

V článku názorne ukážeme ako ovládať zariadenie s Arduinom pomocou mobilnej aplikácie, ktorá komunikuje s Arduinom cez bluetooth.



Video ukazuje jednoduchý, ale kompletný príklad ovládania Arduina mobilnou apkou:

Veľa prototypov, robotických konštrukcií a rôznych iných zariadení ovládaných mikrokontrolérmi získa veľkú pridanú hodnotu, ak ich bude možné ovládať pomocou mobilnej aplikácie. Kombinatorika mobilných platforiem a mikrokontrolérových vývojových dosiek je pomerne rozsiahla, preto sa v článku zameriame na najpopulárnejšie kombinácie, čiže na ovládanie zariadení s vývojovými doskami Arduino a ESP32 pomocou Android aplikácie. Obidve platformy, Arduino aj ESP 32 majú spoločného menovateľa v podobe vývojového prostredia Arduino IDE, v ktorom sa vyvíjajú aplikácie.

Zapojenie Arduina s dvomi LED

Ovládanie zariadenia s mikrokontrolérom pomocou mobilnej aplikácie je komplexná úloha, pretože je potrebné vytvoriť jednak program pre mikrokontrolér a taktiež Android aplikáciu. Na prvý pohľad to vyzerá zložito, ale stačí pochopiť princíp a zvládne to aj začiatočník. Navyše aplikácie pre mikrokontrolér a Android nemusíte vyvíjať súčasne, ale postupne. Najskôr vytvoríte a odladíte aplikáciu pre mikrokontrolér a až neskôr budete potrebovať aplikáciu pre smartfón. Preto aj tento článok bude rozdelený na dve časti. V prvej časti popíšeme vývoj aplikácie pre mikrokontrolér a v pokračovaní vývoj Android aplikácie.

Ako to funguje

Základným predpokladom je komunikácia medzi zariadením a smartfónom, na ktorom je spustená mobilná aplikácia. Nakoľko predpokladáme, že budeme ovládať zariadenie v bezprostrednej blízkosti, využijeme bluetooth komunikáciu s typickým dosahom 10 – 15 metrov. Komunikácia bude obojsmerná. Z mobilnej aplikácie sa budú do zariadenia posielať povely a zariadenie bude mobilnej aplikácii posielať údaje o svojom aktuálnom stave, napríklad o aktuálne vykonávanej funkcii, o stave batérie, prípadne zariadenie pošle aplikácii namerané údaje. Najjednoduchší a často používaný systém využíva na strane aplikácie kombinácie jednoduchých povelov vo forme písmen abecedy a povelov s parametrom, kde komunikácia obsahuje abecedný znak, číselnú hodnotu a ukončovací znak, napríklad „#“. Zariadenie posiela aplikácii v rovnakom tvare rôzne stavové a namerané hodnoty. Najlepšie to pochopíte na jednoduchom príklade.

K vývojovej doske Arduino Uno máme pripojené dve LED, červenú a zelenú. Červenú LED potrebujeme len spínať a u zelenej LED potrebujeme ovládať jej jas. V reálnom zariadení port na ktorom je červená LED môže cez relé, alebo tranzistor spínať nejaký komponent a cez port na ktorom je zelená LED ovládať jednosmerný motor. Arduino bude každú sekundu posielať hodnotu počítadla, ktoré sa inkrementuje. Takže definujeme povely:

C – prepnutie stavu červenej LED. Ak bola predtým vypnutá tak sa rozsvieti a naopak. Prípadne ak to aplikačná logika vyžaduje, môžete definovať samostatné povely na zapnutie a vypnutie LED bez ohľadu na to v akom stave bola LED predtým.

Z128# – nastavenie úrovne jasu zelenej LED v rozsahu hodnôt 0 – 255. „Z“ v tomto príklade znamená pre Arduino port na ktorom je pripojená zelená LED, „128“ je hodnota jasu, ktorý treba nastaviť a „#“ je ukončovací znak. Reťazec číslic ktoré reprezentujú číselnú hodnotu totiž môže byť jednomiestny, dvojmiestny, alebo viacmiestny.

P7# – údaj, ktorý posiela Arduino mobilnej aplikácii. „P“ je typ parametra, „7“ je hodnota a „#“ je ukončovací znak.

Kombinácia aplikácie s lokálnym ovládaním

Veľa zariadení je možné ovládať nielen z mobilnej aplikácie, ale aj lokálne pomocou rôznych ovládacích prvkov, napríklad tlačidiel, pomocou ktorých sa ovláda menu na lokálnom displeji. Po zmene stavu pomocou lokálnych ovládacích prvkov je potrebné poslať informáciu  aplikácii, aby aktualizovala stav ovládacích a signalizačných prvkov. Ak chcete zariadenie ovládať aj pomocou mobilnej aplikácie, nemôžete použiť mechanické ovládacie prvky, ktoré menia polohu ako sú napríklad spínače, prepínače, posuvné, či otočné potenciometre. Ak totiž z aplikácie aktivujete funkciu, ktorá sa na zariadení ovláda páčkovým prepínačom, bolo by potrebné prepnúť tento prepínač, aby stav lokálnych ovládacích prvkov korešpondoval s aktuálnym nastavením vykonaným cez aplikáciu. Rovnako ak nastavíte nejakú spojitú hodnotu napríklad na 60 % a táto hodnota sa na zariadení ovláda otočným potenciometrom so stupnicou, potrebovali by ste tento potenciometer pootočiť do aktuálnej polohy. Preto na ovládanie diskrétnych hodnôt typu zapnuté/vypnuté pripadajú do úvahy len tlačidlá so signalizáciou stavu pomocou LED, alebo displeja. Namiesto otočného prepínača, či potenciometra musíte použiť rotačný enkóder, čo je súčiastka mechanicky  podobná potenciometru, avšak dá sa otáčať o ľubovoľný uhol v obidvoch smeroch a má mechanicky indikované medzipolohy. Pri jeho otáčaní máte pocit ako keby ste otáčali prepínačom s veľa polohami a jemným chodom

Bluetooth komunikácia

Aby bolo možné zariadenie ovládať mobilnou aplikáciou musí jeho riadiaci systém podporovať bluetooth, buď priamo, alebo pomocou rozširujúcich modulov. Vývojové dosky využívajúce platformu ESP 32 majú bezdrôtovú komunikáciu, či už cez bluetooth, alebo cez WiFi priamo integrovanú. Pre Arduino potrebujete samostatný bluetooth modul, napríklad HC-05, HC-06, alebo podobný.

Modul HC-05

Prípadne môžete použiť dosky s podporou Bluetooth, napríklad Arduino Nano 33 BLE, alebo najnovšie Arduino Nano RP2040, ktoré sme predstavili v minulom čísle nášho magazíne. Program bude skoro rovnaký, projekt sa bude líšiť len knižnicou. Vývojové prostredie Arduino IDE, v ktorom sa vyvíjajú aplikácie pre obidve mikrokontrolérové platformy má knižnice pre bluetooth komunikáciu.

Z pohľadu mikrokontroléra a v podstate aj Android aplikácie sa bude v princípe jednať o sériovú komunikáciu. Inak povedané, vo vývojovom prostredí Arduino IDE si budete môcť komunikáciu odladiť pomocou monitora sériového portu, ktorý je súčasťou vývojového prostredia. Takýmto spôsobom naprogramujete a odladíte komunikáciu pomocou povelov pre Arduino, či ESP32. Až po otestovaní fungovania povelov a sériovej komunikácie môžete začať ladiť ovládanie zariadenia pomocou smartfónu. Spočiatku dokonca nebudete potrebovať špecializovanú aplikáciu, ale vystačíte s aplikáciou na ladenie komunikácie cez bluetooth, napríklad na zadávanie povelov môžete využiť hotovú aplikáciu Serial Bluetooth Terminal, ktorá je k dispozícii v aplikačnom obchode Google Play. Táto aplikácia funguje veľmi podobne ako monitor sériového portu. Zobrazuje prijaté údaje z mikrokontroléra a môžete pomocou nej zadávať príkazy.

Komunikáciu budeme riešiť na dvoch vrstvách – fyzickej a logickej. Fyzická vrstva je vyriešená na úrovni knižníc, ktoré podporujú sériovú komunikáciu cez bezdrôtové rozhranie bluetooth, čiže protokol RFCOMM (Radio Frequency Communication). Je to v podstate emulácia komunikácie cez sériové rozhranie RS232. V príklade budeme ovládať dve LED. Povely a parametre boli popísané vyššie.

Kompletný zdrojový kód pre Arduino:

const int ledRed = 4;
const int ledGreen = 3;
int LedStavRed = HIGH;
int LedStavGreen = HIGH;  // stav LED
int JasGreen = 128;

String param1;
char outBuffer[10];

unsigned long oldTimeMs = 0;  // ulozenie casu
const long interval = 1000;  // oneskorenie
static uint32_t hodnota;  // na inkrement

void setup()
{
  Serial.begin(9600);
  pinMode(ledRed, OUTPUT);  // LED
  pinMode(ledGreen, OUTPUT);
  digitalWrite(ledRed, LedStavRed);  // implicitné hodnoty
  analogWrite(ledGreen, JasGreen);
}

void loop()
{
  if (Serial.available())  // prisiel znak
  {
    // ovládanie LED
    char cc = Serial.read();  // príjem
    switch (cc)
    {
      case 'C':
        LedStavRed = !LedStavRed;
        digitalWrite(ledRed, LedStavRed);
        break;
      case 'Z':
        LedStavGreen = !LedStavGreen;
        digitalWrite(ledGreen, LedStavGreen);
        break;
      case 'G':  // s parametrom
        param1 = Serial.readStringUntil('#');
        JasGreen = param1.toInt();
        analogWrite(ledGreen, JasGreen);
    }
    delay(20);
  }
  
  // na ladenie komunikácie každú sekundu inkrementovanú hodnotu
  unsigned long aktTimeMs = millis();
  if (aktTimeMs - oldTimeMs >= interval)
  {
    oldTimeMs = aktTimeMs;
    sprintf(outBuffer, "P%d#", hodnota++);
    Serial.print(outBuffer);  // posli hodnotu
  }
}

Najskôr nastavíme prenosovú rýchlosť sériovej komunikácie 9600 baudov, čiže bitov za sekundu.

Serial.begin(9600);

Vo funkcii nekonečnej slučky loop() kontrolujeme, či od sériovej komunikácie prichádzajú nejaké údaje. Ak áno, údaje sa načítajú a ukladajú do premennej cc. Následne ich porovnávame s definovanými povelmi a vykonáme požadovanú akciu.

Zdrojový kód pre ESP32 nájdete na našom webe v článku IoT a robotika: Ovládanie zariadenia s mikrokontrolérom ESP32 mobilnou apkou II. Je trochu odlišný, využíva kmižnicu BluetoothSerial

V hlavnej slučke program načíta znaky cez sériový port, alebo bluetooth a interpretuje ich. Najskôr budeme ladiť aplikáciu vo vývojovom prostredí Arduino IDE v okne monitora sériového portu. Nezabudnite nastaviť prenosovú rýchlosť 9600 bit/s ktorú budeme neskôr používať aj pre komunikáciu cez bluetooth cez modul HC-05. A ešte jedna dôležitá vec.  Nakoľko bluetooth modul využíva rovnaké komunikačné rozhranie RS232 aké sa využíva aj na komunikáciu Arduina s vývojárskym počítačom, musí byť pri  zavádzaní programu do Arduina tento modul vytiahnutý z pätice, alebo musia byť z neho odpojené vývody Rx a Tx. V prvej fáze ladenia aplikácie modul HC-05 nebudeme potrebovať, takže ho ani nezapojíme.

Ak všetko funguje, budú sa v sekundových intervaloch zobrazovať hodnoty v tvare „P1# P2# P3# P4#…“. V editačnom riadku monitora sériového portu môžete zadávať povely, napríklad „C“ na prepnutie stavu červenej LED a „Z200#“ na nastavenie jasu zelenej LED. Je potrebné zadávať veľké písmená a zadanú hodnotu potvrďte klávesom ENTER.

Keď ste aplikáciu vyskúšali lokálne, môžete vyskúšať komunikáciu zo smartfónom cez bluetooth. Aplikácia bude úplne rovnaká, takže zapojte bluetooth modul HC-05. Do smartfónu nainštalujte aplikáciu Serial Bluetooth Terminal, ktorá je zdarma v aplikačnom obchode Google Play. Následne je potrebné bluetooth modul spárovať s Android smartfónom. Pri vyhľadávaní bluetooth zariadení sa bude prezentovať ako „HC-05“. Pri párovaní smartfónu s týmto modulom je potrebné zadať kód „1234“

V aplikácii Serial Bluetooth Terminal je ľavom hornom rohu obrazovky ikona tzv. hamburgerového menu (tri vodorovné čiarky). V menu vyberte položku Devices a malo by sa vám zobraziť v zozname spárovaných zariadení aj „HC-05“. Vyberte toto zariadenie a môžete začať komunikovať, čiže posielať a prijímať správy. Podobne ako v monitore sériového portu sa v sekundových intervaloch budú zobrazovať hodnoty počítadla a môžete cez aplikáciu zadávať povely ako reťazce znakov. Tie sa zároveň vypíšu cez sériový terminál vývojového prostredia Arduino IDE.  Veľmi vám to uľahčí ladenie kódu.

Vývoj Android aplikácie je popísaný v článku s videom. Android aplikácia je rovnaká ako pre ovládanie zariadení s ESP32.

Ovládanie Android aplikáciou


Článek byl převzat z webu Nextech se souhlasem autora.