2025 Autor: John Day | [email protected]. Viimati modifitseeritud: 2025-01-13 06:57
Pöörlemiskooder on elektromehaaniline seade, mis muudab pöörleva liikumise digitaalseks või analoogteabeks. See võib pöörata päripäeva või vastupäeva. Pöörlevaid andureid on kahte tüüpi: absoluutsed ja suhtelised (inkrementaalsed) kodeerijad.
Kui absoluutne kodeerija väljastab väärtuse, mis on proportsionaalne võlli praeguse nurgaga, siis inkrementaalne kooder väljastab võlli sammu ja selle suuna. (Sel juhul on meil inkrementaalne kodeerija)
Pöördkodeerijad muutuvad üha populaarsemaks, kuna saate ühes elektrimoodulis kasutada kahte funktsiooni: Lihtne lüliti töö kinnitamiseks ja pöördkodeerija navigeerimiseks, nt. menüü kaudu.
Inkrementaalne pöörlev kodeerija tekitab võlli pöörlemise ajal kaks väljundsignaali. Sõltuvalt suunast juhib üks signaale teist. (vt allpool)
1. samm: väljundandmete mõistmine
Nagu näete, kui kodeerimisvõll hakkab päripäeva pöörlema, langeb väljund A kõigepealt madalale ja väljund B järgneb sellele. Vastupäeva liikumine muutub vastupidiseks.
Nüüd peame selle lihtsalt rakendama oma µControlleris (ma kasutasin Arduino Nano).
Samm: ehitage vooluring
Nagu ma eelnevalt kirjeldasin, loovad väljundid HIGH ja LOW külje. Puhta KÕRGE saamiseks µKontrolleri nööpnõeltele A ja B peame lisama tõmbetakistid. Ühine tihvt C läheb LOW külje jaoks otse maapinnale.
Sisemise lüliti (surunupp) kohta teabe saamiseks kasutame kahte ülejäänud tihvti. Üks neist läheb VCC -sse ja teine µKontrolleri andmeside. Puhta LOW saamiseks peame andmestikule lisama ka tõmbetakistuse.
Samuti on võimalik kasutada µController sisemisi tõmbe- ja tõmbetakistusi!
Minu puhul näeb pinout välja selline:
- +3, 3V => +3, 3V (Arduino) (võimalik ka +5V)
- GND => GND (Arduino)
- A => Pin10
-
B =>
Kinnita
11
- C => GND
-
SW =>
Kinnita
12
Samm: koodi kirjutamine
int pinA = 10; // sisemine lüliti A int pinB = 11; // sisemine lüliti B int pinSW = 12; // lüliti (vajutatud Encoder) int encoderPosCount = 0; // algab nullist, soovi korral muutke
int positionval;
bool lüliti; int mrotateLast; int mrotate;
tühine seadistus () {
int mrotateLast = digitalRead (pinA); Seriaalne algus (9600); viivitus (50); }
void loop () {readencoder (); if (readswitch () == 1) {Serial.println ("Switch = 1"); }}
int readencoder () {
mrotate = digitalRead (pinA); if (mrotate! = mrotateLast) {// nupp pöörleb if (digitalRead (pinB)! = mrotate) {// lüliti A muutus kõigepealt -> pöörlev päripäeva kodeerijaPosCount ++; Serial.println ("pööratud päripäeva"); } else {// vahetati kõigepealt lüliti B-> pöörlev vastupäeva kodeerijaPosCount--; Serial.println ("pööratud vastupäeva"); }
Serial.print ("Kodeerija asukoht:"); Serial.println (encoderPosCount); Serial.println (""); } mrotateLast = mrotate; return encoderPosCount; } bool readswitch () {
kui (digitalRead (pinSW)! = 0) {// lülitit vajutatakse
while (digitalRead (pinSW)! = 0) {} // lüliti on praegu vajutatud switchval = 1; } else {switchval = 0;} // lüliti on vajutamata tagasitulek switchval; }
Nüüd saate kodeerijat pöörata ja muutuja encoderPosCount loeb üles, kui pöörate päripäeva, ja loendab alla, kui keerate vastupäeva.
See ongi! Lihtsalt ja kasulik.
Muutke ja täitke julgelt koodi. Saate seda oma projektis rakendada.
Laadin üles ka LED -projekti, kus kasutasin kodeerijat oma valgusdioodide heleduse määramiseks.