Hallo,

@ Bammel

Da dies ja auch bisher mein erste Programm für einen Microcontroller ist, hab ichs mir erst mal einfach gemacht und die ganzen Bewegungen linearisiert. Der Haupcontroller sendet einen Punkt (x,y,z) an den Beincontroller. Dieser berechnet daraus die Position der Fussspitze und bewegt die Servos dementsprechend auf dem direkten weg dorthin. Bei den Drehungen hab ich auch einfach die Punkte der Tangente eines Kreises hergenommen.

Das Autonome agieren des Bots währe der nächste Schritt, nur weis ich noch nicht genau was hier am zielführensten wäre. Hab Ihr vielleicht einen Vorschlag?

@radbruch
Ein Delta Bot mit 2 Beinen ist auch eine super Idee!

@ tucow
ich hab für jedes Bein erstmal die Punkte fest im Hauptcontroller hinterlegt für eine Bewegungsfolge z.b.:

void left(void)
{
send_koordinates(1,50,50,-110); // Bein 1 hoch und nach vorne heben
send_koordinates(3,-50,-50,-110); // Bein 3 gleichzeitig ebenso
_delay_ms(300);
send_koordinates(1,50,50,-140); // Bein 1 absetzen
send_koordinates(3,-50,-50,-140); // Bein 3 absetzen
_delay_ms(300);
send_koordinates(2,50,-50,-110); // Bein 2 hoch und nach vorne heben
send_koordinates(4,-50,50,-110);// Bein 4 gleichzeitig ebenso
_delay_ms(300);
send_koordinates(2,50,-50,-140);// Bein 2 absetzen
send_koordinates(4,-50,50,-140); // Bein 4 absetzen
_delay_ms(300);
send_koordinates(1,-50,-50,-140); // Bein 1 nach hinten schieben , bewirk das der Körper sich nach vorne bewegt
send_koordinates(2,-50,50,-140); // Bein 2 nach hinten schieben , bewirk das der Körper sich nach vorne bewegt
send_koordinates(3,50,50,-140); // Bein 3 nach hinten schieben , bewirk das der Körper sich nach vorne bewegt
send_koordinates(4,50,-50,-140); // Bein 4 nach hinten schieben, bewirk das der Körper sich nach vorne bewegt
_delay_ms(300);

// unterschiedliche Vorzeichen, da die Beine jeweils um 90 Grad gedreht angeordnet sind
}

(Beinnummer, x,y,z)

Der Slave (Beincontroller) läuft dann in einer Schleife von 16ms (= PWM für die analogen Servos). Am Anfang der Schleife wird gewartet bis die PWM Pulse fertig sind (max 3 Millisekunden). Dann berechnet der Controller aus den Koordinaten den anzusteuernden Punkt (inverse kinematik, ca. 7 ms) und stellt die Timer dementsprechend für den Anfang des nächsten Schleifendurchlaufs ein. Der Rest ist wieder Wartezeit.
Für die Kommunikation benutz ich das Hardware SPI der Controller mit jeweils einem Pin als Select für das Bein und den Interrupt im Chip wenn neue Daten angekommen sind.
Die nächste Bewegungsfolge schickt der Master 500ms nach dem Abschluss der letzten. Ich hab viel mit delays gearbeitet um das zu timen (was warscheinlich nicht gerade das optimale Vorgehen ist.)

Gruß LetsBuildBots