HC-12 je komunikační modul pro Arduino. Tento modul obsahuje integrovaný obvod Si4463 a zjednodušeně pracuje jako sériová bezdrátová komunikační linka. Po zapojení antény je podle výrobce možné komunikovat na vzdálenost 600 až 1000 m na volném prostranství.

Veškeré bezdrátová komunikace probíhá na kmitočtu 433 MHz, respektive je nastavitelná v rozsahu 433,4 – 473 MHz. Pomocí konfigurace lze kromě kanálů 1-100 nastavit také rychlost přenosu, vysílací výkon a různé módy komunikace. Pro více informací doporučuji si přečíst tento datasheet.

Pro napájení modulu HC12 lze použít napájecí napětí 3,2 až 5,5 V. Proudový odběr v klidu se pohybuje okolo 16 mA, ale při komunikaci se mohou objevit proudové špičky i přes 100 mA. Výrobce doporučuje zdroj, který je schopný dodat minimálně 200 mA. Je tedy nutné na toto myslet a přizpůsobit tomu napájecí zdroj, případně přidat paralelně k napájení i kondenzátor o velikosti 22 až 1000 uF.

Komunikační modul HC-12 433 MHz

Pro úspěšné propojení komunikačního modulu HC-12 s Arduinem je nutné zapojit celkem 5 vodičů. Propojíme SET s pinem D6, TXD s pinem D5, RXD s pinem D4, GND se zemí Arduina a VCC s 3,3 nebo 5 Volty Arduina. Pro datové piny SET, RXD a TXD lze využít také ostatní digitální piny, ale tuto volbu je nutné provést na začátku programu. Na deskách Mega a Mega 2560 je možné pro pin RX využít pouze tyto piny: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69). A na deskách Leonardo a Micro lze pro pin RX využít tyto piny: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). Viz reference knihovny SoftwareSerial.

Schéma zapojení Komunikačního modul HC-12 433 MHz

Ukázkový kód obsahuje na svém začátku připojení potřebné knihovny pro práci se softwarovou sériovou linkou. Poté nastavíme čísla propojovacích pinů a následně vytvoříme proměnné, které jsou důležité pro chod programu, a provedeme inicializaci modulu HC-12 z knihovny.

V podprogramu setup nejprve provedeme rezervaci místa v paměti pro proměnné, do kterých budeme ukládat příchozí zprávy. Následně nastavíme pin SET jako výstupní a provedeme jeho nastavení do transparentního módu, který slouží pro komunikaci. Po krátké pauze zahájíme komunikaci po sériové lince a komunikaci s modulem HC-12.

Nekonečná smyčka loop obsahuje dva po sobě jdoucí bloky kódu, které jsou vždy určeny jak pro modul HC-12, tak i pro sériovou linku a jsou téměř totožné. V prvním bloku kontrolujeme, jestli nemáme na komunikační lince nějaké znaky. V případě, že ano, provedeme jejich načtení nejprve do proměnné o velikosti jednoho znaku. Následně tento znak přidáme do bufferu a kontrolujeme konec zprávy pomocí detekce speciálního znaku. Pokud byl detekován konec zprávy, nastavíme si příslušnou detekční proměnnou.

Když se po zkontrolování přijatých znaků na obou linkách dostaneme dále, kontrolujeme již zmíněný konec řádku. V případě, že se tento znak objeví na sériové lince, je postup lehce odlišný. Pokud tedy detekujeme konec zprávy, nejprve zjistíme, jestli se nejedná o konfigurační řetězec. Pokud je to tak, pošleme tento řetězec nejprve do druhého modulu a následně svůj modul přepneme do konfiguračního módu. V tomto módu si vytiskneme pro informaci konfigurační zprávu po sériové lince, poté provedeme změnu v modulu a vrátíme jej zpět do komunikačního módu. Pokud by se nejednalo o konfigurační řetězec, jednoduše odešleme zprávu do druhého modulu. Po úspěšném odeslání zprávy vymažeme poslední načtenou zprávu a nastavíme detekční proměnnou zpět do logické nuly.

V případě detekce konce řádku modulem HC-12 je postup kratší. Zde opět zkontrolujeme zprávu, jestli neobsahuje konfigurační řetězec. Pokud ano, provedeme rovnou přepnutí do konfiguračního módu, vytiskneme informaci po sériové lince, nahrajeme nové nastavení a po přepnutí na komunikační mód pošleme informaci o konfiguraci do druhého modulu. V případě přijetí normální zprávy provedeme pouze její vytištění po sériové lince. A po úspěšném přijetí zprávy opět vymažeme poslední načtenou zprávu a nastavíme detekční proměnnou zpět do logické nuly.

Pod tento kód jsem ještě umístil do komentáře krátkou ukázku běžné komunikace, která každou sekundu odešle do druhého modulu čas od spuštění Arduina.

// Arduino bezdrátový komunikační modul HC-12

// připojení potřebné knihovny
#include <SoftwareSerial.h>
// nastavení čísel propojovacích pinů
#define pinRXD 4
#define pinTXD 5
#define pinSet 6
// proměnné pro chod programu
char serialZnak;
char HC12Znak;
String serialZprava = "";
String HC12Zprava = "";
boolean serialKonecZpravy = false;
boolean HC12KonecZpravy = false;
boolean modKomunikace = false;
// inicializace modulu z knihovny
SoftwareSerial HC12(pinTXD, pinRXD);

