Pojďme programovat elektroniku | Programování | Arduino

Pojďme programovat elektroniku: Když nemá Arduino displej, pomůže NFC tag

  • NFC je stále populárnější – hlavně díky platbám
  • Dnes připojíme k Arduinu NFC tag od NXP
  • Přenese provozní data z hlavního čipu do mobilu

Českou polopoušť mají podle meteorologů v příštích dnech zasáhnout opět třicítkové tropy, a tak bychom asi nenašli lepší příležitost k přesunu do vychlazeného sklepa a po čase opět nějakému tomu domácímu bastlení. Tentokrát si ukážeme práci s NFC tagem.

NFC, tedy plným názvem Near Field Communication, je, jak praví česká Wikipedie, „modulární technologie radiové bezdrátové komunikace mezi elektronickými zařízeními na velmi krátkou vzdálenost (do 4 cm) s přiblížením přístrojů.

Ačkoliv byly první mobilní telefony vybavené přijímačem NFC již před docela dlouhou dobou, masově se tato technologie začala rozšiřovat teprve v posledních letech, a to díky nástupu bezkontaktních platebních metod – nejprve v podobě rádiového čipu integrovaného do klasické platební karty a později i v mobilních telefonech a chytrých hodinkách.

Pomalý rádiový přenos, ale bez potřeby napájení

NFC oproti Bluetooth a Wi-Fi operuje na mnohem nižší frekvenci 13,56 MHz a také s mnohem nižší přenosovou rychlostí. Zatímco norma samotná umožňuje teoreticky až 424 kb/s, praktická rychlost většiny zařízení používá spíše spodní hranici a linkovou rychlost 106 kb/s.

Klepněte pro větší obrázek
NFC čip je dnes součástí většiny telefonů střední a vyšší třídy. Díky nástupu mobilních plateb to snad bude brzy naprostá samozřejmost stejně jako Bluetooth.

NFC se tedy hodí opravdu jen na přenos drobných informací – třeba identifikačních údajů pro uskutečnění zmíněné bezkontaktní platby.  Na stranu druhou, jako jeden z mála běžně používaných komerčních protokolů nabízí velmi nízkou spotřebu.

Ta se uplatňuje u tzv. NFC tagů – droboučkých čipů s maličkou pamětí, které mohou být třeba součástí samolepky. Tyto tagy nemusejí být vybavené vlastním zdrojem elektrické energie, získají ji totiž ze samotné rádiové komunikace během čtení.

Když se tedy telefonem přiblížíme k tagu, vysílač NFC v telefonu obvod tagu nejprve nabije (elektrická indukce na cívce) a logická jednotka tagu energii použije k odeslání vlastní zprávy, kterou mobil zachytí.

NFC Tag z Holandska

NFC tagy mohou být naprosto hloupé, přepisovatelné skrze NFC, anebo se může jednat o pokročilejší čipy, které umějí vedle NFC komunikovat i skrze některou z populárních datových sběrnic. A přesně takový tag si dnes vyzkoušíme.

Jmenuje se NT3H2111 a patří do rodiny NTAG I2C plus nizozemského výrobce NXP Semiconductors. Jak už název napovídá, čip je programovatelný skrze sběrnici I2C, kterou je dnes vybavená většina pokročilejších mikrokontrolerů včetně Arduina. Když tedy čip připojíme k prototypovací destičce, můžeme libovolně přepisovat data, která pak má NFC Tag vysílat do okolí, pokud se přiblíží nějaká rádiová čtečka.

NFC Tag od českého BigClownu

Fajn, ale kde tedy splašit prototypovací destičku s čipem od NXP? Namísto Aliexpressu jsem tentokrát zamířil do e-shopu českého projektu BigClown, jenž vyvíjí stejnojmennou prototypovací stavebnici, kterou jsme si v našem seriálu představili už několikrát.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
BigClown NFC Tag s čipem NT3H2111

BigClown je rozšiřitelný o velké moduly, které se zacvakávají na sebe jako haty ze světa Raspberry Pi a shieldy z Arduina, nicméně nabízí ještě maličké tagy, které komunikují na sběrnici I2C a mají vždy pět pinů: 3,3V napájení, dva piny samotné sběrnice I2C (SDA a SCL) a ještě pin INT, tedy přerušení/interrupt, pokud samotná součástka na destičce tagu umí asynchronně vyvolat nějakou akci a dát o tom hlavnímu čipu vědět právě skrze systémové přerušení.

