Diskussion:WS2025 - Sensortechnik - Drehimpulsgeber

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

KY-040 Drehencoder in Simulink einlesen

Der **KY-040 Drehencoder** kann über **Simulink** und ein **Arduino-Board** eingelesen werden. Der Encoder liefert zwei phasenverschobene digitale Signale (A und B). Diese müssen ausgewertet werden, um die Drehrichtung und Schritte zu bestimmen.

🔧 Hardware-Anschluss

KY-040 Pin Funktion Arduino Pin (Beispiel)
CLK (A) Signal A D2
DT (B) Signal B D3
SW Taster (optional) D4 (optional)
+ 5V 5V
GND Masse GND

---

🧩 Schritt 1 – Simulink Setup

1. Öffne **Simulink → Arduino Support Package**

  (falls noch nicht installiert: über **Add-On Explorer → MATLAB Support Package for Arduino Hardware** installieren)

2. Erstelle ein neues Modell:

  * **Library Browser → Simulink Support Package for Arduino Hardware → Common**
  * Ziehe zwei **Digital Input**-Blöcke für die Pins `D2` und `D3` ins Modell.

---

⚙️ Schritt 2 – Quadraturdekoder aufbauen

Da Simulink kein direktes Quadrature-Encoder-Block für Arduino bietet, muss die Logik manuell erstellt werden:

  • **Zwei Digital Input Blöcke** für `A` und `B`
  • **Detect Change / Edge Detector**, um Flanken zu erkennen
  • **Logic-Blöcke** oder **Compare To Constant**, um die Richtung zu bestimmen:
 * Wenn `A` vor `B` → +1 (im Uhrzeigersinn)
 * Wenn `B` vor `A` → −1 (gegen Uhrzeigersinn)
  • **Integrator (Add Block)**, um die Schritte aufzusummieren

Beispielhafte Logik: if rising_edge(A) if B == 0 → count++ else → count-- end


---

🧮 Schritt 3 – MATLAB Function Block

Füge einen **MATLAB Function Block** hinzu und verbinde ihn mit den beiden Digital-Eingängen:

function count = encoderStep(A, B)
persistent lastA lastB position
if isempty(lastA)
    lastA = 0;
    lastB = 0;
    position = 0;
end

if (A ~= lastA) % Flanke erkannt
    if xor(A, B)
        position = position - 1; % gegen Uhrzeigersinn
    else
        position = position + 1; % im Uhrzeigersinn
    end
end

lastA = A;
lastB = B;
count = position;

Dieser Block gibt den aktuellen Zählwert zurück, der proportional zur Drehung ist.

---

📈 Schritt 4 – Ausgabe / Test

  • Verbinde den Ausgang mit einem **Display**, **Scope** oder **To Workspace**-Block.
  • Aktiviere **External Mode**, um Live-Daten während der Simulation zu sehen.

---

🧠 Test in MATLAB (optional)

Vor dem Einsatz in Simulink kann der Encoder direkt in MATLAB getestet werden:

a = arduino('COM3', 'Uno');
configurePin(a,'D2','DigitalInput');
configurePin(a,'D3','DigitalInput');

while true
    A = readDigitalPin(a,'D2');
    B = readDigitalPin(a,'D3');
    disp([A B])
    pause(0.05)
end

Damit kannst du prüfen, ob die Signale sauber wechseln.

---

💡 Tipp

Der Ausgang des MATLAB Function Blocks kann zur Anzeige oder Speicherung direkt an einen

    • To Workspace**-Block angeschlossen werden.

Damit erhältst du eine fortlaufende Positionsvariable (z. B. in „Schritten“ oder „Klicks“).

function [count, sw_out] = encoderStep(A, B, SW) %#codegen persistent lastA position if isempty(lastA)

   lastA = 0;
   position = 0;

end

if A ~= lastA

   if xor(A, B)
       position = position - 1; % gegen Uhrzeigersinn
   else
       position = position + 1; % im Uhrzeigersinn
   end

end

lastA = A; count = position; sw_out = SW;