Blíží se Vánoce, česká města rozzářily ozdobené stromy a naši redakci blikající svetr kolegy Vladislava Klusky. Na podobné vylomeniny už roky pamatuje také projekt Arduino, vedle armády klasických prototypovacích a docela rozměrných desek se totiž zrodil i kulatý LilyPad.
Nenajdete na něm rozměrný USB konektor, zato má však deska po svém obvodu netradičně výrazné perforované pájecí plochy jednotlivých logických pinů GPIO. A důvod? LilyPad je totiž speciální verze Arduina pro prototypování nositelností a rozměrné otvory tedy slouží mimo jiné k tomu, abyste mohli destičku snadno všít do svetru a piny poté rozsvěcovat a zhasínat třeba zrovna primitivní barevné LED.

Kulaté Arduino LilyPad
O chod se stará čip ATmega328 při 8 MHz
Mozkem LilyPadu je dle varianty buď osmibitový čip ATmega168, anebo dnes už rozšířenější ATmega328, který dobře známe z desky Arduino Uno. V tomto případě však čip pracuje na sníženém polovičním taktu 8 MHz, což se podepíše na celkové nižší spotřebě.



Dnes zpravidla seženete tuto větší variantu bez USB a všemi vyvedenými piny čipu, anebo menší variantu s menším počtem GPIO, ale s microUSB
Rozjede jej i 3V baterie
Do třetice má LilyPad i mnohem slabší napájení. Namísto obvyklých 3,3V nebo 5V se rozjede v případě, pokud mu dodáte 2,7-5,5 V a stejné napětí pak bude mít i jeho logika. Jinými slovy, do pinů + a – stačí připojit i titěrnou mincovou 3V baterii CR2032, čip nastartuje a dodá šťávu i nejrůznějším světýlkům, jeho logickými piny totiž může protékat špičkově až 40 mA.



Arduino LilyPad lze napájet 2,7-5,5V, oživí jej tedy i běžná 3V baterie CR2032 zasunutá třeba v podobném pouzdře zhruba za dolar
K nahrání programu budeme potřebovat USB/UART převodník
Tak, po teoretické omáčce hurá na žlutou pěnovou obálku, jeden čínský klon LilyPadu za pár dolarů mi totiž také dorazil. Ještě snad zmíním, že LilyPad se dnes na internetech vyskytuje hned v několika provedeních a mně dorazil ten největší.




K bezproblémovému nahrání programu poslouží převodník USB na sériovou linku s piny RX, TX a DTR. Pak už jen stačí ve vývojovém prostředí Arduina zvolit správnou desku.
Jelikož nemá moje kulatá destička USB (existují ale i varianty s USB), budu muset pro nahrání programu do čipu použít USB/UART převodník. A právě piny sériové linky jsou zpravidla už od výroby připájené pro jeho snadné připojení. V horní řadě jsou zleva postupně vyvedené:
- GND/-
- GND/-
- VCC/+
- RX
- TX
- DTR
Stačí mít tedy USB převodník s piny napájení, datovými piny RX (příjem) a TX (odesílání), které je třeba s destičkou křížově propojit, a konečně DTR (Data Terminal Ready), který slouží k signalizaci, že může začít přenos atp. Bez DTR pinu bychom museli před nahráváním firmwaru čip ručně resetovat. Takto to za nás udělá přímo flashovací program v počítači.

