Levný kit se STM32F103C8 (plus Arduino)

Před časem jsem zahlédl pár velmi levných kitů s procesorem STM32F103C8 (zvané též BluePill). Vlastně jen procesor na desce se spoustou vývodů, k tomu jedna LEDka, tlačítko a stabilizátor napájení 3.3V, a to za naprosto směšnou cenu. Vzal jsem jich rovnou pytel, a k nim přihodil i čínskou kopii ST-Link v.2

Přišlo to, já to zapojil přes ST-Link, přeložil jsem program v C, a po nějakém tom laborování jsem ho nahrál do jednočipu. LEDka neblikala, protože – nevím proč, asi proto, že u ARMu neumím nastavit port na blikání nebo tak něco. 🙂

Čínský „ST-Link v2“ je taky podivnost sama. Nějak to fungovalo, ale jinak to jako spíš bolelo. Valná část utilit hlásí, že žádný ST-Link nevidí, a tak.

STM32 Minimum - Page 1

Což mě trochu hnětlo, protože jsem se zrovna na tuhle desku těšil. Použitý procesor STM32F103C8 má jádro ARM Cortex M3, 64 kB FLASH, 20 kB SRAM a spoustu dalších hezkých vlastností, třeba spoustu periferií. Navíc na desce je téměř „holý“, kromě PC13 není zabraný žádný pin, je připojený (mikro)USB konektor, takže máte hodně velkou volnost.

Hledal jsem tedy další možnost, jak tuto desku programovat, a našel jsem.

Dvojice pinheaderů jsou totiž vývody BOOT0 a BOOT1, a vy si pomocí jumperů nadefinujete, jaké jsou na těchto vstupech hodnoty. Pokud bude BOOT0 roven 1 a BOOT1 roven 0, ocitne se po RESETu čip v boot loader módu, v němž je možné naprogramovat jej pomocí UART1 – tedy signály TX1 (PA9) a RX1 (PA10).

Pak tedy stačí už jen připojit USB-to-UART převodník (třeba oblíbený CH340, Prolific PL2303 nebo CP1202 – pozor! Musí umět 3.3V!) a stisknout tlačítko RESET.

A k samotnému programování jsem použil Arduino IDE. Použil jsem 1.6.8, a měl jsem problémy (cesty apod.), ale po updatu na 1.6.9 vše funguje bez problémů.

Klíčem k úspěchu je knihovna Arduino_STM32. Stáhněte si ji a nahrajte do složky „hardware“ v Arduinu (viz Instalace). Po restartu Arduino IDE se v Manažeru desek objeví nové možnosti. Zvolil jsem desku „Generic STM32F103C series“, variantu „C8, 20kRAM, 64k Flash“ a jako nahrávací metodu Serial (experimetoval jsem i se STLink, ale výsledek nebyl nijak pěkný).

První přeložený sketch byl tento:

Překlad je o něco delší než ten pro Arduino. Důležité je nezapomenout na přehození BOOT0 na hodnotu 1 a stisknutí RESET před nahráním. Pokud chcete, aby při příštím spuštění už boot nenabíhal, hoďte switch zpátky na 0.

Další tipy: Sunspot STM32 Arduino, Arduino goes STM32

Rubriky: Hardware | Štítky: , , | Napsat komentář

ATtiny a Arduino

V EduShieldu jsem použil pro řízení displeje jednočip ATtiny2313. Je to vlastně legendární AT90S2313, ale s novějším jádrem a novými periferiemi. Původně jsem sice chtěl použít jiný typ, ale ten nebyl dostupný. Inu co už, použil jsem tento.

Otázka ale byla: Jak tu Atinu (familiární označení, jistě to říkáte taky…) naprogramovat. A protože jde o shield pro Arduino, nabízelo se naprosto jednoduché řešení, totiž využít Arduino jako programátor.

Dokonce na to mají i tutoriály – Arduino as ISP. Stačí k tomu pár propojovacích drátů a jeden kondenzátor (ten tam neukazují, ale je zapojený mezi RESET a zem na Arduinu).

pinoutattiny2313

Propojení je prosté:

Arduino ATTiny
digital 10 pin 1 (RESET)
digital 11 pin 17 (MOSI)
digital 12 pin 18 (MISO)
digital 13 pin 19 (SCK)
GND pin 10
5V pin 20

Nejprve ale nahrajte do Arduina sketch „ArduinoISP“. Najdete ho mezi Examples.

Jako druhý krok připojte elektrolyt ~10µF mezi zem a RESET na Arduinu (záporným pólem k zemi, logicky).

Teď můžete vesele připojit ATTiny2313 a programovat.

No jo, to se řekne – programovat. Ale čím?

Já jsem si řekl, že bude kůl a vůbec užitečné, když firmware bude taky sketch pro Arduino. A jak jsem řekl, tak jsem i udělal. K tomu, aby to celé fungovalo, ale musíte do Arduina přidat podporu pro ATtiny. Já použil tuto, ale chtělo to trošku laborovat s cestami v souboru boards. Ony se totiž mezi verzí 1.5 a aktuální 1.6 změnily, a tak byl překlad spíš festival chyb než radostná událost. Ale nakonec se podařilo.

Vybral jsem příklad „blink“, přeložil ho pro desku „ATtiny2313@1MHz“, vybral jsem programátor „Arduino as ISP“ a tradá – vše fungovalo.

Trošku trápení bylo s I2C v roli „slave“, ale nakonec po chvilce bastlení s přerušením začala Atina přijímat povely a reagovala na ně. Standardní knihovna Wire totiž moc nešlape, tak jsem zvolil TinyWireS.

(Netestoval jsem Arduino Tiny Core od Spencera Konde, vypadá zajímavě).

