PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : walking asuro



radbruch
27.07.2008, 20:51
Hallo asurofans

Da mein asuro unter einer defekten H-Brücke leidet (und mein RP6 dafür zu schwer ist) habe ich eine alte Idee neu belebt und ein neues Projekt gestartet. Noch etwas unbeholfen und mechanisch nicht wirklich ausgereift sind dies die ersten "Schritte" meines asuros. Ohne große Mathematik nutzt das einfache Programm die symetrische Anordnung der Servos:

http://i.ytimg.com/vi/6FOKJ800YRg/2.jpg (http://www.youtube.com/watch?v=6FOKJ800YRg)
http://www.youtube.com/watch?v=6FOKJ800YRg

Das ist mein erster Versuch und kann noch nicht wirklich als "Gehen" bezeichnet werden. Aber ich muß erst mal ein Gefühl dafür entwickeln, es ist deutlich schwieriger als mit Rädern zu rollen.

Die Hardware:
- asuro-Platine
- Adapter mit einzeln schaltbaren Pins
- vier 4000 mA-Discounter-Akkus mit Halter
- acht 5€-Servos
- Heißkleber und Kleinteile

Das Programm besteht im wesentlichen aus einer 100kHz-ISR die nacheinander die Servos ansteuert. Grundlage dazu war die Vorlage aus dem RN-Wiki die ich etwas modifiziert habe:


TIMSK |= (1<<OCIE2);
TCCR2 = (1<<WGM21) | (1<<CS20);
OCR2 = 80;
...
ISR(TIMER2_COMP_vect)
{
static uint16_t count=0;
static uint16_t count2=1000;
static uint8_t impuls=0, servo=0;
static uint8_t impuls2=0, servo2=0;
if(!impuls)
{
if(servo == 0) { impuls=hra; servo0_on; }
if(servo == 1) { impuls=hri; servo0_off; servo1_on; }
if(servo == 2) { impuls=vra; servo1_off; servo2_on; }
if(servo == 3) { impuls=vri; servo2_off; servo3_on; }
if(servo == 4) servo3_off;
if(servo < 5) servo++;
} else impuls--;
if(!impuls2)
{
if(servo2 == 4) { impuls2=hla; servo4_on; }
if(servo2 == 5) { impuls2=hli; servo4_off; servo5_on; }
if(servo2 == 6) { impuls2=vla; servo5_off; servo6_on; }
if(servo2 == 7) { impuls2=vli; servo6_off; servo7_on; }
if(servo2 == 8) servo7_off;
if(servo2 < 9) servo2++;
} else impuls2--;
if(count < 2000) count++; else { count=impuls=servo=0; if(p) p--; }
if(count2 < 2000) count2++; else { count2=impuls2=0; servo2=4; }
}

Der Code der Hauptschleife für das Demo sieht so aus:

while(1)
{
vla=hla=vra=hra=120; // heben/senken
pause(10);
vli=vri=110; // gehen
hli=hri=140;
pause(15);
vla=hla=vra=hra=135; // heben/senken
pause(10);
vli=vri=140; // gehen
hli=hri=110;
pause(15);
}


vli bis hra sind die Servopositionen vornelinksinnen bis hintenrechtsaußen, Drehbereich ist von 50-200 (?). Das Programm nutzt die spiegelbildliche Anordnung der Servos und ist deshalb sehr einfach gestrickt.

Das ist mal die Basis, mal sehen, was ich da rauskitzel kann...

Gruß

mic

Hansi41
28.07.2008, 12:48
Hey,
das erinnert mich an die unzähligen hexabots...
schöne idee,
frage:
steuert dein asuro die servos an, oder nutzt du dazu ein eigenes board?

MfG
Hans

radbruch
28.07.2008, 16:24
Hallo Hans

