-         

+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: walking asuro

  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    53
    Beiträge
    5.768
    Blog-Einträge
    8

    walking asuro

    Anzeige

    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://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:

    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; }
    }
    Der Code der Hauptschleife für das Demo sieht so aus:
    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);
       }
    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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    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

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    53
    Beiträge
    5.768
    Blog-Einträge
    8
    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]. 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

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    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.

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    53
    Beiträge
    5.768
    Blog-Einträge
    8
    Hallo

    Das 'p' steht für Pause:
    Code:
    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):
    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; }
    }
    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...

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    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

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    30
    Beiträge
    3.889
    witzige idee. gefällt mir sehr.

    sieht das nur so aus, oder wird der asuro beim laufen immer tiefer?
    kleinschreibung ist cool!

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Klingon77
    Registriert seit
    26.09.2006
    Ort
    Hunsrück
    Alter
    55
    Beiträge
    2.543
    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

  9. #9
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    53
    Beiträge
    5.768
    Blog-Einträge
    8
    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:


    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
    Geändert von radbruch (21.08.2013 um 17:56 Uhr) Grund: Bilder neu verlinkt

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    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.

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •