PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Roboter hexapod servo ansteuerung



Zwiebel
08.12.2009, 20:32
Hallo,

ich wollt mal fragen wie ihr es realisiert habt eure Servos anzusteuern. ich will kein fertiges board kaufen. ich hab mir gedacht das ich jeweils 2 Beine mit einem mega168 ansteuere... also insgesamt 3 mega168 über slave.
vom mega32 will ich dann alles koordinieren.

ich wollte dafür die PWM Ausgänge benutzen. jetzt die frage... ist das überhaupt richtig so oder einfacher zu realisieren?

mfg Zwiebel :)

SpiekerChris
10.12.2009, 10:41
Du benutzt also den I²C-Bus um die einzellnen µC mit einander zu verbinden. Eine sehr gute Idee!

Der ATMega168 hat 6 PWM-Ausgänge,
der ATMega48 hat auch 6 PWM-Ausgänge und kostet nur 1,50€ bei Pollin.
Du wolltest ja 18 Servos ansteuern, also brauchst du nur 3 Mega48 aber zur besseren Aufteilung würde ich Ihnen 4 Mega48 empfehlen!

SpiekerChris
10.12.2009, 10:47
Kann bitte hier noch jemand etwas schreiben, die arme Zwiebel fängt sonst an zu weinen!

shedepe
10.12.2009, 13:04
eventuell könntest du noch unter fertige projekte dir mal anschauen wie andere die ansteuerung der beine ihres hexapods gelöst haben

robin
10.12.2009, 16:31
HI,

ich hab bei meinem "4-Beiner" alle 12 Servos an einem mega168 @ 20Mhz hängen +4 taster. bei 18 servos wirds allerdings langam eng mit den pins sollte allergins auch noch möglich sein.

Programmiert habe ich das ganze mit assembler und immer 8 Pins/Servos auf einmal geschaltet bei einer auflösung von 8Bit. Nebenbei berechnet der µC auch noch die Winkel der Servos um den hauptcontroller zu entlasten.

Ich weiß nicht wie fit du in assembler bist,, code könnte ich dir auch hier reinstellen, müsste ich dann allerdings etwas überarbeiten.

mfg robin

Zwiebel
10.12.2009, 17:43
@robin ich würde sehr gern dein code überfliegen.

ich frage mich wie du das mit der Ansteuerung realisiert hast. ein mega168 hat doch nur 6pwm Ausgänge. Benutzt du diese?

hast du inverse kinematik verwendet?

mfg zwiebel

robin
10.12.2009, 18:26
Nein ich benutze die PWMs nicht, ist alles über sofware, was ja bei einem servocontroller nicht weiter stören sollte, da er ja nur die servos ansteuert.

Bei mir werden von den 20ms bis zum erneuten senden nur 4ms (2*8 Servos) bei dir wären es dementsprechend 6ms zum ansteuern der Servos verwendet. in der restlichen zeit kann also gerechnet werden was das zeug (der controller) hält.

Somit ist auch inverse kinematik möglich. Persönlich habe ich inverse kinematik verwendet, zwar noch nicht komplett ausgereift, aber in Tests hats schon funktioniert.

Zwiebel
10.12.2009, 19:02
Interessant. ich warte jetzt meine Servolieferung ab und bau mein Hexapod auf... :) dann experementiere ich mit allen Varianten. Ich hab noch ein Jahr luft für mein Abschlussprojekt -.- . Ich werd dann in einem thread die Fortschritte festhalten. da hab ich noch vieeeel vor mir *zitter* :)

mfg zwiebel

SpiekerChris
10.12.2009, 19:16
Hi Zwiebel,
auch dieser Hexapod könnte dich interressieren:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=50027

ansonsten währe der Code von Robin sehr hilfreich, selbst wenn er nicht überarbeitet ist.

Gruß
SpiekerChris

KingTobi
10.12.2009, 19:20
@Zwiebel
Liess dir mal den BEitrag durch: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=14220
Da hat "storchi" ein sehr gutes Beispiel gepostet. Habe des selber schon ausprobiert. Das Prinzip liesse sich auch auf andere Programmiersprachen übertragen.

