Otáčkoměr s arduinem

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é.

Porovnání s klasickým otáčkoměrem (světélka – fialová – tu bohužel nejsou moc vidět)

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ů 

Poznámka: většinou se setkáte s čínskými klony jako ten na obrázku, jež pracují s krystalem 8MHz, zatímco originální deska prý má krystal 16MHz. 
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 xxxx0010 xxxx0110 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.

STM32_16.ino

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
Konektor OBD-II je zde improvizován ale dá se i koupit, třeba na gme.cz

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.