Neuigkeiten    Das Projekt    Technik    RoboSpatium    Unterstützung    Stichwortverzeichnis    Download    Reaktionen    Spiele    Gadgets    Kontakt   




<<< Digitaler Zollstock         Xylophon >>>

Raspberry PICO Servo

Das Video zum PICO Servo


Über das Pico Servo

Raspbery Pico Servo
Abbildung 1:
Stellmotoren sind sehr nützliche Bauteile in vielen elektromechanischen Projekten und daher existieren auf meinen Seiten schon einige Kapitel zum Thema Servos:
Mit dem in diesem Kapitel behandelten Servo auf Basis des Raspberry Pico möchte ich die Elektronik und Software zur Ansteuerung von Eigenbau-Servos etwas detaillierter behandeln. Das PICO Servo ist von der mechanischen Konzeption nicht auf Leistung und hohes Drehmoment getrimmt, sondern von der Bauweise hauptsächlich an konventionelle RC-Servos angelehnt. Nichtsdestotrotz ist ein recht starkes und durchaus nutzbares Servo entstanden, das mit dem von RC Servos bekannten Pulsweitensignal angesteuert werden kann. Selbstverständlich kann auch die am Raspberry Pico verbaute USB-Schnittstelle zur Datenübertragung genutzt werden. Denkbar sind auch I2C oder SPI oder was immer ihr benötigt und der Raspberry Pico liefern kann.

Teileliste

Durch den Kauf von Bauteilen über die von mir angegebenen Affiliate-Partnerlinks in der Tabelle (oder in den Bannern auf meinen Seiten) unterstützt ihr meine Projekte ohne dass euch dadurch Zusatzkosten entstehen - vielen Dank!
Die Links anzuklicken bedeutet allerdings keinen Kaufzwang - völlig ungezwungenes Stöbern ist möglich ;-)

Meine frei zugängliche Bildungsplattform ohne einzukaufen mit Hilfe einer Spende oder als Patreon zu unterstützen geht natürlich auch. Vielen Dank an alle, die mir bereits einen Obolus haben zukommen lassen!



Bauteil Stückzahl Bezugsquelle Bemerkung
Raspberry Pico 1 Berrybase.de
Keiner meiner Affiliate Partner, aber gute Bezugsquelle
Gleichstrommotor 1 RS-Components Antrieb
H-Brücke BTS7960 1 eBay.de
Amazon.de
Motortreiber
0.96 Zoll OLED 1 ebay.de
Amazon.de
Bildschirm für mehr Bedienkomfort
Hallsensor Typ AH3503 3 ebay.de
Amazon.de
Sensoren
Magnete 5x20x2mm 4 ebay.de
Amazon.de
Sensoren
Dupont-Kabel, weiblich, 20cm viele ebay.de
Amazon.de
Verkabelung
5V Step-Down-Konverter 4 ebay.de
Amazon.de
Versorgungsspannung Pico, mit USB Buchse für mehr Bedienkomfort.
Zenerdiode 3V 4 ebay.de
Amazon.de
Schutz vor Überspannung am Pico
Widerstände 3kΩ 4 ebay.de
Amazon.de
Schutz vor Überspannung am Pico
Diode 6A10G 1 ebay.de
Amazon.de
Verpolungsschutz, 6A oder mehr
PLA 1 Geekbuying.com
Gearbest.com
ebay.de
Amazon.de
Mechanik, PET-G oder andere Materialien passen auch
Alurohr 6mm 1 Baumarkt Wellen für Getriebe, 6mm Stahl oder M6er Gewindestangen gehen auch.
1x 42mm lang, 1x 64mm lang.
Kugellager 609 2 eBay.de Welle Getriebeausgang, Abmessungen 8x22x7mm
Gewindestange M8, 100mm 1 Baumarkt Welle Getriebeausgang
Gewindestange M5, 175mm 8 Baumarkt Verschraubung Gehäuse
Gewindestange M3, 1m 1 Baumarkt Verschraubung Pico-Halterung
Schrauben M5*16 4 Baumarkt Verschraubung Motor
Schraube M3*20 1 Baumarkt Verschraubung Ritzel am Motor
Muttern M3 viele Baumarkt Verschraubung Gehäuse
Muttern M5 viele Baumarkt Verschraubung Gehäuse
Muttern M8 5 Baumarkt Verschraubung Servohebel und Hauptzahnrad
Unterlegscheiben 8mm Bohrung 8 Baumarkt Verschraubung Servohebel und Hauptzahnrad
Blech- oder Holzschrauben 2x20mm 8 Baumarkt Verschraubung Pico und OLED

