Pojďme programovat elektroniku

Naprogramovali jsme počítadlo cyklistů do lesa. Na dvě tužkovky vydrží Jirkovi celou sezónu

  • Stavíme jednoduché počítadlo lidí na baterii
  • Jaké komponenty se nabízejí?
  • Zkusíme si to na stavebnici Tower

Zkraje jara dorazil do redakční dílny kolega Jirka z Computeru s prosbou, že by potřeboval kdesi v lesích na československém pomezí elektronicky počítat cyklisty. Jenže aby toho nebylo málo, Jirka měl dvě klíčové podmínky: Musí to běžet na baterii a nesmí to stát celé jmění.

Co s tím? S úspornými prototypovacími deskami si v našem seriálu hrajeme odjakživa, mozkem celé legrace by tedy mohl být třeba český modul ESP32-LPKit s mikrokontrolerem Espressif ESP32 za tři stovky, který je zároveň vyzbrojený obvodem pro snadné napájení z lithiového akumulátoru a v hlubokém spánku odebírá jen okolo deseti mikroampérů elektrického proudu.

Řídící čip tedy bude v nečinnosti hibernovat a jen na vybraném pinu poslouchat, dokud se na něm neobjeví nějaký pulz, který jej vzbudí. Probouzení čipu ESP32 pomocí externího přerušení na GPIO jsme si ostatně ukázali v minulém dílu našeho seriálu, ve kterém jsme počítali pulzy z primitivního elektromechanického srážkoměru.

Video: Z čeho se dá postavit bateriové počítadlo (nejen) cyklistů:

Mechanický, nebo tenzometrický spínač? Ne!

Externí pulz by mohla vytvořit nějaká překážka na pěšince, kterou cyklista přejede a vlastní vahou na pár milisekund sepne kontakt. Třeba dvě prkna zapuštěná v zemi, která budou mezi sebou svírat jako sendvič buď mechanický koncový spínač (end switch), nebo o něco odolnější odporový tenzometr.

Klepněte pro větší obrázek
Cyklista by mohl při přejezdu vlastní vahou zdeformovat obvod s odporovým tenzometrem 

Tenzometr najdete v každé digitální váze, přičemž se ve své podstatě jedná o docela primitivní obvod, který se při deformaci prodlužuje, nebo zkracuje, čímž se mění jeho elektrický odbor. Když bude změna dostatečná, můžeme ji interpretovat jako přejezd cyklisty přes dřevěnou fošnu.

Cyklisti, divoká příroda, nešvary počasí a dvě prkna se snímačem ale nejdou moc dohromady. Celé zařízení by bez profesionálního zhotovení nejspíše přestalo fungovat už po prvním dešti, mezi desky by se totiž dostalo bláto, štěrk a další nečistoty.

Ultrazvuk? Ne!

Co tam máme dál? Nenašlo by se něco bezkontaktního a bezúdržbového? Ale jistě že ano. Mohli bychom použít nějaký aktivní dálkoměr na bázi ToF (Time of Flight). Třeba populární kutilský ultrazvukový modul HC-SR04.

Klepněte pro větší obrázek
3V a 5V prototypovací modul ultrazvukového dálkoměru

Reproduktor by stále dokola posílal ultrazvukové pulzy proti překážce na opačné straně stezky, které by po odrazu zachytil mikrofon, no a my z časového rozdílu a známé rychlosti zvuku spočítáme vzdálenost.

Když by byla cyklostezka prázdna, bude dálkoměr stále dokola měřit vzdálenost třeba 3 metry. Jakmile ale před HC-SR04 projede bajker, zvukové vlny se odrazí o něco dříve, náš program změří kratší vzdálenost a může opět navýšit čítač.

Zní to hezky, ale i toto bude naprosto nepoužitelné. HC-SR04 totiž během měření odebírá 15 mA (při 5V) elektrického proudu a ještě mnohem hladovější by byla naše řídící deska, která by musela stále dokola měřit čas a počítat vzdálenost. Baterie by vydržela možná tak do večera.

Aktivní světelný paprsek? Ne!

Podobně bychom dopadli i s prototypovacími snímači na optické bázi (IR/laser). Ty s dostatečně nízkou spotřebou, aby baterie vydržela celou cyklistickou sezónou, budou mít spíše malý dosah v řádu centimetrů, no a ty výkonnější – i když mohou být výrazně úspornější než ultrazvuk – ji i tak vyšťaví během několika málo dnů nebo týdnů.

Klepněte pro větší obrázek
Oblíbené laserové ToF dálkoměry řady ST VL53Lxx mohou být poměrně úsporné, ale za cenu nižší frekvence měření. Hrozilo by, že nám cyklista prosviští bez povšimnutí

