2023. február 9., csütörtök

Gyorskeresés

KY 040 rotary encoder illesztése Arduino Pro Micro -hoz

Írta: | Kulcsszavak: Arduino . Leonardo . Pro Micro . Atemga32U4 . billentyűzet . egér . rotary encoder . ky 040

[ ÚJ BEJEGYZÉS ]

Rutinus ebay felhasználóként miután megrendeltem a Arduino Leonardo Pro Micro-t (igazából csak Pro Micro, de ugyanaz az Atmega32U4-es vezérlő van rajta, mint a Leonardo-n, és így könnyebben megtalálja a felhasználó), félretettem a billentyűzet-projektet egy hónapra. Nagy meglepetésemre három hét alatt kihozták a kontrollert. Így múlt héten csütörtökön össze is raktam egy minimális kapcsolást hogy kipróbáljam a chipet és a hivatalos könyvtárakat. Egy analóg pöcögtetőt és egy rotary encoder-t használtam Előbbit a kurzor mozgatására, utóbbit a görgőeseményekhez, és a gombhoz (bár az analóg stick-kel is lehetne kattintani).

Természetesen én is a netről lestem el az eszközök használatát. Két jó leírást is találtam, egy nyersebbet, és egy összeszedettebbet, amiben a szoftveres pergésmentesítésről is írnak. A rotary encoder használata nem triviális, mivel nem tartalmaz aktív alkatrészeket, közvetlenül a mechanikus működést kell mintavételezni. Az enkóder két jelet ad, és attól függ a megszakítások sorrendje, hogy melyik irányba tekerte a felhasználó a kapcsolót. A KY 040 több, mint a nyers enkóder, néhány ellenállással kiegészítették, de a pergésmentesítéshez ki kell egészíteni két kondenzátorral, amik a magas frekvenciás zajokat szűrik, ideális esetben elkenve a tüskéket, amik a felfutó és lefutó élek közelében jelentkeznek. Én a kísérleti kapcsolásból ezeket még kihagytam, így bele is futottam a tipikus hibába: néha feltekerésnél egy lépés helyett két-három eseményt is észlelt az Arduino, néha pedig egyenesen a másik irányba indult. De működött.

Az egéreseményt könnyen hozzá tudtam illeszteni, az Arduino Mouse.move() metódusa három paramétert fogad, az első kettő a kurzorra, a harmadik a görgőre vonatkozik. Nem küldtem kurzor-mozgást, csak a kerék +1 vagy -1 elmozdulását, és így egy meglepően hasznos görgetőt készítettem. Sokkal kényelmesebben kezelhető, mint a hagyományos egérgörgő, mivel a kisebb sugár miatt lényegesen többet lehet görgetni fogásváltás nélkül.

volatile boolean TurnDetected = false;
volatile boolean up = false;

const int PinCLK = 7; // Used for generating interrupts using CLK signal
const int PinDT = 5; // Used for reading DT signal
const int PinSW = 6; // Used for the push button switch
long lastPressed = 0;
long now = 0;

void isr () { // Interrupt service routine is executed when a HIGH to LOW transition is detected on CLK
Serial.println("Interrupt");
if (digitalRead(PinCLK))
up = digitalRead(PinDT);
else
up = !digitalRead(PinDT);
TurnDetected = true;
}

// Main stuff
void setup() { // initialize the buttons' inputs:

pinMode(PinCLK, INPUT);
pinMode(PinDT, INPUT);
pinMode(PinSW, INPUT);

digitalWrite(PinSW, HIGH);
attachInterrupt (4, isr, FALLING); // interrupt 0 is always connected to pin 2 on Arduino UNO
Serial.begin (9600);
Serial.println("Start");
// initialize mouse control:
Mouse.begin();
now = millis();
}

long virtualPosition = 0;

void loop() {
// Check rotary click
if (!(digitalRead(PinSW)) && ((millis() - lastPressed) > 50)) {
lastPressed = now;
Serial.println ("Click");
Mouse.click();
}

if (TurnDetected) { // do this only if rotation was detected
if (up) {
virtualPosition++;
Mouse.move(0, 0, -1);
} else {
virtualPosition--;
Mouse.move(0, 0, 1);
}
TurnDetected = false;
Serial.print ("Count = ");
Serial.println (virtualPosition);
}
delay(1);
}

Copyright © 2000-2023 PROHARDVER Informatikai Kft.