PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Deltawalker: 3D-Modell



radbruch
19.01.2011, 01:30
Hallo

Ohne CAD muss ich meine Ideen immer noch real umsetzen und testen:

http://radbruch.bplaced.net/cat/deltawalker1_klein.jpg (http://radbruch.bplaced.net/cat/deltawalker1.jpg)

Echtes 3D sieht bei mir dann so aus:

http://i4.ytimg.com/vi/sBgtgO6mCnY/2.jpg (http://www.youtube.com/watch?v=sBgtgO6mCnY)
http://www.youtube.com/watch?v=sBgtgO6mCnY

Das sollte eigentlich nur eine schlanke Servoansteuerung werden, hat sich dann aber irgendwie verselbstständigt. Ich zeig's euch mal, weil's mir selbst echt gut gefällt ;)

Gruß

mic

Searcher
19.01.2011, 08:11
Hallo radbruch,

Interessant. Was mir als erstes dabei einfiel war: 3D Modell in 1D Bewegung weil ich im Video keine Fortbewegung erkennen konnte.

Setzt Du auf die Biegsamkeit der blauen Stützen oder sind da doch noch irgendwo Gelenke drin?

Gibt es weitere Pläne damit?

Gruß
Searcher

radbruch
19.01.2011, 10:42
Hallo

"Fortbewegung" ist noch nicht möglich, da bin ich in der ersten Euphorie mit dem Threadtitel etwas über die Realität hinausgeschossen:)

Die Frage die hinter diesem Funktionsmodell steckt: Könnte ein Roboter mit nur zwei solchen "Beinen" laufen? Um das zu Überprüfen musste ich erstmal einen Weg finden, die Beine leicht, stabil und vor allem kostengünstig herzustellen. Und das scheint mir mit den blauen Stützen, die im echten Leben Wattestäbchen sind, gelungen zu sein. Immerhin kann das Teil frei stehen und Kniebeugen machen, mehr schafft die Software leider noch nicht.

Zur Ansteuerung verwende ich die Caterpillar-Platine von arexx. Diese besitzt einen 16MHz-Mega16 und ist für den Betrieb von 8 Servos ausgelegt. Allerdings gefällt mir deren Software nicht so gut, weil sie die Servoimpulse für das Restprogramm blockierend erzeugt. Deshalb verwende ich meine eigene Routinen, die nach vielen Versuchen nun sehr kompakt sind:


// Servoansteuerung mit 16Bit-Timer1 (mit arexx cat16) mic 18.1.2011

// Die 8 Servos werden an Port C und D angeschlossen:
// Servo0 - PC0
// Servo1 - PC1
// Servo2 - PD2
// Servo3 - PD3
// Servo4 - PD4
// Servo5 - PD5
// Servo6 - PD6
// Servo7 - PD7

#define mitte 2500 // das sollte 1,25 Millisekunden entsprechen

#define pos1 500
#define pos2 1000

#include <avr/io.h>
#include <avr/interrupt.h>

volatile uint8_t count_20ms;
volatile uint16_t servo[9] ={0, 0, 0, 0, 0, 0, 0, 0, 40000}; // Servopositionen

ISR(TIMER1_COMPA_vect)
{
static uint8_t nr=0; // Nummer des aktuellen Servos

PORTB &= ~0b00000011; // alle Servoimpulse low
PORTC &= ~0b11111100;

if(nr>7) // Impuls für Servo oder Pause?
{
OCR1A = servo[8]; // servo[8] ist die Impulspause
servo[8] = 40000; // Startwert 20ms laden
nr = 0; // beim nächsten ISR-Aufruf Impuls
// für Servo 0 erzeugen
if(count_20ms) count_20ms--; // blockierende Pause aktiv?
}
else
{
if(nr<2) PORTB |= (1<<nr); // Impulsleitung des aktuellen Servos
else PORTC |= (1<<nr); // auf High setzen und
OCR1A = servo[nr]; // Impulslänge in OCR1A laden
servo[8] -= servo[nr]; // Impulslänge von der Pause abziehen
nr++; // nächstes Servo
}
TCNT1=0x00; // Zählregister reseten
}

void Sleep(uint8_t pause) // 1/50 Sekunde blockierende Pause
{
count_20ms=pause+1;
while(count_20ms);
}