void setup() {
  // rezervování paměti 64 byte pro proměnné,
  // do kterých se ukládají příchozí znaky
  HC12Zprava.reserve(64);
  serialZprava.reserve(64);
  // nastavení pinu Set jako výstupního
  pinMode(pinSet, OUTPUT);
  // nastavení transparentního módu pro komunikaci
  digitalWrite(pinSet, HIGH);
  // pauza pro spolehlivé nastavení módu
  delay(80);
  // zahájení komunikace po sériové lince
  Serial.begin(9600);
  // zahájení komunikace s modulem HC-12
  HC12.begin(9600);
}

void loop() {
  // pokud přijal modul HC-12 nějaké znaky, provedeme následující
  while (HC12.available()) {
    // načteme do proměnné první byte ve frontě
    HC12Znak = HC12.read();
    // načtený byte přidáme do bufferu
    HC12Zprava += char(HC12Znak);
    // pokud je poslední přijatý znak konec řádku,
    // nastavíme detekční proměnnou na logickou 1
    if (HC12Znak == '\n') {
      HC12KonecZpravy = true;
    }
  }
  // pokud přijala sériová linka od uživatele nějaké znaky, provedeme následující
  while (Serial.available()) {
    // načteme do proměnné první byte ve frontě
    serialZnak = Serial.read();
    // načtený byte přidáme do bufferu
    serialZprava += char(serialZnak);
    // pokud je poslední přijatý znak konec řádku,
    // nastavíme detekční proměnnou na logickou 1
    if (serialZnak == '\n') {
      serialKonecZpravy = true;
    }
  }
  // pokud je detekován konec řádku ve zprávě ze sériové linky, provedeme následující
  if (serialKonecZpravy) {
    // pokud zpráva začíná znaky AT, jedná se o konfiguraci,
    // pro kterou je potřeba odlišné chování
    if (serialZprava.startsWith("AT")) {
      // jako první pošleme konfiguraci do druhého modulu,
      // aby se nastavil shodně
      HC12.print(serialZprava);
      // pauza pro zpracování zprávy druhým modulem
      delay(100);
      // nastavení konfiguračního módu s pauzou pro zpracování
      digitalWrite(pinSet, LOW);
      delay(100);
      // vytištění konfigurační zprávy po sériové lince pro kontrolu
      Serial.print(serialZprava);
      // nastavení konfigurace pro lokálně připojený modul s pauzou pro zpracování
      HC12.print(serialZprava);
      delay(500);
      // přechod zpět do transparentního módu s pauzou na zpracování
      digitalWrite(pinSet, HIGH);
      delay(100);
    }
    // v případě normální zprávy se pošle načtená zpráva do dalšího modulu
    else {
      HC12.print(serialZprava);
    }
    // vymazání načtené zprávy pro nové zpracování
    serialZprava = "";
    // změna detekční proměnné zpět na logickou 0
    serialKonecZpravy = false;
  }
  // pokud je detekován konec řádku ve zprávě přijaté modulem HC-12, provedeme následující
  if (HC12KonecZpravy) {
    // pokud zpráva začíná znaky AT, jedná se o konfiguraci,
    // pro kterou je potřeba odlišné chování
    if (HC12Zprava.startsWith("AT")) {
      // nastavení konfiguračního módu s pauzou pro zpracování
      digitalWrite(pinSet, LOW);
      delay(100);
      // vytištění konfigurační zprávy po sériové lince pro kontrolu
      Serial.print(serialZprava);
      // nastavení konfigurace pro lokálně připojený modul s pauzou pro zpracování
      HC12.print(HC12Zprava);
      delay(500);
      digitalWrite(pinSet, HIGH);
      // přechod zpět do transparentního módu s pauzou na zpracování
      delay(100);
      // odeslání informace do druhého modulu o úspěšném novém nastavení
      HC12.println("Vzdalena konfigurace probehla v poradku!");
    }
    // v případě normální zprávy se pošle načtená zpráva do dalšího modulu
    else {
      Serial.print(HC12Zprava);
    }
    // vymazání načtené zprávy pro nové zpracování
    HC12Zprava = "";
    // změna detekční proměnné zpět na logickou 0
    HC12KonecZpravy = false;
  }
  // testovací kód, který každou sekundu odešle
  // do druhého modulu čas od spuštění
  /*
    if (millis()%1000 == 0) {
      HC12.print("Cas od spusteni: ");
      HC12.print(millis()/1000);
      HC12.println("sekund");
    }
  */
}

Po nahrání ukázkového kódu do dvou Arduino desek s připojenými moduly HC-12 můžeme zahájit komunikaci, jako by byly mezi sebou spojené pomocí sériové linky. Pro ukázku nastavení si můžeme zkusit poslat informace o konfiguraci pomocí příkazu „AT+RX“ a poté si nastavit komunikační kanál číslo 10 pomocí příkazu „AT+C010“.

AT+RX
OK+B9600
OK+RC001
OK+RP:+20dBm
OK+FU3

AT+C010
OK+C010
Vzdalena konfigurace probehla v poradku!

Komunikační modul HC-12 je zajímavou možností, jak spojit bezdrátově Arduino desky. Výhodou tohoto modulu je jeho jednoduchá konfigurace, dlouhý dosah a příznivá cena. Hodí se tedy do těch projektů, kde chcete vyrobit například bezdrátová čidla, zvonek či prostě jen připojit bezdrátově zařízení, které používá standardní sériovou linku. Ohledně proudového odběru ve spojení s maximálním dosahem doporučuji prostudovat tento datasheet. Je totiž možné dosáhnout i nižšího proudového odběru či vyšších komunikačních rychlostí, ale za cenu nižšího dosahu a podobně.

 

Seznam použitých komponent:

https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html

https://dratek.cz/arduino/1394-433mhz-hc-12-si4463-wireless-serial-port-modul-1000m-1473675078.html

FB tw

Další podobné články