Jedním takovým tagem je i NFC Tag s čipem NT3H2111, který pořídíte za 230 korun. Je to sice možná více, než na co jste zvyklí z Aliexpressu, destička vám ale domů dorazí bez dlouhého čekání už za pár dnů.

Klepněte pro větší obrázek
Modul NFC Tagu je oproti mnoha ostatním maličký, což je příjemné. na stranu druhou, menší je tím pádem i anténa a dosah.

I když je NFC Tag primárně určený pro stavebnici BigClown, skrze sběrnici I2C jej samozřejmě ovládnete na jakémkoliv mikrokontroleru. Jen mějte na paměti, že BigClown běží na 3,3V logice, zatímco Arduino povětšinou na 5V, a tak je třeba pro signály SDA a SCL použít logický převodník, který v obou směrech převede napětí na 3,3V, respektive na 5V. Stejně tak je třeba tag napájet 3,3V napětím a nikoliv 5V.

1kB EEPROM pro NFC zprávy 

NT3H2111 má k dispozici 1kB EEPROM, takže dokáže pojmout 1024 B dat, což není vůbec špatné. Když do této paměti nahrajeme data, můžeme NFC čip klidně odpojit od Arduina a napájení, přilepit třeba na vstupní dveře kanceláře, a přikázat všem příchozím s telefonem vybaveným NFC přijímačem, aby mobilem při vstupu lízli o náš čip.

Video: Přečtení textové zdravice na NFC tagu pomocí mobilního telefonu

NFC Tag v takovém případě může na telefonu zobrazit nějakou textovou zprávu, třeba „Čau lidi, jak se dnes máte,“ anebo něco smysluplnějšího – může například automaticky otevřít webový prohlížeč a načíst speciální URL. Třeba adresu s jedinečným identifikátorem, která vás zapíše do podnikového docházkového systému.

Prostý text i webovou adresu dokáže telefon sám zobrazit, aniž bychom museli programovat nějakou vlastní aplikaci, NFC Tag totiž odeslal data ve standardizovaném formátu NDEFNFC Data Exchange Format.

NFC Tag a NDEF zprávy namísto displeje

NFC Tag nicméně může sloužit i jako aktivní výstupní zařízení u elektronického obvodu, který nemá žádný displej a není připojený k internetu. Dejme tomu, že z nějaké prototypovací destičky budete chtít přečíst data jen občas – na vyžádání.

Může to být třeba nějaký turniket, který ukládá do paměti počet průchodů, ale data neposílá nikam na internet, protože je to třeba počítadlo cyklistů kdesi na lesním singletrailu.

Klepněte pro větší obrázek
Náš dnešní obvod: Po stisku tlačítka Arduino Nano přečte teplotou a vlhkost z čipu SHT3x a údaje jako textovou zprávu NDEF zapíše do EEPROM paměti NFC Tagu. Tu pak můžeme přečíst třeba mobilním telefonem,

My k němu jen občas přijdeme a chtěli bychom přečíst aktuální data. Právě zde se hodí aktivní NFC Tag. Jeho spotřeba bude mizivá, a tak celý obvod bude energeticky mnohem úspornější a provozně levnější, než kdyby byl vybavený třeba modemem a data automaticky posílal skrze mobilní síť.

Arduino, které bude dostupné skrze NFC

Na nepájivém poli jsem za tímto účelem postavil jednoduchý testovací obvod s maličkou destičkou Arduino Nano, naším NFC Tagem a kombinovaným vlhkoměrem a teploměrem Sensirion SHT3x, který jsme si v našem seriálu už programovali a s mikropočítačem také komunikuje skrze sběrnici I2C. Komunita pro něj připravila nepřeberné množství knihoven pro Arduino.

Klepněte pro větší obrázek
Schéma zapojení našeho dnešního experimentu v návrhovém programu Fritzing

