Rotační enkodér a OLED displej
Úvodní stránka › Fórum › Hardware › Arduino › Rotační enkodér a OLED displej
Označeno štítky: oled, rotacni enkoder
- Toto téma obsahuje celkem 10 odpovědí. Do diskuze (2 diskutující) se naposledy zapojil uživatel
vlada@liskovic.cz a poslední změna proběhla před 9 roky a 1 měsícem.
-
AutorPříspěvky
-
17.10.2016 v 9:11 #8815
vlada@liskovic.cz
ÚčastníkAhoj, mám takový dotaz. Potřebuji na displeji zobrazovat polohu rotačního enkodéru. Displej i enkodér samostatně fungují skvěle. Jakmile je ale spojím, tak, enkodér načítá jen na jednu stranu a ještě špatně, jak kdyby tam byla dlouhá odezva, ale to by být neměla. Neví někdo prosím co s tím? Kód přikládám.
#include "U8glib.h" #define outputA 3 #define outputB 4 int counter = 10; int aState; int aLastState; U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); void setup() { pinMode (outputA,INPUT); pinMode (outputB,INPUT); aLastState = digitalRead(outputA); u8g.setFont(u8g_font_fub25n); u8g.setColorIndex(1); } void loop() { aState = digitalRead(outputA); if (aState != aLastState){ if (digitalRead(outputB) != aState) { counter ++; } else { counter --; } } aLastState = aState; u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); } void draw(){ u8g.setPrintPos(0,64); u8g.print(counter); }17.10.2016 v 10:59 #8817Zbyšek Voda
ÚčastníkDobrý den, jakou Arduino desku máte?
17.10.2016 v 11:06 #8818vlada@liskovic.cz
Účastníknějaký CH340 klon, konkrétně jsem zkusil dva různé. Zatím s nimi v ničem nebyly problémy (krom toho, že shazovaly mac osx 🙂 Můžu to zkusit i s originálem, ale musím ho vyndat – je zabudovaný jinde 🙁
17.10.2016 v 11:12 #8820Zbyšek Voda
ÚčastníkAle klon jaké desky? 🙂 UNO, Leonardo…?
17.10.2016 v 11:15 #8821vlada@liskovic.cz
ÚčastníkA jo, pardon, vůbec mi to nedošlo, Uno 🙂
17.10.2016 v 11:35 #8826Zbyšek Voda
ÚčastníkDobře, díky. Původně jsem myslel, že jde o konflikt pinů, ale tím to asi není.
Kód pro ten enkodér mi přijde podivný, ale jestli vám to takto funguje samotné, tak OK.Problém bude v tom, že funkce knihovny pro obsluhu displeje (u8g.firstPage(), draw()…) vždy nějakou dobu trvají. Ony si vlastně seberou procesor pro sebe a ten pak nezjišťuje, jestli melete enkodérem – to zjišťuje až ve chvíli, kdy přijde řad na funkce digitalRead() apod..
Vy tedy musíte nějak zajistit, aby procesor změny na pinech z enkodéru neignoroval. Pro tento účel se používá tzv. přerušení (anglicky interrupt) – na pinech, na kterých máte enkodér připojený si nastavíte přerušení a při změně těchto pinů dojde k donucené obsluze tohoto přerušení – takže pohyby enkodérem procesor nebude přehlížet.
O přerušeních se můžete dočíst více zde. Musíte si dát pozor na to, abyste použil piny, které přerušení podporují – u UNO jsou to piny 2 a 3. Také pozor na to, že se přerušení nastavují pomocí jejich čísla a ne čísla pinu. Ke správnému zjištění čísla přerušení z čísla pinu slouží funkce digitalPinToInterrupt(interruptPin).
Potom samotné použití přerušení s enkodérem je popsáno zde – hledejte sekci Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pins.
17.10.2016 v 11:48 #8829vlada@liskovic.cz
ÚčastníkDíky moc.
Zkusím se tím prokousat 🙂 Je pravda, že ta knihovna asi bude i dost veliká, protože kompilace překvapivě trvá skoro minutu, takže procesor tam fak má co dělat 🙂 Pokud se mi to nepovede, strčím tam jednoduchý displej, se kterým nikdy problém nebyl a ne ten líbivý OLED 🙂17.10.2016 v 12:02 #8831Zbyšek Voda
ÚčastníkNení zač. Pokud se vám teď nechce prokousávat teorií, můžete použít kód z té sekce Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pins. Proměnná encoder0Pos udává polohu enkodéru – ve vašem případě plní funkci vaší proměnné counter.
18.10.2016 v 22:18 #8871vlada@liskovic.cz
Účastníktak jsem vyzkousel skoro vsechny priklady, jeden z nich je vcelku funkcni, dost se to zlepsilo, ale porad to tak polovinu kroku ztraci. Co s tim? Jinou desku? Jiny displej s mensi obsluznou knihovnou? Docela me to prekvapilo, protoze jinak mi arduino slouzilo fakt spokojene i na daleko slozitejsi veci 🙂
20.10.2016 v 10:02 #8877Zbyšek Voda
ÚčastníkDobrý den, tak ještě zkuste nasdílet váš kód 🙂
20.10.2016 v 17:23 #8878vlada@liskovic.cz
Účastníkje mozne, ze problem je v tom, ze na interupt vstupech nemam debounce kondenzator?
-
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.