steuert dein asuro die servos an, oder nutzt du dazu ein eigenes board?
Ich verwende kein zusätzliches Bord, mein asuro steuert die Servos selbst an. Sein ATMega8 steckt in einem Sockel der über Dip-Schalter mit dem orginalen Sockel verbunden ist [Link (https://www.roboternetz.de/phpBB2/viewtopic.php?p=382106#382106)]. So kann ich die Pins die ich verwenden will von der asuro-Platine trennen. Im Adapter sind noch ein 10µF und ein 100nF zwischen Vcc und GND geschaltet. Da nur die Pins 1-6, 9-14, 15-20 und 23-28 schaltbar sind (ich hatte nur 6er Klaviere) kann ich Vcc(7), GND(8+22) und AREF(21) nicht trennen, aber damit kann man gut leben. Die Servos hängen an den Motoranschlüssen und den BackLEDs/Odometrie(PB1,2,4,5, PC0,1 und PD4,5) Diese Anschlüsse benötige ich ja nun nicht mehr und so kann ich alle anderen Funktionen des asuros weiterhin nutzen...

Gruß

mic

Sternthaler
28.07.2008, 16:56
Hallo radbruch,

da hast du mal wieder etwas Feines zusammengeklebt. Ich nehme an, der Heißkleber wird für die Servobefestigung benutzt?
Und deine Software ist ja wirklich schnuckelig einfach.
Wofür ist das: if(p) p-- im Interrupt?

NUR GUT

Gruß Sternthaler

radbruch
28.07.2008, 18:11
Hallo

Das 'p' steht für Pause:

volatile uint16_t p=0;

void pause(uint16_t p_dauer)
{
p=p_dauer;
while(p);
}
Eine kleine Pause kann man immer mal brauchen. Die Einheit ist wohl 20ms, dann sollte pause(50) eine Sekunde (blockierend) verzögern. 'p' ist aber auch ein Servoimpulszyklus, vielleicht kann man das später mal verwenden...

Der Vollständigkeit halber hier noch mein "Arbeitscode" (=ungeputzt und nicht kommentiert):

//#include "../inc/walkerlib.h"
//#include "../inc/walkerlib.c"

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

#define servo_init {DDRB|=0b11011; DDRC|=0b11; DDRD|=0b11000;}

#define servo0_on PORTC |= (1<<PC1)
#define servo0_off PORTC &= ~(1<<PC1)
#define servo1_on PORTC |= (1<<PC0)
#define servo1_off PORTC &= ~(1<<PC0)
#define servo2_on PORTD |= (1<<PD4)
#define servo2_off PORTD &= ~(1<<PD4)
#define servo3_on PORTD |= (1<<PD5)
#define servo3_off PORTD &= ~(1<<PD5)

#define servo4_on PORTB |= (1<<PB1)
#define servo4_off PORTB &= ~(1<<PB1)
#define servo5_on PORTB |= (1<<PB2)
#define servo5_off PORTB &= ~(1<<PB2)
#define servo6_on PORTB |= (1<<PB4)
#define servo6_off PORTB &= ~(1<<PB4)
#define servo7_on PORTB |= (1<<PB5)
#define servo7_off PORTB &= ~(1<<PB5)

#define servo_stop {servo0_off; servo1_off; servo2_off; servo3_off; \
servo4_off; servo5_off; servo6_off; servo7_off;}

uint8_t vla, vli, vra, vri, hla, hli, hra, hri;
volatile uint16_t p=0;

void pause(uint16_t p_dauer)
{
p=p_dauer;
while(p);
}

int main(void)
{
TIMSK |= (1<<OCIE2);
TCCR2 = (1<<WGM21) | (1<<CS20);
OCR2 = 80;
servo_init;
servo_stop;
sei();

vla=125; vli=125;
vra=125; vri=125;
hla=125; hli=125;
hra=125; hri=125;
pause(50);
while(1)
{
vla=hla=vra=hra=120; // heben/senken
pause(10);
vli=vri=110; // gehen
hli=hri=140;
pause(15);
vla=hla=vra=hra=135; // heben/senken
pause(10);
vli=vri=140; // gehen
hli=hri=110;
pause(15);
}
return(0);
}

ISR(TIMER2_COMP_vect)
{
static uint16_t count=0;
static uint16_t count2=1000;
static uint8_t impuls=0, servo=0;
static uint8_t impuls2=0, servo2=0;
if(!impuls)
{
if(servo == 0) { impuls=hra; servo0_on; }
if(servo == 1) { impuls=hri; servo0_off; servo1_on; }
if(servo == 2) { impuls=vra; servo1_off; servo2_on; }
if(servo == 3) { impuls=vri; servo2_off; servo3_on; }
if(servo == 4) servo3_off;
if(servo < 5) servo++;
} else impuls--;
if(!impuls2)
{
if(servo2 == 4) { impuls2=hla; servo4_on; }
if(servo2 == 5) { impuls2=hli; servo4_off; servo5_on; }
if(servo2 == 6) { impuls2=vla; servo5_off; servo6_on; }
if(servo2 == 7) { impuls2=vli; servo6_off; servo7_on; }
if(servo2 == 8) servo7_off;
if(servo2 < 9) servo2++;
} else impuls2--;
if(count < 2000) count++; else { count=impuls=servo=0; if(p) p--; }
if(count2 < 2000) count2++; else { count2=impuls2=0; servo2=4; }
}


Die "walkerlib" soll mal irgendwann (falls ich das Projekt fertigstellen werde;) die Motorfunktionen MotorSpeed() und MotorDir() der orginalen asuro-Library ersetzen...

Gruß

mic

[Edit]
btw: uint8_t p reicht ja völlig, das sind 5 Sekunden...

Hansi41
28.07.2008, 20:26
Hallo,

das ist ja natürlich eine gute idee, du hast also sozusagen deinen asuro in ein experimentier board umgewandelt.
vielleicht werde ich dies auch einmal tun...

viel gelingen noch
hans

damaltor
29.07.2008, 13:42
witzige idee. gefällt mir sehr.

sieht das nur so aus, oder wird der asuro beim laufen immer tiefer?

Klingon77
29.07.2008, 16:58
hi,

wie immer schnell, rationell und einfach umgesetzt.

Was mir beim beschauen des Video´s so durch den Kopf ging:


Ihr kennt alle die alten SW-Aufnahmen der ersten motorgetriebenen Flugversuche.

In 150 Jahren wird einer kommen und eine Retrospektive bezüglich Laufmaschinen und Roboter (die dann ganz selbstverständlich sein werden) erstellen.

Mit Sicherheit ist dann Dein Video, neben vielen anderen, auch mit dabei.

Das i-Net vergisst ja bekanntermaßen nichts.


verschmitzte Grüße,

Klingon77


PS: Sorry für OT O:)