Teploměr tentokrát nebude měřit teplotu třeba každých deset sekund a nebude ji periodicky vypisovat do sériové linky, ale teplotu změří jen v případě, že stiskneme tlačítko. V takovém případě firmware Arduina nejprve změří teplotu a vlhkost a poté je uloží jako NDEF zprávu v prostém textu do paměti EEPROM samotného NFC Tagu.

Klepněte pro větší obrázek
Po stisku tlačítka se pomocí teploměru přečte teplota a vlhkost a oba údaje se uloží do paměti NFC Tagu, takže je mohu přečíst třeba mobilním telefonem.

Následně stačí k NFC Tagu přiblížit mobilní telefon a na jeho displeji se zobrazí zpráva o aktuální teplotě vzduchu a vlhkosti.  Stejným způsobem bychom mohli přečíst jakákoliv data na Arduinu nebo jiném mikrokontroleru, který nemá displej nebo pokročilejší a energeticky náročnější rádiový vysílač (Wi-Fi, Bluetooth aj.)

Klepněte pro větší obrázek
Po přiblížení telefonu k NFC Tagu se aktivovalo rádiové spojení v pásmu 13,56 MHz a mobil přijal data. Jelikož jsem zprávu uložil ve standardizovaném formátu NDEF, telefon ji dekódoval a rovnou zobrazil ve své integrované čtečce.

64B SRAM pro často přepisovaný NFC Tag

NFC čip NXP NT3H2111 na podobný scénář sám pamatuje, a tak vedle EEPROM disponuje i maličkou 64B pamětí SRAM. Tu bychom mohli přepisovat v podstatě neustále a bez rizika, že ji zničíme. Zatímco EEPROM na čipu slibuje nejméně 500 000 bezpečných přepisů paměti, u RAM je to o mnoho řádů více a z tohoto hlediska je prakticky nezničitelná.

Jak ho oživit? 

Komunita sice připravila hned několik knihoven pro Arduino k ovládnutí NFC čipu NT3H2111, ani jedna však není bez dalších úprav plně kompatibilní s NFC Tagem od BigClownu.  Naštěstí to není žádný velký problém. Pokud se s ním totiž budete chtít spojit z Arduina namísto ze stavebnice BigClown, stačí si nastudovat jeho zdrojové kódy pro NFC Tag a přepsat je do Arduina. Konkrétně se jedná o ovladač bc_tag_nfc.c a jeho hlavičkový soubor bc_tag_nfc.h.

Není to nijak složité, zdrojové soubory jsou totiž docela stručné a BigClown používá jazyk C (Arduino pak C++). V podstatě jen stačí upravit příkazy ke komunikaci na sběrnici I2C, pro kterou má Arduino vlastní knihovnu Wire.

Klepněte pro větší obrázek
Pro účely dnešního článku jsem upravil oficiální ovladač Bigclown NFC Tagu pro použití v prostředí Arduino pomocí předinstalované knihovny Wire pro práci se sběrnicí I2C.  Najdete jej na GitHubu včetně příkladu.

Pokud se vám pokročilejší zdrojové kódy studovat nechtějí, pro účely dnešního článku jsem je upravil za vás, takže je najdete v mém repozitáři na GitHubu pod názvem BigClown NFC Tag (Arduino). Vedle samotného ovladače tagu tam najdete i ukázkový projekt pro Arduino, takže všechny tři soubory stačí stáhnout, vložit do jedné složky a otevřít ve vývojovém prostředí Arduino.

Funkce pro textovou a URL zprávu NDEF. Víc není potřeba

Pánové z BigClownu připravili jednoduchý ovladač, který zatím pracuje pouze s jeho pamětí EEPROM, nicméně zkušenější kodéři si po prostudování datasheetu nebo dalších knihoven na GitHubu kód snadno rozšíří i o možnost ukládání dat do 64B SRAM, která bude pochopitelně dostupná jen tehdy, pokud bude NFC Tag stále napájený.

Video: Kompletní ukázka vypálení dat do EEPROM na NFC čipu a přečtení dat mobilním telefonem

Ovladač je opravdu jednoduchý. Po úvodním nastartování NFC Tagu nabízí dále už jen dvě klíčové funkce pro uložení zprávy NDEF, a to buď ve formátu URI odkazu (URL), anebo v prostém textu, který se zobrazí na displeji telefonu s NFC přijímačem. A právě to použijeme i v našem ukázkovém programu s teploměrem, jehož komentovaný kód najdete na konci článku.

