PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kraft von Servos im Hexabot



Bauteiltöter
03.09.2008, 16:07
Hallo,

ich Plane im moment einen Hexabot mit 12 Servos, also 2 Servos pro Bein.

Jetzt stellt sich mir die Frage, wie fiel kg/cm die Servos haben müssen. Reichen 2kg/cm? Dann gäbe es nämlich grade günstig welche bei Ibä. Ich rechne mit einem gewicht von 3,5-4kg... ist das Realistisch? Der Bot soll aus Plexiglass gebaut werden.

MfG Bauteiltöter

hosti
03.09.2008, 16:17
Hier einmal zwei Links zum schmöckern
https://www.roboternetz.de/wissen/index.php/Spinnenbeine_%28Hexapods%29
https://www.roboternetz.de/wissen/index.php/Technische_Mechanik_%28_Statik_/_Elastomechanik_%29

Ist immer die Frag wie gross die ganze Geschichte werden soll.
Meiner Meinung nach passen 2kg/ch und 3.5-4kg nicht zusammen.
Mein Hexa hat im moment 1.6kg mit 18 Servos, und jeder Servo hat 5.5kg/cm. Und das ist schon nicht wirklich grosszügig dimensioniert.

Ist natürlich auch abhängig von den Hebelwegen(Beinlängen) und der Schrittart.

PS. Plexi ist nicht ideal. Wenns Kunstoff sein soll kannst du dich mal nach Makrolon umsehen.

Bauteiltöter
03.09.2008, 16:27
OK, danke...

Darf ich fragen wie du auf 1,6Kg mit 18Servos komst?!? Selbst wenn ein Servo nur 10g wiegt, währen das schon 1,8kG!

Da muss ich wohl noch Gewicht sparen... aber 6kg/cm... ist das Projekt wohl gestorben... sowas kann eine Schüler-Spardose kaum verkraften :cry:

Und warum geht Plexi nicht? Ich habe hier im Forum schon viele Plexibots gesehen...

Edit: Ich habe grade diesen (http://www.conrad.de/goto.php?artikel=205390) gefunden... er kostet "nur" 15€ un dhat bei 6V 7,8Ncm... geht der?

hosti
03.09.2008, 16:57
Ich würd dir raten erstmals rechnen zu lernen ;)

10g x 18 = 180g
meine Servos wiegen 40g x 18 = 720g.

Klar kannst du Plexi nehmen, wird dir keine verbieten.
Hast du dich mal über Makrolon informiert? (Aus diesem Material sind die meisten Hexas hier und nicht aus Plexi)

Ich kenne das Servo nicht, aber das ding ist echt klein. Ich glaub nicht wirklich an die 7,8Ncm und allgemein würd ich auf ein anderes Produkt setzten.
Ich hab Hitec HS-475 verbaut

Bauteiltöter
03.09.2008, 17:19
Ich würd dir raten erstmals rechnen zu lernen ;)
10g x 18 = 180g
meine Servos wiegen 40g x 18 = 720g.


omg ](*,) Bin ich doooooof.... :-& =;


Ich kenne das Servo nicht, aber das ding ist echt klein. Ich glaub nicht wirklich an die 7,8Ncm und allgemein würd ich auf ein anderes Produkt setzten.

Ich gucke mich nochmal nach anderen um... aber das Teil ist ein Digitalservo... und laut Wiki sind Digitalservos Stärker als Analoge...


Der hauptsächliche Unterschied besteht darin, dass digitale Servos schneller und genauer sind und ihre Position besser halten können. Analoge Servos geben ihrem Motor alle 20ms ein Signal. Wirkt eine Kraft auf das Servo, braucht die Steuerelektronik bis zu 20ms, um dem Motor einen neuen Spannungsimpuls zu senden. Bei Digitalservos sendet die Steuerelektronik alle 400us einen Impuls an den Motor. Der Motor bekommt die Spannungsimpulse viel schneller. Um so öfter ein Motor Spannung bekommt, um so mehr Leistung kann er verrichten.



Klar kannst du Plexi nehmen, wird dir keine verbieten.
Hast du dich mal über Makrolon informiert? (Aus diesem Material sind die meisten Hexas hier und nicht aus Plexi)

Ok, ich werde Makrolon nehmen...

schonmal vielen Dank für deine Hilfe..

MfG

hosti
03.09.2008, 17:24
Einfach mal ein Grundsätzlicher Tipp.