Schéma netradiční destičky LilyPad v provedení bez USB
Takže stačí LilyPad přes převodník připojit k počítači, ve vývojovém prostředí vybrat správnou desku a nahrát program.
LilyPad funguje, co k němu přidělat? Třeba LEDky?
Ověřil jsem si funkci čipu primitivním prográmkem, který jen vypisoval pozdrav do sériové linky a zašel se podívat do své stále větší KPA (Krabice Pitomostí z AliExpressu), co demonstračně k LilyPadu vlastně připojím.
Hra blikajících světýlek by byla pochopitelně zdaleka nejjednodušší a stejně tak program. Stačilo by prostě do svetru zašít pár LED a přes drobné rezistory o obvyklé síle několika set ohmů je spojit s GPIO piny čipu. Náš program by pak na těchto pinech pomocí funkce digitalWrite nastavoval logickou jedničku a nulu a světýlka by se dle našeho scénáře rozsvěcovala a zhasínala.
Laserový dálkoměr VL53L0X
Na stranu druhou, nejsem úplně ten typ, který by chtěl po ulici chodit v blikajícím svetru, a tak jsem hledal v krabici dál, až jsem našel drobný modul VL53L0X.
VL53L0X je laciný optický ToF s dosahem do dvou metrů. Cože, jaký ToF? Tak ještě jednou, čip Time-of-Flight. To je kategorie dálkoměrů, které, velmi jednoduše řečeno, měří čas, za který světelný paprsek dorazí k překážce, odrazí se zpět a zachytí jej detektor.
Z této doby pak obslužná elektronika dálkoměru spočítá vzdálenost od překážky. Mějme výkonný a rychlý ToF s velkým dosahem, umístěme jej na elektromotor, roztočme jej dokola a získáme... Základní LIDAR, laserový radar, klasické rotační konstrukce, který je nedílnou součástí mnoha autonomních vozů.

Primitivní a laciný ToF dálkoměr VL53L0X s obvyklou přesností v řádu jednotek mm a s dosahem okolo dvou metrů.
Optické ToF dálkoměry dnes zpravidla používají velmi slabý laser kategorie VCSEL s vlnovou délkou infračerveného světla (třeba 940 nm), který může bez problému pohánět i slabá baterie, protože odběr proudu je velmi nízký.
Malý je nakonec i samotný čip dálkoměru, v případě VL53L0X se totiž jedná o plastovou krabičku s rozměry 4,4 × 2,4 × 1,0 mm, což je mimochodem jedna z jeho velkých výhod oproti ultrazvukovým dálkoměrům, které jsme si v našem seriálu o programování elektroniky ukázali už mnohokrát.

Ověření funkce dálkoměru v sériové lince
Podobný dálkoměr je sice titěrný, ale dostatečně chytrý, s okolím totiž komunikuje skrze sběrnici I2C, kterou samozřejmě čip ATmega328 podporuje a GitHub je plný knihoven pro Arduino. V případě LilyPadu tedy stačí připájet linky SCL a SDA na piny A5 a A4, podobně napájení a v programu pak už jen periodicky číst vzdálenost od překážky.
Když laser zjistí překážku, začne pípat bzučák
Další drobnou cetku, kterou jsem vylovil z krabice, byl primitivní bzučák. Má jen dvě nožky + a -, takže + jsem připájel k digitálnímu pinu 6, který dle schématu destičky nabízí pulzující digitální signál PWM, a – pak k pinu 7 hned vedle něj, na kterém jsem pak v programu nastavil povelem digitalWrite(7, LOW) logickou nulu. Nechtělo se mi vést ošklivý drátek až ke vzdálenějšímu pinu země.

Primitivní piezoelektrický pípák. Arduino jej rozbzučí pomocí signálu PWM a vygeneruje tón s kýženou frekvencí, kterou zrovna potřebujeme.
V programu jsem nakonec nastavil podmínku, že když laserový dálkoměr změří nižší vzdálenost než třeba jeden metr, bzučák se cholericky rozpípá. K tomu poslouží další vestavěné funkce Arduina, tone a noTone, které na bzučáku vytvoří (a ukončí) tón s kýženou frekvencí právě pomocí pulzujícího signálu PWM generovaného hodinami přímo v čipu.
To je celé. K čemu by to mohlo celé nakonec být?
Co kdyby to fungovalo jako třeba detektor překážek pro nevidomé?
Vraťme se na začátek. Arduino LilyPad slouží k prototypování nositelností – chytrého oblečení. Dá se snadno všít třeba do svetru, do nějaké kapsičky. Náš prototyp by tedy mohl po všití nebo připevnění na přední stranu bundy sloužit jako detektor překážek třeba pro nevidomé.