Ještě jednou, naše počítadlo musí být bezúdržbové ideálně po celou sezónu. To je základ, přes který nejede vlak!

Hallův jev? Ne!

Takže, co tam máme dál? Třeba nejrůznější snímače na bázi Hallova jevu a měření deformace magnetického pole, když se v blízkosti objeví nějaká větší masa kovu.

Klepněte pro větší obrázek
Mohli bychom také měřit náhlé deformace magnetického pole, když okolo čidla projede kovové kolo

Takové spínače, které by při překonání hraniční deformace vytvořily pulz a probudily hlavní procesor na naší desce, sice existují, mají ale opět velmi nízký dosah, relativně vyšší spotřebu a dnešní odlehčená kola (o karbonových rámech nemluvě), by byla asi úplně neviditelná.

My potřebujeme něco, co bude spolehlivě měřit cyklisty od jara do podzimu a zároveň něco, co bude mít průměrný dlouhodobý odběr nejvýše v řádu desítek mikroampérů při napětí okolo 3 V!

Taková řešení samozřejmě existují, kupodivu ale povětšinou naprosto míjejí svět domácích kutilů. Tedy až na pár výjimek, přičemž jednou z nich je severočeské Hardwario – odnož Jablotronu – a jeho stavebnice Tower. Dříve se jmenovala BigClown a v našem seriálu jsme ji věnovali hned několik článků.

Cyklisty bude měřit stavebnice, která na dvě tužkovky vydrží celou sezónu

Tower je postavený na úsporném čipu STM32L083CZ (ARM Cortex M0+) s 20 kB RAM a 192 kB flashové paměti pro firmware a jeho autoři začátečníkům vše usnadnili nástroji, které nabízí podobně jednoduché programování jako v prostředí Arduino. Jen s tím rozdílem, že namísto objektového C++ použijete základní C.

Klepněte pro větší obrázek
Základní deska stavebnice Tower Core Module 

Podstatné je ale to, že se jedná o stavebnici, základní destičku Core Module proto doplňuje hromada dalších modulů a čidel, které mají až na pár výjimek jednoho společného jmenovatele: velmi nízký průměrný odběr elektrické energie. Skrze obvyklé sběrnice I²C, SPI, sériovou linku a GPIO nicméně samozřejmě připojíte prakticky cokoliv.

Klepněte pro větší obrázekKlepněte pro větší obrázekKlepněte pro větší obrázek
Stavebnice je natolik úsporná, že meteostanici plnou čidel bez problému utáhne maličký 3V solární panýlek a místo baterie či akumulátoru postačí superkondenzátor

Díky tomuto přístupu dokáže kompletní jednotka, která něco měří, fungovat na pár tužkových baterií formátu AAA klidně i několik let a to i tehdy, když bude skrze své 868MHz rádio odesílat změřené hodnoty do další desky, která bude sloužit jako rádiový hub pro všechny podobné senzory v okolí.

Cyklistu zaznamená úsporný PIR

Jednou z rozšiřujících desek stavebnice je PIR Module (ukázka práce s PIRem v C) vyzbrojený pasivním infračerveným detektorem pohybu Excelitas DigiPyro PYQ-1648-7053. Disponuje dosahem až 5 metrů, 98° zorným polem v obou osách a titěrnou klidovou spotřebou okolo 3 mikroampérů.

Klepněte pro větší obrázek
Pod plastovým krytem je pasivní infračervený detektor odladěný na teplotu lidského těla

Jen pro srovnání, běžný 5V prototypovací modul infračerveného pasivního detektoru za pár kaček HC-SR501 propálí až o několik řádů více elektrické energie, pro celodenní běh na baterii je tedy opět nevhodný. Ne, nebudu chodit každý týden kamsi do lesa měnit baterie.

S Towerem a jeho infračerveným modulem mám bohaté zkušenosti, protože u mě doma měří lidský pohyb už hromadu let, takže vím, že se dvěma tužkovými bateriemi AAA opravdu vydrží klidně i celý rok a to včetně odesílání 868MHz rádiových zpráv se statistikou každé dvě minuty.

Klepněte pro větší obrázek
Dvě tužkové baterie AAA jsem v jednotce se základní deskou Core Module a PIR Module naposledy měnil loni na začátku srpna. Zařízení přitom neustále měří pohyb a každé dvě minuty odesílá souhrnnou rádiovou zprávu do centrály

V lese nám ale bude krátkodosahový rádiový vysílač k ničemu a Jirka jej ani nechce. Nepotřebuje znát počet cyklistů v reálném čase a kreslit grafy (alespoň prozatím), takže mu bude stačit, když se občas vypraví k sondě a údaj jednoduše přečte.