Beschäftige dich erstmal damit wie man ein Servo zum drehen bewegt.
Das ist gar nicht so einfach, beim digitalen noch einmal ein Stück schwerer.

Der Frust wird verdammt gross sein wen du hunderte von Euros ausgegeben hast und das Teil dann nicht zum laufen kriegst.
Als Dekoobjekt ist ein Hexa nicht wirklich geeigent. ;)

Bauteiltöter
03.09.2008, 17:33
Ich weiß, das ein Hexa kein Deko-projekt ist...

Ich weiß auch, wie man einen Servo zum drehen bewegt... ein impuls, 1-2ns Lang, 20ns pause... und so weiter!
Außerdem Progge ich in BASCOM, da ist das gaaaanz einfach, du schreibst einfach
Servo(1)=150 und dan dreht sich der Servo zum rechten Anschlag, bei
Servo(1)=50 zum Linken anschlag \:D/

Und jetzt BITTE nicht auf Bascom schimpfen, da kann man genau so gut mit Proggen, wie mit C oder asm!

cipher
03.09.2008, 17:55
@Bautteillöter: Du meinst hoffentlich "ms" statt "ns". Den Controller möcht ich haben, der im ns-Bereich noch sauber mitkommt. :D

Bauteiltöter
03.09.2008, 17:59
@Bautteillöter: Du meinst hoffentlich "ms" statt "ns". Den Controller möcht ich haben, der im ns-Bereich noch sauber mitkommt. :D

](*,) ](*,) ](*,) nicht schon wieder ein dummer fehler... klar, ns ist ein wenig heftig... :-#

hosti
03.09.2008, 18:39
Ja ich weis das das in Bascom gaaaanz einfach ist.
Aber damit ist es ja noch nicht getan.
Gehen muss er, und da brauchts noch so einiges mehr dazu als einen Servo mal wohin fahren zu lassen.

Ist nur ein gut gemeinter Rat, ist deine Entscheidung und gegen Bascom hat auch keiner was gesagt

Bauteiltöter
03.09.2008, 19:20
und gegen Bascom hat auch keiner was gesagt
Ja, aber das ist (leider) nicht selbstverständlich, BASCOM wird oft als Dreck abgestempelt
Gehen muss er, und da brauchts noch so einiges mehr dazu als einen Servo mal wohin fahren zu lassen.
Ja, danke dass du ich daran erinnert, aber ich traue mir einfache Schrittfolgen durchaus zu.
Für mich der Schwierigste teil wird die Mechanik sein, aber wenn ich die Servos habe, kann ich ja dann auch eine V2 bauen, wo ich von den Fehlern der V1 gelernt habe...

ikarus_177
04.09.2008, 10:14
Hi Bauteiltöter,


Servo(1)=150

hmmm, so die furchtbar elegante Methode ist das nicht, ich hab das bei meinem Hexa mal nur mit einem Bein getestet, das ruckelt "wie Sau", wenn ein Winkel langsam angefahren wird.

Da ist es besser, eine Interrupt-Routine zu erstellen, in der dann der Servo angesteuert wird, das ist dann um Welten besser.

Viele Grüße
ikarus_177

Bauteiltöter
04.09.2008, 15:36
hallo ikarus_177,

Hast du bei

Config Servos = 1 , Servo1 = Portb.0 , Reload = 10
verschiedene Reload-Werte ausprobiert?
Ich werde erstmal einen Servo kaufen und ausprobieren, denn die Bascom-funktion hat den vorteil, das ich für die 12 Servos nur einen ATmegaX verwenden kann, wenn ich das mit Timern u.s.w. machen würde, müsste ich mehrere AtmegaX nehmen, was zwar ansich kein Problem ist, aber wider das Gewicht und die Kosten in die Höhe treiben würde.
(was für ein Satz :-#). Ich wollte eh mehrere ATmegaX nehmen und sie über I2C verbinden...

MfG
Bauteiltoeter

hosti
04.09.2008, 16:03
Wieso sollte das mit einem Atmega nicht machbar sein?
Das geht mit einem genau wie auch mit mehreren.

ikarus_177
04.09.2008, 17:55
Hi,

ne, ich habs immer bei 20 belassen. Wahrscheinlich wirds eh besser bei niedrigeren Werten (sogar ziemlich sicher). Trotzdem verlasse ich mich lieber auf meine "Selbstbau-Routine" ;-)

Viele Grüße
ikarus_177

Bauteiltöter
04.09.2008, 18:15
Hi,


Wieso sollte das mit einem Atmega nicht machbar sein?
Das geht mit einem genau wie auch mit mehreren.

