Otáčkomer založený na mikrokontrolérovej platforme Arduino (AVR ATmega328P), infračervenom senzore prekážok KY-032 a LCD znakovom displeji s I2C prevodníkom pre vizualizáciu otáčok za minútu. Modul infračerveného senzora obsahuje 2 diódy - vysielaciu a prijímaciu a taktiež digitálny výstup, označovaný ako DOUT. Vysielacia dióda má stále napájanie 5V a vyžaruje svetlo s frekvenciou 38 kHz na vlnovej dĺžke 950, resp. 940 nm (podľa konkrétneho modelu použitej IR diódy). Prijímacia IR dióda je tmavá, tzv. filter denného svetla. Takáto úprava prijímacej diódy do výraznej miery znižuje senzitivitu diódy na svetlo, čo je nežiadúci jav - interferencia. Prijímacia IR dióda je pripojená na vývod modulu DOUT. Modul senzora je vybavený potenciometrom pre ovládanie citlivosti, reguláciou sa upravuje detekovaná vzdialenosť objektu.
Senzor reaguje na prekážku v určitej vzdialenosti (nastavená potenciometrom) 2-40 cm. Pri odraze vysielaného svetla a jeho odraze od prekážky ho dokáže prijať prijímacia LED dióda a tento signál je privedený na DOUT. Tento digitálny výstup je pripojený na digitálny vstup mikrokontrólera Arduino Uno s podporou prerušenia - D2, prípadne D3. Jednou z výhod IR senzorov je fakt, že svetlo sa z lesklých plôch odrazí efektívnejšie ako od plôch matných. V praxi to znamená, že v určitej vzdialenosti dokáže senzor detegovať svetlo z lesklej plochy, avšak z matnej nie. Môžeme tak využiť tento jav pre záznam pohybu lesklej plochy pri jej prechode (záznam otáčok kolesa, remenice). Pre moju implementáciu otáčkomera som na vonkajšiu časť remenice kľukového hriadeľa nalepil prúžok pásky široký asi 1 cm, prípadne je dobré použiť aj alobal, či celofán, ktorý má veľmi dobré odrazové (reflexné) vlastnosti svetla. Citlivosť senzora som nastavil potenciometrom tak, aby mi senzor reagoval iba na prechod lesklej plochy, nie na remenicu ako takú.
Motor naftového traktora má maximálne otáčky 2500 ot/min.
To znamená, že pri maximálnych otáčkach motora za sekundu Arduino zaznamená 41 prechodov odrazovej plochy.
Medzi jednotlivými pulzami pri maximálnych otáčkach bude pauza cca. 24 milisekúnd, ktorú je možné použiť napríklad aj pre softvérové vyhladenie zákmitov - Debouncing pre rozlíšenie dvoch za sebou idúcich pulzov.
Arduino v prerušení bude načítavať pulzy a inkrementovať premennú dátového typu INT.
Prerušenie bude reagovať na vzostupnú hranu signálu - RISING. (t.j. na stav prechodu z GND to 5V).
Na základe vyhodnocovania vzorcom každú sekundu (1 Hz obnovovacia frekvencia displeja s otáčkami) sa vypočíta počet otáčok motora za minútu a hodnota sa vypíše na LCD znakový displej, ktorý komunikuje s Arduinom po I2C zbernici.
Vďaka I2C prevodníku stačia na prepojenie displeja a Arduina 4 vodiče.
Napájanie (5V), zem (GND), hodinový signál (SCL), dáta (SDA).
Otáčkomer je možné použiť na rôzne stroje, sledovanie otáčok remeníc traktorov, kombajnov, ale aj v priemysle pre monitorovanie procesov, prevádzky a aktivity strojov, rýchlosti posuvu.
Štandardná implementácia využíva rýchlosť komunikácie s displejom 100 kHz, možno použiť až 400 kHz pre rýchlejší prepis displeja.
Program je možné použiť aj s hall senzorom a magnetom umiestneným na remenici. Program je totožný.
Vzorec prepočtu (1Hz rutina --> spúšťané každých 1000 ms):
time = akt_cas - posledny_cas; //rozdiel casov
rpm = (pocet_pulzov/ time) * 60000; //vyrataj otacky/min
oldtime = akt_cas; //uloz aktualny cas
pocet_pulzov = 0;
Zjednodušená programová implementácia, ktorá je na stránke projektu dostupná nerieši odrušenie pred zákmitmi. Debounce je vhodné doimplementovať samostatne do výsledného programu. Pri nevyužívaní debouncingu môže byť miera chybovosti programu do +- 30%.
//Martin Chlebovec (martinius96@gmail.com) //Základná implementácia pre otáčkomer na platforme Arduino Uno / Nano (ATmega328P) //Neobsahuje ošetrenie zákmitov, volatile premenné v interrupt rutine (negarantované obslúženie premennej) //Verzia zdarma pre orientačné meranie, chybovost meraní do: 30% #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 20, 4); //alebo 0x27 (najpouzivanejsie I2C komunikacne adresy) int rev = 0; int rpm; unsigned long oldtime = 0; unsigned long time; void isr() { rev++; } void setup() { lcd.begin(); //100 kHz I2C speed - Standard Mode lcd.backlight(); lcd.setCursor(0, 0); lcd.print("-----ZETOR 4011-----"); attachInterrupt(digitalPinToInterrupt (2), isr, RISING); //interrupt pin } void loop() { delay(1000); detachInterrupt(digitalPinToInterrupt(2)); time = millis() - oldtime; //rozdiel casov rpm = (rev / time) * 60000; //vyrataj otacky/min oldtime = millis(); //uloz aktualny cas rev = 0; lcd.setCursor(0, 1); lcd.print(rpm); lcd.print(" ot/min "); attachInterrupt(digitalPinToInterrupt (2), isr, RISING); }
Využíva prepočet pauzy medzi jednotlivými pulzami v čase kompilácie na základe hodnoty z makra, ktoré predstavuje maximálne otáčky stroja, ktoré nadobúda. Oproti zjednodušenému programu je integrovaná aj volatile premenná uint_32, ktorá uchováva čas posledného pulzu. To v kombinácii so známou pauzou zaručí správne pripočítanie pulzu bez zákmitu, ktoré sa môžu vyskytnúť. Meranie je presnejšie ako v klasickom programe. Rozšírený program nevyužíva delay(), nahradené funkciou millis() pre presnejšie časovanie rutiny každých 1000 ms bez oneskorenia spôsobeného vykreslovaním na displej (rádovo v pôvodnom programe 1000 ms delay + 3 ms vykonávanie výpisu na displej na každú iteráciu loopu). Komunikácia s displejom je rýchlejšia, nakoľko je nastavený hodinový signál 400 kHz (Fast speed). Prekreslovanie znakov trvá 4-násobne kratšie ako v prípade štandardnej komunikačnej rýchlosti 100 kHz. Funkcie detach a attach interrupt nahradené s makrami cli(), sei(). Implementácia je vhodná aj pre projekty s vyšším počtom otáčok za minútu (rádovo až do 12 000 ot/min).