Close

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: ,

Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Autor
    Příspěvky
  • #8815
    vlada@liskovic.cz
    Účastník

    Ahoj, 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);
    }
    #8817
    Zbyšek Voda
    Účastník

    Dobrý den, jakou Arduino desku máte?

    #8818
    vlada@liskovic.cz
    Účastník

    ně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 🙁

    #8820
    Zbyšek Voda
    Účastník

    Ale klon jaké desky? 🙂 UNO, Leonardo…?

    #8821
    vlada@liskovic.cz
    Účastník

    A jo, pardon, vůbec mi to nedošlo, Uno 🙂

    #8826
    Zbyšek Voda
    Účastník

    Dobř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.

    #8829
    vlada@liskovic.cz
    Účastník

    Dí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 🙂

    #8831
    Zbyšek Voda
    Účastník

    Není 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.

    #8871
    vlada@liskovic.cz
    Účastník

    tak 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 🙂

    #8877
    Zbyšek Voda
    Účastník

    Dobrý den, tak ještě zkuste nasdílet váš kód 🙂

    #8878
    vlada@liskovic.cz
    Účastník

    je mozne, ze problem je v tom, ze na interupt vstupech nemam debounce kondenzator?

Aktuálně je na stránce zobrazeno 11 příspěvků - 1. až 11. (celkem z 11)
  • Pro reakci na toto téma se musíte přihlásit.