Servo

apfelwolle

Neues Mitglied
13. Sep. 2009
54
0
0
Rheinhessen
Sprachen
So, bevor ich an die Sache mit dem Schrittmotor gehe befasse ich mich noch mit dem Thema Servo.

Ziel ist es zwei Servos mittels je zwei Taster zu bewegen. Dazu sollen dann später noch eine Lageanzeige mittels Display und Speicherfunktion für Positionen kommen das aber erst später.

Ich habe mir nun mal was auf meinem MyAVR Board aufgebaut und in Bascom programmiert:

Code:
'Prozessor einstellungen
$regfile = "m8def.dat"
$crystal = 8000000

'Ausgänge konfigurieren
Config Portc.1 = Output
Config Portc.1 = Output

'Eingänge konfigurieren
Config Portd.0 = Input
Config Portd.1 = Input
Portd.0 = 1
Portd.1 = 1
Tast0 Alias Pind.0
Tast1 Alias Pind.1

'Servo Ausgänge zuweisen
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Enable Interrupts

'Parameter setzten
Const Start_pan = 50
Const End_pan = 150
Dim Pan_neu As Byte
Dim Pan As Byte

Servo(1) = Start_pan
Pan = Start_pan

Do

Pan = Pan_neu

If Tast1 = 0 Then
Pan_neu = Pan + 1
End If
If Pan_neu > 149 Then
Pan_neu = 149
End If
If Pan_neu < 50 Then
Pan_neu = 50
End If
Servo(1) = Pan_neu
Waitms 10

Pan = Pan_neu

If Tast0 = 0 Then
Pan_neu = Start_pan - 1
End If
If Pan_neu > 149 Then
Pan_neu = 150
End If
If Pan_neu < 50 Then
Pan_neu = 50
End If
Servo(1) = Pan_neu
Waitms 10

Pan = Pan_neu

Loop
End

Die + Verstellung läuft auch schon sehr gut! Aber beim - springt der Servo auf "Start_pan". Da springe ich wohl falsch im Programm oder ich schreibe "Pan_neu" an der falschen Stelle oder wo ist das Problem?

Danke für die Hilfe!
 
So läuft es nun:

Code:
'Prozessor einstellungen
$regfile = "m8def.dat"
$crystal = 8000000

'Ausgänge konfigurieren
Config Portc.0 = Output
Config Portc.1 = Output

'Eingänge konfigurieren
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
Tast0 Alias Pind.0
Tast1 Alias Pind.1
Tast2 Alias Pind.2

'Servo Ausgänge zuweisen
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Enable Interrupts

'Parameter setzten
Const Start_pan = 20
Const End_pan = 140
Const Mitte = 80
Dim Pan_neu As Byte
Dim Pan As Byte

Servo(1) = Mitte
Pan = Mitte

Do

If Tast1 = 0 Then
Pan_neu = Pan + 1
End If
If Pan_neu >= End_pan Then
Pan_neu = End_pan
End If
If Pan_neu <= Start_pan Then
Pan_neu = Start_pan
End If
Servo(1) = Pan_neu
Waitms 5


If Tast0 = 0 Then
Pan_neu = Pan - 1
End If
If Pan_neu >= End_pan Then
Pan_neu = End_pan
End If
If Pan_neu <= Start_pan Then
Pan_neu = Start_pan
End If
Servo(1) = Pan_neu
Waitms 5

If Tast2 = 0 Then
Pan_neu = 70
End If

Pan = Pan_neu

Loop
End

Taster für die Mittelstellung geht auch nun folgt der Positionsspeicher...
Schaltpaln sollte ich auch noch zeichnen...
Ja das geht alles noch schöner zur programmieren aber so habe ich den besseren Überblick
 
Nun aber Schlag auf Schlag. Der Speicher geht auch:D

Code:
'Prozessor einstellungen
$regfile = "m8def.dat"
$crystal = 8000000

'Ausgänge konfigurieren
Config Portc.0 = Output
Config Portc.1 = Output

'Eingänge konfigurieren
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1

Tast0 Alias Pind.0
Tast1 Alias Pind.1
Tast2 Alias Pind.2
Tast3 Alias Pind.3
Tast4 Alias Pind.4

'Servo Ausgänge zuweisen
Config Servos = 1 , Servo1 = Portc.0 , Reload = 10
Enable Interrupts

'Parameter setzten
Const Start_pan = 20
Const End_pan = 140
Const Mitte = 80
Dim Pan_neu As Byte
Dim Pan As Byte

Servo(1) = Mitte
Pan = Mitte

Do

If Tast1 = 0 Then
Pan_neu = Pan + 1
End If
If Pan_neu >= End_pan Then
Pan_neu = End_pan
End If
If Pan_neu <= Start_pan Then
Pan_neu = Start_pan
End If
Servo(1) = Pan_neu
Waitms 5


If Tast0 = 0 Then
Pan_neu = Pan - 1
End If
If Pan_neu >= End_pan Then
Pan_neu = End_pan
End If
If Pan_neu <= Start_pan Then
Pan_neu = Start_pan
End If
Servo(1) = Pan_neu
Waitms 5

If Tast2 = 0 Then
Pan_neu = 70
End If

If Tast3 = 0 Then
Writeeeprom Pan_neu , 4
End If

If Tast4 = 0 Then
Readeeprom Pan_neu , 4
Servo(1) = Pan_neu
End If

Pan = Pan_neu

Loop
End

So! nun den zweiten Servo in das Programm einbauen.
 
So das Ganze mit zwei Servos:
Code:
'Prozessor einstellungen
$regfile = "m8def.dat"
$crystal = 8000000

'Ausgänge konfigurieren
Config Portc.0 = Output
Config Portc.1 = Output