radbruch
29.07.2008, 20:10
Hallo

Das Gehen ist für einen Roboter und seinen Programmierer wohl die schwierigste Art der Fortbewegung. Weil ich es selbst machen und nicht irgendwo "abschreiben" möchte wird es wohl noch etwas dauern bis es eleganter aussieht.


sieht das nur so aus, oder wird der asuro beim laufen immer tiefer?
Kurz vor der 20sten Sekunde im Video fällt hinten links das Servohorn ab (war zum Justieren noch nicht festgeschraubt), dann konnte er sich nicht mehr abstemmen. Außerdem brauchen die Billigservos auch ein paar Sekunden bis sie "warmgelaufen" sind. In dieser Zeit ändern sich die Servopositionen dramatisch, das hatte ich bei den Dominosteinen schon festgestellt.

Was man auf dem Video noch nicht sieht: Wenn die "Beine" voll ausgefahren sind hat der asuro ca. 7 cm Bodenfreiheit:

http://radbruch.bplaced.net/asuro/walker/bodenfreiheit1_klein.jpg (http://radbruch.bplaced.net/asuro/walker/bodenfreiheit1.jpg) http://radbruch.bplaced.net/asuro/walker/bodenfreiheit2_klein.jpg (http://radbruch.bplaced.net/asuro/walker/bodenfreiheit2.jpg)
Da staunt die Katze :)


Das i-Net vergisst ja bekanntermaßen nichts.
Das I-Net wird wohl demnächst zusammenbrechen, bin mal gespannt, was dann kommt. Auch die Mikrokontroller werden sich rassend schnell weiterentwickeln, was wir uns heute mühsam erarbeiten wird bald Standart sein :)

Gruß

mic

Sternthaler
30.07.2008, 18:23
Hallo mic,

