Werbung
Ich befürchte, Du brauchst noch stärkere Servos. Bin sehr gespannt auf die ersten Ergebnisse.
Alles auf die Waage gepackt und gewogen. Jetzt komm ich auf 2,5kg also rund 0,3kg leichter als bei der ersten Messung. Gut es ist noch nicht alles zusammen gebaut aber ich hab auch alle Schrauben und Muttern mit gewogen.
Berechnung:
2,5kg aufgeteilt auf 4 Beine die immer am Boden sind ergibt 0,6kg (=6N) pro Bein an Gewicht. Der längste Hebelarm beträgt 16cm (Bein voll ausgestreckt) ergibt 16cm * 6N = 96Ncm. Die Servos können 14,2kgcm also rund 142Ncm. Also eine Sicherheit von 1,47. Natürlich wird noch das eine oder andere angebaut werden an den Hexa und damit wird das ganze schwerer werden. Bei einer Sicherheit von 1,2 würde ich also ein Gewicht von 2,95kg nicht überschreiten dürfen.
Alternativ gibt es aber noch die Möglichkeit Teile leichter zu machen oder gar durch CFK zu ersetzen.
@movido warum glaubst du ich brauch noch mehr Kraft in den Servos? Ich fürchte eher, dass die Massenträgheit der Beine zu groß ist.
@HannoHupmann Naja, probier's erst einmal so. Die Trägheit der Beine ist fast egal. Aber bei einem Hexa wirst Du ganz schnell nur noch drei Beine am Boden haben wollen. Und Du hast ja nicht nur statische Belastung, sondern auch dynamische Kräfte. Wenn Du z.B. einen Schritt machst, dann bewegt sich ja der Körper auch auf und ab, wird also vertikal beschleunigt und abgebremst. Das geht natürlich alles auf die Hebel.
Aber wie gesagt. Schau erst mal, wie's klappt. Mit der aktuellen Konfiguration wirst Du schon sehr weit kommen. Für die Schrittfolge wäre eine gute Inverse Kinematik prima, damit die vertikale Bewegung gering bleibt.
Ich drücke die Daumen und danke ganz herzliche für die tolle Beschreibung!
- Matthias
So kleines Update, nachdem ich am Wochenende fleißig war und alle Beine wieder zusammengeschraubt habe, sieht der Hexa jetzt wieder gut aus:
![]()
Neu hinzugekommen sind die Abdeckungen für die LED-Streifen (diese milchigen Streifen auf den Oberschenkeln). Die Kabel im Inneren des Roboters müssen noch sauber verlegt werden, was ich aber erst machen werde, wenn die zweite Platine fertig ist.
Hier noch eine kleine Detailaufnahme von den beiden Beinen:
![]()
Gewogen habe ich den Aufbau noch nicht, das werde ich vermutlich heute oder morgen machen um zu sehen ob es bei den 2,3kg bleibt. Die neuen Servos hören sich sehr viel "leiser" an und sind auch kräftiger, allerdings auch das habe ich noch nicht getestet.
Gestern ist mir noch ein klassischer "Initalisierungs-Bug" aufgefallen, den einige von euch vielleicht auch schon erlebt haben. Die Beine bekommen im Moment alle 90° als Vorgabe - also Mittenstellung. Wird dann die Spannungsversorgung angeschaltet gibt es ein wildes, nicht endenden Zucken und Zappeln. Der Strom geht dabei seh stark hoch. Initialisiert man hingegen nur 4 Beine und hängt die beiden übrigen erst dann an, ist alles ruhig und schön brav und der Ruhestrom beträgt etwa 0,5A
Erst dachte ich, dass mein Netzteil nicht in der Lage ist den hohen Einschaltstrom bereit zu stellen, aber auch mit dem Akku war es nicht möglich alle Servos gleichzeitig zu initialisieren. Entweder muss ich mir in der Schaltung oder in der Programmierung noch etwas überlegen um dieses Anfangsgezappel weg zu bekommen.
PS: Im Fehlschlag der Woche hatte ich geschrieben, dass mir mein Spannungsregler für die 12V Step-Up verschmort ist, aber es war dann doch nur eine kleine 100µH Spule die sich verabschiedet hat.
Der Roboter wiegt nun 2,9kg, gerade nochmal nachgewogen. Ist also ein bischen schwerer geworden, das wundert mich bei den Servos aber nicht. Allerdings trau ich meiner Personenwaage auch nicht ganz über den Weg, die ist nicht kalibriert und mag schon mal messen was sie mag. Ich muss das Ding mal in der Arbeit auf die Digitalwaage stellen.
Heute habe ich den ersten Programmschnipsel für die Beine geschrieben:
Servo - Speed - Control
Da ich mit einem Propellerchip arbeite kann man wunderbar parallele Prozesse laufen lassen. Im nachfolgenden Code ist zu sehen, dass ich einen "Prozessorkern" (Cog) dafür abstelle die Position an den Servo zu übergeben. Dazu greift er kontinuierlich auf die Variable pos zu. D.h. immer wenn sich im Hauptprogramm der Wert von pos ändert, wird dieser Wert automatisch auch an den Servo übertragen. Ganz ohne lästiges übergeben.
Wenn man sich mal reingedacht hat ist die Programmiersprache ganz simpel.Code:CON _CLKMODE = XTAL1 + PLL16X 'Set to ext crystal, 16x PLL, 80MHz Clock _XINFREQ = 5_000_000 'Frequency on XIN pin is 5 MHz VAR LONG high_pulse, low_pulse, periode, speed, pos, vorzeichen, posinit, lastpos, zielpos long stack_c2[55] ' Speicher für den Cog PUB main dira[26]~~ ' Ausgang für LED - Grün zielpos := 1990 ' Zielposition Servo posinit := 950 ' Startposition Servo speed := 1000 ' Geschwindigkeit 0 = schnell, 500 = mittel, 5000 = langsam '------------------------------------------------------------------------------------------------------------------------- '### INITIALPOSITION ANFAHREN ### pos := posinit cognew(moveit, @stack_c2) ' Ab hier arbeitet ein Cog kontinuierlich das moveit programm ab waitcnt(80_000_000 + cnt) ' Anfahren der Initalposition repeat 10 busy_led ' Bestätigen, dass bereit '------------------------------------------------------------------------------------------------------------------------- '### SERVO BEWERGN ### lastpos := posinit pos := lastpos pos #>= 900 ' Untere Servogrenze pos <#= 2000 ' Obere Servogrenze, wenn die Mathe mal versagt if zielpos > lastpos ' Servo-bewegung vorwärts vorzeichen := +1 if zielpos < lastpos ' Servo-bewegung rückwärts vorzeichen := -1 repeat ' Bewegung pos += vorzeichen ' Positionsänderung repeat speed ' Warten until pos == zielpos ' Bis zum Ziel und Schluss '------------------------------------------------------------------------------------------------------------------------- '### PROGRAMM ENDE ### repeat ready_led PRI moveit ' Paralleler Prozess der dauerhaft läuft dira[15]~~ ' Servo Pin D[2] periode := ((clkfreq/1000000)*20000) ' Länge der gesamten Periode berechnen repeat ' Tu das bis du gestoppt wirst - für immer high_pulse := ((clkfreq / 1000000) * pos) ' Immer wenn sich der Wert in der Variablen pos ändert low_pulse := periode - high_pulse ' wird dieser Wert an den Servo geschickt. outa[15]~~ ' Ausgabe des High Pegels waitcnt (cnt += high_pulse) outa[15]~ ' Ausgabe des Low Pegels waitcnt (cnt += low_pulse) PUB busy_led !outa[26] ' Ausgang invertieren waitcnt(3_000_000 + cnt) ' 300ms warten PUB ready_led outa[26]~~ ' LED ON
Als nächstes wird dieser Code nun so erweitert, dass ich ein Bein steuern kann, also 3 Servos mit beliebiger pos und beliebigem speed. Der Programmteil ist wichtig, weil ich den Hexa nicht immer bei voller Geschwindigkeit laufen lassen will, da schwingt alles zu sehr.
So Code erweitert auf 3 Servos damit kann ich dann schon ein Bein steuern mit entsprechender Geschwindkeitsregelung. Irgendwas sagt mir aber langsam schon, dass es diesmal nicht bei 800 Zeilen Code bleiben wird...
Lesezeichen