int main(void)
{
cli();

// für 16MHz-ATMega16
TCCR1A = (0<<WGM11)|(0<<WGM10); // CTC Mode
TCCR1B = (0<<WGM13)|(1<<WGM12);

TCCR1B |= (0<<CS12)|(1<<CS11)|(0<<CS10); // prescaler /8

TIMSK = (1<<OCIE1A); // MatchCompare-Interrupt erlauben

DDRB = 0b00000011; // Servoausgänge setzen
DDRC = 0b11111100;
sei();

while(1) // Demo
{
servo[0]=servo[1]=servo[2]=mitte;
servo[3]=servo[4]=servo[5]=mitte;
Sleep(40);
servo[0]=servo[1]=servo[2]=mitte-pos1;
servo[3]=servo[4]=servo[5]=mitte+pos1;
Sleep(30);
servo[0]=servo[1]=servo[2]=mitte;
servo[3]=servo[4]=servo[5]=mitte;
Sleep(20);
servo[0]=servo[1]=servo[2]=mitte+pos2;
servo[3]=servo[4]=servo[5]=mitte-pos2;
Sleep(20);
servo[0]=servo[1]=servo[2]=mitte;
servo[3]=servo[4]=servo[5]=mitte;
}
return(0);
}


Der Timer läuft im CTC-Mode mit 2MHz, 1ms dauert dann 2000 Zähltakte, 20ms entsprechend 40000 Zähltakte des Timers. Die Servoimpulse werden nacheinander erzeugt, am Ende jedes Zykluses wird die Restpause angehängt. So sind theoretisch bis zu 10 Servos möglich, denn 10 mal 2ms ergibt die Wiederholfrequenz von 50Hz. Ich gehe davon aus, dass sich unter Verwendung des B-Kanals des Timers zusätzlich nochmals 10 Servos ansteuern lassen.

Gruß

mic

[Edit]
Das Laden der 16Bit-Servopositionen funktioniert nur deshalb reibungslos, weil nach Sleep() immer mindestens eine Servoimpulslänge lang kein neuer Interrupt ausgelöst wird und somit das Laden der 16Bit-Variablen an dieser Stelle quasi atomar ist.

Searcher
19.01.2011, 17:03
...den blauen Stützen, die im echten Leben Wattestäbchen sind...
Solche Konstruktionen gefallen mir besonders. Wattestäbchen hatte ich schon in Verdacht :) und es sieht so aus, als ob da Nylonfäden durchgezogen sind.

Ich möchte aber doch nochmal nachfragen, ob sich die Stäbchen bei den Kniebeugen biegen oder sich am unteren Ende in Nylongelenken bewegen.

Wenn die fest sind, könnte die Federwirkung den Servo eventuell beim "Aufrichten" unterstützen?

(Kann das nicht eindeutig erkennen; manche Videos von youtube kommen bei mir nur ruckelnd oder unklar an)

Gruß
Searcher

radbruch
19.01.2011, 19:55
Hallo

Der Nylonfaden ist 0,7er Dekoschnur und dient neben dem Zusammenhalt als Ersatz für die bei Deltas sonst üblichen Kugelgelenke. Die Streben selbst sollten weder knicken noch federn. Allerdings kann man die Rechtecke so zu beliebigen Parallelogrammen formen, ebenso können sich die kurzen waagrechten Röhrchen nahezu frei auf dem Faden drehen. Der Aufbau ist die Weiterentwicklung meiner ersten Deltaversuche mit den Scharnieren als Ersatz für die teuren Kugelgelenke:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=423641#423641

Das Video ist in erster Linie deshalb so peinlich, weil ich das Projekt nur wegen der Servoansteuerung kurzfristig eingeschoben habe. Beim Testen gestern abend fand ich das dann eben so hübsch, dass ich es euch mal zeigen wollte. Zudem scheint mir diese Stäbchentechnik noch einiges an Potential zu haben. Und die Kosten sind dabei so gering, dass sogar ich es mir leiste, neue Stäbchen zu verschwenden anstatt Gebrauchte zu recyclen. Das macht auch das fummelige Abpiddeln (http://www.google.de/search?q=Abpiddeln) der Watte etwas erträglicher ;)

Die eigentliche Frage ist aber immer noch ungeklärt: Kann ich das Gewicht der Maschine so verlagern, dass es gelingt, das Schwungbein um das Standbein herum zu führen?

Gruß

mic

[Edit]
Oh, hierher kommt die Idee eigentlich:


Das Video gefällt echt! So eine Konstruktion hatte ich zwischenzeitlich mal als Bein für einen Hexapod in Betracht gezogen, aber man kommt ja zu nixSein Kommentar zum oben verlinken Beitrag :)