klasse Bilder. Bei der Auflösung, kann man auch erahnen, wie wenig Platz du genutzt hast um die Servos an der Asuro-Platine zu befestigen.
Hast du für die hinteren 'Beine' die Brems-LED's entfernt? Oder sind die Beine auf Höhe der demontierten Motoren angebracht?
Anhand des Videos vermute ich aber eher auf eine 'Verlängerung' des Asuros.


Wieso bricht das I-Net erst demnächst zusammen?
Ich versuche seit 1,5 Jahren einen Provider zu bekommen, der mir etwas mehr als 3,5 Mb zu Spitzenzeiten über eine 'bis zu 16 Mb'-Leitung liefern kann. Und dabei wohne ich nicht gerade ländlich. Selbst das Original (T - Offline) windet sich, auch wenn man unbedingt TV über DSL bei denen kaufen möchte. (Kann man im T-Shop ja mal behaupten ;-))

Stabile Ruderhörner und einen gleitenden Laufstil wünsche ich deinem Asuro
Gruß Sternthaler

P.S.: p, klar das ist Pause ;-)
Danke für die Gesamtansicht der Software.

damaltor
30.07.2008, 18:48
schöne bilder. sehe ich das richtig, und läuft der Asuro auf flummis als "füße"? das finde ich eine absolut gute idee, eine sehr einfache möglichkeit den beinen etwas halt zu verschaffen. und im notfall könnte man daraus auch etwas spitzere füße schnitzen, falls er doch mal abrutschen sollte.

radbruch
30.07.2008, 19:19
Hallo


...wie wenig Platz du genutzt hast um die Servos an der Asuro-Platine zu befestigen.Nunja, eigentlich war es ja gerade andersrum. Ich hatte die Beine, die habe ich dann an den Akkuhalter (altes FT-Teil ;) geklebt und letzlich habe ich den asuro druntergeklebt:

http://radbruch.bplaced.net/asuro/walker/asuro-walker1_klein.jpg (http://radbruch.bplaced.net/asuro/walker/asuro-walker1.jpg) http://radbruch.bplaced.net/asuro/walker/asuro-walker2_klein.jpg (http://radbruch.bplaced.net/asuro/walker/asuro-walker2.jpg) http://radbruch.bplaced.net/asuro/walker/asuro-walker3_klein.jpg (http://radbruch.bplaced.net/asuro/walker/asuro-walker3.jpg)
Die Flummies (sind heutzutage eher schwer zu bekommen) stammen noch vom Einbein (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=34593). Die Lösung scheint mir nicht optimal weil die Beine nicht auf dem Mittelpunkt der Kugeln aufsetzen und sich deshalb die Bälle drehen und Kraft verloren geht. Aber es sieht schick aus. Man sieht auch deutlich wie krumm und schief das alles ist. Ich möchte damit auch nur das Konzept testen...

Am RP6 sah's übrigends so aus:
http://i.ytimg.com/vi/m1Ob0WOxdMw/3.jpg (http://www.youtube.com/watch?v=m1Ob0WOxdMw)
http://www.youtube.com/watch?v=m1Ob0WOxdMw

Gruß

mic

radbruch
01.08.2008, 20:36
Hallo

Um das "Sommerloch" zu stopfen hier ein weiterer kleiner Vorkucker (diesmal mit festgeschraubten Servohörnern und leichtem Linksdrall):

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

Die "KI" ist unverändert minimal, lediglich die Parameter sind variiert:

while(1)
{
vla=hla=vra=hra=120; // heben/senken
pause(5);
vli=vri=80; // gehen
hli=hri=160;
pause(15);
vla=hla=vra=hra=130; // heben/senken
pause(5);
vli=vri=160; // gehen
hli=hri=80;
pause(15);
}

Nett, oder?

Gruß

mic

[Edit]URL von youtube-Vorschaubild aktualisiert

Klingon77
01.08.2008, 23:22
hi radbruch,

Du sollst das Sommerloch nicht alleine stopfen; ich helfe ein wenig mit...


ist schon interessant zu sehen, mit wie wenig "KI" der Robby läuft.

Was den Linksdrall betrifft: auf unseren Waschbetonplatten (leider haben wir noch welche) habe ich auch immer einen linksdrall... :-b

Der lässt sich doch bestimmt über die Schrittlänge (Parameter?) austreiben.


