KY-040 Drehregler (Rotary Encoder) über Sensor Shield

Hi,
ich versuche gerade die ersten Schritte eines Maker-Projekts zum Aufbau einer Uhr aus drehbaren Segmenten. Damit die dazu benötigten Servos anständig ausgerichtet sind sollten sie direkt beim Einbau kalibriert werden.

Der Ersteller des Threads (der aber offenbar aktuell nicht mehr gepflegt wird) beschreibt hierzu folgendes:

  • am Arduino Mega (mit Sensor Shield -> weil später insgesamt 20 solcher Servos mit dem Arduino verbunden werden) an Pin45 den Servo anschließen.
  • Das Drehelement mittels dem KY-040 rotieren und den entsprechenden Wert auf dem Serial Monitor in der Arduino IDE notieren.

Der zugehörige Code lautet:

#define CLK_PIN 2 
#define DT_PIN 3 
#define SW_PIN 4 
#define SERVO_PIN 45 
#include <Servo.h> 

class MyServo: public Servo { 
  public: void moveTo(int pos) { 
    int old_pos = read(); 
    for(int i=0;i<500;i+=20) { 
      write(map(i,0,500,old_pos,pos)); 
      delay(20); 
    } 
    write(pos); 
  }
}; 
  
MyServo servo; 

class RotaryEncoder { 
  const byte pin_clk, pin_dt, pin_sw; 
  int previous_clk; 
  unsigned long servo_ms; 
  int counter=90; 
  public: RotaryEncoder(byte clk_attach_to, byte dt_attach_to, byte sw_attach_to) : pin_clk(clk_attach_to), pin_dt(dt_attach_to), pin_sw(sw_attach_to) {
  } 
   
  void setup() { 
    pinMode(pin_clk,INPUT); 
    pinMode(pin_dt,INPUT); 
    pinMode(pin_sw,INPUT_PULLUP); 
  } 
  
  void loop() { 
    int current_clk = digitalRead(pin_clk); 
    if(current_clk != previous_clk) {
      if(digitalRead(pin_dt) != current_clk) { 
        counter = max(--counter,0); 
      } else { 
        counter = min (++counter,180); 
      } 
      Serial.println(counter); 
      servo.write(counter); 
    } 
    previous_clk = current_clk; 
  } 
}; 

RotaryEncoder rotaryEncoder(CLK_PIN,DT_PIN,SW_PIN); 

void setup() { 
  Serial.begin(9600); 
  servo.attach(SERVO_PIN); 
  rotaryEncoder.setup(); 
  servo.write(90); 
} 

void loop() { 
  rotaryEncoder.loop(); 
}

Mir ist allerdings völlig unklar, wo am shield ich den rotary encoder anstecken soll. die normalen pins sind ja durch das shield belegt. An pin 45 den Servo anzustecken war hingegen kein Problem.

du kannst Beispiel Sketch "Knob" der Bibliothek Servo nutzen, mit Ersatz Encoder durch Poti und ganz ohne Schild. Den aktuellen Winkelwert könntest du mit Serial.print ausgeben.

Ich hoffe damit Deine Frage beantwortet zu haben. :slight_smile:
Auf den SW kannste ggfls. verzichten.

1 Like

Naja, nicht wirklich :slight_smile:

Die Pins gibts beim Shield ja so nicht, ich finde eigentlich nur "dreiadrige" female plugs, an die direkt ein z.B. servo angeschlossen werden kann.

Nehme ich das shield ab, hab ich zwar die ganzen pins ulk, dt, usw. aber dann weiß ich nicht, wie ich den servo an pin 45 (den ich laut Anleitung für mein maker-projekt nutzen soll) mit seinen drei kabeln an einem einzelnen pin anschließen soll.

ich benutze diesen Arduino (Nachbau)
https://de.aliexpress.com/item/1005005850180098.html?spm=a2g0o.order_list.order_list_main.59.21ef5c5f8X3Wev&gatewayAdapt=glo2deu

ich habe dieses shield:

Zeige mall Link zum Shield.
Du bekommst keinen Encoder drauf, wies nicht was Du für einen hast, Fotos oder Link Bitte,.

das shield hab ich von hier https://www.amazon.de/dp/B00QHEND66?psc=1&ref=ppx_yo2ov_dt_b_product_details

wenn der encoder nicht an das shield passt, dann muss er aufs normale board. wie schließe ich dann aber an pin45 für die kalibrierung den servo mit seinen 3 kabeln an?

Die Pins hat doch @my_xy_projekt im Post #3 gezeigt.

nein, die pin45 ist eine einzelne, der servo hat aber 3 Kabel

Jung oder Mädchen