S touto sestavou tedy trvalo vytvoření firmware pro EduShield jedno odpoledne. Naprogramování pak vyžaduje jen šest drátů, kondenzátor a pět minut práce.

Rubriky: Hardware | Štítky: , | Napsat komentář

Komprese GPS

U minulého článku jsem zmínil, že jsem přemýšlel nad tím, jak přenést souřadnice pomocí krátké zprávy Sigfox (12 bajtů). Jaké jsou možnosti?

GPS obecně udává dvě souřadnice (výšku tentokrát zanedbáme), a to zeměpisnou šířku (latitude) a délku (longitude). Šířka se udává ve stupních 0 až 90, kde 0 je rovník, 90 je pól. Další informace je, zda se jedná o severní nebo jižní polokouli. U délky se hodnoty udávají ve stupních v rozsahu 0 až 180, kde 0 je Greenwich, na východ od něj je východní polokoule, na západ západní. Kompletní adresa tedy vypadá třeba takto: 15E 50N.

Jenže celý stupeň je hodně velká oblast. Pro představu – tohle je prostor mezi 15 a 16 stupňem východní délky a 49 a 50 stupněm severní šířky:

screenshot-mapy.cz 2016-07-19 12-56-47

Tedy flák země. Proto se stupně dále dělí na minuty, vteřiny, a ty se přenášejí v desetinné podobě. Jenže minuty a vteřiny používají šedesátkové dělení, což je u počítačů nepraktické, proto se často používá desetinné dělení stupňů. Například 49.2244914N, 13.2719244E.

Z vlastností reálných čísel vyplývá, že přidáváním dalších míst za desetinnou tečku zpřesňujeme polohu.Pokud snížíme počet číslic, sníží se přesnost souřadnice, respektive zvětší se označená plocha na zemském povrchu. Pozice je tedy „ztrátově kompresována“ už tím, že jde o reálná čísla.

Pokud bych přenášel čísla v desítkové ASCII podobě, vyšlo by mi šest znaků na každou souřadnici. „49.22413.271“ – tedy přesnost na tisíciny stupně, je nedostatečná. Pro představu:

screenshot-mapy.cz 2016-07-19 13-22-25

Ušetřím jedno místo, když vypustím desetinnou tečku. Ale v takovém případě už musím vycházet z toho, že část před ní bude mít fixní počet číslic. Pokud chci třeba operovat na území České republiky, nemám problém. Ale pro obecnou kompresi GPS se to příliš nehodí: délka může mít rozsah 0 až 180, tedy 1 až 3 číslice, navíc potřebuju zakódovat kvadranty severní / jižní, západní / východní.

Na dvojnásobek mohu přesnost zvednout, pokud použiju BCD. Do jednoho bajtu se pak vejdou dvě číslice, a díky tomu, že mám nevyužité kódy A-F, mohu jimi zakódovat desetinnou tečku i kvadrant. Dostanu se tak na velmi vysoké rozlišení.

Jenže jaksi sami cítíte, že taková komprese není příliš efektivní. Je tam spousta „volného prostoru“.

Další možnost je pracovat s reálnými čísly ve tvaru „floating point“, nebo „fixed point“, osekanými na určitý počet bitů v mantise. Do toho se mi ale moc nechtělo.

Druhý nápad, se kterým jsem pracoval, vyšel z toho, že si určím jižní a západní polokouli jako zápornou (-180..+180, resp. -90..+90) a posunu soustavu souřadnou tak, aby byla v rozmezí <[0,0] – [360,180]>. Tento rozsah pak rozdělím na menší obdélníky. Jejich počet bude určovat jednak přesnost, ale i požadovaný počet bitů informace. Jako dostačující přesnost mi připadá pěti- či šestibajtová (20 či 24 bitů per souřadnice). Pokud rozdělíme plochu na šestnáctimiliontiny (1/16777216, 24 bitů), dostáváme obdélník o délce 0.0000214 stupně a šířce 0.0000107 stupně. To je vzdálenost několika kroků:

screenshot-mapy.cz 2016-07-19 13-38-09

V případě nutnosti přidám sedmý bajt a přesnost bude v každém směru 16x větší.

Když tu ukazuju hrubé odhady toho, kolik je jedna desetitisícina stupně, tak platí zhruba pro naše území. Z vlastností zeměpisných souřadnic vyplývá, že vzdálenost jednoho stupně délky na rovníku je mnohem vyšší než u nás, a i tady je mnohem vyšší než třeba na severu Švédska, a v bezprostřední blízkosti pólu klesá až k nule. Toho by se dalo využít, a v případě, že neděláte aplikaci pro polárníky, tak by jistě šlo zeměpisnou délku pro šířky blízké pólům „decimovat“ – snížit jim přesnost v bitech, a tak ušetřit, při relativně malé degradaci přesnosti.

No a konečně poslední možnost, se kterou jsem pracoval, je umělé snížení rozsahu GPS souřadnic, pokud je jasné, že přenášená hodnota z těchto souřadnic nevystoupí. Pro Českou republiku můžeme zvolit hrubý „obdélník opsaný“, omezený mezi 12. a 19. stupeň východní délky a 49. až 51. stupeň severní šířky. Tady je problém, protože malá část našeho území spadá až nad 51. stupeň:

screenshot-mapy.cz 2016-07-19 13-46-40

Pokud chcete vědět úplně přesně, tak vězte, že obdélník opsaný má souřadnice [48.5519972N, 12.0906633E] – [51.0556997N, 18.8591456E]. Pokud republiku pokryjete sítí 65536 x 65536 obdélníků, tedy 16 x 16 bitů, získáte dostatečnou přesnost pro velké množství aplikací ve čtyřech bajtech. První souřadnici by šlo degradovat, protože republika je orientována směrem východ – západ, a dal by se tak ušetřit bit či dva.