Jak? No na displeji přece!

Úsporný displej od Sharpu ukáže počet cyklistů

Součástí počítadla totiž bude i LCD Module (ukázka práce s displejem v C) – jednotka s maličkým monochromatickým 1,28“ displejem LS013B7DH03 s technologií Memory LCD od Sharpu a s rozlišením 128×128 pixelů.

Klepněte pro větší obrázek
Monochromatický displej má velmi nízkou spotřebu 

S touto technologií jsme v našem seriálu už pracovali, takže jen připomenu, že každý z pixelů má vlastní 1bit paměť, čili jej není třeba při nečinnosti stále překreslovat. V tomto směru do jisté míry připomíná elektromechanické e-inkové displeje a celý modul se může pochlubit velmi nízkým průměrným odběrem elektrického proudu do 16 mikroampérů.

Když projede cyklista…

Takže Jirka sedne na kolo, dojede k průhledné schránce, která odolá vlivům počasí, a z displeje jednoduše přečte, kolik cyklistů náš počítač zaznamenal od svého spuštění.

Aby PIR nepočítal jednoho cyklistu několikrát, při první detekci bude všechny další po určitý čas ignorovat. Přesná konfigurace už závisí jen na nás a v kódu níže to budou (třeba) 3 sekundy.

Bajker má 3 000 milisekund na opuštění prostoru měření a během této doby by se před snímačem neměl objevit ani žádný další. Způsobů, jak toho dosáhnout, je požehnaně. Čidlo bychom mohli umístit třeba ve složitém terénu, do stoupání, ale hlavně do zúženého místa, kterým zaručeně projede vždy jen jeden z nich.

Jakmile se navýší čítač, zároveň aktualizujeme údaj na displeji. V produkční verzi bychom mohli na displeji vypisovat také stav baterie a pro kontrolu i dobu běhu programu třeba v minutách, čímž snadno odhalíme skrytý reset kvůli zatím neodhalené chybě, podpětí atp.

Údaj počítadla bychom mohli zároveň ukládat do persistentní paměti EEPROM přímo na čipu, zde je však třeba myslet na limit v podobě garantovaných 100 000 přepisů. Pokud bude náš čítač dostatečně stabilní, mohli bychom data do EEPROM ukládat třeba jen jednou za hodinu nebo den. Další možností je samozřejmě ukládání na nějaké externí médium – třeba SD kartu, což se ale drasticky podepíše na spotřebě elektrické energie.

Kód programu

Kód produkční verze firmwaru bude samozřejmě mnohem košatější a bude myslet na spoustu dalších věcí, pro naši dnešní ukázku, jak se vlastně programuje na stavebnici Tower, ale bohatě stačí i zjednodušená podoba níže.

Klepněte pro větší obrázek
Úspěšný překlad a flash firmwaru v Hardwario Code

Co se psaní kódu, překladu a flashování skrze USB týče, Hardwario nabízí dvě řešení. Tím prvním je Hardwario Code postavené nad populárním, multiplatformní a bezplatném editoru Visual Studio Code.

Druhou možností, od které ale Hardwario postupně upustí, je podpora oblíbené nadstavby PlatformIO pro snadné programování a flashování mikrokontrolerů (viz blogový zápisek Hardwaria z loňského září).

#include <application.h>

// Konstanta s prodlevou po detekci cyklisty v milisekundach
const uint16_t PRODLEVA = 3000;
// Pokud je aktivni zamek, nepocitam cyklisty
bool zamek = false;
// Pocitadlo cyklistu
uint32_t cyklisti = 0;
// Modul PIRu
twr_module_pir_t pir;
// Programovatelne tlacitko na desce
twr_button_t tlacitko;
// Graficky ovladac
twr_gfx_t *gfx;

// Deklarace nasich uzivatelskych funkci
void pohyb(twr_module_pir_t *modul, twr_module_pir_event_t udalost, void *parametry);
void odemkni(void* param);
void stisk(twr_button_t *modul, twr_button_event_t udalost, void *parametry);
void prekresli(void);

// Funkce odemkni uvolni zamek,
// ktery blokuje pocitani cyklistu
void odemkni(void* param){
    zamek = false;
}