#define CLK_PIN 2 
#define DT_PIN 3 
#define SW_PIN 4 

Was sind das für Nummern ?
Wurde Tippen das die 2 ist die PIN Nummer, die 3 die 4 auch :wink:

die 3 genannten PINs (2,3,4) sind für den rotary encoder (der hat male connectors), pin 45 ist für den servo (der aber wie gesagt 3 Kabel hat), der servo hat female connectors.


Jede 3-er Kombination (Senkrecht im obrigen Foto) sind von oben G-GND, V-Versorgungsspannung und S-Signal. Unter jedem Dreierblock steht eine Nummer des Pins die dem S-Pin entspricht.
image
Die Pins an die Du den Encoder stecken solltest sind die Pins 2, 3 und 4.

Grüße Uwe

1 Like

Herzlichen Dank. Das macht Sinn.
Brauche ich GND und + (zumindest gibt es dafür auf dem encoder auch Beinchen) für den auch?

Du bringst zwei Sachen gehörig durcheinander.
Das kann mehrere Gründe haben, aber hier ist es eindeutig das nicht richtige lesen.

Ich habe Dir in #3 Deine Frage zitiert und dazu die passende Antwort gegeben.
Damit ist der Teil erledigt.

Dein PIN 45 ist der Pin, auf dem die pwm übertragen wird,
Die anderen beiden Pins sind die Versorgung.

Somit braucht dein Servo den Anschluß mit der Nummer 45:
grafik

Wie rum der Stecker da rauf kommt, siehst Du dann auf dem Board am linken Rand.
Da wo GND dran steht, dürfte das Kabel sw sein, wenn es sich an die gängigen Konventionen hält. Die 5V dann rt.

Tut mir Leid, wenn der Eindruck entsteht, dass ich nicht richtig lesen würde. Ich gebe mein bestes und behaupte, es liegt er am mangelnden Verständnis als an einer Leseschwäche :slight_smile:

Wie auch immer, ich habe deshalb nachgefragt, weil die genannten Pins aus Post3 und die aus der als Lösung gekennzeichneten für den Encoder nicht zu funktionieren scheinen. (Ist-Zustand siehe Foto ->


)

Daher hatte ich überlegt, ob es sein kann, dass die beiden aktuell noch nicht belegten Pins am Encoder (beschriftet mit + und gnd) auch irgendwie mit dem board verbunden werden müssten.

Ach - vielleicht ist das Problem auch grundlegender: ich weiß nämlich nicht mal, ob das board ein hochgeladenes Skript automatisch ausführt oder ob man das irgendwie starten muss (und es daran mangelt)

Ein Arduino MEGA 2560 (wie viele andere Modelle) hat kein Betriebsystem und darum wird der geladene Sketch beim Einschalten oder nach RESET nach Arbeitung des Bootloader direkt ausgeführt.

Der Bootloader dient dazu damit mit einem eventuel vorhandenen Programmierer ( = IDE auf dem PC) zu komunizieren, ob ein neuer Sketch hochgeladen werden soll und dann diesen im Flash abzuspeichern. Ist das nicht der Fall wird sofort der im Flash hinterlegte Sketch ausgeführt.

Du brauchst auf dem KY-040 Modul Masse und +5V. Die Masse als Bezugspotential für die Signale ( wie fast immer) und die 5V für die Pullupwiderstände.

Also ohne Masse (GND) und +5V funktioniert das nicht. Die +5V können entfallen wenn Pullupwiderstände hinzugeschaltet werden (Aber wieso 2 Widerstände verbauen wenn sie bereits vorhanden sind. Für den Druckknopf (SW Pin) braucht es einen Pullup Widerstand weil da keiner vorhanden it. Es kann auch der interne verwendet werden.

und ein Manual:
https://forum.arduino.cc/uploads/short-url/gtPxVAxPPxji48Ir8vMAKSVvnhP.pdf

Grüße Uwe

1 Like

Andererseits mein KY-040 (Nachbau) hat drei 10kOhm Widerstände und darum auch auf SW.


Grüße Uwe

bitte verlinke das Projekte damit wir auch sehen was dort beschrieben ist.

https://www.printables.com/de/model/69977-time-twister/comments

Um dieses Uhrenprojekt geht es.

Wenn ich @uwefed richtig verstanden habe soll ich also z.B. vom shield an PIN 2, 3 oder 4 noch den mittleren pin (5V) und den "oberen" (GND) zum encoder führen?

Du sollst Pin 2, 3 UND 4 UND GND UND +5V an das Shield führen!

1 Like

Also so wie hier eingezeichnet?

Rot an den Encoder, grün an den servo.