Ich dachte, da prauche ich PWM-Kanäle? Da muss ich mich wohl nochmal schlau machen...

@ikarus_177 ich werde bald mal einen Servo testkaufen, und die BASCOM Routine auf Herz und Nieren Testen :Haue

MfG

ikarus_177
04.09.2008, 18:22
Hi Bauteiltöter,

um keinen Irrtum aufkommen zu lassen: PWM brauchst du nicht bei Servos, sondern bei z.B.: LEDs, die du Dimmen möchtest, Motoren sollen geregelt werden etc.

Servos brauchen (meiner Meinung nach) eine "spezialisierte" Form von PWM. Also ein Impuls von 1,5 - 3 ms Dauer gefolgt von einer Pause von 20 ms. Für einen Motor wäre diese Impulsdauer viel zu gering, um anzulaufen (denke ich jetzt mal).


lg ikarus_177

Bauteiltöter
04.09.2008, 18:44
Hi ikarus_177,

ok, dann müste es ja *theoretisch* so gehen:



Do
waitms 20
Toggle portx.x
Waitms 3
toggle portx.x
Loop


Ich werde aber erstmal die Highlevel-funktion ausprobieren...
Warum einfach wen's auch komplieziert geht?^^

Bluesmash
04.09.2008, 18:50
Hallo!

Ich habe gerade die diskussion gelesen und gebe auch mal meinen Senf dazu:

Ich bin momentan auch am bau eines Hexas und prorammiere mit bascom, die eingebauten servo routinen kanste vergessen wenn du wirklich schöne bewegungen ausführen lassen wilst. um einfach einen servo ein bisschen zu bewegen ist sie absolut geeignet. ich habe sie auch schon benutzt um z.B. einen sensor zu schwenken...
aber für einen hexa ist sie wirklich ungeeignet. deshalb habe ich mir auch selber eine Routine geschrieben mit der "theoretisch" 1800 schritte möglich sind, ob die das servo auch umsetzt ist eine andere sache...

gruss bluesmash

ikarus_177
04.09.2008, 19:00
Hi,

*theoretisch* schon, aber dann hängt der uC ständig in den "wait"-Anweisungen herum, und kommt zu sonst nix ;-).

Ich habs einfach mit einem Interrupt und 16-bit Timer gemacht, was wunderbar funktioniert. Ich bin aber grade dabei, noch zusätzliche Funktionen zu inkludieren, z.B.: ein Power-off für die Servos etc.


Grüße
ikarus_177

Bauteiltöter
04.09.2008, 19:09
Hi,

Ok, die Servoroutine ist schlecht... schade auch

@bluesmash: Kanst du die Routien mal hier posten, als kleiner Denkanstoß?

@ikarus_177: Ja, das war ja auch nur Theoretisch 8) Auch an deiner Routine bin ich interressiert...

Ich möchte sie nicht einfach Abkupfern, sonder als Denkanstoß benutzen... schließlich will ich ja auchnoch was Lernen :wink:

MfG Bauteiltöter

ikarus_177
04.09.2008, 19:14
@Bauteiltöter: ich implementiere noch die Power-off Sequenz (hört sich cool an ;-)), teste sie, und dann kann ich sie von mir aus reinstellen.

lg

Bauteiltöter
04.09.2008, 19:18
Ok, vielen Dank!

Ich werde mich jetzt mal nach einem Kostenlosen CAD-Programm umschauen, und post dann mal Zeichnungen vom Geplanten Bot... oder sollte ich da lieber einen neuen Thread in geplante Projeckte eröffnen?
Oder kann ein Mod den Thread verschieben?

ikarus_177
05.09.2008, 11:08
Hi,

sodana, meine Routine:


$regfile = "m32def.dat" 'verwendeter Chip
$crystal = 16000000 'Taktfrequenz
$hwstack = 32 'HardwareStack
$swstack = 32 'SoftwareStack
$framesize = 64

Config Timer1 = Timer , Prescale = 1
On Timer1 Servo
Enable Timer1
Start Timer1


'-----------------------------------------------------------------------'
'Verwendete Ports: '
'-----------------------------------------------------------------------'

Config Porta.0 = Output
Config Porta.1 = Output
Config Porta.2 = Output

Servo1 Alias Porta.0
Servo2 Alias Porta.1
Servo3 Alias Porta.2


'-----------------------------------------------------------------------'
'Variablendefinition: '
'-----------------------------------------------------------------------'