Searcher
19.01.2011, 20:51
Hallo radbruch,
gefällt mir immer besser vor allem wegen der billigen und einfach zu bearbeitenden Materialien, die einen Umbau bei der nicht so leichten Aufgabe unkompliziert machen.


Die eigentliche Frage ist aber immer noch ungeklärt: Kann ich das Gewicht der Maschine so verlagern, dass es gelingt, das Schwungbein um das Standbein herum zu führen?
[brainstorm ein]Ein Gewicht, daß sich zb. durch Schwerkraft verlagert. Standseite tief - Schwungseite hoch - Gewicht rutscht zur Standseite - Vorsichtig Schwungbein anheben ... Gewicht könnte Kugel in einem Rohr sein[brainstorm aus]

Gruß
Searcher

tbasnoopy
19.01.2011, 21:44
Mal bei der Natur abschau...

beim Mensch:
schwerpunkt ca. Bauchnabel also ca. 10% ueber huefte. Beim laufen neigen des Beckens auf Standbein. Beim bloeden laufen (also starren laufen) neigt also der Oberkoerper Richtung Standbein.

Ich behaupte somit das es ohne Schwingkoerper bzw. Ausgleichskoerper welcher das Gewicht kurzzeitg komplett auf das Standbeinverlagert nicht funktionieren wird.

radbruch
19.01.2011, 22:02
Hallo

Das war mir schon klar, dass dir das gefällt. ;)

Die Idee mit dem verschiebbaren Gewicht ist super, allerdings werde ich versuchen, die Akkus mit Servokraft zu verschieben. Eine durch Schwerkraft beschleunigte Kugel müsste ich am Ende des Rohres auch irgendwie wieder anhalten ohne das der Bot seitlich umkippt.

Das passt auch gut zu dem fehlenden Hüftgelenk. Da die Akkus nicht in den Bereich der Beinservos geraten dürfen, wird der Anbau, und damit auch der Schwerpunkt, dann wohl naturnah in gedachter Nabelhöhe sein. :)

Nun muss ich wieder mal alles andere liegen lassen und mich voll den neuen Beinchen widmen.

Gruß

mic

radbruch
20.01.2012, 21:38
Ein zweiter Anlauf, hoffentlich schaffe ich diesmal auch den Sprung:


http://www.youtube.com/watch?v=n3WUgeDU_r4

Manf
21.01.2012, 00:01
Wenn ich noch daran denke wie genial der Kippler war, nicht ganz präzise im schnellen Gang aber ein sehr robustes Prinzip, - Fuß wechseln und Standfuß drehen.

Wie ginge das hier? Beide Füße am Boden einer mit etwas mehr Last gleitet weinger, schlurfender Gang, - oder ein Ausbalancieren auf jeweils einem Fuß und den anderen nach vorne bringen. Ich denke dazu müssen die Füße etwas breiter werden - Deckel von breitem Gurkenglas?

radbruch
21.01.2012, 00:26
Da ich nun ausreichend viele (nahezu baugleiche) Servos besitze, und diese auch ansteuern kann, plane ich etwas sechsbeiniges:

https://www.roboternetz.de/community/threads/56325-Servo-ES-05-zum-Sonderpreis
https://www.roboternetz.de/community/threads/54583-Code-Optimierung-f%C3%BCr-Interrupt-m%C3%B6glich?p=524912&viewfull=1#post524912

malthy
21.01.2012, 10:20
... etwas sechsbeiniges

nachdem ich meinen Delta einigermaßen hinbekommen hatte und mich ja auch schonmal an einem Hexa versucht habe, kam mir natürlich auch genau diese Idee in den Kopf: Hexa- und Delta-Prinzip zu verheiraten. Man bräuchte ja auch drei Servos pro Bein. Ich habe leider gerade keine Zeit für ein solches Projekt, insofern bin ich äußerst gespannt auf Deine Versuche!

Gruß
Malte