Celý bastl v produkční verzi. Zatímco destička s baterií může být někde uvnitř, z bundy bude vykukovat jen čidlo laserového dálkoměru.
Když se bude osoba pohybovat vpřed a přiblíží se stěna, řídící čip to díky laserovému dálkoměru zjistí a začne pípat dostatečně hlasitě na to, aby si toho jeho majitel všiml. Vše může být přitom díky malým rozměrům elegantně skryto a oko dálkoměru by mohlo být třeba součástí falešného knoflíku.
V takovém případě by se nám ale spíše hodil sourozenec našeho dálkoměru – VL53L1X, který má zvýšený dosah až na čtyři metry za cenu nižší přesnosti, avšak o nějaké jednotky milimetrů (a vlastně i centimetrů) v tomto případě nejde.
Je třeba zároveň pamatovat na to, že podobné senzory mají mnohem menší zorné pole než třeba ultrazvukový dálkoměr s poměrně širokým záběrem. V tomto případě laserový dálkoměr vidí jen zhruba 25-30° výseč, snímá tedy opravdu jen oblast před námi a nevšímá si třeba bočních překážek.
A do třetice, stejně jako jiné optické součástky i tyto může zmást světlo – jiný zdroj IR záření, nebo povrch s problematickou odrazivostí, který paprsek pohltí, anebo odrazí do nevhodného směru.
Když dálkoměr zjistí překážku, bzučák začne pípat:
Na zahraničních e-shopech seženete velký LilyPad se všemi vyvedenými piny GPIO za cenu okolo 50 korun. Za podobnou částku tamní obchodníci prodávají i zmenšenou verzi s menším počtem pinů, ale s obvodem microUSB. Za 20-30 kaček nakonec koupíte drobné pouzdro na jednu 3V baterii CR2032, které můžete snadno připájet třeba na zadní stranu destičky.
Pro větší projekty však budete potřebovat alespoň dvě takové baterie, při vyšším odběru energie totiž snadno dojde k podnapětí a řídící čip se restartuje, aby celý běh programu začal znovu. Řešením může být také silnější (ale stále maličká) Li-ion/pol baterie.
Na závěr opět nesmím zapomenout na kód:
// https://github.com/adafruit/Adafruit_VL53L0X
#include <Adafruit_VL53L0X.h>
Adafruit_VL53L0X tof = Adafruit_VL53L0X();
// Pokud vzdalenost klesne pod 500 mm, zacni pipat
#define THRESHOLD 500
// delka pipnuti v ms
#define RYCHLOST 100
// Ponocne promenne pro pipani
uint32_t timeout = 0;
uint16_t vzdalenost = 9999;
bool ton = false;
bool pipej = false;
// Funkci pipani budu ve smyce loop volat stale dokola
// Funkce bude periodicky na dobu RYCHLOST generovat 1000Hz ton a ticho
// Funkce bude pipat jen tehdy, pokud bude promenna pipej rovna pravde
// Samotné pipani neblokuje beh programu
void pipani() {
if (millis() > timeout) {
if (ton && pipej) {
tone(6, 1000);
ton = false;
}
else {
noTone(6);
ton = true;
}
timeout = millis() + RYCHLOST;
}
}
// Funkce setup se spusti jen jendou pro startu programu
void setup() {
// Pin cislo 7 slouzi jako GND pro bzucak
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
// Nastartuj laserovy dalkomer
tof.begin();
}
// Funkce loop se opakuje stale dokola
void loop() {
// Pokud mas povoleno pipat, pipej
pipani();
// Zmer vzdalenost v milimetrech
VL53L0X_RangingMeasurementData_t mereni;
tof.rangingTest(&mereni, false);
// Pokud jsou data v poradku, uloz vzdalenost do stejnojmenne promenne
if (mereni.RangeStatus != 4) {
vzdalenost = mereni.RangeMilliMeter;
}
// Pokud je vzdalenost mensi nez v uvodu stanovena hranice,
// zacni pipat
if ((vzdalenost > 0) && (vzdalenost < THRESHOLD)) {
pipej = true;
}
// V opacnem pripade ukonci pipani
else {
pipej = false;
}
}