Nakonec jako vždy zdrojový kód

A to je vlastně všechno. Dnes jsme si tedy ukázali, jak do jednoho z mnoha pokročilejších NFC tagů uložit údaje ve formátu NDEF, kterému nativně rozumí každý mobilní telefon s podporou rádiového protokolu NFC.

Hodí se to nejen k jejich pasivnímu provozu bez vlastního elektrického napájení, ale právě i k tomu, jak elegantní cestou bezpečně přečíst provozní informace z mikropočítače, který nemá žádné jiné výstupní zařízení jako třeba displej nebo Wi-Fi a HTTP server.  

// Ovladac NFC Tagu
// Je treba stahnout z meho GitHubu: https://github.com/jakubcizek/Bigclown_NFC_Tag_Arduino
// a oba soubory cpp a h vlozit do adresare aktualniho projektu Arduino
#include "bc_tag_nfc.h"
// Knihovna pro praci s teplomerem/vlhkomrem SHT3x
// Lze doinstalovat primo z prostredi Arduino ve vyhledavaci knihoven
#include <Adafruit_SHT31.h>

// Objekt teplomeru a vlhkomeru
Adafruit_SHT31 sht31 = Adafruit_SHT31();

// Objekt NFC cipu
bc_tag_nfc_t nfc;

// Pomocne promenne indikujici korektni inicialziaci NFC cipu a tepomeru
bool nfc_ok = false;
bool sht_ok = false;

// Pomocna promenna zpravy, ktera dorazi ze seriove linky
String zprava;

// Pomocny typ enum s rozlisenim typu zpravy
// Tedy zdali to bude prosty text, anebo URL
typedef enum {
  URI,
  PLAINTEXT
} ndef_typ_t;

// Funkce pro vypaleni zpravy ve formatu NDEF do EEPROM pameti NFC cipu
// Jedna se o prepis funkci z oficialniho ovladace NFC Tagu pro stavebnici BigClown
// Zatimco Arduino pouziva C++, BigClown pouziva C
bool ulozDoNFC(char* txt, ndef_typ_t typ) {
  bc_tag_nfc_ndef_t zprava;
  bc_tag_nfc_ndef_init(&zprava);
  // Pokud se jedna o typ URI, vytvor NDEF zpravu typu URI
  if (typ == URI) {
    bc_tag_nfc_ndef_add_uri(&zprava, txt);
  }
  // Pokud se jedna o prosty text, vytvor NDEF zpravu s prostym textem
  // NDEF zprava s prostym textem umoznuje nastavit jazyk
  // Pro kompatibilitu s NFC cteckami ponechame univerzalni EN - english
  else if (typ == PLAINTEXT) {
    bc_tag_nfc_ndef_add_text(&zprava, txt, "en");
  }
  // Pokus o vypaleni NDEF zpravy do EEPROM NFC cipu
  if (bc_tag_nfc_memory_write_ndef(&nfc, &zprava)) {
    return true;
  }
  else {
    return false;
  }
}

// Hlavni funkce setup se zpracuje hned po startu
void setup() {
  // Nastartuj seriovou linku rychlosti 115200 bps
  Serial.begin(115200);
  // Rezervuj 500 B pro promennou zpravy ze seriove linky
  zprava.reserve(500);
  // Dotykove tlacitko je pripojene na pin A3
  // Logicka 0:  Nedotykam se
  // Logicka 1: Dotykam se
  pinMode(A3, INPUT);

  // Incializace NFC cipu na I2C adrese 0x08
  if (!(nfc_ok = bc_tag_nfc_init(&nfc, 0x08))) {
    Serial.println("Nepodarilo se inicializovat NFC cip :-(");
  }
  else {
    Serial.println("NFC cip v poradku inicializovan!");
  }

  // Inicializace teplomeru SHT3x na I2C adrese 0x44
  if (!(sht_ok = sht31.begin(0x44))) {
    Serial.println("Nepodarilo se inicializovat teplomer SHT3x :-(");
  }
  else {
    Serial.println("Teplomer SHT3x v poradku inicializovan!");
  }
}