Na podobných principech pracují i další metody „komprese zeměpisných souřadnic“. Naleznete jistě i sofistikovanější metody. Já přemýšlel pouze nad těmi, které bych dokázal, doufejme, bez větších obtíží implementovat v Arduinu.

Rubriky: Jen tak, Software | Štítky: | 6 komentáře

Hrátky se Sigfoxem

Minule jsem si hrál s deskou SmartEverything (SME) a Sigfoxem – nechal jsem si posílat informace o teplotě, tlaku a vlhkosti. Teď mě napadlo, že si zkusím, jak je na tom GPS.

Nainstalovat si příklad „zjisti pozici z GPS a napiš mi ji“ je triviální. Ale to se mi moc nechtělo, já chtěl něco onačejšího. Vzal jsem tedy pozici z GPS a posílal jsem ji přes Sigfox na server. Jako že takový sledovač GPS (Gde Právě Su), a zároveň trošku tester technologie Sigfox.

Přemýšlel jsem, jak posílat inteligentně souřadnice ve zprávách, co mají maximálně 12 bajtů. Napadlo mě omezování rozsahu, konverze float na bajty, a už už jsem psal union, a pak mě napadlo, že se podívám, jestli už to někdo neřešil… No jasně že řešil.

Takže jsem použil hotové řešení, upravil jsem posílání tak, aby odesílal zprávu každou minutu, ChytréVšechno jsem dal do auta na nabíječku a vyrazil jsem. Na serveru jsem si předem připravil úplně jednoduché logování poslaných dat.

Jel jsem odpoledne po českých dálnicích v intervalu <2;0>. Tedy jako že po D2, pak po D1 a nakonec po D0. SME vesele poblikával a posílal data, na serveru se vše shromažďovalo, a já teď sednul a celé jsem to hodil do mapy.

Co bod, to zachycená zpráva. Na serveru se ukládaly kromě pozice i informace o RSSI a SNR – najdete je v infoboxech. Barva bodu odpovídá hodnotě RSSI.

Co z mapy vyčteme? Především dvě věci:

  • Pokrytí je už poměrně slušné
  • Při rychlostech nad 110 km/h zprávy nepřicházejí.

Podle toho, co mi říkali lidé ze SimpleCell, je Sigfox bohužel velmi citlivý na úhlovou rychlost vůči přijímači. Pokud se útlum způsobený tímto efektem potká s útlumem v důsledku vlastností okolního terénu, a navíc se vysílá z auta, může signál poklesnout pod použitelnou mez.

V experimentech budu pokračovat a SME s sebou asi budu vozit pravidelně.

Rubriky: Hardware | Štítky: , , | 7 komentáře

Soutěž v programování mikrořadičů

O víkendu proběhlo celorepublikové kolo soutěže mládeže v programování. Se Štěpánem Bechynským jsme byli porotci kategorie „mikrořadiče“.

Účastníci dostali Arduino a výukový kit, který používáne na workshopu Arduino101. Na vypracování úlohy měli čtyři hodiny… Chcete s nimi zmřit síly?

Zadání úlohy pro celostátní kolo kategorie mikrořadiče

Univerzální hlídač lednice

Nové lednice mají velmi často zabudovaný teploměr, takže víte, jestli fungují správně, a když necháte dveře dlouho otevřené, tak začnou pískat. Co ale udělat s lednicí, která takto vybavená není? To je úkol pro Univerzální hlídač lednice (UHL). Vaším úkolem je takovéto zařízení vytvořit. Hardware dostanete připravený a vaším úkolem bude vše naprogramovat.

Funkce UHL je následující: 1. Pokud je lednice otevřená déle než 30 vteřin, tak začne UHL přerušovaně (5 Hz) pískat. Otevření lednice detekujte pomocí fotorezistoru.

2. Při otevření lednice zobrazuje UHL teplotu ve stupních Celsia nebo Fahrenheita, podle toho, co si uživatel naposled zvolil, viz bod 3. Teplota je zaokrouhlena na celé číslo a za teplotou se na displeji zobrazí jednotky, tedy znak C nebo F.

3. Pokud je lednice zavřena, tak se na displeji nic nezobrazuje, aby se šetřila energie.

4. Tlačítkem Menu UHL přepíná mezi zobrazením teploty ve stupních Celsia, Fahrenheita.

5. UHL ukládá maximální a minimální naměřenou teplotu. Tyto hodnoty zůstanou uloženy, i když UHL přijde o napájení, např. při výměně baterie.

6. Ke každému extrému se zároveň uloží i datum a čas. Nezapomeňte proto správně nastavit hodiny.

7. Pomocí tlačítka Up zobrazí UHL maximální naměřenou teplotu a po 10 vteřinách se vrátí na naposled zvolené zobrazení, viz funkce č. 2.

8. Pomocí tlačítka Down zobrazí UHL minimální naměřenou teplotu a po 10 vteřinách se vrátí na naposled zvolené zobrazení, viz funkce č. 2.

9. UHL umí hlídat překročení mezních hodnot teploty. Při překročení minimální nebo maximální teploty se rozblikají všechny LED a na displeji začne blikat hodnota teploty, která je mimo rozsah. Frekvence blikání diod je 10 Hz, frekvence blikání displeje je 1 Hz. Nastavení minimální a maximální teploty se provádí přes sériovou linku. Tyto hodnoty se uchovávají i při odpojení napájení.

