PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo Programmieren



alex007
14.12.2007, 08:21
hallo zusammen,

ich möchte gerne mit hilfe des rn-mini controll boards, ein servo so programmieren, das es beim setzen von einem eingang am board, eine bestimmte bewegung macht, eine bestimmte zeit stehen bleibt, und dann wieder in die ausgangsposition zurück fährt.

hat da einer ne idee, bzw. etwas quellcode für mich! ich bin noch totaler anfänger im punkto bascom.

danke,

gruss alex

Cairol
20.12.2007, 00:10
Ich würde mir dazu erstmal die Infos in der Wiki zu Gemüte führen: https://www.roboternetz.de/wissen/index.php/Servos

Da ist ein Bespiel wo 2 Servos konfiguriert werden, beide in eine bestimmte Position gefahren werden und dann eine Weile gewartet wird.
Du musst das nur etwas anpassen:
Nur einen Servo einstellen, mit if ... abfragen ob der Eingang gesetzt ist und dann mit "Servo(1) = XXX" den Servo in Position fahren, ein beliebig langes "Wait" einschieben und dann wieder mit Servo(1)... zurückfahren.
Die Werte für die Servo-Position liegen zwischen 0 und 255. Wo dein Servo den linken und rechten Anschlag hat und wo die Mittelstellung liegt musst du ausprobieren. Am besten mal mit Wert "100" anfangen und dann nacheinander die beiden Endanschläge suchen.

Ist keine große Sache wenn du das Beispiel verstanden hast.
In der BASCOM-Hilfe werden alle diese Befehle außerdem ganz gut erklärt.

alex007
20.12.2007, 07:28
hallo cairol,

danke für deine info.

das mit den servo´s habe ich hinbekommen! jetzt hänge ich an der kommunikation zwischen pc - rn-control per rs232.

hast du da auch ne idee? ich möchte mir mein eigenes protokoll entwickeln.

gruss alex

Cairol
21.12.2007, 21:45
Naja, also: "Ich hänge..." ist jetzt nicht so aussagekräftig...
Außerdem ist das Thema ja wieder ne ganz andere Hausnummer.

- Was geht denn schon, und was geht nicht?

- Welches Programm benutzt du für das senden/empfangen von Daten auf dem PC? Ein Terminalprogramm? Oder baust du die ne grafische Oberfläche mit VisualBasic, C++ oder Java?
- Sendest du Bytes, einzelne Character oder ganze Strings?

Zeichen kann man auf dem ATMega mit dem "inkey()"-Befehl von der seriellen Schnittstelle einlesen. (auch hier hilf wieder die BASCOM-Hilfe)
Man macht einfach eine Schleife die mit "inkey()" die Zeichen einliest bis eine '0' empfangen wird. In der Hilfe ist ein Bespiel dazu.

Auf dem PC kommt es eben drauf an mit welchem Programm du senden und empfangen willst. Da kann ich jetzt nix aus der Luft greifen.

Das mit dem "eigenen Protokoll" ist das kleinste Problem. Da du ja auch beliebige Strings senden kannst, sind Befehle wie: "SWITCH_LIGHT_ON", "MOTORSPEED_70", oder was immer dir Freude macht möglich.
Nur ein Tipp falls du die Daten über Funk senden möchtest: Halte die Kommandos so kurz wie möglich. Mit jedem Zeichen steigt die Wahrscheinlichkeit eines Übertragungsfehlers. Das kann bei einem gestörten "MOTOR_STOP"-Kommando böse enden...

alex007
23.12.2007, 10:30
hallo cariol,

danke für deine antwort.

für den pc wollte ich die software labview von national instruments verwenden. damit ist es sehr "einfach" möglich, daten zu senden und zu empfangen über schnittstellen. bis jetzt habe ich noch nichts im punkto kommunikation gemacht. ich werde mir mal die hilfe von bascom reinziehen, und dann melde ich mich nochmal.

danke,

gruss alex

Luca-33
28.12.2007, 15:11
hey, weiß einer zufällig wie die ein- und aus-schaltzeiten von dem Signal für die Servos sein muss??

und wie lass ich den anders herum drehen , was muss ich an den zeiten ändern??

gruß luca