Dim Servo(6) As Word 'Array der Pulsweiten für Servos
Dim Servo_ein(6) As Byte '1 - Servo eingeschaltet; 0 - Servo ausgeschaltet
Dim I As Byte : I = 0 'Zählvariable
Dim J As Word : J = 1 'Zählvariable
Dim Verzoegerung As Word 'zum Einstellen der Refresh - Rate
Dim Verzoegerungsservo As Byte


'-----------------------------------------------------------------------'
'Hauptprogramm: '
'-----------------------------------------------------------------------'

For J = 1 To 6 'alle Servos inkl. Verzögerunsservos einschalten
Servo_ein(j) = 1
Next

Verzoegerung = 60000

Servo(4) = Verzoegerung 'Verzögerungsservos einstellen
Servo(5) = Verzoegerung
Servo(6) = Verzoegerung


Enable Interrupts 'Servointerrupt aktivieren


Do
For J = 15000 To 35000 Step 10
Servo(1) = J
Servo(2) = J
Servo(3) = J
Waitus 1000
Next

For J = 35000 To 15000 Step -10
Servo(1) = J
Servo(2) = J
Servo(3) = J
Waitus 1000
Next


Loop



'-----------------------------------------------------------------------'
'Funktionen: '
'-----------------------------------------------------------------------'

Servo:

Select Case I
Case 1 : Servo1 = 0
Case 2 : Servo2 = 0
Case 3 : Servo3 = 0
Case 4 : Verzoegerungsservo = 0
Case 5 : Verzoegerungsservo = 0
Case 6 : Verzoegerungsservo = 0
End Select

Incr I

If I = 7 Then
I = 0
End If

If Servo_ein(i) = 1 Then

Select Case I
Case 1 : Servo1 = 1
Case 2 : Servo2 = 1
Case 3 : Servo3 = 1
Case 4 : Verzoegerungsservo = 1
Case 5 : Verzoegerungsservo = 1
Case 6 : Verzoegerungsservo = 1
End Select

End If

Timer1 = 65535 - Servo(i)

Return



ich hab auch ein kurzes Video gemacht:

http://de.youtube.com/watch?v=diCrlAC4-3w

die Routine ist noch nicht das gelbe vom Ei, da es eine maximale Anzahl der Servos gibt, die angesteuert werden können. Wird diese Zahl überschritten, werden die (analogen) Servos kraftlos, da der Impuls nicht mehr alle 20 ms wiederholt werden kann. Da ich aber pro ATMega eh nur 3 Servos ansteuere, reichts für mich.


Viele Grüße
ikarus_177

Bauteiltöter
05.09.2008, 14:17
Hallo ikarus_177,

danke, ich habe die Routine zwar noch nicht ganz verstanden, aber ich habe noch einen Tipp: Du kannst ein wenig Speicher sparen, wenn du
Dim Servo_ein(6) As Byte durch
Dim Servo_ein(6) As bit ersetzt.

Udn warum schreibst du das in einen ATmega32? Der ist da doch unterfordert... oder scheibst du noch anderen Code dazu, z.B. die Algorhythmen (schreibt man das so?) für die vorwertsbewegung? Der Code passt nämlich auch locker in einen ATmega8!

Du kanst mit der Routine maximal 3 Servos ansteuern, oder?

MfG Bauteiltöter

ikarus_177
05.09.2008, 14:26
Hi,

danke für den Tipp! Werde ich gleich mal umsetzen.

Ich verwende deswegen einen Mega32, weil da später noch die ganzen Berechnungen für IK und so dazukommen sollen.

Man kann mehrere Servos auch ansteuern, du musst nur unten die Interruptroutine folgendermaßen umändern:


Servo:

Select Case I
Case 1 : Servo1 = 0
Case 2 : Servo2 = 0
Case 3 : Servo3 = 0
Case 4 : Servo4 = 0
Case 5 : Servo5 = 0
Case 6 : Servo6 = 0
End Select

Incr I

If I = 7 Then
I = 0
End If

If Servo_ein(i) = 1 Then

Select Case I
Case 1 : Servo1 = 1
Case 2 : Servo2 = 1
Case 3 : Servo3 = 1
Case 4 : Servo4 = 1
Case 5 : Servo5 = 1
Case 6 : Servo6 = 1
End Select

End If

Timer1 = 65535 - Servo(i)

Return


Du musst halt dann oben im Deklarationsteil die Ports noch hinzufügen:


config PortX.X = output
Servo4 alias PortX.X
Servo5 alias PortX.X
Servo6 alias PortX.X