10. Po připojení UHL k počítači si mohu některé informace zobrazit nebo nastavit pomocí následujících příkazů přes sériovou linku:

 

Příkaz (nezáleží na velikosti písmen) Funkce Ukázka výstupu
Maxc Maximální hodnota ve °C 2016-01-14 10:32:14 10C
Maxf Maximální hodnota ve °F 2016-01-14 10:32:14 50F
Minc Minimální hodnota ve °C 2016-01-14 12:02:14 7C
Minf Minimální hodnota ve °F 2016-01-14 12:02:14 44F
Delete Smaže uložené informace OK nebo ERROR
Allc Zobrazí minimální a maximální teplotu ve °C 2016-01-14 12:02:14 7C
2016-01-14 10:32:14 10C
Allf Zobrazí minimální a maximální teplotu ve °F 2016-01-14 12:02:14 44F
2016-01-14 10:32:14 50F
Setlimitmaxc <hodnota> Nastaví poplach při překročení maximální teploty OK nebo ERROR
Setlimitminc <hodnota> Nastaví poplach při překročení minumální teploty OK nebo ERROR
Deletelimitmaxc Vypne hlídání maximální teploty OK nebo ERROR
Deletelimitminc Vypne hlídání minimální teploty OK nebo ERROR

11. Pokud uživatel provede neplatnou operaci, třeba zadá nesmyslnou hodnotu, tak se na displeji objeví text ERROR, který bude po dobu 10 vteřin po displeji rolovat, a zároveň se pošle chybové hlášení po sériové lince. Pak se UHL vrátí do režimu zobrazení teploty.

Pravidla

1. Pokud něčemu nerozumíte, tak se ihned zeptejte.

2. Musí se použít jen dodaný jednotný hardware.

3. Smí se použít Standard Libraries, které jsou dostupné v čisté instalaci Arduino IDE viz. https://www.arduino.cc/en/Reference/Libraries.

4. Smí se použít knihovna TM1636 pro ovládání displeje, kterou dodá pořadatel. (Odstranili jsme znaky A-F, abychom si ověřili, že soutěžící chápou cizí kód  dokážou ho upravit)

5. Knihovny se mohou libovolně upravovat.

6. Můžete vytvořit vlastní knihovnu.

7. Jiné knihovny jsou zakázané.

8. Zdrojový kód musí být pečlivě okomentován, aby bylo zřejmé, že mu autor rozumí. I když vydělíte dvě čísla, tak musíte do komentáře napsat proč je dělíte.

9. Zdrojové kódy aplikace, včetně knihoven, uložte na plochu do adresáře, jehož jméno bude vaše startovní číslo. Adresář je třeba si vytvořit.

10. V případě stejného počtu bodů rozhoduje čas odevzdání úlohy. (Kdo dřív přijde, ten dřív mele. First come, first serve.)

Co máte k dispozici

1. Schéma zapojení použitého shieldu.

2. Seznam použitých součástek.

3. Katalogový list hodin reálného času.

4. Knihovnu TM1636.

5. Katalogový list použitého termistoru.

6. Vzorec pro přepočet °C na °F.

t[C°]= 5/9.(t[F°]−32)

7. Vzorec pro výpočet teploty.

t [°C] – výsledná teplota

r [Ω] – odpor termistoru

B – konstanta z katalogového listu

t[°C]=1 / (log(r[Ω] / 10000) / (B+1) / 298.15)−273.15


Tak co, troufnete si?

Soutěžící (12-19 let) se s tím popasovali všelijak. Dva byli výrazně lepší než zbytek, vítěz dokone používal i DDRD a PORTD, nastavil si přerušení,…

Na druhé straně konstrukce:

byla velmi neotřelá a ukazovala, že autor možná udělá líp, když se bude věnovat jiným aktivitám 😉

Troufnete si vy? Alespoň koncept…

Rubriky: Software | Štítky: , , , | 4 komentáře

O objektu, struktuře a gotu

A taky o globální proměnné.

Programátoři se od pradávna dělili na Opravdové Programátory a Pojídače koláčů. Tenhle sloupek Eda Posta je tak notoricky známý, že ho ani nebudu připomínat, a místo toho rovnou řeknu, co mám na srdci…

Totiž já už to psal, ale klidně to připomenu: Učte se programovat mikrokontroléry, naučte se assembler aspoň jednoho procesoru, a uvidíte, jak vám věci začnou dávat smysl.

Uvědomil jsem si to, když mi jeden velmi zkušený programátor ukazoval svůj kód pro Arduino a divil se, že se mu to nevejde do paměti. Koukám do kódu, a ten byl – přátelé! – ten byl nádherný! Srdce každého učitele programování by nad tím zaplesalo. Nahoře měl konstruktor a destruktor, pod tím ty struktury, správně přetypované malloc()…

Polknul jsem.

„Co? Mám chybu v tom pointerovém typecastu? To snad ne…“

Povídám: „Co to tady tím mallocem tvoříš?“

Prý že nějaké úložiště dat… V hlavní smyčce se volají dvě funkce, první nějak sebere data, vytvoří tuhle strukturu, předá ji druhé, ta je zpracuje a strukturu zase zruší. Napsal bych objekt, ale nemělo to metody. Tady by asi ten učitel povytáhnul obočí.

Funkce, která data zpracovávala, měla taky nějaké lokální proměnné. Ještě že nepoužil rekurzi, pak by bylo neštěstí hotové.

Dal jsem mu stručnou nalejvárnu. Naštěstí šlo o chápavého a velmi liberálního programátora. Kdyby byl rigidní, tak mě ještě dneska škrtí a křičí, že globální proměnná neexistuje a GOTO je ďábel!

Pojďme si to trošku nahodit na koleje. Pokud jste programátor bankovních systémů v Javě, pokud děláte weby nebo pokud programujete, cojávím, matematické algoritmy v … čemkoli, zkrátka pokud programujete cokoli s výjimkou low level systémů, tak si opravdu vystačíte s objektovým / objektově orientovaným přístupem, ti drsnější z vás se naučí funkcionální, a neberte to teď nijak zle: vystačíte si s tím a budete v tom klidně dobří. Ale nepouštějte se, probůh, do low level, protože tam jsou lvi a temnota a zmatení a jistoty přestávají platit.

Trošku to připomíná situaci člověka, který je zvyklý na newtonovskou mechaniku, a najednou je postaven před teorii relativity. Všechno je jinak a sčítání rychlostí není sčítání a tak. Jenže platí, a to si zapište červenou tužkou hned vedle tabulky ASCII kódů, že v normálním životě si většina lidí vystačí s newtonovskou mechanikou, a kdo by při výpočtu doby dojezdu z Prahy do Brna autem po D1 montoval relativistické vzorce, dopočítal by se téhož, ale působil by značně nepatřičně. Tam stačí obyčejné „vzdálenost lomeno rychlost“. Teda – na D1 je to potřeba ještě vynásobit imaginární jednotkou i, protože D1 se řídí vlastními zákony a žádný vzorec nikdy nezohlední počet bílých Transitů, Felicií jedoucích 110 v levém pruhu, vymletý pravý pruh od Humpolce po Jihlavu ani Slováků v audinách tak temných, že mají zatemněné i přední sklo, ale – rozumíme si, ne?

Zkrátka úplně stejně, jako jsou relativistické vzorce vhodné jen pro některé oblasti, tak jsou low level postupy taky vhodné převážně pro low level programování. Ale zase je dobré je znát, abyste si nepřipadali před cyklotronem a Arduinem jako mistři světa, protože umíte newtonovskou fyziku a Quicksort.

Pár základních věcí tedy zde:

Zaprvé – globální proměnné existují a jsou užitečné. Pokud se pracuje s jednou instancí něčeho (tedy jako že singleton), tak to uložte do „globální proměnné“. V praxi to dostane v RAMce, které v jednočipu není nikdy dost, tolik bajtů, kolik to skutečně zabírá, bude to na konstantní adrese, a nazdar bazar, bude to tam furt, přistupuje se k tomu jednoduše a hotovo dvacet.

Zadruhé – žádná halda. Víte vy, jak se pracuje s haldou? Jasně že víte, ale otázka zní: jak to ten procesor vlastně dělá, že tu haldu má, a že vám z ní přiděluje paměť, o kterou si řeknete? No, on si totiž vezme celou volnou paměť, co má k dispozici (a to se liší podle architektury), a udělá si v ní bloky. V zásadě si na začátku zapíše na začátek celé haldy pár servisních bajtů, typicky: toto je prázdný blok, má délku tolik a tolik. Pak uděláte malloc(), knihovna koukne do paměti, najde značku pro „prázdný blok“, z ní odpočítá požadovaný počet bajtů, a na začátek zapíše: Alokovaný blok, tolik a tolik bajtů, a za konec zapíše: Prázdný blok, tolik a tolik bajtů. Chvilku je přidělujte a rušte, nejlépe s různými a nesoudělnými délkami, a za chvilku v RAMce nebudete mít k hnutí. Prostě ne, dynamická alokace paměti je v jednočipu prostě hloupý nápad a pokud můžete, tak se jí vyhněte.

Zadvouapůlté – ukazatel. Když už máte nějakou dynamickou paměť přidělenou, tak k ní přistupujete přes ukazatel a přes index. Což tedy v praxi znamená, že buď má procesor nějaké indexové registry, a do nich si uloží hodnotu ukazatele a pak přistupuje k paměti prostřednictvím nepřímé adresy, nebo je nemá, a pak si musí pokaždé adresu dopočítat. Naštěstí je dneska mají, taky překladače umí hodně dobře optimalizovat, ale raději se na to nespoléhejte, protože i překladač může narazit na omezení, buď svoje, nebo procesoru.

Zatřetí – žádné lokální proměnné. Taková lokální proměnná, to je místo na zásobníku. Zásobník, helejte, to není nějaká abstraktní struktura ze skript „Algoritmy I – datové struktury“, ale docela zásadní součást procesoru na nízké úrovni. Když voláte podprogram (což je ve vyšších jazycích plusmínus ekvivalent „volání funkce“), tak se na zásobník, což je struktura v paměti, uloží adresa, ze které se skáče, aby se po returnu mohl procesor vrátit tam, kde byl naposledy. Na zásobník se taky ukládají věci, které si potřebujete na chvíli někam schovat. Zkrátka zásobník je velmi důležitá věc, bez ní by vám program ve strojáku fungoval naprosto nestrukturovaně. U „velkých“ procesorů to nebývá úplně takový problém, tam bývá zásobník hodně velký a s chybou „stack overflow“, která nastává ve chvíli, kdy toho na zásobník uložíte moc, se setkáte jen zřídka. Nebo ještě hůř – nesetkáte se s ní až do chvíle, než vám někdo pomocí téhle chyby nezruší systém a nenabourá se do něj. U malých procesorů to už problém je, tam není dost RAMky. Některé dokonce mají omezenou velikost (třeba 6502 měl jen 256 bajtů na zásobníku) a některé jednočipy mají hardwarově zásobník zcela mimo adresní prostor a pevně omezený například na 16 hodnot.

No, a proč o zásobníku mluvím? Protože zrovna lokální proměnné se dělají tak, že po vstupu do podprogramu (=funkce, procedury, jakkoli) se na zásobníku alokuje množství paměti, potřebné pro všechny proměnné, a pak se k nim přistupuje (zase) nepřímo. Moderní překladače to řeší tak, že se snaží alokovat pro tyto situace některé z registrů, ale zase: nejde to vždy a všude, nespoléhejte na to.

Mimochodem – když předáváte funkci parametry, víte, co se stane? Záleží na překladači, ale obecně platí, že zase uloží všechny na zásobník a zavolají podprogram. Pak je opět zahodí. Znovu: překladače optimalizují a snaží se nacpat parametry do registrů, ale když jich je moc, tak i registry dojdou.

Začtvrté – rekurze. Není to dobrý nápad, důvod vizte výš.

Za páté – goto. Nebo GO TO. Zkrátka přímý skok na nějaké místo programu. Od dob strukturovaného programování je to zlo, protože to rozbíjí strukturu. Ve skutečnosti za všemi těmi for a loop a while není nic jiného než prachsprosté goto, jen zakapotované tak, že cílovou adresu skoku řeší překladač a ne chybující programátor. I známé breakcontinue jsou jen syntaktický cukřík místo goto. V assembleru se mu ale říká většinou jump (JMP, JP, JUMP) nebo branch. Je to velmi silný nástroj, takže chápu, proč ve vyšších jazycích moc nebývá, ale tam dole, tam, kde to smrdí křemíkem, se bez něj neobejdete. A stačí jedna chyba, a program vám najednou skáče, kam nemá, kde ho nikdo nečekal, a dějou se věci veliké.

Holt jednočipy, osmibity a assembler nejsou pro měkkýše… Jsou to mocné nástroje, ale nebezpečné a v rukou nezkušeného můžou napáchat obrovské škody. Ale rozhodně pomůže, když se je naučíte – i kdyby hlavním důvodem měla být ta úleva, že programujete v něčem s podstatně vyšší mírou abstrakce.

Rubriky: Jen tak, Software | Štítky: , , , | 3 komentáře

BigClown

Před pár lety, kdy jsem si redefinoval svoje profesní cíle a fantazie, tak jsem si říkal: Jaká by byla úplně ideální práce, kterou bych chtěl dělat? A uvědomil jsem si, že by mě ze všeho nejvíc bavilo:

  • Hrát si s elektronikou. Jako že mě zaujme nějaké zajímavé čidlo, tak si ho koupím, zkusím s ním něco dělat, nějaké zapojení navrhnout, vyzkoušet to, pohrát si. A pak sednout a…
  • Psát o tom, jak se s čipem pracuje, na jaké problémy jsem narazil, co se mi líbilo a co ne… Dát dohromady tipy, odpovídat lidem, které to zaujalo, pomoci s použitím a nasazením…
  • Programovat pro to – drobné utility, uživatelské rozhraní a tak. Nic velkého, žádný bankovní systém v Javě, ale spíš jen malá aplikace, drobnost, proof of concept
  • Školit to, učit, psát o elektronice…

Celé to dohromady se jaksi přirozeně točí okolo Internetu věcí, ať už to je co chce.

No a tak jsem decentně směřoval k tomu cíli. Kombinoval jsem něco jako zaměstnání, něco jako koníček, však víte sami, pokud mě sledujete.

Logicky se na mne časem začali obracet různí lidé, abych jim buď poradil, nebo řekl svůj názor na jejich „IoT technologii“. Tak jsem se dostal k Sigfoxu, k LoRaWan od Things.cz a ke spoustě dalších věcí. Jedním z týmů, který mě oslovil a žádal o zpětnou vazbu, byla parta z Jablotronu, která přišla s platformou pro domácí automatizaci, nazvanou BigClown. Na první letmý pohled jedním okem to vypadalo jako ekosystém „a la Arduino + vybrané senzory a aktuátory + koncentrátor“, ale jedna věc mě zaujala enormně, a to… Zkusíte hádat?

Když Jablotron, tak bezpečnost!

Ty jednotlivé endpointy, tedy samotné „věci“, jsou modulární. Hlavní modul („core“) je postavený na procesoru STM32L083CZ, což je Cortex M0+, s low power, s generátorem náhodných čísel a akcelerací AES128. U něj je čip ATSHA204, tedy kryptografický čip, který umožňuje bezpečné ukládání klíčů a další kryptografické lahůdky (do podrobností se hodlat nehodlám, nemám nyní na to čas…)

Takže máme „věci“ s integrovaným kryptografickým hardware, kde šifrování není možnost, ale vlastnost. Komunikace s koncentrátorem (hubem) probíhá po rádiu (v pásmu 868MHz) a je šifrovaná. Zprávy jsou technicky MQTT s JSON payloadem, serializované, komprimované a šifrované.

bigclown

V roli koncentrátoru může být jakýkoli počítač, klidně i Raspberry Pi nebo Turris Omnia (router od CZ.NIC), který se stará o další věci – příjem zpráv, odesílání, jejich zpracování, komunikaci do internetu (ostatně ani být nemusí; můžete si to připojit třeba k televizi a sledovat či řídit) a další věci. Důležitá vlastnost je tu automatická aktualizace a záplatování. Koncentrátor hraje rovněž zásadní roli při distribuci klíčů a párování se zařízením – to probíhá fyzicky přes NFC.

Idea „modulární stavebnice domácí automatizace, kde je bezpečnost nikoli přidaná hodnota, ale transparentní vlastnost“ je něco, co Michal Altair Valášek ohodnotil slovy: „Tohle jsem u IoT hledal, takovouhle stavebnici, kde je kryptografie vyřešená, ale nikde nenašel!“