@SpiekerChris
Spar die mal deine Kommentare, was du da von dir gegeben hast zeigt nur das du auch keine Ahnung hast wovon du redest!

robin
10.12.2009, 19:38
So ich hab jetzt mal den code rausgesucht, aber noch nicht editiert.

Das ganze ist die noch nicht ganz so elegante lösung ohne Timer. Das Programm läuft folgender masen ab:

Ausgabe1:
- an Portb werden alle pins high geschaltet.
- es wird 1ms gewartet (kann auch über timer gemacht werden)
- danach werden die servo werte nacheinander abgeglichen und bei gleichheit der entsprechende pin ausgeschaltet (es wird erster Register "A1" geschrieben und dann am ende eines durchlaufes A1 nach portb geschoben)
- wenn das ganze 255mal durchgelaufen ist, springt er aus dem unterprogramm

bei Ausgabe2 ist es das gleiche nur mit einem anderen port.


;-------------------------------------------------------------------
;UP zur ansteuerung der Servos, wird später durch Interrups ersetzt.
;-------------------------------------------------------------------

Ausgabe1:
clr X1
ser A1
cli
out Portb,A1
ldi R30,low(Servo1)
ldi R31,high(Servo1)
ldd var1,z+3
ldd var2,z+4
ldd var3,z+5
ldi R30,low(Servo2)
ldi R31,high(Servo2)
ldd var4,z+3
ldd var5,z+4
ldd var6,z+5
Servoinit:
ldi B1,250
loop1: ldi B2,6
loop: dec B2
brne loop
dec B1
brne loop1

Se1:
cp X1,var1
brne wait1
subi A1,0b00000001
nop
rjmp Se2
wait1:
nop
nop
nop
Se2:
cp X1,var2
brne wait2
subi A1,0b00000010
nop
rjmp se3
wait2:
nop
nop
nop
Se3:
cp X1,var3
brne wait3
subi A1,0b00000100
nop
rjmp se4
wait3:
nop
nop
nop

Se4:
cp X1,var4
brne wait4
subi A1,0b00001000
nop
rjmp se5
wait4:
nop
nop
nop

Se5:
cp X1,var5
brne wait5
subi A1,0b00010000
nop
rjmp se6
wait5:
nop
nop
nop
Se6:
cp X1,var6
brne wait6
subi A1,0b00100000
nop
rjmp se7
wait6:
nop
nop
nop
Se7:
nop
out portb,A1
nop
ser A2
cp X1,A2
brne se8
sei
ret
se8:
inc X1
rjmp Se1

;================================================= =

Ausgabe2:
clr X1
ser A1
cli
out Portd,A1
ldi R30,low(Servo3)
ldi R31,high(Servo3)
ldd var1,z+3
ldd var2,z+4
ldd var3,z+5
ldi R30,low(Servo4)
ldi R31,high(Servo4)
ldd var4,z+3
ldd var5,z+4
ldd var6,z+5
rjmp Servoinit2
Servoinit2:
ldi B1,250
loop12: ldi B2,6
loop2: dec B2
brne loop2
dec B1
brne loop12


Se12:
cp X1,var1
brne wait12
subi A1,0b00000100
nop
rjmp Se22
wait12:
nop
nop
nop
Se22:
cp X1,var2
brne wait22
subi A1,0b00001000
nop
rjmp se32
wait22:
nop
nop
nop
Se32:
cp X1,var3
brne wait32
subi A1,0b00010000
nop
rjmp se42
wait32:
nop
nop
nop

Se42:
cp X1,var4
brne wait42
subi A1,0b00100000
nop
rjmp se52
wait42:
nop
nop
nop

Se52:
cp X1,var5
brne wait52
subi A1,0b01000000
nop
rjmp se62
wait52:
nop
nop
nop
Se62:
cp X1,var6
brne wait62
subi A1,0b10000000
nop
rjmp se72
wait62:
nop
nop
nop
Se72:
nop
out portd,A1
nop
ser A2
cp X1,A2
brne se82
sei
ret
se82:
inc X1
rjmp Se12