Bei mir geht es nach der ersten Flasche Bier dann eher geradeaus.

Ab der zweite rechts herum... :oops: #-o


Von den Zahnrädern habe ich auch noch einen Satz.
Die waren gar nicht mal übel um schnelle Versuche aufzubauen.

Sie hatten ein gutes Preis-Leistungsverhältnis, waren robust und hatten ein recht großes Modul, was die Paarung erleichtert.

Ich glaube ich verwendete sie damals um eine Lineareinheit mit zwei Gewindespindeln zu betreiben.

zuversichtliche Grüße,

Klingon77

damaltor
03.08.2008, 20:21
hilft etwas sekundenkleber gegen das wegdrehen der flummis?

radbruch
16.10.2008, 17:48
Hallo

Nachdem ich nun noch einen "Rahmen" aus 16er-Tischlerplatte drangebastelt habe ist er deutlich stabiler und steifer und der "Geradeauslauf" ist auch viel besser:
http://i1.ytimg.com/vi/4v5GxbYlkXk/3.jpg (http://www.youtube.com/watch?v=4v5GxbYlkXk)
http://www.youtube.com/watch?v=4v5GxbYlkXk

Das Gesamtgewicht beträgt jetzt ca. 1130 Gramm die sich so zusammensetzen:

150gr pro Bein
330gr Akku und Halter
45gr asuro-Platine
80gr Adapter und Kabel
75gr Chassis
(alle Werte aufgerundet)


Als Einstieg, um die Möglichkeiten und Unmöglichkeiten besser zu erkennen, werde ich mal mit einfachen Schrittfolgen beginnen...

Gruß

mic

robocat
16.10.2008, 18:38
wirklich top! kommt richtig zügig voran der kleine. danke für das viddie.

gruesse

Sternthaler
16.10.2008, 22:43
Hallo mic,

Schrittfolgen erinnern mich an den Tanzkurs.
Ich vermute, dass es aber wohl eher um Kurvengängigkeit geht.

Sehr überraschend finde ich deine Demonstration im Video, bei der du die 1100 Gramm an einem Bein 'laufen' läßt. Die Motoren/Getriebe in den Beinen scheinen ja richtige Kraftmeier zu sein.

Wie immer eine gelungen Bastelei von dir.
Gruß Sternthaler

radbruch
27.10.2008, 20:09
Hallo

Das unvermeidliche Redesign steht an weil a: die mechanischen Ungenauigkeiten nerven und b: die gegenlaufigen Drehrichtungen der Servos unnötig kompliziert sind. Selbstverständlich bleibt die Basis mit den Teilen der Stromabnehmer bestehen:
http://radbruch.bplaced.net/asuro/walker/beine-details1_klein.jpg (http://radbruch.bplaced.net/asuro/walker/beine-details1.jpg) http://radbruch.bplaced.net/asuro/walker/beine-details2_klein.jpg (http://radbruch.bplaced.net/asuro/walker/beine-details2.jpg) http://radbruch.bplaced.net/asuro/walker/beine-details3_klein.jpg (http://www.vahle.de/vahleassets//pdf/Kataloge/deutsch/Kat_02a_de_Isolierte_Stromschienen_U10.pdf)

Die Stromabnehmer (Katalog S. 10 (http://www.vahle.de/vahleassets//pdf/Kataloge/deutsch/Kat_02a_de_Isolierte_Stromschienen_U10.pdf)) sind quasi ein Abfallprodukt meiner täglichen Arbeit: Wir verkaufen die kompletten Abnehmer, tauschen aber je nach Zustand nur die Schleifkohlen und die Halter bleiben übrig ;) "Zufällig" passen die Lochabstände der Streben dieser Halter genau zu meinen 3€-Servos :) Aus der rausgebohrten Strebe ist übrigens der Halter am anderen Servo gefertigt. Obwohl alles in handwerklicher Schnitz- und Heißklebetechnik gefertigt wurde ist es doch erstaunlich stabil. *grins*

Gruß

mic

[Edit]
http://radbruch.bplaced.net/asuro/walker/walker-teilebild_klein.jpg (http://radbruch.bplaced.net/asuro/walker/walker-teilebild.jpg)