A celé tohle je open source hardware a open source software, uvolněné pod licencemi MIT, CC apod. (ne, žádné GPL, naštěstí!)

No a když jsme se bavili o mém názoru na věc, tak jsem říkal, že se mi to moc líbí, že rád pomůžu a že se to blíží mé „práci snů“.

A tak jsme si plácli.

Jestli vás to zaujalo, tak si přihlašte newsletter na firemní stránce BigClown Labs, nebo pište mně.

Rubriky: Hardware, Jen tak | Štítky: , , , , , | 2 komentáře

Pravidelný přehled

Přátelé, mám toho dost.

Teda ne že bych byl jako že úplně hotovej, jak se říká, ale že mám hodně věcí, kterým se věnuji. Třeba píšu pro Lupu, což dělám zčásti pro peníze a zčásti z ryzí zlomyslnosti, když si představím, jak tamní komentátoři nadskakují. Ale je pravda, že elektroniku jsem teď nějaký čas kvůli pracovnímu vytížení zanedbával… Respektive jsem se jí nevěnoval tak intenzivně, jak by si zasloužila. Pojďme to napravit.

Náš výukový shield už existuje v dvou prototypech. Jeden mám já, druhý má Štěpán, a dokonce už i otestoval fungování shieldu s Ethernet shieldem. Fungují! Takže jupí! Včera navíc přišly termistory, tak můžu udělat třetí kus, tentokrát už s kompletní výbavou, a jet ho ukázat přátelům v CZ.NIC.

Do toho tu testuju Smarteverything, Loru a nejnovější přírustek, Arduino Uno Wifi. Ale protože je času málo, tak to jde jak psovi pastva.

Jediné, co si ale nenechám ujít, je pravidelné procházení Flipboardu a vybírání těch nejvhodnějších kandidátů pro svůj magazín. To se takhle ráno probudím a mám čas, tak si zalistuju novinkama na blozích a magazínech o mikroelektronice a bastlení, a když mě něco zaujme, tak si to přihodím do svého magazínu. Běžte se podívat sami, uvidíte, jaká spousta zajímavých konstrukcí se denně objevuje!

Ať se vám dobře listuje!

Rubriky: Hardware | Štítky: , , | 1 komentář

Odpor k LEDce

Mám odpor k LEDce. Vy ne? To byste měli mít, protože prostě… víte proč, že?

Jsou dva typy elektroinžinýrů. Jedni vědí, že „u LEDky musí být rezistor“, kouknou do schématu, vidí LEDku bez rezistoru, a je jim jasné: To navrhoval patlač, klikač, amatér, bastlič, Satanáš a debil, protože všichni vědí, že u LEDky musí být rezistor a bez něj to může zapojit jen prase.

No a pak je ta, kupodivu menší, skupina lidí, kteří vědí, že „LEDka vydrží jen určitý proud“ (plus samozřejmě že určitý proud potřebuje k tomu, aby vůbec svítila, ale tím se teď tady nezatěžujme). A že nejjednodušší je zapojit sériově rezistor, který proud omezí, ale – a to je důležité – není to jediné správné řešení.

Totiž,on ten rezistor má dvě zásadní nevýhody. Zaprvé: topíte jím pánubohu do oken. Není to nic podstatného, ale přeci jen – topíte. Zadruhé: je to další součástka v obvodu, a když držíte náklady nebo prostor na minimu, tak se každý rezistor počítá.

Tady je dobré vědět, že k LEDce není „povinný rezistor“, ale „maximální proud“. A pokud se vám LEDka ocitne v místě, kde je jaksi z podstaty proud, který je nižší než maximální povolený, tak se nemusíte už s rezistorem babrat. Však proč taky – o proud jde, ne o to, že máte rezistor u LEDky!

Maximální proud je kupodivu na spoustě různých míst. Například na výstupech a vstupech jednočipů. Nebo tam, kde se budí pomocí PWM. Například si představte takový displej, složený ze čtyř sedmisegmentovek, a jeho buzení pomocí jednočipu. Na porty připojím rovnou anody a katody, protože vím, že budím postupně jednu pozici po druhé, tedy každá LED je vlastně buzena PWM se střídou 1/4. Navíc vím, že jednočip má omezený proud per pin, takže nehrozí nebezpečí, že by tekly velké proudy. A proto vím, že v tomto případě není nutné použít rezistor.

Ale obávám se, že do finální verze shieldu jich asi budu muset osm strčit. Sice jsou ty LEDky připojený mezi vývody ATtiny2313 a jsou buzené přes PWM, ale asi bych neměl na to vysvětlovat stále dokola to, co jsem napsal tady, každému, kdo se naučil mantru o LEDkách v té blbé verzi (tedy s rezistorem místo té verze s proudem)!

Já to na jednu stranu chápu: Začátečníkovi je lepší říct, že „k LEDce patří rezistor“, tím začátečník nic nezkazí… Jenže pak je taky dobré mu říct, proč to dělá, a dbát na to, aby to pochopil. Jinak se to naučí jak Ohmův zákon a bude to naprosto mechanicky aplikovat pořád, všude, a co hůř: bude se chodit hádat do diskusí…

PS: Tady máte trošku detailnější počtení o LEDkách a rezistoru a jednočipu, ale je to v angličtině.

Rubriky: Hardware | Štítky: , , , | 5 komentáře

Liška kontra papoušek

Tak se to nějak sešlo, že mám teď doma tři kousky na testování. Dvakrát Sigfox, jednou LoRa od Things.cz. (Fox a Lóra, jasný? Slovní hříčka…)

Desky na shieldy přijdou zítra nebo pozítří, takže je zatím čas na hraní. Zde jsou moje první dojmy z vybraných kitů.

