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
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:
Bild hier
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:
Der Code der Hauptschleife für das Demo sieht so aus:Code: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; } }
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.Code: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); }
Das ist mal die Basis, mal sehen, was ich da rauskitzel kann...
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
Hallo Hans
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]. 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...steuert dein asuro die Servos an, oder nutzt du dazu ein eigenes board?
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
Lieber Asuro programieren als arbeiten gehen.
Hallo
Das 'p' steht für Pause:
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...Code:volatile uint16_t p=0; void pause(uint16_t p_dauer) { p=p_dauer; while(p); }
Der Vollständigkeit halber hier noch mein "Arbeitscode" (=ungeputzt und nicht kommentiert):
Die "walkerlib" soll mal irgendwann (falls ich das Projekt fertigstellen werde;) die Motorfunktionen MotorSpeed() und MotorDir() der orginalen asuro-Library ersetzen...Code://#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; } }
Gruß
mic
[Edit]
btw: uint8_t p reicht ja völlig, das sind 5 Sekunden...
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
witzige idee. gefällt mir sehr.
sieht das nur so aus, oder wird der asuro beim laufen immer tiefer?
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
Der kürzeste Weg zwischen zwei Menschen ist ein Lächeln - http://www.ad-kunst.de
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.
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.sieht das nur so aus, oder wird der asuro beim laufen immer tiefer?
Was man auf dem Video noch nicht sieht: Wenn die "Beine" voll ausgefahren sind hat der asuro ca. 7 cm Bodenfreiheit:
Bild hier Bild hier
Da staunt die Katze :)
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 :)Das i-Net vergisst ja bekanntermaßen nichts.
Gruß
mic
Geändert von radbruch (21.08.2013 um 17:56 Uhr) Grund: Bilder neu verlinkt
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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.
Lieber Asuro programieren als arbeiten gehen.
Lesezeichen