Funktionsweise des Drehgebers und Verwendung mit Arduino
In diesem Tutorial lernen wir, wie Drehgeber funktionieren und wie man ihn mit Arduino verwendet. Sie können sich das folgende Video ansehen oder das schriftliche Tutorial unten lesen.
Ein Drehgeber ist eine Art Positionssensor, der zur Bestimmung der Winkelposition einer rotierenden Welle verwendet wird. Er erzeugt entsprechend der Drehbewegung ein elektrisches Signal, entweder analog oder digital.
Es gibt viele verschiedene Arten von Drehgebern, die entweder nach Ausgangssignal oder Sensortechnologie klassifiziert werden. Der spezielle Drehgeber, den wir in diesem Tutorial verwenden werden, ist ein inkrementeller Drehgeber und der einfachste Positionssensor zum Messen der Drehung.
Dieser Drehgeber ist auch als Quadratur-Encoder oder Relativ-Drehgeber bekannt und sein Ausgang ist eine Reihe von Rechteckimpulsen.
Werfen wir einen genaueren Blick auf den Encoder und sehen wir uns sein Funktionsprinzip an. So werden die Rechteckimpulse erzeugt:Der Encoder hat eine Scheibe mit gleichmäßig verteilten Kontaktzonen, die mit dem gemeinsamen Pin C und zwei anderen separaten Kontaktpins A und B verbunden sind, wie unten dargestellt.
Wenn sich die Scheibe Schritt für Schritt zu drehen beginnt, beginnen die Stifte A und B mit dem Kontakt mit dem gemeinsamen Stift und die beiden Rechteckwellen-Ausgangssignale werden entsprechend erzeugt.
Jeder der beiden Ausgänge kann zur Bestimmung der Drehposition verwendet werden, wenn wir nur die Impulse des Signals zählen. Wenn wir jedoch auch die Drehrichtung bestimmen wollen, müssen wir beide Signale gleichzeitig betrachten.
Wir können feststellen, dass die beiden Ausgangssignale um 90 Grad gegeneinander verschoben sind. Wenn sich der Encoder im Uhrzeigersinn dreht, ist Ausgang A vor Ausgang B.
Wenn wir also jedes Mal die Schritte zählen, wenn sich das Signal ändert, von High nach Low oder von Low nach High, können wir feststellen, dass zu diesem Zeitpunkt die beiden Ausgangssignale entgegengesetzte Werte haben. Umgekehrt, wenn sich der Encoder gegen den Uhrzeigersinn dreht, haben die Ausgangssignale gleiche Werte. In Anbetracht dessen können wir unseren Controller einfach so programmieren, dass er die Encoder-Position und die Drehrichtung liest.
Machen wir ein praktisches Beispiel dafür mit dem Arduino. Das spezielle Modul, das ich für dieses Beispiel verwenden werde, kommt auf einem Breakout-Board und hat fünf Pins. Der erste Pin ist der Ausgang A, der zweite Pin ist der Ausgang B, der dritte Pin ist der Button-Pin und die anderen beiden Pins sind natürlich der VCC- und der GND-Pin.
Wir können die Ausgangspins mit jedem digitalen Pin des Arduino Boards verbinden.
Die für dieses Arduino-Tutorial benötigten Komponenten erhalten Sie über die folgenden Links:
Hier ist der Arduino-Code:
Beschreibung des Codes: Also müssen wir zuerst die Pins definieren, an die unser Encoder angeschlossen ist, und einige Variablen definieren, die für das Programm benötigt werden. Im Setup-Abschnitt müssen wir die beiden Pins als Eingänge definieren, die serielle Kommunikation zum Drucken der Ergebnisse auf dem seriellen Monitor starten, sowie den Anfangswert des Ausgangs A lesen und den Wert in die Variable aLastState schreiben.
Dann lesen wir im Schleifenabschnitt den Ausgang A erneut, aber jetzt fügen wir den Wert in die aState-Variable ein. Wenn wir also den Encoder drehen und ein Impuls erzeugt wird, unterscheiden sich diese beiden Werte und die erste „wenn“-Anweisung wird wahr. Gleich danach bestimmen wir mit der zweiten „if“-Anweisung die Drehrichtung. Wenn sich der Zustand des Ausgangs B vom Zustand des Ausgangs A unterscheidet, wird der Zähler um eins erhöht, andernfalls wird er verringert. Am Ende, nachdem wir die Ergebnisse auf dem seriellen Monitor ausgegeben haben, müssen wir die aLastState-Variable mit der aState-Variablen aktualisieren.
Das ist alles, was wir für dieses Beispiel brauchen. Wenn Sie den Code hochladen, starten Sie den seriellen Monitor und beginnen Sie mit dem Drehen des Encoders, wir beginnen mit dem Abrufen der Werte im seriellen Monitor. Das spezielle Modul, das ich habe, macht 30 Zählungen in jedem vollen Zyklus.
Weitere Informationen:Ultraschallsensor HC-SR04 und Arduino – vollständige Anleitung
Zusätzlich zu diesem einfachen Beispiel habe ich ein weiteres Beispiel für die Steuerung der Position eines Schrittmotors mit dem Drehgeber erstellt.
Hier ist der Quellcode dieses Beispiels:
Fühlen Sie sich frei, Fragen im Kommentarbereich unten zu stellen.Übersicht
Funktionsweise des Drehgebers
Drehgeber-Arduino-Beispiel
Quellcode
/* Arduino Rotary Encoder Tutorial
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
Serial.begin (9600);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the outputA with the current state
}
Codesprache:Arduino (arduino) Beispiel 2 – Steuerung eines Schrittmotors mit einem Drehgeber
/* Stepper Motor using a Rotary Encoder
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
// defines pins numbers
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0;
int angle = 0;
int aState;
int aLastState;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
counter ++;
angle ++;
rotateCW();
}
else {
counter--;
angle --;
rotateCCW();
}
if (counter >=30 ) {
counter =0;
}
lcd.clear();
lcd.print("Position: ");
lcd.print(int(angle*(-1.8)));
lcd.print("deg");
lcd.setCursor(0,0);
}
aLastState = aState;
}
void rotateCW() {
digitalWrite(dirPin,LOW);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
Codesprache:Arduino (arduino)
Herstellungsprozess
- C#-Warteschlange mit Beispielen:Was ist C#-Warteschlange und wie wird sie verwendet?
- Steuerung des Servomotors mit Arduino und MPU6050
- DIY Einfaches Messrad mit Drehgeber
- u-blox LEA-6H 02 GPS-Modul mit Arduino und Python
- So liest man Temperatur und Luftfeuchtigkeit auf Blynk mit DHT11
- Wie einfach ist es, einen Thermistor zu verwenden?!
- Wie man mit einem Arduino Musik macht
- So verwenden Sie NMEA-0183 mit Arduino
- So verwenden Sie Modbus mit Arduino
- Spracherkennung mit Arduino und BitVoicer Server