Innholdsfortegnelse:
2025 Forfatter: John Day | [email protected]. Sist endret: 2025-01-13 06:58
En roterende encoder er en elektro-mekanisk enhet som konverterer rotasjonsbevegelse til digital eller analog informasjon. Den kan snu med eller mot klokken. Det er to typer roterende encoders: Absolutte og relative (inkrementelle) encoders.
Mens en absolutt encoder sender ut en verdi som er proporsjonal med gjeldende akselvinkel, sender en inkrementell encoder trinnet til akselen og dens retning. (I dette tilfellet har vi en inkrementell encoder)
Rotary encoders blir stadig mer populært fordi du kan bruke to funksjoner i en elektrisk modul: En enkel switch for bekreftelse av operasjoner og roterende encoder for å navigere, f.eks. gjennom en meny.
En inkrementell roterende encoder genererer to utgangssignaler mens akselen roterer. Avhengig av retningen leder det ene signalet det andre. (se nedenfor)
Trinn 1: Forstå utdataene
Som du kan se når kodeakselen begynner å rotere med klokken, faller utgang A til LAV først og utgang B følger den. I retning mot klokken vender operasjonen motsatt.
Nå må vi bare implementere dette på vår µController (jeg brukte en Arduino Nano).
Trinn 2: Bygg kretsen
Som jeg beskrev før, lager utgangene en HØY og en LAV flanke. For å få en ren HIGH ved datapinnen A og B på µController må vi legge til Pull-Up-motstander. Den vanlige Pin C går rett til bakken for den LAVE flanken.
For å få informasjon om den interne bryteren (trykknapp) bruker vi de to andre pinnene. En av dem går til VCC og den andre til en datapinne på µController. Vi må også legge til en Pull-Down Resistor i datapinnen for å få en ren LOW.
Det er også mulig å bruke interne Pull-Up og Pull-Down motstander på µController!
I mitt tilfelle ser pinout slik ut:
- +3, 3V => +3, 3V (Arduino) (også +5V mulig)
- GND => GND (Arduino)
- A => Pin10
-
B =>
Pin
11
- C => GND
-
SW =>
Pin
12
Trinn 3: Skrive koden
int pinA = 10; // intern bryter A int pinB = 11; // intern bryter B int pinSW = 12; // switch (presset Encoder) int encoderPosCount = 0; // starter på null, endre hvis du vil
int posisjonval;
bool switchvalval; int mrotateLast; int mrotate;
ugyldig oppsett () {
int mrotateLast = digitalRead (pinA); Serial.begin (9600); forsinkelse (50); }
void loop () {readencoder (); if (readwitch () == 1) {Serial.println ("Switch = 1"); }}
int readencoder () {
mrotate = digitalRead (pinA); hvis (mrotate! = mrotateLast) {// knotten roterer hvis (digitalRead (pinB)! = mrotate) {// switch A endret først -> roterer med klokken encoderPosCount ++; Serial.println ("rotert med klokken"); } annet {// bryter B endret først-> roterer encoderPosCount mot klokken; Serial.println ("rotert mot klokken"); }
Serial.print ("Encoder Position:"); Serial.println (encoderPosCount); Serial.println (""); } mrotateLast = mrotate; return encoderPosCount; } bool readwitch () {
hvis (digitalRead (pinSW)! = 0) {// bryteren er trykket
mens (digitalRead (pinSW)! = 0) {} // bryteren er trykket på switchval = 1; } annet {switchval = 0;} // switch er upresset retur switchval; }
Nå kan du snu encoder og variabelen encoderPosCount teller opp hvis du roterer med klokken og teller ned hvis du roterer mot klokken.
Det er det! Enkelt og nyttig.
Du er velkommen til å endre og utføre koden. Du kan implementere det i prosjektet ditt.
Jeg vil også laste opp et LED -prosjekt der jeg brukte koderen for å angi lysstyrken på lysdiodene mine.