-
        

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: Weg aufzeichnen und Aufzeichnung abspulen

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.062
    Blog-Einträge
    2

    Weg aufzeichnen und Aufzeichnung abspulen

    Anzeige

    Hallo Zusammen,

    im Sourcecode des ct-Bot habe ich eine Routine gesehen, die aus den Odometriedaten die aktuelle Position des Roboters berechnet. Jetzt frage ich mich, ob man sowas nicht auch mal auf dem ASURO ausprobieren sollte.
    Jaja, ich weis, die Odoemetrie ist nach einiger Zeit ungenau ( siehe "ASURO und Haus vom Nikolaus ), aber veilleicht könnte man trotzdem interessante Ergebnisse erhalten.

    Idee:
    Besonders viel Spass macht es, den ASURO mit einer IR-Fersteuerung wie ein Modellauto herum fahren zu lassen. Mit der Odometrie könnte man den Weg aufzeichenen und dann mit "Repeat" die Fahrt immer wieder wiederholen lassen. Das ist dann schon mal ein ganzes Stück fortschrittlicher als ein Robotermodellauto.

    Wäre das nicht eine lustige Sache?

    Gruss,
    stochri

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Hi

    Ich find die Idee auf jeden Fall auch richtig lustig, aber ich wage zu bezweifeln, dass es um umsetzbar ist. (Ja, das ist eine Herausforderung, für alle die meinen es geht!)

    Ich kann mir grade 2 Varianten denken:
    1. Man steuert über IR und er merkt sich nur "Solange gradeaus, wie Schritte gefahren wurden, als über IR gesagt wurde Fahr und dann irgendwann Stop".
    Das ist wohl einfach, da man nur ne Befehlskette abarbeiten muss.

    2. Wenn wir wirklcih alles komplett übernehmen wollen, dann müssen ja auch langegestreckte Kurven möglich sein. Mein Idee wäre hier, dass man halb sekündlich die Odometrie Werte aufschreibt und beim repeat muss man halt so regeln, dass in diesen Intervallen auch immer das gleich abgefahren wird. (Also die Motorleistung vorausdenkend regeln)

    Das 2. halt ich für sinnvoller, bzw. eher das was gedacht ist, aber aufgrund des Speichervermögens ... mh ... könnte eng werden, oder was meint ihr?

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    das könnte wirklich eng werden. der sram hat nur 1 kb, und der eeprom nur 512 bytes. da ist nicht viel zu machen... aber sag niemals nie. eine befehlskette ist auf jeden fall möglich. man könnte sogar 1024 befehle nehmen, in ein nibble umsetzen (= ein halbes byte) also zB 0000 = stop, 0001=vorwärts, 0010 = linksrum, 0011=rechtsrum, 0100 = bogen links und so weiter) und diese dann immer als zwei befehle in einem byte des eeproms abspeichern. so könnte die zuletzt gefahrene strecke des asuro auch nach dem ausschalten wiederholt werden.
    kleinschreibung ist cool!

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Zufällig spiele ich grad mit IR-Fernbedienungen rum, deshalb hier ein einfacher Code um rc5-Signale mit dem asuro auszuwerten:

    Code:
    #include "asuro.h"
    
    #define pow1 150 // Langsame Geschwindigkeit
    #define pow2 200 // Schnelle Geschwindigkeit
    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    unsigned int count, temp; // Zaehler, IR-Kommando
    unsigned char daten[14], ir_status; // IR-Datenspeicher, IR-Eingangspegel
    
    int main(void) {
    
    Init();
    do{
    	temp=0;
    	while (PIND & (1 << PD0)) //warten auf die Flanke des Startbits
    		{if keine_taste StatusLED(GREEN); else StatusLED(RED); // Tastenspielerei
    		 if taste BackLED(ON,ON); else BackLED(OFF,OFF);}
    	StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug
    
    	for (count=0; count<14; count++) { // im Gesammten warten wir auf 14 bits
    /*
    lt. Spettel-Diagramm betraegt die Bitlaenge 1,778 ms. Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64
    */
    	Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
    	   ir_status=(PIND & (1 << PD0)); // Pegel Speichern
    	   if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
    	   if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
    	   while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
    	}
    	temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
    	StatusLED(YELLOW); // Daten gelesen
    	//Msleep(2000); // Zeit um den IR-Transceifer ueber den asuro zu bringen
    	SerWrite("\n\r",2);
    	SerWrite(daten,14); // Bitmuster zum PC senden
    	SerWrite("-",1);
    	PrintInt(temp); // erkannte Daten zum PC senden
    
    /* asuro steuern.
    	Mit dem 10er-Block der Fernbedienung kann der asuro nun gesteuert werden:
    	Alle anderen Tasten stoppen den asuro
    */
    
    	switch (temp) {
    	   case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
    	   case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
    	   case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
    	   case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
    	   case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
    	   case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
    	   case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break;
    	   case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
    	   case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break;
    	   default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
    	}
    	StatusLED(GREEN); //endlos
    	//Msleep(1000);
    
    }while (1);
    return 0;
    }
    Der Code basiert auf den Infos die ich bei spettel.de gefunden habe. Bei mir funktioniert das nur mit bestimmten Fernbedienungen, vermutlich nur diejenigen, die echten rc5-Code senden. Wenn der asuro nach dem Empfang des Signals auf Grün schaltet, kann man von 14 gesendeten Bits und rc5 ausgehen. Je nach eingestelltem Code an der Fernbedienung muss man etwas experimentieren. Sony z.b. geht nicht, Phillips scheint grundsätzlich zu funktionieren.

    Der nächste Schritt wäre nun wohl die Steuercodes und die Zeiten dazwischen zu speichern um den asuro dann zeitgesteuert die "geteachten" Strecken nachfahren zu lassen.

    Gruß

    mic

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

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.062
    Blog-Einträge
    2
    Hallo radbruch,

    könnte es sein, dass in der neuen ASUROLib 2.7 Routinen für dei RC5 Fersteuerung vorhanden sind?

    Gruss,
    stochri

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    könnte es sein, dass in der neuen ASUROLib 2.7 Routinen für dei RC5 Fersteuerung vorhanden sind?
    Keine Ahnung, ich habe mir die Lib noch nicht angesehen. Ich bin eher der Selbermach-Typ. Aber ich hole das gleich mal nach. Mal sehen, wie das "richtig" geht.

    Gruß

    mic

    [Edit]
    Da sind tatsächlich Routinen für rc5-Fernsteuerungen dabei.

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

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Hier mein Versuch das Problem der Wegspeicherung und Wiederholung über die Zeit zu lösen, die zwischen den gesendeten Kommandos vergeht.

    Code:
    #include "asuro.h"
    
    #define wegteile 50
    #define pow1 150 // Langsame Geschwindigkeit
    #define pow2 200 // Schnelle Geschwindigkeit
    #define taste (!(PINC & (1<<PC4))) // Tastenabfrage
    #define keine_taste (PINC & (1<<PC4))
    
    unsigned int count, temp; // Zaehler, IR-Kommando
    unsigned char daten[14], ir_status; // IR-datenspeicher, IR-Eingangsegel
    unsigned int wegspeicher[wegteile], wegabschnitt, wegkommando;
    unsigned long int startzeit;
    
    void fahre(unsigned char kommando) {
    /* asuro steuern.
    	Mit dem 10er-Block der Fernbedienung kann der asuro nun gesteuert werden:
    	Alle anderen Tasten stoppen den asuro
    */
    	switch (kommando) {
    	   case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
    	   case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
    	   case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
    	   case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
    	   case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
    	   case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
    	   case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break;
    	   case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
    	   case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break;
    	   default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
    	}
    }
    
    int main(void) {
    
    Init();
    for (count=0;count<wegteile; count++) wegspeicher[count]=0;
    wegabschnitt=0;
    wegkommando=0;
    startzeit=0;
    do{
    	temp=0;
       while (PIND & (1 << PD0)) //warten auf die Flanke des Startbits
       StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug
    	for (count=0; count<14; count++) { // im Gesammten warten wir auf 14 bits
    		Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
    	   ir_status=(PIND & (1 << PD0)); // Pegel Speichern
    	   if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
    	   if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
    	   while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
    	}
    	temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
    	StatusLED(YELLOW); // Daten gelesen
    	//Msleep(2000); // Zeit um der IR-Transceifer ueber den asuro zu bringen
    	//SerWrite("\n\r",2);
    	//SerWrite(daten,14); // Bitmuster zum PC senden
    	//SerWrite("-",1);
    	//PrintInt(temp); // erkannte Daten zum PC senden
    
    	//fahre(temp);
    
    	if ((temp > 0) && (temp <= 9)) fahre(temp);
    	if (temp == 0){
    	   count=0;
    	   BackLED(ON,ON);
    	   Msleep(1000);
    	   while (wegspeicher[count]) {
    	      fahre(wegspeicher[count] & 0xf);
    	      Msleep(wegspeicher[count]/16);
    	      count++;
    		}
          BackLED(OFF,OFF);
    	}
    	if (temp == 12) {
    	   BackLED(ON,ON);
    		for (count=0;count<wegteile; count++) wegspeicher[count]=0;
    		wegabschnitt=0;
    		wegkommando=0;
    		startzeit=0;
    		Msleep(300);
    	   BackLED(OFF,OFF);
    	}
    
    	if (wegkommando) {
    	   startzeit=Gettime()-startzeit;
    	   while (startzeit > 2000) {
    	      wegspeicher[wegabschnitt]=2000*16+wegkommando;
    	      wegabschnitt++;
    	      startzeit-=2000;
    		}
    	   wegspeicher[wegabschnitt]=startzeit*16+wegkommando;
    	   wegabschnitt++;
    	   wegkommando=0;
    	}
    	if ((temp > 0) && (temp <= 9)) {
    	   startzeit=Gettime();
    	   wegkommando=temp;
    	}
    
    	      
    	StatusLED(GREEN); //endlos
    	//Msleep(1000);
    
    }while (1);
    return 0;
    }
    Die Zeit wird mit Gettime() in Millisekunden gemessen und in den oberen 12 Bits zusammen mit dem Kommandocode in den unteren 4 Bits in einem Integer-Feld gespeichert. So können Zeiten bis ca. 2000 Millisekunden (2^11=204 plus das Kommando in zwei Bytes gespeichert werden.

    Nach dem Einschalten und dem Senden eines ersten Startzeichens beginnt die Aufzeichnung. Mit "0" wird das bisher Aufgezeichnete wiederholt, mit "12" (ist bei mir die Teletexttaste) wird die Aufzeichnung gelöscht und der asuro kann was neues aufnehmen.

    Achtung! Die Aufzeichnung endet nie! Das muss ich noch ändern um zu verhinderen, dass ein Speicherüberlauf auftritt. Ein kleines Video werde ich noch nachreichen.



    Mit der Odometrie geht das sicher genauer, wenn auch deutlich aufwendiger. Aber auch meine Lösung macht Spass und verblüfft die Zuschauer.

    Gruß

    mic

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

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    18.12.2006
    Ort
    Eberbach
    Beiträge
    199
    Hi,
    Zitat Zitat von damaltor
    das könnte wirklich eng werden. der sram hat nur 1 kb, und der eeprom nur 512 bytes. da ist nicht viel zu machen... aber sag niemals nie. ...
    das gilt aber nur für's Recording!

    Man kann die Daten ja auch im Flash ablegen, da hat man dann mehr (bis zu 7KB) Platz. Allerdings muß man dazu die Daten erst "stückchenweise" mittels SRAM/EEPROM aufnehmen (oder aber die Daten per IR zum PC senden). Die aufgenommenen (und evtl. aus mehereren Aufnahmestückchen zusammengesetzten) Daten kann man dann mittels .hex-file irgendwo oben in den Flash-speicher schreiben (z.B. ab 0x1BFF so weit zurück, wie nötig -- 0x1C00-0x1FFF ist der geblockte Bereich mit u.A. dem Bootloader).

    Auslesen des Flash zum Abspielen geht dann z.B. mittels:
    Code:
    #include <avr/pgmspace.h>
    
    unsigned char FLASH_read(unsigned int uiAddress)
    {
      return __LPM(uiAddress);
    }
    Und für gaaanz lange Sequenzen kann man die Daten ja auch noch komprimiert im Flash ablegen -- kennt jemand ein ganz kurzes (und möglichst schnelles) unzip() für den ATMega8L??

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.062
    Blog-Einträge
    2
    Hallo radbruch,

    geht ja ruck zuck, mit der Umsetzung. Ich bin gespannt auf das Video.

    Gruss,
    stochri

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Das geht deshalb so "ruck-zuck", weil ich mich selbst grad etwas mit den Möglichkeiten der Fernbedienungen beschäftige.

    Das Video ist schon da, leider völlig nichtssagend und unspektakulär. Ich werde ein schöneres machen (was gar nicht so einfach ist):



    In dieser Version messe ich die Zeit zwischen den einzelnen Signalen. Der nächste Schritt wäre die Wegstrecke zwischen den Signalen zu messen. Beim Abspielen sind dann Richtung und Power über das Kommando vorgegeben, man braucht also nur auf die Summe der Impulse zu prüfen. Optimal wäre da natürlich eine Drehzahlregelung der Antriebe, aber das ist in der 2.7er Version sicher schon enthalten.

    2000 Impulse pro Speicherinteger ergibt bei 50 Werten doch eine recht lange Speicherstrecke. Auch wenn nicht jeder Schritt die 2000 voll nutzt. Und der asuro ist damit noch lange nicht am Limit.

    Gruß

    mic

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

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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