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
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?
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
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!
@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...  :-#
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
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
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>
 
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.