Tento příspěvek je věnován atypickému otáčkoměru, tvořenému věnečkem 16 světelných diod. V závislosti na otáčkách motoru se světélko pohybuje buďto doprava (ve směru hodinových ručiček), nebo doleva (opačně). Světélko obíhá tím rychleji, čím více jsou otáčky vzdáleny od otáček optimálních. Optimálními otáčkami se rozumějí otáčky, kdy má motor největší točivý moment – tehdy se pohyb světélka zastaví. V oněch optimálních otáčkách, tedy v případě zážehového motoru kolem 3000 ot/min je motor nejsilnější a měl by mít i nejnižší spotřebu paliva.
V porovnání s klasickým ručkovým otáčkoměrem lze pokládat za výhodu, že pohyb světelného budu lze sledovat periferním viděním, aniž by bylo třeba odtrhnout oči od silnice; pro sledování ručičky na přístrojové desce by bylo navíc nutno přeostřit, tedy akomodovat zrak, což odvádí pozornost od dění na silnici po dobu asi dvou vteřin.
Pokud tedy váš vůz není otáčkoměrem vybaven, může ho náš „okolík“ plně nahradit. Do vozu, který je otáčkoměrem vybaven, můžete si okolík přidat prostě pro radost. Už když sepnete zapalování, začnou se na okolíku honit světelné hady postupně v sedmi barvách. Při volnoběžných otáčkách zase jiný hezký efekt, světélka nepravidelně probleskují. Nad 1000 ot/min již displej poskytuje informaci o provozních otáčkách: světelný bod se pohybuje nejprve doleva, se zvyšováním otáček postupně zpomaluje, nad 2000 otáček se připojí ještě druhý, protilehlý světelný bod. Při 3000 otáčkách se pohyb zastaví a pak pokračuje v opačném směru, nad 4000 otáčkami druhý bod zhasne a obíhá jen jediné světélko, stále rychleji… to vše je hezké i užitečné.
Strojek jsem vymyslel asi před 20 lety. V mém tehdejším autě, Škoda Felicia, jsem na přístrojovém panelu nalezl signál, jehož frekvence byla úměrná otáčkám. Dál to bylo snadné: pro každou délku intervalu mezi dvěma impulzy jsem tabulkou přiřadil příslušný interval otáčení. O moc let později jsem si pořídil Hyundai i30, u toho jsem vhodný signál na palubní desce nenašel, impulzy jsme odebírali ze zapalovací cívky. Zařízením v tomto provedení jsem se pochlubil i v internetových novinách (http://technet.idnes.cz/cesky-vynalez-otackomer-ktery-vas-nauci-setrit-motor-pdy-/veda.aspx?c=A110303_132303_veda_mla). Nyní jsem se ale rozhodl využít digitální data, která jsou k dispozici v palubní informační síti vozu. Předem upozorňuji, že takové řešení je daleko složitější.
Sběrnice CAN
Někde pod palubní deskou, zpravidla blízko volantu, je vyvedena diagnostická zásuvka sběrnice CAN. Na sběrnici CAN jednotlivá zařízení ve voze posílají nebo přijímají různé zprávy týkající se motoru, nabíjení, osvětlení a spousty dalších věcí. Taková zpráva sestává v zásadě z adresové části a datové části. Datový protokol probíhá na dvou vodičích, CAN_H a CAN_L a je poměrně složitý. Jako bastlíři si také musíme být vědomi, že narušení komunikace na sběrnici vozu by mohlo mít vážné důsledky. Z těchto důvodů pro připojení na sběrnici použijeme profesionální obvod. V rodině Arduino je to deska MCP2515, ta obsahuje obvody MCP2515 s TJA1050. To první je vlastně datový procesor, zatímco druhý obvod (TJA1050) pouze ošetřuje vstupy ze sběrnice CAN, označené H a L. Na desce je kromě konektoru SPI, který popíšeme vzápětí, ještě propojka J1 k propojení vstupů H a L přes odpor 120 Ω; propojka se uplatní pouze na obou koncích sběrnice, což není náš případ.
Vývody desky MCP2515 – 7 pinů

INT | Výstup přerušení |
SCK | Hodinový pin vysokorychlostního rozhraní SPI™ (10 MHz), režimy SPI 0,0 a 1,1. |
SI (MOSI) | Vstupní pin |
SO (MISO) | Výstupní pin |
CS | MCP2515 předpokládá, že první bajt po uvedení CS na nízkou úroveň je bajt instrukce či povelu. Což znamená, že je nutno uvést CS nejprve na vysokou a poté na nízkou úroveň, aby byl přijat další povel |
GND | Zem |
Vcc | Napájení +5V |
Obvod MCP2515 je procesor, obsahuje zhruba 128 osmibitových registrů, z nichž část slouží k ukládání instrukcí a část k ukládání dat. Jedna z instrukcí zaručí, že obvod nebude do sběrnice aktivně zasahovat – to je náš případ, my budeme pouze sledovat zprávy, které si vyměňují jiná zařízení. Další instrukce udávají parametry sběrnice CAN; v případě Hyundai i30 sběrnice běží na 500kb a adresa zprávy je standardní 11-bitová. Norma (ISO 15765) ovšem připouští i jiné alternativy, jako je použití rozšířené adresy nebo jiné rychlosti komunikace. V této souvislosti ještě uveďme, že sítí CAN bývá ve voze hned několik, třeba ve vozech Škoda jsou to: CAN-Pohon 500 kBit/s, CAN-Komfort 100 kBit/s, CAN-Infotainment 100 kBit/s, CAN-Panel přístrojů 500 kBit/s, CAN-Diagnostika 500 kBit/s.
Nyní se na paměťové registry MCP2515 podíváme podrobněji. Zpravidla se prezentují ve formě tabulky s osmi sloupci a šestnácti řádky, my se soustředíme jen na část tabulky:
0000 xxxx | 0010 xxxx | 0110 xxxx | |
xxxx 0000 | RXF0SIDH | RXM0SIDH | RXB0CTRL |
xxxx 0001 | RXFSIDL | RXMOSIDL | RXB0SIDH |
xxxx 0010 | RXF0EID8 | RXMOEID8 | RXBSIDL |
xxxx 0011 | RXF0EID0 | RXMOEID0 | RXB0EID8 |
xxxx 0100 | RXB0EID0 | ||
xxxx 0101 | RXB0DLC | ||
xxxx 0110 | RXB0D0 | ||
xxxx 0111 | RXB0D1 | ||
xxxx 1000 | RXB0D2 | ||
xxxx 1001 | RXB0D3 | ||
xxxx 1010 | RXB0D4 | ||
xxxx 1011 | RXB0D5 | ||
xxxx 1100 | RXB0D6 | ||
xxxx 1101 | RXB0D7 | ||
xxxx 1110 | CSANSTAT | ||
xxxx 1111 | CANCTRL |
Pramen: Tabulka 11-1 v http://ww1.microchip.com/downloads/en/devicedoc/21801d.pdf
RXB0SIDH..RXB0EID0 | V těchto 4 bajtech je mj. adresa zprávy. Zpráva může mít „standardní formát“ s adresou o délce 11 bitů (horních 11 bitů z oněch 4 bajtů~32 bitů) nebo tkzv. „rozšířený formát“; tomu se nebudeme věnovat, neboť vozy Hyundai zhruba od roku 2010 používají sběrnici se standardním formátem, CAN 11 bit (500kb). |
RXM0SIDH.. RXM0EID0 | Maska : nás zajímá pouze horních 11 bitů, proto sem zadáme masku 11111111 11100000 00000000 00000000 |
RXF0SIDH.. RXF0SIDL | Tento filtr předepisuje, jak musí vypadat horních 11 bitů adresy, aby byla zpráva přijata a zapsána do sloupce 0110 xxxx. |
RXB0D0.. RXB0D7 | Datové pole, může obsahovat 0 až 8 bajtů. |
RXB0DLC | Skutečný počet datových bajtů v datovém poli |
Ke snímání otáček je potřeba znát adresu zprávy, v níž se požadovaný údaj nachází a také, ve kterých bytech datového pole se údaj nachází. Obvykle otáčky bývají ve dvou bajtech A a B, přičemž
ot/min = 32∙A+0,125∙B [0 až 8031,875]
nebo
ot/min = 64∙A+0,25∙B [0 až 16383,75]
Jak jsme zjistili (postup uvedeme na konci tohoto příspěvku), u vozu Hyundai jsou otáčky součástí zprávy s 11 bitovou adresou RXF0SIDH|RXF0SIDL 98|192, otáčky jsou uloženy v jediném registru RXB0D3, kdy jeho hodnotu je nutno vynásobiti 64:
ot/min = 64∙[RXB0D3]
Schéma zapojení

Signál odebíráme z diagnostického konektoru OBDII (nebo přímo ze sběrnice CAN) přes desku MCP2515. Desku MCP2515 spojuje s deskou Digispark! Attiny85 sběrnice SPI; komunikaci na této sběrnici řídíme jednoduchými povely z programu mikroprocesoru.
Deska mikroprocesoru je podrobně popsána třeba na https://digistump.com/wiki/digispark. Sestává z mikroprocesoru Attiny85, konektoru USB a několika dalších součástek. V mikroprocesoru je nahrán rezidentní program, který umožňuje přímé nahrávání aplikací (programů, skečů) z vývojového prostředí Arduino, instalovaného na počítači, přes kabel USB. Když je na Digispark přivedeno napájecí napětí, tento vyčká asi 5 sekund, aby umožnil případné nahrání nové aplikace. Z hlediska uživatele je tak zařízení po připojení na napájení po dobu prvních 5 sekund v nečinnosti, což ovšem znamená, že pokud po sepnutí zapalování hned startujete, pak vám výše zmíněné „světelné hady“ uniknou neboli, zobrazí se rovnou animace pro volnoběžné otáčky.
Výstupem P4 mikroprocesoru ovládáme zobrazovač CJMCU-2812-16; je to 16 fakticky samostatných jednotek WS2812 uspořádaných v kruhu.

Krátce zde popíšeme protokol zobrazení: komunikace probíhá rychlostí 800kb, tj., přenos jednoho datového bitu trvá 1,25 µs. Pracuje se s proměnnou střídou signálu, ten má v rámci jednoho bitu nejprve vysokou úroveň a pak úroveň nízkou. Pokud vysoká úroveň trvá zhruba dvě třetiny onoho intervalu 1,25 µs, jedná se o logickou 1, pokud jen jednu třetinu onoho intervalu, jedná se o logickou nulu. Jednotka WS2812 se aktivuje přetrvávající nízkou úrovní na sběrnici po dobu alespoň 50 µs. Jakmile se pak na vstupu (IN) objeví signál, jednotka z něj odebere prvních 24 bitů a další bity už jen propouští dál (OUT) na následující WS2812. Další WS2812 v sérii tedy začne vnímat o 48 cyklů později a náš uzel zůstane pasivní, dokud nenarazí opět na zmíněnou prodlevu. Jedná se o statické zobrazení, nevyžadující periodické obnovování.
Oněch 24 bitů představuje 3 bajty barevných složek RGB, každý pixel ze tří základních barev může tedy nabývat 256 úrovní jasu. Obsluha našeho displeje o 16 jednotkách trvá nominálně 50 + 1,25×24×16 = 530 µs. Je to rychlé a proto to vyžaduje speciální knihovnu, využívající přímý přístup do paměti (DMA); takových knihoven na internetu naleznete vícero, ne všechny jsou ale schopny spolupracovat právě s deskou Attiny85.
Knihovna, kterou jsme použili my, má i instrukci pro nastavení svítivosti všech LED v kruhu najednou. Onu svítivost je nutno v noci omezit, proto jsme zařízení vybavili čidlem osvětlení připojeným na pin P5. U tohoto pinu mají některé klony Attiny85 nestandardní chování: pokud se na pinu P5 objeví napětí 2V nebo nižší, dojde k resetu – námi ověřeno na několika exemplářích; podle katalogového listu je bezpečné dokonce až napětí 3V. Na pinu P5 proto máme odporový dělič 7k5+10k který zaručí, že napětí nepoklesne pod ½ provozního napětí. Fototranzistor máme SP213F (z nabídky hadex.cz), při použití jiného fototranzistoru s jinými parametry bude patrně třeba upravit konstanty mezí signálu v příslušných řádcích programu.
Připojení desky MCP2515 na CAN by mělo být nakrátko, řádově 10 cm. Spojení MCP2515/Digispark Attiny85 na displej může být o hodně delší. Nutný je velký kondenzátor (100µF a více) bezprostředně u displeje.
Napájení zařízení +12V by mělo být spínané klíčkem zapalování, ovšem na konektor OBDII (pin 16) je standardně vyvedeno jen napětí trvale připojené na akumulátor. To jsme neřešili, neboť po odladění jsme se připojili na sběrnici CAN mimo konektor OBDII přes vlastní konektor jiného typu, na který jsme přivedli i napájení, odvětvené od klíčku zapalování přes diodu a kondenzátor 100µF vůči zemi. Na schématu napojení na pin 16 není zakresleno.
Příklad realizace je na následujícím obrázku. K propojení s displejem slouží telefonní konektor (v pravém horním rohu). Do konektorů na základní desce se zasunou desky 2515 a Attiny85 (žlutě). Přečnívající část desky 2515 (vlevo) je možno odříznout.

Projděte si komentáře ve výpisu programu.
ex18.ino
Přípravek pro ladění programu
Zobrazovací jednotka s WS2812 je dost choulostivá, proto je žádoucí odzkoušet její funkčnost ještě před zabudováním zařízení do vozu. Můžete také pokusničit s jinými režimy zobrazení, měnit rozsah svítivosti, atd. Za tím účelem vyjmeme desku MCP2515 z konektoru a nahradíme ji nějakým potenciometrem (jeho hodnota není kritická):


Otáčením potenciometru „generujeme“ otáčky. V programu v sekci setup() je třeba upravit
pinMode(SCK,INPUT); // iniciace analogového kanálu 1
Ještě nahradíme počáteční řádky podprogramu tours():
void tours() {int R; int JOB;
R = analogRead(1); // 10-bit ADC, 0 až 1024 >> chci 0 až 128 tj. dělit 8
otoc = R >> 3;
CAN jako černá skříňka – skeč STM32_16.ino
Na internetu jsme nalezli informaci, že zhruba od r.2010 Hyundai má sběrnici CAN s adresou o 11 bitech a s rychlostí 500kb/s. Potřebovali jsme ale zjistit, s jakou adresou a ve kterých datových bitech je k dispozici údaj o otáčkách. Proto jsme si sestavili přípravek podle obrázku. Pro tento účel se deska Digispark Attiny85 nehodí, protože nemá sériový kanál; měli jsme ale k dispozici desku STM32F103C a převodník USB to TTL:

K tomu jsme sestavili program STM32_16.ino, který snímá veškerou korespondenci na sběrnici.
Na monitoru to pak vypadá nějak takhle:
RXBOSIDH|RXBOSIDL|RXB0EID8|RXB0EID0|RXB0DLC|RXB0D0|..D1|..D2|..D3|..D4|..D5|..D6|..D7
…
176 3 34 176 8 0 0 0 0 0 0 0 0
150 3 37 128 5 146 244 0 7 218
98 193 133 128 8 1 59 22 71 59 74 0 0
98 195 37 128 8 1 58 74 71 58 74 0 0
98 193 133 128 8 1 58 136 71 58 74 0 0
101 32 3 22 8 132 80 122 16 0 50 255 14
101 32 3 22 8 10 80 122 16 0 50 255 14
86 1 77 69 5 146 244 0 7 233
86 1 77 69 5 146 244 0 7 52
…
Oproti běžným zvyklostem posíláme na monitor data v dekadickém formátu, nikoli hexadecimálním, což usnadní převod dat do tabulkového procesoru. Data překopírujeme do tabulkového procesoru (Excel nebo podobný), dále je setřídíme podle horního bajtu adresy (RXBOSIDH) a pak je vyneseme, pro každou adresu zvlášť, do spojnicového grafu. Zajímají nás data, která vykazují při stojícím motoru hodnotu 0. Nadějně vypadá adresa 98 (plná adresa má 11 bitů, tedy kombinace 98|192, 98|193, 98|194 atd.):

Při spuštění motoru, volnoběhu, pak zvýšení a pak poklesu otáček by měl záznam procházet maximem. V našem případě je patrně záznam o otáčkách pod adresou 98|192 a ve 4. datovém sloupci, což je obsah registru RXB0D3. Odečtený údaj je nutno vynásobit konstantou, kterou bude nějaká mocnina 2. Zvolíme konstantu 64. Do skeče ex18.ico tedy dosadíme reg. RXB0D3=0x69, reg.RXF0SIDH=98, reg. RXF0SIDL=192, reg. RPM=64. Hotovo!
Dodatek: napájení z pinu 16

Vyzkoušel jsem i napájení zařízení z pinu 16 konektoru OBDII. Tento pin je standardně trvale připojen na akumulátor, pokud jej použijeme přímo, odběr proudu bude trvale kolem 100 mA a na displeji budou obíhat světelné hady pořád dokola, to je neúnosné. Naproti tomu níže uvedený přípravek s dvojitým operačním zesilovačem (LM358N) sníží odběr v režimu spánku na 0,3 mA, pokles kapacity baterie o 1 Ah pak bude trvat celých 20 týdnů…
Funkce: při sepnutí klíčku zapalování se na sběrnici CAN H/CAN L objeví napětí oscilující kolem 3V, tím se nabíjejí členy RC, ty překlopí operační zesilovač/zesilovače a tranzistor sepne napájení.
Se součástkami podle schématu po vyjmutí klíčku zapalování na displeji obíhají světelné hady ještě asi půl minuty. Lze odzkoušet zkrácení tohoto času zmenšením kapacity kondenzátorů, vstupní odpory 220k ale doporučuji zachovat – na sběrnici CAN jsme přece jenom pouhými hosty. Zhasnutí displeje lze také urychlit úpravou programu.