Jako první dorazil Arduino shield pro Sigfox. Je na něm modul od ATIM, připojený tím nejjednodušším možným způsobem přes adaptér úrovní 3.3V – 5V.

Abych to konkretizoval: Nejjednodušší možný způsob zde znamená, že modul, co komunikuje přes sériový port, připojili na sériový port Arduina. Já nevím, jestli víte, co to znamená… na tomtéž sériovém portu totiž probíhá programování Arduina. Data, co tečou při programování do Arduina, se volně míchají s daty, co tečou z toho modulu po resetu (a že jich tam teče dost), a když Arduino něco odpoví, tak to modul pošle do sítě. A nakonec to, logicky, skončí s chybou. Takže programování, přátelé, programování znamená, že musíte odpojit Arduino, sundat shield, připojit Arduino, naprogramovat, odpojit Arduino, připojit shield, připojit Arduino.

Navíc ten modul má takovou zvláštnost. On totiž sice umí takové ty standardní AT příkazy, co má Sigfox, ale nejdřív mu musíte nějakou escape sekvencí znaků (podle manuálu je to „+++“, ale taky možná „&&&“) říct, že budete posílat AT příkazy. Pokud to neuděláte, tak modul bere to, co mu pošlete, a po shlucích dvanácti bajtů to posílá do sítě. Damned.

A než jsem na to metodou pokus – omyl přišel, tak byl shield ošoupaný jako levné sako. Manuál je roztomilý, protože půlka je ve francouzštině, půlka v angličtině, naštěstí ta, co se týká Sigfoxu, je anglicky. Le jupí!

Přitom ten modul má, jestli jsem to dobře pochopil, něco jako enable vstup. Kdyby na té destičce bylo prosté, himbajs, tlačítko, které by odpojilo modul, takže by ho při programování stačilo přidržet, bylo by to rázem řádově lepší! No, tlačítko není, a v SimpleCell by se asi zlobili, kdybych si ho na zapůjčený shield přimontoval sám. 🙂

Jinak jako jo, práce s tím je extrémně jednoduchá (když si tímhle projdete), a pokud si sestavíte zařízení, co bude někde fungovat, tak to je naprostá pohoda a vystačíte si s naprosto obyčejným Serial.print, ani ty AT příkazy neřešíte. Ale NEŽ to zařízení sestavíte a odladíte, tak to bude asi bolest.

Od bolesti dál. Druhý testovací bazmeg dorazil od Things.cz, tedy od společnosti, co chce provozovat nekomerční síť na standardu LoRa, resp. LoRaWAN. A protože okolí mého bydliště pokryté není, pokryl jsem si ho vlastními silami, respektive zapůjčeným přístupovým bodem. Zatím nemohu potvrdit dosah, protože testuju z ložnice do obýváku, a to doslova. Testuju to na dodaném LoRaWAN modulu, který je zatím, jestli to správně chápu, neveřejný, takže ho ani fotit nebudu…

Po kratších peripetiích, způsobených nastavením přístupového bodu a tím, že klíč je nutno poslat UPPERCASE, což jsem netušil, začalo zařízení fungovat takříkajíc na první dobrou. Vyzkoušel jsem uplink, tedy posílání zpráv, i downlink, tedy příjem odpovědí, a nezaznamenal jsem žádný problém, s jedinou výjimkou, a to bylo potvrzování downlinku, které se občas neodeslalo. Podle výrobce je příčinou použitý chipset v tom kusu, co mám k dispozici, s novým by to mělo fungovat bez problémů.

Třetí deska, co dorazila, je takový bastlířský ekvivalent šlehačkového dortu s karamelovou polevou, zmrzlinou a želatinovými bonbóny. Jmenuje se SmartEverything a je to taková, pardon za to slovo, „beruška“. Ani jsem se nedíval na cenu, protože… Helejte:

Je to deska, velká jako Arduino. Je tam Atmel SAMD, tedy 32bitový Cortex. Je tam GPS. Je tam Sigfox. A taky teplotní čidlo, vlhkostní čidlo, akcelerometr, gyroskop, kompas, tlakoměr, NFC, proximity senzor, RGB ledka a vodotrysk. Ne, kecám, jedno z toho tam není…

Připojil jsem, dle návodu nainstaloval prostředí pro desky, spustil blink.ino, přeložil, a v půlce získal zvláštní chybu.

Totiž ono je takové pravidlo. Jakmile se pokouším instalovat nebo zprovoznit něco, o čem je někde v nějakém diskusním fóru napsáno „Zkouším to a objevila se mi tam taková chyba“ a na to třicet odpovědí: „To se nestává, to slyším prvně“, tak mně se ta chyba projeví. Takže tady taky. Nakonec pomohlo aktualizovat Arduino IDE, a už to šlapalo jak hodinky.

Ke všem těm komponentám jsou i knihovny a demíčka, takže jsem vesele posílal data přes Sigfox, měřil teplotu, tlak, vlhkost, blikal LEDkou, zjišťoval pozici (což šlo doma docela blbě) – ta výbava zkrátka slibuje velkou radost při hraní. Dokonce jsem někde koutkem oka zahlédl, že to lze napájet i z baterie, to by bylo fakt pěkné…

(Jo, a ta cena je nějakých pětasedmdesát liber…)

(Doplnění, díky Pavlovi Sodomkovi: Na českém rs-online se to skrývá pod kryptickým označením Vývojová sada MCS7561, cena necelých 2900 Kč)

Víc jsem zatím po večerech nestihnul, ale zůstaňte vytuněni, jak se říká, jen co bude Troška času, budu experimentovat dál.

Rubriky: Hardware | Štítky: , , | 2 komentáře