recycle
28.12.2007, 15:15
hey, weiß einer zufällig wie die ein- und aus-schaltzeiten von dem Signal für die Servos sein muss??

und wie lass ich den anders herum drehen , was muss ich an den zeiten ändern??

gruß luca

Klick einfach mal auf: Servo
Dass hier einige Begriffe automatisch in einen Link umgewandelt werden hat schon seinen Sinn.

Luca-33
28.12.2007, 16:48
da muss man mal drauf kommen ...
aber danke hat mir sehr geholfen!!

Bloodyben
24.09.2008, 08:57
Hallo Zusammen,
ich mache mal keinen neuen Thread auf, da der Thread Titel ganz gut passt.

Wenn ich mit servos = .... servos ansteuern will... kommt beim kompilieren unknown interrupt source...

selbst wenn ich das Beispiel aus der Hilfe in ein leeres Programm kopiere und kompilieren will, kommt dieser Fehler.

Hat jemand Abhilfe?



'-----------------------------------------------------------------------
' (c) 2001-2005 MCS Electronics
' servo.bas demonstrates the SERVO option
'-----------------------------------------------------------------------

'Servo's need a pulse in order to operate
'with the config statement CONFIG SERVOS we can specify how many servo's we
'will use and which port pins are used
'A maximum of 16 servos might be used
'The SERVO statements use one byte for an interrupt counter and the TIMER0
'This means that you can not use TIMER0 anymore
'The reload value specifies the interval of the timer in uS
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
$regfile = "2313def.dat"

Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
'as an option you can use TIMER1
'Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10 , Timer = Timer1


'we use 2 servos with 10 uS resolution(steps)

'we must configure the port pins used to act as output
Config Portb = Output

'finally we must turn on the global interrupt
Enable Interrupts

'the servo() array is created automatic. You can used it to set the
'time the servo must be on
Servo(1) = 10 '10 times 10 = 100 uS on
'Servo(2) = 20 '20 times 10 = 200 uS on
Do
Loop

Dim I As Byte
Do
For I = 0 To 100
Servo(1) = I
Waitms 1000
Next

For I = 100 To 0 Step -1
' Servo(1) = I
Waitms 1000
Next
Loop
End

Bloodyben
25.09.2008, 08:36
hier noch ein bild von dem sachverhalt

http://www.bloodyben.de/Unbenannt.jpg[/list]

Sauerbruch
25.09.2008, 08:59
Hmmm....



10 = 200 Us on

...was heißt´n das??

Und warum gibst Du Dir so viel Mühe mit dem Code ab
"Dim I as Byte"
...
...

- da kommt das Programm sowieso niemals hin, weil davor ´ne Do - Loop-Schleife ist...

Außerdem fehlt irgendwo das "enable interrupts".

Bloodyben
25.09.2008, 09:42
sorry war das falsche prog... hatte garnicht richtig geguckt... also das ist jetzt genau das programm aus der hilfe... und wenn ich kompilieren will siehts so aus wie oben... hab das bild ausgetauscht...

Sauerbruch
25.09.2008, 19:21
Eigenartig: Ich hab´s mal genau so abgetippt - und bei mir wird´s anstandslos kompiliert. Ich habe die Version 1.11.8.8. (nicht mehr gaaaanz neu...).

Bloodyben
26.09.2008, 08:14
kannst du mal gucken, ob im programmordner lib irgend ne datei mit servo drin steht?

Sauerbruch
26.09.2008, 08:59
...hab´ ich gemacht - nichts dergleichen. Auch nichts, wass nur annähernd nach Servo klingt :(

BTW: Wenn Du nur 2 Servos ansteuern möchtest - hast Du schon mal über Hardware-PWM nachgedacht? Das ist ultragenau (habe ich schon in Modellflugzeugen angewendet), und es läuft vor allem immer im Hintergrund, ohne den Controller von was anderem abzuhalten...

Bloodyben
26.09.2008, 10:23
wie läuft das denn? ich brauche sogar nur 1 servo.. und da nur 2 positionen... und das auch nicht sonderlich genau ;-)

bin halt noch nicht besonders gut im programmieren und brauche daher immer programm schnipsel die ich mir zusammen setzten und dann nach belieben anpassen kann.

