winkel-mit-encoder
Bauteil: Miuzei Micro Servo 9g · Kategorie: servo
Am Drehknopf (EC11) drehen stellt den Servo-Winkel in 10-Grad-Schritten zwischen 0 und 180 Grad. Knopf A setzt zurueck auf 90 Grad. Verbindet Servo-Ansteuerung und Encoder.
Material
| Anzahl | Bauteil |
|---|---|
| 1 | micro:bit V2.2 |
| 1 | Miuzei Micro Servo 9g (Metallgetriebe) |
| 1 | EC11 Rotary Encoder |
| 1 | Steckbrett |
| ~7 | Jumperkabel |
| — | optional: Batteriefach 3x AA |
Masse fuers CAD: ../../../../hardware/servo/miuzei-9g-servo/
Verkabelung
micro:bit Servo EC11 (nur Drehteil)
+---------+
| P0 |--------- Signal (orange/gelb)
| 3V |--------- + (rot)
| GND |--------- - (braun) --+-- C (COM, Mittelpin)
| | |
| P1 |------------------------------- A (CLK)
| P2 |------------------------------- B (DT)
+---------+
- Interne Pull-ups fuer
P1undP2per Code. Der Taster im Encoder-Knopf wird hier nicht benutzt. - Dreht der Winkel falsch herum ->
P1undP2tauschen. - Stromversorgung: wie bei den anderen Servo-Samples. Bewegt sich der
Servo unter Last oder startet der micro:bit neu -> externe Batteriebox
(3x 1.5 V = 4.5 V):
+an Servo rot,-an Servo braun und an micro:bitGND. Der Encoder-COM bleibt am selbenGND.3Vfrei lassen. Details: Bauteil-README.
Foto der Verkabelung
Nach dem Test ein Foto in wiring/ ablegen und hier einbinden:
Wie der Code funktioniert
- Servo an
P0wie in den anderen Samples (servo_winkel(grad)). - Encoder an
P1/P2: bei einer fallenden Flanke anP1(eine Raste) sagt der Zustand vonP2die Drehrichtung ->grad+/- 10. gradbleibt mitmax(0, min(180, grad))im gueltigen Bereich.- Die LED-Matrix zeigt
grad // 10(0..18) als grobe Anzeige.
Programm
Ganzer Code, Quelle main.py (hier automatisch eingefuegt):
# Sample: winkel-mit-encoder (Miuzei Micro Servo 9g + EC11 Rotary Encoder)
# Board: BBC micro:bit V2.2
# Sprache: MicroPython
#
# Ziel: Am Drehknopf (EC11) drehen stellt den Servo-Winkel in 10-Grad-Schritten
# zwischen 0 und 180 Grad. Knopf A setzt zurueck auf 90 Grad (Mitte).
# Kombiniert das Servo-Ansteuern mit dem Encoder aus code-samples/input.
#
# --------------------------------------------------------------------------
# Verkabelung
# --------------------------------------------------------------------------
# Servo:
# orange/gelb (Signal) -> P0
# rot (+) -> 3V (bei Zittern/Reset: externes 4.5-V-Fach,
# GND gemeinsam)
# braun/schwarz (-) -> GND
#
# EC11 Encoder (nur Drehteil, Taster im Knopf bleibt frei):
# Pin A (CLK) -> P1
# Pin B (DT) -> P2
# Pin C (COM) -> GND (mittlerer Pin der 3er-Seite)
#
# Interne Pull-ups fuer P1 und P2 per Code.
# Dreht der Winkel falsch herum -> P1 und P2 tauschen.
# --------------------------------------------------------------------------
from microbit import *
pin0.set_analog_period(20) # Servo-PWM: 20 ms = 50 Hz
pin1.set_pull(pin1.PULL_UP) # Encoder CLK
pin2.set_pull(pin2.PULL_UP) # Encoder DT
def servo_winkel(grad):
grad = max(0, min(180, grad))
duty = int(26 + grad * (123 - 26) / 180) # ca. 0.5 ms .. 2.4 ms
pin0.write_analog(duty)
grad = 90
servo_winkel(grad)
display.show(str(grad // 10))
letzter_clk = pin1.read_digital()
while True:
# ----- Encoder drehen -> Winkel aendern -----
clk = pin1.read_digital()
if clk != letzter_clk and clk == 0: # fallende Flanke = eine Raste
if pin2.read_digital() == 1:
grad = grad + 10
else:
grad = grad - 10
grad = max(0, min(180, grad))
servo_winkel(grad)
display.show(str(grad // 10)) # 0..18
print("Winkel:", grad)
letzter_clk = clk
# ----- Knopf A -> zurueck auf 90 Grad -----
if button_a.was_pressed():
grad = 90
servo_winkel(grad)
display.show(str(grad // 10))
print("Mitte")
sleep(1)
Auf den micro:bit uebertragen
https://python.microbit.org/v/3 -> Code einfuegen -> Connect -> Send to micro:bit. Details: ../../../../docs/setup.md.
Erwartetes Verhalten
- Drehen im Uhrzeigersinn -> Servo-Winkel groesser, gegen den Uhrzeigersinn -> kleiner
- Knopf A -> Servo springt auf 90 Grad
- Open Serial zeigt
Winkel: ...
Moegliche Erweiterungen
- Encoder-Druck (an
P8o. ae.) nutzen, um Schrittweite umzuschalten - Zwei Servos mit einem Encoder abwechselnd steuern
- Servo dem Zielwinkel weich folgen lassen statt in Spruengen