Man könnte wahrscheinlich auch noch mehr als die 6 Servos ansteuern, ab einer bestimmten Grenze wird halt dann der Impuls nicht mehr alle 20 ms wiederholt und die Servos werden kraftlos.

Gibt sicher noch eine elegantere Lösung.


Viele Grüße
ikarus_177

Bauteiltöter
05.09.2008, 15:39
Hallo,

ok, dann werde ich das so machen, dass ich 1xAtmega8 für 3 Beine und einmal ATmega 16 für die restlichen 3 Beine und die Berechnung der Schritte nehme.
Die ganzen µCs weden hinterher über I2C verbunden.

Über Atmega16 kann ich eh nicht gehen, da ich den Flash eh nich vollbekomme... ich hab nur die Demo-version... dann muss ich das ganze halt auf mehrere µCs splitten....

Ich habe vor, die Elektonik Steckbar zu machen, d.h. eine Hauptplatine, die die Stromversorgung enthält und dann 10 Steckerleisten drauf, sodass Platinen einfach Senkrecht aufgesteckt werden...

MfG

Bluesmash
05.09.2008, 19:19
so und hier meine routine:



'--------Definitionen für Servo------------
Config Timer1 = Timer , Prescale = 8
On Timer1 Timer1_irq nosave
Enable Timer1

Config Portc.3 = Output
Servo4 Alias Portc.3
Config Portc.1 = Output
Servo5 Alias Portc.1
Config Portc.0 = Output
Servo6 Alias Portc.0
Config Portb.0 = Output
Servo1 Alias Portb.0
Config Portb.1 = Output
Servo2 Alias Portb.1
Config Portb.2 = Output
Servo3 Alias Portb.2

Dim Servo_incr As Byte
Dim Servo_incr2 As Byte
Dim Servo(6) As Word '0-3900
Dim Servo_aus As Bit
Dim Servo_ber As Bit



Timer1_irq:

$asm
push r10
push r11
push r16
push r17
push r20
push r21
push r24
push r25
push r26
push r27
in r24,SREg
push r24
$end Asm


Select Case Servo_incr
Case 0 : Servo1 = 1
Int_daten = 0
Case 1 : Servo1 = 0
Case 2 : Servo2 = 1
Case 3 : Servo2 = 0
Case 4 : Servo3 = 1
Case 5 : Servo3 = 0
Case 6 : Servo4 = 1
Case 7 : Servo4 = 0
Case 8 : Servo5 = 1
Case 9 : Servo5 = 0
Case 10 : Servo6 = 1
Case 11 : Servo6 = 0
End Select

Incr Servo_incr

If Servo_aus = 0 Then
Incr Servo_incr2
Temp_word2 = 1000 + Servo(servo_incr2)
Timer1 = 65535 - Temp_word2
Else
Temp_word2 = 3900 - Servo(servo_incr2)
Timer1 = 65535 - Temp_word2
End If

Toggle Servo_aus

If Servo_incr = 12 Then
Servo_incr = 0
Servo_incr2 = 0
Servo_aus = 0
Timer1 = 65535 - 12000
Int_daten = 1
Servo_ber = 1
End If

$asm
pop r24
Out Sreg , R24
pop r27
pop r26
pop r25
pop r24
pop r21
pop r20
pop r17
pop r16
pop r11
pop r10
$end Asm
Return


dies ist für 6 servos... es würde bis ca. 8 gehen....


gruss bluesmash

Bauteiltöter
05.09.2008, 20:24
Hi,
auch dir vielen dank, ich habe diese Routine auch noch nicht ganz verstanden, werde mir beide aber nochmal genau anschauen.

MfG Bauteiltöter

PS: Ich werde jetzt wahrscheinlich Alu nehmen

hosti
05.09.2008, 20:58
PS: Ich werde jetzt wahrscheinlich Alu nehmen

gute sache =D>

Bauteiltöter
06.09.2008, 12:17
hallo,

ich hab enoch eine Frage:
Digitalservos werden doch genauso angespochen wie normale Servos, oder?
Wenn nicht, werde ich mich nach Analogservos umschauen...

MfG

ikarus_177
06.09.2008, 12:18
Hi,

klar geht das, da gibts in der Ansteuerung keinen Unterschied

Viele Grüße
ikarus_177

Bauteiltöter
06.09.2008, 12:28
hi,



klar geht das, da gibts in der Ansteuerung keinen Unterschied


Genau das wollte ich hören =D>