// Funkce prekresli pro prekresleni LCD displeje
void prekresli(void){
    twr_module_lcd_clear();
    twr_gfx_set_font(gfx, &twr_font_ubuntu_33);
    char txt_cyklisti[20];
    sprintf(txt_cyklisti, "%"PRIu32"", cyklisti);
    twr_gfx_draw_string(gfx, 10, 70, txt_cyklisti, true);
    twr_gfx_set_font(gfx, &twr_font_ubuntu_24);
    twr_gfx_draw_string(gfx, 10, 10, "Pocitadlo", true);
    twr_gfx_draw_string(gfx, 10, 30, "cyklistu", true);
    twr_gfx_update(gfx);
}

// Funkce pohyb, kterou zavola cip, pokud z PIRu dorazi nejaka udalost
void pohyb(twr_module_pir_t *modul, twr_module_pir_event_t udalost, void *parametry){
    (void) modul;
    (void) parametry;

    // Pokud se jedna o pohyb
    if (udalost == TWR_MODULE_PIR_EVENT_MOTION){
        // Pokud je zamek odemceny
        if(!zamek){
            // Zamkni zamek
            zamek = true;
            // Navys pocitadlo cyklistu
            cyklisti++;
            // Uloz stav pocitadla do EEPROM
            // Pozor, jen pro demonstraci! EEPROM ma omezeny pocet bezpecnych zapisu
            // Budeme zapisovat hned na zacatek EEPROM, tedy na adresu 0
            twr_eeprom_write(0, &cyklisti, sizeof(cyklisti));
            // Prekresli udaje na displeji
            prekresli();
            // Pomoci vestaveneho planovace uloh zavolej funkci odemkni
            // v case ted+PRODLEVA (tedy za 3000 ms)    
            twr_scheduler_register(odemkni, NULL, twr_tick_get() + PRODLEVA);
        } 
    }
}

// Funkce stisk, kterou zavola cip, pokud stiskneme tlacitko
// Stisk tlacitka slouzi pro reset pocitadla cyklistu
void stisk(twr_button_t *modul, twr_button_event_t udalost, void *parametry){
    (void) modul;
    (void) parametry;

    // Pokud se jedna o stisknuti tlacitka
    if (udalost == TWR_BUTTON_EVENT_PRESS){
        // Anuluj promennou cyklisti
        cyklisti = 0;
        // Uloz ji do EEPROM, a tak anuluj i persistentni pamet
        twr_eeprom_write(0, &cyklisti, sizeof(cyklisti));
    }
}

// Hlavni uvodni funkce stavebnice Hardwario Tower
// Analogie funkce setup ze sveta Arduino
void application_init(void){
    // Precti ulozeny pocet cyklistu z EEPROM na adrese 0
    // Pozor, na uplnem zacatku musi byt samozrejme tato cast EEPROM
    // vynulovana, jinak bychom promennou cyklisti naplnili nahodnymi daty 
    twr_eeprom_read(0, &cyklisti, sizeof(cyklisti));

    // Incializace vestaveneho tlacitka
    twr_button_init(&tlacitko, TWR_GPIO_BUTTON, TWR_GPIO_PULL_DOWN, 0);
    // Pokud stiskneme tlacitko, zavola se funkce stisk
    twr_button_set_event_handler(&tlacitko, stisk, NULL);

    // Inicializace modulu LCD displeje a ovladace
    twr_module_lcd_init();
    gfx = twr_module_lcd_get_gfx();

    // Inicializace modulu PIR
    twr_module_pir_init(&pir);
    // Pokud PIR vyvola nejakou udalost, zavola se funkce pohyb
    twr_module_pir_set_event_handler(&pir, pohyb, NULL);
    // Nastaveni citlivosti PIRu
    twr_module_pir_set_sensitivity(&pir, TWR_MODULE_PIR_SENSITIVITY_MEDIUM);

    // Vse je nastavene, tak na uvod prekreslim displej
    prekresli();
}

Prototyp počítadla funguje. Temný les se postará o případné rušení infračerveného detektoru slunečním zářením, přičemž v produkční verzi nebude chybět ani vhodné (a nutné) stínítko, které ještě více omezí zorné pole jen na malou výseč na stezce.

Automatický čítač bude zároveň díky své drobné velikosti prakticky nepostřehnutelný pro kolemjdoucí, takže jej s patřičným maskováním nikdo neukradne.

Diskuze (17) Další článek: Vědci sledovali mozek v průběhu smrti. EEG naznačilo, že skutečně „promítne život před očima“

Témata článku: Programování, Pojďme programovat elektroniku, Arduino, Baterie, Cyklistika, Stavebnice, DIY, BigClown, Sharp, ARM Cortex, Aaa, LCD Modul, Modul, TWR, GFX, Tim of Flight, Počítadlo, Jablotron, Tower, Les, Halla, Void, Pira, Core modul, Hardwario Tower, Cyklistika na Heureka.cz