Modellbau Servo
Mit Servo meine ich Stellmotoren aus dem Modellbau bereich. Diese gibt es in verschiedenen Ausführungen, und je nach Größe und Qualität (Plastik- oder Metallzahnräder) liegen sie im Preis zwischen 4 Euro und 70 Euro (Conrad Stand 10/2007). Zum Testen habe ich einen Modellbauservo von der Firma Graupner C577 verwendet. So ein Servo hat einen Stellweg von ca. 180 Grad und man kann ihn in Robotern einsetzen, oder zum Drehen einer Web-CAM benutzen.
Der Servo C577 hat ein dreiadriges Anschlusskabel mit Stecker. Dabei ist braun die Masse (0V) in der Mitte rot die Betriebsspannung (4,8V bis 6V) und orange das Kabel für den Steuerimpuls.
Ein normaler Server (kein Digitaler) wird über einen TTL Impuls mit einer Länge von 1ms bis 2ms angesteuert. Dabei ist 1ms der linke Anschlag und 2ms der rechte Anschlag und theoretisch 1,5ms die Mittelstellung. Diese Werte schwanken aber etwas von Servo zu Servo.
Der Impuls muss sich ca. alle 20ms wiederholen. Bei einer Fernsteuerung im Modellbau werden dann mehrere Impulse für
verschiedene Servos nach einander übertragen. Bei einem Abstand von 20ms könnte man theoretisch 10 Impulse unterbringen. Da aber noch eine kleine Pause für die Synchronisation des Ganzen benötigt wird sind bei diesem Verfahren bis zu 9 Kanälen möglich.
Im Empfänger werden dann die Impulse von einem Demultiplexer wieder getrennt und an die einzelnen Servo’s weitergeleitet, so das der Servo selbst nur einen Impuls im Abstand von 20ms erwartet.
Zuerst müssen wir den Servo mal anschliessen. Dazu habe ich das myAVR Board wie auf dem Bild Verdrahted. Die beiden Taster für Links und Rechts habe ich mit den Pin 0 und 1 von Port B verbunden. (blaues und schwarzes Patchkabel)
Die Betriebsspannung für den Servo hole ich mir direkt vom myAVR Board mit dem roten und schwarzen Patchkabel, und das gelbe Patchkabel verbindet die Signalleitung (Impulsleitung) mit dem Pin 0 von Port C. Für die Programmierung ist es nun am Einfachsten die fertigen Befehle (Unterprogramme) von BASCOM zu verwenden.
Servo Steuerung myAVR mit BASCOM Servo-Befehl
Download: myavr-servo-servo.zip
' Taktfrequenz des Quarzes einstellen (3,686411 MHz -> 1 Takt=0,00000027127s=0,27127us) $crystal = 3686411 ' Verwendete CPU festlegen (ATmega8) $regfile = "m8def.dat" ' Pin 0 an Port C als Ausgang für Modellservo Config Portc.0 = Output ' alle Pin's an Port B als Eingang festlegen Config Portb = Input ' Interne Pullup Widerstände setzten für Taster Portb = &H03 Config Servos = 1 , Servo1 = Portc.0 , Reload = 10 Enable Interrupts Dim Winkel As Byte ' Etwa auf Mittelstellung setzen Winkel = 70 Servo(1) = Winkel ' Hauptprogrammschleife Do If Pinb.1 = 0 Then ' ist Schalter an Pin 2 Port D gedrückt If Winkel > 30 Then Decr Winkel Elseif Pinb.0 = 0 Then ' ist Schalter an Pin 3 Port D gedrückt If Winkel < 110 Then Incr Winkel End If Servo(1) = Winkel Waitms 10 Loop End |
Servo Steuerung myAVR mit BASCOM über Timer
Download: myavr-servo-timer.zip
' Taktfrequenz des Quarzes einstellen (3,686411 MHz -> 1 Takt=0,00000027127s=0,27127ys) $crystal = 3686411 ' Verwendete CPU festlegen (ATmega8) $regfile = "m8def.dat" ' alle Pin's an Port C als Ausgang festlegen Config Portc = Output ' alle Pin's an Port B als Eingang festlegen Config Portb = Input ' Interne Pullup Widerstände setzten für Taster Pin 0 & 1 Portb = &H03 ' 65536-56320 = 9216*0.27127us = 2,5ms * 8(Vorteiler) = 20ms Const Reload = 56320 ' 1 Timertakt = 2,17us Config Timer1 = Timer , Prescale = 8 Timer1 = Reload On Timer1 Timer1_isr Enable Timer1 Enable Interrupts Dim Winkel As Word Winkel = 700 ' Hauptprogrammschleife Do If Pinb.1 = 0 Then ' ist Schalter an Pin 2 Port D gedrückt If Winkel > 300 Then Winkel = Winkel - 1 ' 0,65 ms Elseif Pinb.0 = 0 Then ' ist Schalter an Pin 3 Port D gedrückt If Winkel < 1100 Then Winkel = Winkel + 1 ' 2,38 ms End If Waitms 2 Loop End Timer1_isr: If Pinc.0 = 1 Then ' Pause ca. 20 ms Portc.0 = 0 Timer1 = Reload Else ' Impuls 0ms bis 2ms Portc.0 = 1 Timer1 = 65536 - Winkel End If Return |