hier noch die variablen:


.def A1 = R16 ;Bearbeitungs Register
.def A2 = R17 ;Bearbeitungs Register
.def B1 = R18 ;Bearbeitungs Register
.def B2 = R19 ;Bearbeitungs Register

.def Heben= R20

.def var1 = R7 ;frei zur verfügung stehende Variablen
.def Var2 = R8 ;frei zur verfügung stehende Variablen
.def Var3 = R21 ;frei zur verfügung stehende Variablen
.def Var4 = R22 ;frei zur verfügung stehende Variablen
.def Var5 = R23 ;frei zur verfügung stehende Variablen
.def Var6 = R24 ;frei zur verfügung stehende Variablen

.DSEG

Servo1: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)

Servo2: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)

Servo3: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)

Servo4: .BYTE 10 ;X,Y,Z,a,ß,y,Werte umdrehen(YY>128,Bein in der Luft,-,-,-,a,ß,y),Abweichung(a,ß,y)

GlVar: .byte 5 ;X,Y,Z,a,Globale Flags(Bein in der Luft, )

.CSEG



eine Initialisierung ist nicht notwendig, es müssen nur die ports als ausgänge geschalten werden.

Der code bietet noch viele möglichkeiten zur optimierung, aber ich denke mal, das er dir schonmal ein wenig weiterhelfen wird.

Es werden auch nur jeweils 6 Servos angesteuert, da ich nicht mehr benötigte ist aber auch auf 8 Servos leicht erweiterbar, muss man nur schaun, dass ein durchlauf nicht länger als 1/255ms ist.[/code]

Zwiebel
10.12.2009, 19:42
Danke für eure hilfe. @spiekerchris danke für den link ;) Ich hab mir schon fast alle Hexapodbeiträge komplett durchgelesen und die guten Links gemerkt *g*. Ich muss jetzt in praktischen Tests eure Ideen aufgreifen und dann werde ich mich hilfesuchend an euch wenden ;).

@Robin dein Quellcode würde mich auf jedenfall interessieren. An irgendwas muss man sich am Anfang halt klammern ;)

mfg zwiebel

*edit*
PS: ah da hast du schneller gepostet:) Super in Assembler wollte ich das auch programmieren. ich werd den code am wochenende bei einer Tasse Milch nachvollziehen -.- vllt find ich ein paar Schwachstellen ;)

High Light
10.12.2009, 20:17
Hallo zusammen,

ich bin auch im Moment damit beschäftigt einen Hexabot
zubauen.
Ich habe für jeden Fuß einen Kontroller und einen als Master
der sagt wo es lang geht. Alles Atmega88.
Kommunikation wird über I2C stattfinden und programmiert
wird er mit Bascom.

Was ich noch dazu sagen muss, habe erst heute meine Paltinen
fertig gelötet, also auch noch nicht viel ausgetestet.
Spannung stimmt und die Grundprogrammierung funktioniert.
I2C habe ich noch nicht getestet.
Aufgebaut wurde alles auf drei Streifenrasterplatinen. (Billiger als welche zuätzen!)

Gruß High Light

Zwiebel
10.12.2009, 20:45
oi aber für jeden Fuss einen Controller find ich zu viel. Ich kann dir gleich sagen Bascom ist zu langsam. Spätestens bei der ik wirst du es merken. Zumindest sagen das die Roboprofis hier. Ich freunde mich lieber glei mit Assembler an. -.-

Bei sovielen Controllern muss sehr viel über I2C kommuniziert werden. Sonst kommen sich deine Füsse in die Quere etc.. Aber du hast dir sicher was dabei gedacht und Erfahrung damit. Der "Marvin" Erbauer hat ja auch so begonnen.
-> http://www.vreal.de
Doch inzwischen verwendet er nur einen controller ;).

Ich bau auch alles auf Lochraster und wenn ich mit dem Ergebniss zufrieden bin wird geätzt und in smd gebaut. Also nie ;) Ich freu mich schon meinem robo ins leben zu rufen und wenn er dann erstmal in die schule geht lol ;).

mfg zwiebel