Mechanik

Raspbery Pico Servo, gedruckte Teile
Abbildung 2:
Fast alle mechanischen Komponenten sind aus PLA mit einem 3D-Drucker erstellt worden.

Raspbery Pico Servo, sonstige Kleinteile
Abbildung 3:
Benötigt werden ferner Schrauben, Unterlegscheiben, Gewindestangen, zwei Kugellager und sonstige Kleinteile.
Die Achsen für das Getriebe besitzen einen Durchmesser con 6mm. Ich habe Aluröhrchen verwendet, weil ich diese in meinem Vorrat hatte.

Raspbery Pico Servo, Getriebe
Abbildung 4:
Von den Zahnrädern des Getriebes habe ich zwei Varianten erstellt:
Die erste Version hatte eine Untersetzung von 355:1 mit sehr hohem Drehmoment, war allerdings deutlich zu langsam, daher habe ich zwei der Zahnräder geändert, womit sich eine Gesamtuntersetzung von 177:1 ergibt, bei welcher sich der Hebel am Getriebeausgang mit etwa der dreifachen Geschwindigkeit dreht.

Raspbery Pico Servo, Unterseite
Abbildung 5:
Im uneren Bereich befinden sich die elektronischen Komponenten.

Elektronik

Raspbery Pico Servo, elektronische Komponenten
Abbildung 6:
Den Motor hatte ich vor Jahren von RS-Components geschenkt bekommen, aber bislang nicht eingesetzt - manchmal braucht ein Projekt einfach etwas länger zum Reifen. Die elektrische Eingangsleistung wird über eine H-Brücke Typ BTS7960 zugeführt. Die Steuerung übernimmt der bereits angesprochene Raspberry Pico Mikrocontroller. Der 12V Antrieb liefert bis zu 36W Leistung. Für ein wenig mehr Bedienkomfort habe ich ein 0.96 Zoll OLED Display angeschlossen.

Raspbery Pico Servo, Hallsensoren
Abbildung 7:
Damit der Pico seine Umgebung wahrnehmen kann, kommen 3 Hallsensoren Typ AH3503 zum Einsatz. Diese Sensoren liefern ein Ausgangssignal, das analog zur Stärke und Richtung der sie durchdringenden magnetischen Flussdichte ist.

Raspbery Pico Servo, Sensorscheibe
Abbildung 8:
Direkt an der Motorwelle ist eine Sensorscheibe mit 3 Magneten angebracht. Diese Scheibe wird von 2 Hallsensoren abgetastet - warum 2 Sensoren benötigt werden, um die Drehung zu erfassen, habe ich in einem vorangegangenen Kapitel ausführlich beschrieben.

Raspbery Pico Servo, Spannungsteiler Hallsensor
Abbildung 9:
Der Raspberry Pico arbeitet mit einer logischen Spannung von maximal 3.3V. Ein Spannungsteiler aus einem 3 Kiloohm Widerstand und einer 3V Zenerdiode verhindert, dass die Logikspannung am Pin des Pico überschritten wird.
Ohne Magnet gibt der entsprechende Pin eine logische "1" zurück, in Anwesenheit eines Magneten mit dem Südpol in Richtung des Hallsensors wird eine logische "0" zurückgegeben.

Raspbery Pico Servo, Schaltplan
Abbildung 10:
Schaltplan

Scheibenwischermotor als Servo

Raspbery Pico Servo aus Scheibenwischermotor
Abbildung 11:
Und wer keinen 3D-Drucker besitzt, kann auch einen Scheibenwischermotor entsprechend modifizieren. Zusammen mit dem OLED Bildschirm werden die selben Pins am Pico verwendet, lediglich ein paar Parameter in der Software müssen angepasst werden.

Raspbery Pico Servo, Sensorscheibe an Scheibenwischermotor
Abbildung 12:
Bei dem hier genutzten Exemplar von Mercedes (Typ SWF 4195B) ragt die Motorwelle am hinteren Ende so weit heraus, dass ich die Kappe am Gehäuse abschneiden und daran eine Sensorscheibe aus Blech ankleben konnte. Diese Scheibe wird über Lichtschranken abgetastet.

Raspbery Pico Servo, Endschalter
Abbildung 13:
Die Untersetzung des Schneckengetriebes beträgt 72:1. Der Endschalter für den Servohebel besteht ebenfalls aus einer Lichtschranke.

Software

