Cuprins:
- Pasul 1: Codificatoare rotative în interior
- Pasul 2: Mizeria care provoacă dureri reale pentru mulți
- Pasul 3: soluție pentru mașina cu stat finit (FSM)
- Pasul 4: Cod Arduino
- Pasul 5: integrare perfectă
Video: O soluție rotativă completă Arduino: 5 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:44
Codificatoarele rotative sunt butoane de control rotative pentru proiecte electronice, adesea utilizate cu microcontrolerele familiei Arduino. Acestea pot fi utilizate pentru a regla fin parametrii, a naviga prin meniuri, a muta obiecte pe ecran, a seta valori de orice fel. Acestea sunt înlocuiri obișnuite pentru potențiometre, deoarece pot fi rotite mai precis și infinit, ele incrementează sau scad o valoare discretă la un moment dat și sunt adesea integrate cu un comutator împingător pentru funcții de selecție. Sunt disponibile în toate formele și dimensiunile, dar gama de prețuri cea mai mică este dificil de interfațat, așa cum se explică mai jos.
Există nenumărate articole despre detaliile de lucru și modurile de utilizare a codificatoarelor rotative și numeroase exemple de coduri și biblioteci despre cum să le utilizați. Singura problemă este că niciunul dintre aceștia nu funcționează 100% exact cu modulele rotative chinezești cu cea mai mică gamă de prețuri.
Pasul 1: Codificatoare rotative în interior
Partea rotativă a codificatorului are trei pini (și încă doi pentru partea opțională a comutatorului). Unul este un teren comun (GND negru), celelalte două sunt pentru a determina direcția când butonul este rotit (acestea sunt adesea numite albastru CLK și roșu DT). Ambele acestea sunt atașate la un pin de intrare PULLUP al microcontrolerului, făcând nivelul ÎNALT citirea lor implicită. Când butonul este rotit înainte (sau în sensul acelor de ceasornic), mai întâi CLK albastru cade la nivelul LOW, apoi urmează DT roșu. Întorcându-se mai departe, CLK albastru se ridică înapoi la HIGH, apoi pe măsură ce patch-ul GND comun părăsește ambii pini de conexiune, DT roșu se ridică și la HIGH. Completând astfel o bifare completă FWD (sau în sensul acelor de ceasornic). Același lucru este valabil și în cealaltă direcție BWD (sau în sens invers acelor de ceasornic), dar acum roșul cade mai întâi, iar albastrul crește înapoi ultima, așa cum se arată în imaginile cu două niveluri.
Pasul 2: Mizeria care provoacă dureri reale pentru mulți
Problemă obișnuită pentru pasionații Arduino, că modulele ieftine de codificare rotativă saltează modificări suplimentare în nivelurile de ieșire, provocând citiri suplimentare și greșite ale numărării direcțiilor. Acest lucru previne numărarea perfectă și face imposibilă integrarea acestor module în proiecte rotative precise. Aceste sărituri suplimentare sunt cauzate de mișcările mecanice ale plasturilor peste pinii de conectare și chiar și aplicarea condensatorilor suplimentari nu le poate elimina complet. Salturile pot apărea oriunde în ciclurile complete de bifare și sunt ilustrate de scenarii din viața reală pe imagini.
Pasul 3: soluție pentru mașina cu stat finit (FSM)
Imaginea arată spațiul complet al stării posibilelor modificări de nivel pentru cei doi pini (albastru CLK și roșu DT), atât pentru săraci corecte, cât și false. Pe baza acestei mașini de stare poate fi programată o soluție completă care funcționează întotdeauna 100% precisă. Deoarece nu sunt necesare întârzieri de filtrare în această soluție, este și cea mai rapidă posibilă. Un alt avantaj al separării spațiului de stare al știfturilor de modul de lucru este acela că se pot aplica ambele moduri de interogare sau de întrerupere după propriul său gust. Interogarea sau întreruperile pot detecta modificări de nivel pe pini și o rutină separată va calcula starea nouă pe baza stării actuale și a evenimentelor efective de schimbări de nivel.
Pasul 4: Cod Arduino
Codul de mai jos numără bifele FWD și BWD de pe monitorul serial și, de asemenea, integrează funcția de comutare opțională.
// Peter Csurgay 2019-04-10
// Pinii rotativului mapat la porturile Arduino
#define SW 21 #define CLK 22 #define DT 23
// Valoarea curentă și anterioară a contorului reglat de rotativ
int curVal = 0; int prevVal = 0;
// Șapte stări ale FSM (mașină cu stări finite)
#define IDLE_11 0 #define SCLK_01 1 #define SCLK_00 2 #define SCLK_10 3 #define SDT_10 4 #define SDT_00 5 #define SDT_01 6 int state = IDLE_11;
configurare nulă () {
Serial.begin (250000); Serial.println ("Start …"); // Nivelul HIGH va fi implicit pentru toți pinii PinMode (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // Atât CLK, cât și DT vor declanșa întreruperi pentru toate modificările de nivel attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }
bucla nulă () {
// Manipularea comutatorului opțional integrat în unele codificatoare rotative if (digitalRead (SW) == LOW) {Serial.println ("Pressed"); while (! digitalRead (SW)); } // Orice modificare a valorii contorului este afișată în Serial Monitor dacă (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}
// State Machine tranziții pentru modificări de nivel CLK
void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (state == IDLE_11) state = SCLK_01; else if (state == SCLK_10) state = SCLK_00; else if (state == SDT_10) state = SDT_00; } else {if (state == SCLK_01) state = IDLE_11; else if (state == SCLK_00) state = SCLK_10; else if (state == SDT_00) state = SDT_10; else if (state == SDT_01) {state = IDLE_11; curVal--; }}}
// State Machine tranziții pentru modificări de nivel DT
void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; else if (state == SDT_01) state = SDT_00; else if (state == SCLK_01) state = SCLK_00; } else {if (state == SDT_10) state = IDLE_11; else if (state == SDT_00) state = SDT_01; else if (state == SCLK_00) state = SCLK_01; else if (state == SCLK_10) {state = IDLE_11; curVal ++; }}}
Pasul 5: integrare perfectă
Puteți verifica în videoclipul atașat că soluția FSM funcționează cu precizie și rapiditate chiar și în cazul codificatoarelor rotative cu rază mică de acțiune, cu diverse efecte sporadice.
Recomandat:
Soluție de poluare luminoasă - Artemis: 14 pași
Soluție de poluare luminoasă - Artemis: Poluarea luminoasă este ceva care ne afectează pe toți din întreaga lume. De când s-a inventat becul, lumina a devenit mult mai popularizată și a fost utilizată în mod specific în orașele mari precum New York și Chicago. Toată această lumină poate afecta
Soluție Loeed LoRa IoTea: 5 pași
Soluție Seeed LoRa IoTea: un sistem automat de colectare a informațiilor aplicat plantației de ceai. Face parte din colectarea inteligentă a informațiilor agricole
Proiect Arduino: Gama de testare a modulului LoRa RF1276 pentru urmărirea GPS Soluție: 9 pași (cu imagini)
Proiect Arduino: Test Range Module LoRa RF1276 pentru urmărire GPS Soluție: Conexiune: USB - Serial Necesitate: Chrome Browser Necesitate: 1 X Arduino Mega Need: 1 X GPS Need: 1 X Card SD Need: 2 X LoRa Modem RF1276 Funcție: Arduino Send GPS value la baza principală - Datele principale de stocare a bazei în modulul Datora Server Lora: ultra-lung
O soluție vizibilă accesibilă cu brațul robotului bazat pe Arduino: 19 pași (cu imagini)
O soluție vizibilă accesibilă cu brațul robotului bazat pe Arduino: Când vorbim despre viziunea automată, se simte întotdeauna atât de inaccesibil pentru noi. În timp ce am făcut o demonstrație de viziune open-source, care ar fi foarte ușor de realizat pentru toată lumea. În acest videoclip, cu camera OpenMV, indiferent unde este cubul roșu, robotul este
Ultima soluție MacOS / Hackintosh High Sierra 10.13 USB Wifi Driver "Future Proof" Soluție utilizând Raspberry Pi: 4 pași
Ultima soluție MacOS / Hackintosh High Sierra 10.13 Usb Wifi Driver „Future Proof” Soluție folosind Raspberry Pi: Una dintre cele mai frustrante probleme cu cele mai recente macOS / Hackintosh este disponibilitatea driverului wifi USB. MacOS High Sierra 10.13 Ultimul meu wifi USB este panda wireless, dar suportul pentru driver pentru macO