'Eingänge konfigurieren
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Input
Config Portd.6 = Input

Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
Portd.5 = 1
Portd.6 = 1

Tast0 Alias Pind.0
Tast1 Alias Pind.1
Tast2 Alias Pind.2
Tast3 Alias Pind.3
Tast4 Alias Pind.4
Tast5 Alias Pind.5
Tast6 Alias Pind.6


'Servo Ausgänge zuweisen

Config Servos = 2 , Servo1 = Portc.0 , Servo2 = Portc.1 , Reload = 10
Enable Interrupts

'Parameter setzten
Const Start_pan = 20
Const Start_tilt = 20
Const End_pan = 140
Const End_tilt = 140
Const Pan_mitte = 80
Const Tilt_mitte = 80

Dim Pan_neu As Byte
Dim Tilt_neu As Byte
Dim Pan As Byte
Dim Tilt As Byte

Pan = Pan_mitte
Tilt = Tilt_mitte

Servo(1) = Pan
Servo(2) = Tilt

Do
If Tast1 = 0 Then
Pan_neu = Pan + 1
End If
If Pan_neu >= End_pan Then
Pan_neu = End_pan
End If
If Pan_neu <= Start_pan Then
Pan_neu = Start_pan
End If
Servo(1) = Pan_neu
Waitms 5

If Tast0 = 0 Then
Pan_neu = Pan - 1
End If
If Pan_neu >= End_pan Then
Pan_neu = End_pan
End If
If Pan_neu <= Start_pan Then
Pan_neu = Start_pan
End If
Servo(1) = Pan_neu
Waitms 5

If Tast5 = 0 Then
Tilt_neu = Tilt + 1
End If
If Tilt_neu >= End_tilt Then
Tilt_neu = End_tilt
End If
If Tilt_neu <= Start_tilt Then
Tilt_neu = Start_tilt
End If
Servo(2) = Tilt_neu
Waitms 5

If Tast6 = 0 Then
Tilt_neu = Tilt - 1
End If
If Tilt_neu >= End_tilt Then
Tilt_neu = End_tilt
End If
If Tilt_neu <= Start_tilt Then
Tilt_neu = Start_tilt
End If
Servo(2) = Tilt_neu
Waitms 5

If Tast2 = 0 Then
Pan_neu = Pan_mitte
Tilt_neu = Tilt_mitte
Servo(1) = Pan_neu
Servo(2) = Tilt_neu
End If

If Tast3 = 0 Then
Writeeeprom Pan_neu , 4
Writeeeprom Tilt_neu , 5
End If

If Tast4 = 0 Then
Readeeprom Pan_neu , 4
Readeeprom Tilt_neu , 5
Servo(1) = Pan_neu
Servo(2) = Tilt_neu
End If

Pan = Pan_neu
Tilt = Tilt_neu

Loop
End
Sicher könnte ich bei den Konstanten und Parametern etwas sparsamer arbeiten. Aber so kann ich in der Grundeinstellung mit verschiedenen Werten arbeiten. Das Vereinfachen der Ein- und Ausgänge kommt zum Schluß so ist für mich alles noch etwas übersichtlicher. So finde ich können auch andere alles recht einfach nachvollziehen.
Nächster Schritt ist das DisplaY.
Ach und das lästige Zeichnen des Schaltplans auch noch...
 
Hi, apfelwolle
sehe ich das richtig, dass du in der do-loop-Schleife permanent Daten
(Werte Pan und Tilt) ins EEPROM schreibst und ausliest:confused: ?
Ein Blick ins Datenblatt verrät, das der Mega8 das so ca. 100.000 mal
mitmacht, ab dann übernimmt Atmel keine Garantie mehr das die Daten
noch korrekt geschrieben/gelesen werden können. :eek:
Will heissen: die Funktion im Programm wird nur ne gewisse Zeit gehen,
dannach Hasta la vista, Baby:( . Vielleicht irre ich mich, aber dafür
wär wohl das RAM besser geeignet. Und wenn man eine permanente
Datenhaltung (zB. für Stromausfälle o.ä.) braucht, müsste man beispiels-
weise mit 'nem zweiten Atmega über ADC die Betriebsspannung überwachen
und bei Abfall (definierter Mindestpegel) dann die Daten ins EEPROM retten.
Dieser Vorgang sollte dann aber wenigstens durch ein Goldcap gestützt werden, denk ich mal :rolleyes: .
Dann lebt das (oder der?:confused:) EEPROM bestimmt a bissle länger :pleasantry:.

Grüssle
Wolfgang
 
Hallo Wolfgang,
vielen Dank für den Hinweis. Ich dachte der schreibt nur wenn ich auf den Taster drücke!? So hätte ich die Daten auch bei einem Spannungsverlust.

Gut, das lässt sich je recht einfach ändern.

Danke und viele Grüße

auch Wolfgang :)
 
Hi
In den EEProm gehören Daten, die bspw. vom PC an Parametern für ein Programm übergeben werden. Wenn du da konst. Werte aus dem Programmspeicher nehmen würdest, müßtest du bei einer Änderung jedesmal den Flash neu beschreiben. Natürlich kann man, wie Darkstar geschrieben, auch wichtige Daten bei einem Spannungseinbruch dort speichern. Aber du brauchst keinen extra-µC, der Atmega8 schafft das auch. Mußt halt ein Portbit opfern. Dann legst du von der nicht geregelten Versorgungsspannung einen Spannungsteiler, der so bemessen ist, das die Spannung etwas kleiner als die Versorgungsspannung ist. Siehe Skizze.
Große Kondensatoren auf Controllerseite halten bei Sannungsausfall die paar ms die Spannung oder setz Akkus ein.
Gruß oldmax
 

Anhänge

  • Spannung.JPG
    Spannung.JPG
    10 KB · Aufrufe: 28

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)