Eine Besonderheit des Raspberry Pico ist die Möglichkeit, kleine Programme in einer Extra-Hardware des Chips völlig unabhängig vom Hauptprogramm laufen zu lassen. Somit kommt es zu keinen Unterbrechungen durch die Hauptroutine und die Verarbeitung der Signale an den Pins erfolgt extrem schnell. Diese Eigenschaft nutze ich zum schnellen Abarbeiten der Eingangssignale, sowohl an der Sensorscheibe, als auch zum Einlesen des PWM-Signals an einem weiteren Pin. Der Befehlssatz dieser Mini-Programme ist allerdings sehr begrentzt und die Anzahl der Befehle pro Programm auf 32 begrenzt (Sprungmarken zählen nicht als Befehlszeile).
Das Auslesen der Sensorscheibe am Motor erfolgt mit Hilfe der ersten, sogenannten State Machine:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Definition of first "State Machine"  
# that checks the pins of the rotary sensor disc  
 
@asm_pio(autopush=True, push_thresh=32)  
def encoder():  
    label("start")  
    set(x, 0)  
 
    label("loop_high")  
    wait(1, pin, 0)         # Wait until in_base pin goes HIGH  
    jmp(pin, "CW_1")        # if jmp_pin is low CW rotation  
    jmp(x_dec, "CCW_1")     # if not, CCW rotation, Decrement X  
    label("CCW_1")  
    jmp("loop_low")         # jump to "wait for loop going low"  
    label("CW_1")           # CW rotation  
    mov(y, invert(x))       # Increment X  
    jmp(y_dec, "CW_1a")  
    label("CW_1a")  
    mov(x, invert(y))  
 
 
    label("loop_low")  
    wait(0, pin, 0)         # Wait until in_base pin goes LOW  
    jmp(pin, "CCW_2")       # if jmp_pin is low CCW rotation  
    mov(y, invert(x))       # if not, CW rotation Increment X  
    jmp(y_dec, "CW_2")  
    label("CW_2")  
    mov(x, invert(y))  
    jmp("loop_high")  
    label("CCW_2")          # CCW rotation detected  
    jmp(x_dec, "loop_high") # Decrement X  
    jmp("loop_high")  
 
    wrap()  
 
sm1 = StateMachine(1, encoder, freq=125_000_000, in_base=Pin(HALL_1_PIN), jmp_pin=Pin(HALL_2_PIN))  
sm1.active(1) # Start the mini program  
    

Mit diesem Programm werden pro Zahn (Magnet) an der Sensorscheibe lediglich 2 der 4 möglichen Zustände erfasst, was den begrenzten Möglichkeiten der State Machines geschuldet ist - ich habe es nicht geschafft, alle 4 Zustände in 32 Befehlszeilen unterzubringen. Im Hauptprogramm wird die hier ermittelte Pulszahl mit 2 multipliziert. Ferner wird der Ist-Zustand der beiden Sensoren eingelesen, so dass auch die Zwischenstände errechnet werden können (allerdings nicht mit der hohen Geschwindigkeit einer State Machine).

Das Einlesen des Pulsweitensignals zum Ansteuern des Servos erfolgt mit der zweiten State Machine:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# Definition of second "State Machine"  
# that checks for incoming servo control PWM signal  
# Note that in_base pin must be identical to jmp_pin !!!  
 
@asm_pio(autopush=True, push_thresh=32)  
def servo_PWM_read():  
    label("start")  
    set(x, 0)  
 
    label("loop")  
    set(y, 0)  
    mov(y, invert(y))  
    wait(1, pin, 0)         # Wait until in_base pin goes HIGH  
    label("still_high")  
    jmp(y_dec, "plus_1")    # Pin went from LOW to HIGH, start countdown  
    label("plus_1")  
    jmp(pin, "still_high")  # if jmp_pin still high, continue counting  
    mov(y, invert(y))       # Pin went to LOW, no more counting  
    mov(x, y)               # Store number of counted loops in X  
    jmp("loop")  
 
    wrap()  
 
sm2 = StateMachine(2, servo_PWM_read, freq=125_000_000, in_base=Pin(PWM_READ), jmp_pin=Pin(PWM_READ))  
sm2.active(1) # Start the mini program  
    

Den kompletten Quellcode in Micropython gibt's im Download-Paket (siehe unten).


Download

Das Download-Paket (7.2MB) umfasst die Software, den Schaltplan, sowie die 3D-Dateien zum Druck der Bauteile.


<<< Digitaler Zollstock         Xylophon >>>


Neuigkeiten    Das Projekt    Technik    RoboSpatium    Unterstützung    Stichwortverzeichnis    Archiv    Download    Reaktionen    Spiele    Verweise    Gadgets    Kontakt    Impressum   





Twitter YouTube Hackaday Patreon TPO