// Smycka loop se opakuje stale dokola a spusti se po zpracovani funkce setup
void loop() {
  // Pokud jsem se dotkl tlacitka
  if (digitalRead(A3)) {
    Serial.println("Stisk tlacitka");
    if (sht_ok) {
      // Zmer teplotu a vlhkost
      float t = sht31.readTemperature();
      float h = sht31.readHumidity();
      // Vypis obe hodnoty pro kontrolu do seriove linky
      Serial.print("Teplota: "); Serial.println(t, 2);
      Serial.print("Vlhkost: "); Serial.println(h, 2);

      // Preved obe ciselne hodnoty na textovy retezec
      char zprava[100];
      char txt_t[7];
      char txt_h[7];
      dtostrf(t, 4, 2, txt_t);
      dtostrf(h, 4, 2, txt_h);
      // Vytvor textovou zpravu s teplotou a vlhkosti a pro kontrolu ji vypis do seriove linky
      sprintf(zprava, "Teplota %s, vlhkost: %s", txt_t, txt_h);
      Serial.print("Vytvarim NDEF zpravu: "); Serial.println(zprava);
      // Zkus ji vypalit do EEPROM NFC cipu jako prosty text
      if (ulozDoNFC(zprava, PLAINTEXT)) {
        Serial.println("Zapsano do NFC cipu!");
      }
      else {
        Serial.println("Nelze zapsat do NFC cipu!");
      }
    }
    else {
      Serial.println("Teplomer SHT3x neni inicializovany! NElze zmerit teplotu!");
    }

    // Cekej, dokud stisk tlacitka neuvolnim
    // 100ms cekani muze pomoci s bouncingem,
    // i kdyz u dotykovych tlacitek neni tak patrny jako u mechanickych
    // Bouncing: rozkmitani napeti pri mechanickem stisku = muze se vyvolat nekolik stisku
    while (digitalRead(A3)) {
      delay(100);
    }
  }

  // Pokud dorazila nejaka data z PC po seriove lince
  while (Serial.available()) {
    // Precti data jako text s povinnym ukoncenim radku
    zprava = Serial.readStringUntil('\n');
    zprava.trim();
    if (!nfc_ok) {
      Serial.println("NFC cip neni inicializovany!");
      break;
    }
    // Pokud zprava zacina znakem U, po mezere nasleduje webova adresa
    if (zprava[0] == 'U') {
      // Smaz prvni dva znaky a zbytek vypal jako URL do NFC cipu
      zprava.remove(0, 2);
      Serial.print("Vytvarim NDEF zpravu s URL: ");
      Serial.println(zprava);
      if (ulozDoNFC(zprava.c_str(), URI)) {
        Serial.println("Zapsano do NFC cipu!");
      }
      else {
        Serial.println("Nelze zapsat do NFC cipu!");
      }
    }
    // Pokud zprava zacina znakem T, po mezere nasleduje prosty text
    else if (zprava[0] == 'T') {
      // Smaz prvni dva znaky a zbytek vypal jako prosty text do NFC cipu
      zprava.remove(0, 2);
      Serial.print("Vytvarim NDEF zpravu: ");
      Serial.println(zprava);
      if (ulozDoNFC(zprava.c_str(), PLAINTEXT)) {
        Serial.println("Zapsano do NFC cipu!");
      }
      else {
        Serial.println("Nelze zapsat do NFC cipu!");
      }
    }
  }
}
Diskuze (3) Další článek: Jaký bude příští iPhone? Telefonům Applu hrozí technologické zaostávání

Témata článku: Pojďme programovat elektroniku, Internet, Programování, Wi-Fi, Wikipedia, Arduino, BigClown, NFC, C++, Vlhkost, NXP Semiconductors, String zprava, URI, SCL, EEPROM, Elsa, Bluetooth a Wi-fi, Prace, AliExpress, NFC Tag, Sběrnice, Elektro, BigClownu, Near Field Communication, PLAINTEXT


Aktuální číslo časopisu Computer

Velký test Wi-Fi mesh

Nejlepší hodinky pro všechny aktivity

Důležité aplikace na cesty

Jak streamovat video na Twitch