Benutzer-Werkzeuge

Webseiten-Werkzeuge


arduino_einstieg

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
arduino_einstieg [24.06.2018]
Frank Hochrath [Abstand messen]
arduino_einstieg [20.02.2020] (aktuell)
Frank Hochrath [Winkelgeber]
Zeile 1032: Zeile 1032:
  
  
 +\\
 +\\
 +==== Winkelgeber ====
 +
 +Im Internet habe ich eine Seite gefunden, die den Anschluss eines Drehimpulsgebers (KY-040 Rotary Encoder Drehgeber) beschreibt.\\
 +Als der Geber endlich auf dem Schreibtisch lag, kopierte ich den Code und kämpfte zunächst mit der Pinbelegung.\\
 +\\
 +{{:​drehgeber:​geber1.jpg?​400|}}
 +\\
 +Mein Geber ist wie folgt an dem Arduino angeschlossen:​\\
 +\\
 +Geberpin - Arduinopin\\
 +CLK - 6\\
 +DT - 5\\
 +SW - 2\\
 +\\
 +\\
 +\\
 +drehimpulsgeber_4.ino
 +<​code>​
 +// Den Rotary encoder KY-040 auslesen
 +// Die Taste speichert den aktuellen Wert ins EEPROM
 +//
 +// Matthias Busse 10.2017 Version 1.0
 +//
 +// http://​shelvin.de/​rotary-encoder-ky-040-auslesen-und-wert-in-eeprom-ablegen/#​more-2516
 +//
 +
 +#include <​EEPROM.h>​ // standard Arduino Library
 +
 +int ra = 6; // Pin 6 zu CLK am KY-040
 +int rb = 5; // Pin 7 zu DT am KY-040
 +int sw = 2; // Pin 8 zu SW am KY-040
 +int pos, alast, aval;
 +int eeadr=14; // Speicheradresse wird hier gewählt
 +
 +void setup() { 
 +  pinMode (ra,​INPUT); ​      // Rotary Encoder A & B ist in
 +  pinMode (rb,INPUT);
 +  pinMode(sw, INPUT); ​      // Schalter ist in
 +  digitalWrite(sw,​ HIGH); ​  // interner Pull up Widerstand auf 5V
 +  EEPROM.get(eeadr,​ pos);
 +  alast = digitalRead(ra); ​  
 +  Serial.begin (38400);
 +  Serial.print("​Startpos:​ ");
 +  Serial.println(pos);​
 +
 +
 + void loop() { 
 +  if( digitalRead(sw) == 0) { // Taste gedrückt?
 +    EEPROM.put(eeadr,​ pos);
 +    Serial.print("​geschrieben:​ ");
 +    Serial.println(pos);​
 +    while (digitalRead(sw) == 0); // warten bis die Taste losgelassen wird
 +  }
 +  aval = digitalRead(ra);​ // Encoder gedreht?
 +  if (aval != alast){ // wenn gedreht
 +    if (digitalRead(rb) != aval) { pos++; } // rechts rum
 +    else { pos--; } // sonst links
 +    Serial.print("​Pos:​ ");
 +    Serial.println(pos); ​    
 +  } 
 +  alast = aval;
 +}
 +</​code>​
 +
 +\\
 +Ausgabe beim drehen des Gebers:
 +<​code>​
 +Startpos: -3
 +Pos: -2
 +Pos: -1
 +Pos: 0
 +Pos: 1
 +Pos: 2
 +Pos: 3
 +Pos: 4
 +Pos: 3
 +Pos: 4
 +Pos: 3
 +Pos: 4
 +Pos: 5
 +Pos: 6
 +Pos: 7
 +Pos: 8
 +Pos: 9
 +Pos: 10
 +Pos: 11
 +Pos: 10
 +Pos: 11
 +Pos: 10
 +Pos: 9
 +Pos: 8
 +Pos: 7
 +Pos: 6
 +Pos: 5
 +Pos: 4
 +Pos: 3
 +Pos: 2
 +Pos: 3
 +Pos: 2
 +Pos: 3
 +Pos: 2
 +Pos: 1
 +Pos: 0
 +Pos: 1
 +Pos: 0
 +Pos: -1
 +Pos: -2
 +Pos: -1
 +Pos: -2
 +Pos: -3
 +
 +</​code>​
 +
 +\\
 +\\
 +Die Suche nach einem anderen Code ergab:\\
 +\\
 +drehgeber_5.ino\\
 +<​code>​
 +// Quelle: http://​www.linkerkit.de/​index.php?​title=KY-040_Kodierter_Drehschalter_%28Rotary_Encoder%29
 +// Initialisierung benötigter Variablen
 +int Counter = 0; 
 +boolean Richtung;
 +int Pin_clk_Letzter;  ​
 +int Pin_clk_Aktuell;​
 + 
 +// Definition der Eingangs-Pins
 +int pin_clk = 6;  ​
 +int pin_dt = 5; 
 +int button_pin = 2;
 +  ​
 +  ​
 +void setup() ​
 +
 +   // Eingangs-Pins werden initialisiert...
 +   ​pinMode (pin_clk,​INPUT);​
 +   ​pinMode (pin_dt,​INPUT);​
 +   ​pinMode (button_pin,​INPUT);​
 +    ​
 +   // ...und deren Pull-Up Widerstände aktiviert
 +   ​digitalWrite(pin_clk,​ true);
 +   ​digitalWrite(pin_dt,​ true);
 +   ​digitalWrite(button_pin,​ true);
 +    ​
 +   // Initiales Auslesen des Pin_CLK
 +   ​Pin_clk_Letzter = digitalRead(pin_clk); ​  
 +   ​Serial.begin (38400);
 + ​} ​
 + 
 +// Das Programm überprüft,​ falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden
 +// Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt.
 +// Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen
 +// Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.
 +// Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.
 +// Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position.
 + 
 +void loop()
 +
 +   // Auslesen des aktuellen Statuses  ​
 +   ​Pin_clk_Aktuell = digitalRead(pin_clk);​
 +    ​
 +   // Überprüfung auf Änderung
 +   if (Pin_clk_Aktuell != Pin_clk_Letzter)
 +   ​{ ​
 +          ​
 +        if (digitalRead(pin_dt) != Pin_clk_Aktuell) ​
 +        {  ​
 +            // Pin_CLK hat sich zuerst verändert
 +            Counter ++;
 +            Richtung = true;
 +        } 
 +          ​
 +        else
 +        {       // Andernfalls hat sich Pin_DT zuerst verändert
 +            Richtung = false;
 +            Counter--;
 +        }
 +        Serial.println ("​Drehung erkannt: ");
 +        Serial.print ("​Drehrichtung:​ ");
 +         
 +        if (Richtung)
 +        {
 +           ​Serial.println ("Im Uhrzeigersinn"​);​
 +        }
 +        else
 +        {
 +           ​Serial.println("​Gegen den Uhrzeigersinn"​);​
 +        }
 +         
 +        Serial.print("​Aktuelle Position: ");
 +        Serial.println(Counter);​
 +        Serial.println("​------------------------------"​);​
 +          ​
 +   ​} ​
 +    ​
 +   // Vorbereitung für den nächsten Druchlauf:
 +   // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert
 +   ​Pin_clk_Letzter = Pin_clk_Aktuell;​
 +    ​
 +   // Reset-Funktion um aktuelle Position zu speichern
 +   if (!digitalRead(button_pin) && Counter!=0)
 +     {
 +       ​Counter = 0;
 +       ​Serial.println("​Position resettet"​);​
 +     }
 +      ​
 + ​} ​
 +</​code>​
 +
 +\\
 +Ausgabe:\\
 +<​code>​
 +Drehung erkannt: ​
 +Drehrichtung:​ Gegen den Uhrzeigersinn
 +Aktuelle Position: -1
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Gegen den Uhrzeigersinn
 +Aktuelle Position: -2
 +------------------------------
 +Position resettet
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 1
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 2
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 3
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 4
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Gegen den Uhrzeigersinn
 +Aktuelle Position: 3
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Gegen den Uhrzeigersinn
 +Aktuelle Position: 2
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Gegen den Uhrzeigersinn
 +Aktuelle Position: 1
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Gegen den Uhrzeigersinn
 +Aktuelle Position: 0
 +------------------------------
 +</​code>​
 +
 +\\
 +Diese habe ich nun so angepasst, dass eine volle Umdrehung des Gebers auch die 20 Schritte die er hat, anzeigt:\\
 +\\
 +drehgeber_6.ino\\
 +<​code>​
 +// Initialisierung benötigter Variablen
 +int Counter = 0; 
 +int Counter2 = 0; 
 +boolean Richtung;
 +int Pin_clk_Letzter;  ​
 +int Pin_clk_Aktuell;​
 + 
 +// Definition der Eingangs-Pins
 +int pin_clk = 6;  ​
 +int pin_dt = 5; 
 +int button_pin = 2;
 +  ​
 +  ​
 +void setup() ​
 +
 +   // Eingangs-Pins werden initialisiert...
 +   ​pinMode (pin_clk,​INPUT);​
 +   ​pinMode (pin_dt,​INPUT);​
 +   ​pinMode (button_pin,​INPUT);​
 +    ​
 +   // ...und deren Pull-Up Widerstände aktiviert
 +   ​digitalWrite(pin_clk,​ true);
 +   ​digitalWrite(pin_dt,​ true);
 +   ​digitalWrite(button_pin,​ true);
 +    ​
 +   // Initiales Auslesen des Pin_CLK
 +   ​Pin_clk_Letzter = digitalRead(pin_clk); ​  
 +   ​Serial.begin (38400);
 + ​} ​
 + 
 +// Das Programm überprüft,​ falls eine Änderung der Pin-Zustände sich ereignet hat, welcher der beiden
 +// Pins sich zuerst geändert hatte, was auf die Drehrichtung schließen lässt.
 +// Diese Information erhält man, in dem man einen der beiden Pin-Werte aus einem vorherigen
 +// Durchlauf mit dem Wert des aktuellen Durchlaufs vergleicht.
 +// Nachdem die Richtung festgestellt wurde, werden die Schritte von der Startposition an gezählt und ausgegeben.
 +// Ein Drücken auf den Knopf des Drehgebers resettet die aktuelle Position.
 + 
 +void loop()
 +
 +   // Auslesen des aktuellen Statuses  ​
 +   ​Pin_clk_Aktuell = digitalRead(pin_clk);​
 +    ​
 +   // Überprüfung auf Änderung
 +   if (Pin_clk_Aktuell != Pin_clk_Letzter)
 +   ​{ ​
 +          ​
 +        if (digitalRead(pin_dt) != Pin_clk_Aktuell) ​
 +        {  ​
 +            // Pin_CLK hat sich zuerst verändert
 +            Counter ++;
 +            Richtung = true;
 +        } 
 +          ​
 +        else
 +        {       // Andernfalls hat sich Pin_DT zuerst verändert
 +            Richtung = false;
 +            Counter--;
 +        }
 +        Serial.println ("​Drehung erkannt: ");
 +        Serial.print ("​Drehrichtung:​ ");
 +         
 +        if (Richtung)
 +        {
 +           ​Serial.println ("Im Uhrzeigersinn"​);​
 +        }
 +        else
 +        {
 +           ​Serial.println("​Gegen den Uhrzeigersinn"​);​
 +        }
 +         
 +        Serial.print("​Aktuelle Position: ");
 +        Counter = Counter;
 +        Serial.println(Counter);​
 +
 +        Serial.print("​Wahre aktuelle Position: ");
 +        Counter2 = (Counter/​2);​
 +        Serial.println(Counter2);​
 +
 +        Serial.println("​------------------------------"​);​
 +          ​
 +   ​} ​
 +    ​
 +   // Vorbereitung für den nächsten Druchlauf:
 +   // Der Wert des aktuellen Durchlaufs ist beim nächsten Druchlauf der vorherige Wert
 +   ​Pin_clk_Letzter = Pin_clk_Aktuell;​
 +    ​
 +   // Reset-Funktion um aktuelle Position zu speichern
 +   if (!digitalRead(button_pin) && Counter!=0)
 +     {
 +       ​Counter = 0;
 +       ​Serial.println("​Position resettet"​);​
 +     }
 +      ​
 + ​} ​
 +</​code>​
 +
 +Ausgabe:\\
 +<​code>​
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 18
 +Wahre aktuelle Position: 9
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 19
 +Wahre aktuelle Position: 9
 +------------------------------
 +Drehung erkannt: ​
 +Drehrichtung:​ Im Uhrzeigersinn
 +Aktuelle Position: 20
 +Wahre aktuelle Position: 10
 +------------------------------
 +
 +</​code>​
  
  
Zeile 1041: Zeile 1418:
 https://​www.aeq-web.com/​arduino-blitzdetektor/​\\ https://​www.aeq-web.com/​arduino-blitzdetektor/​\\
 http://​www.elektronik-labor.de/​Arduino/​Rechteck.html\\ http://​www.elektronik-labor.de/​Arduino/​Rechteck.html\\
 +http://​shelvin.de/​rotary-encoder-ky-040-auslesen-und-wert-in-eeprom-ablegen/#​more-2516\\
 +http://​www.linkerkit.de/​index.php?​title=KY-040_Kodierter_Drehschalter_%28Rotary_Encoder%29
 \\ \\
 \\ \\
arduino_einstieg.1529834472.txt.gz · Zuletzt geändert: 24.06.2018 von Frank Hochrath