Sauerbruch
26.09.2008, 10:32
Guckst Du hier:
https://www.roboternetz.de/wissen/index.php/Bascom_und_PWM

Besser kann man´s nicht erklärt bekommen - damit hab´s sogar ich verstanden =P~

Zu den Impulsen von (Standard)-Servos muss man eigentlich nur wissen, dass deren Frequenz etwa 30 - 50 Hz betragen sollte (unkritisch), während sich die Impulsdauer etwa zwischen 0,8 und 2,2 ms bewegen sollte. Mit diesem Bereich deckt man den "normalen" Drehbereich eines Servos gut ab.

Bloodyben
26.09.2008, 11:54
Hab ich das richtig verstanden:



$regfile = "m32def.dat"
$crystal = 16000000

Config Portb.1 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1024

Do
Compare1a = 205
Loop

End


müsste jenachdem was man für Compare1a einsetzt, das servo nach rechts oder links ausschlagen lassen? das kann man ja ausprobieren

Also mir ging es um die config zeile... ob die richtig ist... damit kommt man auf 30,51xx Hz

wofür sind die 30 -50 hz entscheidend? wenn man daneben liegt, zuckt das nervo oder macht garnix?

Sauerbruch
26.09.2008, 13:18
Die Config-Zeile scheint mir absolut o.k. zu sein.

Etwa 30Hz sind genau richtig. Davon hängt nur ab, wie oft pro Sekunde das Servo seine aktuelle Stell-Information bekommt. Würde das im Extremfall nur ale 10 Sekunden passieren, wäre die sache halt irre träge. 30 mal in der Sekunde ist absolut gbräuchlich.

Wie weit es sich drehen soll, hängt von der Impulslänge ab, wie gesagt zwischen 0,8 und 2,2ms.

Ich würd´s mal mit Compare1a-Werten zwischen 10 und 20 versuchen. Kann´s jetzt leider nicht genauer erklären, da ich erstmal weg muss.

Viel Erfolg!!

Bloodyben
27.09.2008, 11:03
dankeschön... ich glaub das mit mit dem 10 und 20 hab ich soweit verstanden... bekommt das servo ein impuls von 0.8ms ist es ganz links... und bei etwas 2,2 ganz rechts... und errechnen kann man den wert in dem man die 10 / die bit länge teilt... mein ich zumindest gestern so verstanden zu haben ;-)

Sauerbruch
29.09.2008, 10:25
und errechnen kann man den wert in dem man die 10 / die bit länge teilt...

Fast... das mit dem Berechnen läuft etwa so:

Der Timer läuft ja immer rauf und runter. 0,1,2,...254,255,254,253...2,1,0,1,2,3... usw.
Trifft er beim runterzählen den Compare-Wert wird der Ausgang auf 1 gesetzt, kommt er beim raufzählen wieder dort vorbei wird der Ausgang auf 0 gesetzt ("Clear Up").

Wenn Du also einen High-Impuls von z.B. 1ms haben willst, muss der Compare-Wert so gewählt werden, dass beim Zählen vom Compare-Wert bis 0 und wieder zurück 1ms vergehen.

Bei 16MHz und einem Prescaler von 1024 dauert eine Zähl-Periode 64µs. in 1ms zählt der Zähler also 1000/64, also etwa 16 Schritte weiter. Damit müsste man den Output-Compare-Wert auf 8 setzen. Für 2,2ms auf 17.

Eine feinere Abstufung bekommst Du, wenn Du die Bandbreite de Zählers auf z.B. 10 Bit erhöhst - dann muss allerdings auch der Prescaler um den Faktor 4 verkleinert werden, damit Du wieder bei etwa 30Hz rauskommst.

Bloodyben
29.09.2008, 10:28
danke für die ausfürhliche antwort. werde es, wenn ich am mittwoch wieder zuhause bin, mal ausprobieren (wenn ich Zeit dafür finde ;-) )

melde mich dann ob es geklappt hat...

Bloodyben
01.10.2008, 19:18
so habe es probiert. funktioniert auch.

komisch ist nur, dass das servo bei 238 und bei 254 die vollausschläge hat.

aber naja ... funktioniert. super danke!