Diskussion:WS2025 - Sensortechnik - Drehimpulsgeber
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;