PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Weg aufzeichnen und Aufzeichnung abspulen



stochri
02.06.2007, 22:06
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

Andun
03.06.2007, 13:23
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

damaltor
03.06.2007, 14:26
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.

radbruch
03.06.2007, 17:38
Hallo

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


#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 (http://www.spettel.de/ralf/projekte/avr_rc5/index.shtml) 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

stochri
03.06.2007, 18:19
Hallo radbruch,

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

Gruss,
stochri

radbruch
03.06.2007, 18:33
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.

radbruch
04.06.2007, 00:04
Hallo

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



#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=2048) 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.

http://img.youtube.com/vi/O9OaaDFe4kA/2.jpg (http://www.youtube.com/watch?v=O9OaaDFe4kA)

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

Gruß

mic

HermannSW
04.06.2007, 00:31
Hi,

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:
#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??

stochri
04.06.2007, 18:36
Hallo radbruch,

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

Gruss,
stochri

radbruch
04.06.2007, 18:58
Das geht deshalb so "ruck-zuck", weil ich mich selbst grad etwas mit den Möglichkeiten der Fernbedienungen beschäftige. O:)

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

http://img.youtube.com/vi/drHZkhQypsM/2.jpg (http://www.youtube.com/watch?v=drHZkhQypsM)

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

damaltor
06.06.2007, 09:31
hrhr... ich denke mal, dass mit einem komprimierungsalgorithmus mehr platz verbraucht wird als durch die komprimierten daten gewonnen...

wenn man allerdings versucht befehle aufzunehmen, dann sollte der eeprom doch reichen. man könnte auch 2 bytes für jeden befehl abspeichern (zB ein byte "vorwärts" zweites byte "eine sekunde"), dann sind immer noch 256 befehle speicherbar. damit kann man doch was anfangen. mit 265 befehlen kann der asuro schon recht lange fahren... auf der fernbedienung wäre das dann "nach oben" und "2" nacheinander gedrückt.

um dem problem mit dem rc5-code zu entgehen ist mir nochwas eingefallen: man nehme eine lernfähige fernbedienung (gibts ab 1 euro im ramschladen und bei ebay, das billigste modell reicht), stellt diese auf "lernmodus" und benutzt den transceiver um zB die fernbedienung den buchstaben "A" lernen zu lassen auf die nach-oben-taste. dann müsste die fernbedienung doch auf dieser taste ein "a" senden, oder? der asuro müsste dann den code nicht mehr decodieren, sonden nur ein "A" empfangen. wäre das möglich? oder lernt eine fernbedienung nur rc5-code? im endeffekt kann man doch auch nicht-rc5-konforme fernbedienungen einlesen, oder?

stochri
06.06.2007, 17:57
Das mit der Lern-Fernbedienung ist gar keine schlechte Idee, könnte vielleicht funktionieren.

Sternthaler
06.06.2007, 19:29
Hallo Leute,
warum wollt ihr unbedingt schon mit einer Fernbedienung anfangen?
Als Idee ist das ganze schon mal unter dem Nikolaus an dieser Stelle (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=170455#170455) angedacht.

Es bleibt aber auch an der Stelle dabei, dass das Problem mit dem Speicherplatz noch nicht 'überdacht' ist.

stochri
06.06.2007, 19:38
Hallo Sternthaler,

das mit der Fernbedienung hat meiner Meinung nach einen bestimmten "Spaßfaktor". Man kann den ASURO ohne groß die Bewegungen vorher zu programmieren intuitiv steuern. Und wenn man eine "Repeat" Taste hat, das ganze noch mal abspulen. Wenn man Glück hat, ist die Wirkung des Vorgangs ganz interessant, auch wenn es mit der Positionsgenauigkeit nicht so weit her ist.

Beste Grüße,
stochri

ehenkes
06.06.2007, 20:25
Fernbedienung? Meines Erachtens völlig inakzeptabel. Ein Roboter muss autonom "werkeln". ;-)

rossir
06.06.2007, 22:26
Ich finde die Idee auch klasse. Deshalb hier mein Programm:



#include "asuro.h"

#define NORMAL GREEN
#define PLAY YELLOW
#define REC RED

#define MAXSTORE 30
char dataStore[MAXSTORE]={ '9' };
unsigned int timeStore[MAXSTORE];

int main(void) {
char f=40, s=30, mode=NORMAL, idx=0, data;
unsigned int time=0;
long t0;

Init();
EncoderInit();
EncoderStart();
while(1) {
t0=Gettime();
StatusLED(mode);
SerRead(&data, 1, time);
switch(mode) {
case PLAY:
if(data=='T') {
data=dataStore[idx];
idx++;
time=timeStore[idx];
} else {
mode=NORMAL;
}
break;
case REC:
timeStore[idx]=Gettime()-t0;
dataStore[idx]=data;
idx=(idx+1)%MAXSTORE;
}

switch(data) {
case '9': mode=(mode==NORMAL) ? REC : NORMAL; time=0; idx=0; break;
case '0': mode=PLAY; time=1; idx=0; break;
case '1': Move( 0, f, 0); break;
case '3': Move(-s, s, 0); break;
case '5': Move(-f, 0, 0); break;
case '2': Move( f, f, 0); break;
case '6': Move(-f, -f, 0); break;
case 'o': Move( f, 0, 0); break;
case 'p': Move( s, -s, 0); break;
case 'u': Move( 0, -f, 0); break;
default: Move( 0, 0, 0);
}
}
}


1) Ich habe das Glück eine lernende Fernbedienung zu besitzen, die in der Lage ist RS232 Signale zu lernen. (Sollte aber auch mit ReadRC5() gehen.)

2) SerRead(.., timeout) ist bei mir so umgebaut, dass timeout in ms angeben wird. Kompatible zu Gettime().

3) Der Clou: Move(..) nutzt die Encoder-Odometrie und ist interrupt getrieben ( = läuft im Hintergrund ). Dadurch ist das Ganze sehr wiederholgenau.

Sternthaler
06.06.2007, 23:49
An alle Fernbediener:
Ich finde die Idee auch klasse, hatte als Einwand nur, dass man evl. erst mal mit einem 'Lernmode' anfängt, ohne gleich auch die 'Schwierigkeiten' mit einer Fernbedienung zu behandeln.
Das scheint aber wohl kein Problem zu sein.

@rossir
Kannst du mal bitte die Parameter und die Funktion von Move() erklären. Code?

HermannSW
07.06.2007, 00:27
Hi,

hrhr... ich denke mal, dass mit einem komprimierungsalgorithmus mehr platz verbraucht wird als durch die komprimierten daten gewonnen...wenn Du Dich da mal nicht verlachst!

Ich hatte schon mal mit dem GZIPInputStream von Tinyline gearbeitet, dessen .jar-File (Java !) war ganze 6KB groß:
http://www.tinyline.com/utils/index.html

Habe damit sogar auf dem Siemens S55 entzippen können -- wenn man in Java einen Entzipper in 6KB machen kann, dann kann man das in C und/oder Assembler doch wohl mit viel weniger Platz, oder?

Nur so als Beispiel: wenn man einen entzipper in 2KB hinkriegen würde, hätte man in den 5KB abzüglich des eigentlichen Programms richtig viel Platz(abhängig vom Komprimierungsgrad der Daten) ...

Falls sich jemand berufen fühlt, hier die notwendigen Infos zum Programmieren eines Entzippers:
http://de.wikipedia.org/wiki/Gzip

Gerade noch vor dem Absenden gegoogled:
http://en.wikipedia.org/wiki/DEFLATE

... Other possible focuses for a DEFLATE implementation could be super-fast compression speed, or being designed to have a very small executable code such for use in embedded systems. ...

stochri
07.06.2007, 08:01
Fernbedienung? Meines Erachtens völlig inakzeptabel. Ein Roboter muss autonom "werkeln".

Aber, aber ... Dogmatismus ist des Kreativen Tod. [-X
Man muss die Ideen aufgreifen, die am Rand des Weges liegen. =P~

rossir
07.06.2007, 11:37
@sternthaler
Hier der Code von Move(..). Inspiriert von Travel(..) und Rotate(..).
Allerdings bereitet Move(..) nur vor.
Die einfache encoder-Regelung (auch inspiriert von Travel(..) bzw. Rotate(..)) ist in SIGNAL (SIG_OVERFLOW2) {..} eingehängt, ähnlich wie dies für IsrRC5() in der Lib gemacht wird.

/* @param leftSpeed left motor speed in ticks per second. positive = forward, negative = backward
* @param rightSpeed right motor speed in ticks per second. positive = forward, negative = backward
* @param distance [mm].
* Stop if sum(leftTicks, rightTicks) > abs(distance).
* Run in background if distance<=0.
* Forever if distance==0.
* @return err in number of summed ticks
*/
int Move(const int leftSpeed_, const int rightSpeed_, int distance_) {
int tmp;

Ta=0;
if(t1==0 || Gettime()-t1>1000) {
t1=Gettime();
EncoderReset();
}
// We want to have at least 3 ticks collected from slowest encoder side and timeslot.
// Deshalb, suche sinnvolles Zeitintervall
// Idea: Ta=1000/(ticks/3)
tmp= abs( (abs(leftSpeed_)<abs(rightSpeed_)) ? leftSpeed_ : rightSpeed_ );
tmp= (tmp>0) ? 3*1000/tmp : 10;
if (tmp<10) tmp=10; //not to smal
if (tmp>300) tmp=300; //not to big

// Werte für Interruptroutine
measure=(distance_!=0);
distance=distance_*6/10;
leftSpeed=leftSpeed_;
rightSpeed=rightSpeed_;
Ta=tmp;

while(distance>0&&distance_>0&&leftSpeed!=0&&rightSpeed!=0) mSleep(1);
return distance;
}

Sternthaler
07.06.2007, 14:18
Danke rossir,
werde ich mir nachher mal ansehen. (Jetzt drängelt aber erst meine Frau zu einer Radtour. Bin ich nun ferngesteuert?)

radbruch
07.06.2007, 14:36
Hallo

Ich kann immer noch keine Speicherplatzprobleme erkennen, vielleicht solltet ihr die Postings ab und zu mal lesen:


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=2048) plus das Kommando in zwei Bytes gespeichert werden.

Das ist doch deutlich effektiver als ein Byte fürs Kommando und ein Byte für die Dauer/Strecke zu belegen. Ich kann 15 verschiedene Kommandos und gleichzeitig Werte bis 2000 in einem Integer speichern.

Gruß

mic

damaltor
08.06.2007, 11:23
aber wo kommt dann der integer hin? man könnte ihn evtl splitten und dann als zwei bytes im eeprom ablegen, damit die gefahrene strecke erhalten bleibt... zum thema autonomie: klar sollte ein roboter autonom sein. aber irgend jemand muss ihm doch sagen was er machen soll.. also mit der fernbedienung den weg zeigen den er machen soll. und dann macht er diese "aufgabe" bis er was neues hört... ausserdem: was spricht gegen einen nicht vollkommen autonomen roboter?

radbruch
08.06.2007, 16:22
Ja, als 2-Byte-Wert ins EEProm. Oder als ASCII zurück zum PC nach dem Schema:

wert[0]=w0*16+k0 // Wert 0 mit Komando 0
wert[1]=w1*16+k1 // Wert 1 mit Komando 1
...
...
wert[n]=wn+16+kn // wert n mit Komando n

Wert und Kommando jeweils mit PrintInt(), der Rest mit SerWrite() zum PC gesendet kann man die Werte als Mensch lesen (und editieren) und als Code oder Include in das Programm einfügen als Defaultweg.

mic

Roboaktiv
08.06.2007, 16:53
Im Grunde ist die Sache ganz einfach
http://www1.conrad.de/scripts/wgate/zcop_b2c/~flNlc3Npb249UDkwV0dBVEU6Q19BR0FURTAzOjAwMDIuMDEyN y5iNWMwYTZlOSZ+aHR0cF9jb250ZW50X2NoYXJzZXQ9aXNvLTg 4NTktMSZ+U3RhdGU9MTM4NTg3ODk2Nw==?~template=PCAT_A REA_S_BROWSE&mfhelp=&p_selected_area=%24ROOT&p_selected_area_fh=&perform_special_action=&glb_user_js=N&shop=B2C&vgl_artikel_in_index=&product_show_id=&p_page_to_display=DirektSearch&~cookies=&zhmmh_lfo=&zhmmh_area_kz=&s_haupt_kategorie=&p_searchstring=Asuro&p_searchstring_artnr=&p_search_category=alle&r3_matn=&insert_kz=&area_s_url=&brand=&amount=&new_item_quantity=&area_url=&direkt_aufriss_area=&p_countdown=&p_80=&p_80_category=&p_80_article=&p_next_template_after_login=&mindestbestellwert=&login=&password=&bpemail=&bpid=&url=&show_wk=&use_search=3&p_back_template=&template=&kat_save=&updatestr=&vgl_artikel_in_vgl=&titel=&darsteller=&regisseur=&anbieter=&genre=&fsk=&jahr=&jahr2=&dvd_error=X&dvd_empty_error=X&dvd_year_error=&call_dvd=&kna_news=&p_status_scenario=&documentselector=&aktiv=&p_load_area=$ROOT&p_artikelbilder_mode=&p_sortopt=&page=&p_catalog_max_results=20
Diesen dualen Fahrtenregler einbauen und dann gehts los.
Oder wollt ihr das Programmieren?
Dazu fehlt mir leider das Wissen, weil ich mit dem Asuro angefangen hab zu programmieren und ich die Bücher noch nicht habe.

Roboaktiv
08.06.2007, 17:06
Sorry war der Falsche Link
Richtig:
Link geht irgendwie nicht
Artikel-Nr.: 190872 - 62
Name:FAHRTREGLER RAUPE
Eins von beiden bei "Suche" eingeben

Sternthaler
09.06.2007, 00:40
Oh jemine,
schaut mal hier (http://www.arexx.com/arexx.php?cmd=system&cparam=set_pg_lang(p_asuro_rovipro.dat|DE|true)).
Da hat doch schon einer(*) was 'gebastelt'! Aber super, wenn man keine Fernbedienung nutzen möchte.

*=arexx-henk

Roboaktiv
11.06.2007, 15:01
Hi Sterntaler,
hast du mit diesem EASY-ASURO Ding schon Erfahrung?
Wenn ja: Wie läd man die geschriebenen Programme auf den Asuro?

Schönere Grüße von Roboaktiv

inka
11.06.2007, 15:38
mit upload, bzw. upload & run...

Sternthaler
11.06.2007, 23:11
Ja, upload geht bei mir auch.
Klar, erst im Menue die richtige serielle Schnittstelle auswählen.
Eins der mitgelieferten Testprogramm laden und "upload & run"
--> Vorsicht: Asuro erst mal in der Hand halten, oder Platz auf der 'Spielwiese' schaffen, da einige Testprogamme den Asuro fahren lassen.
Was ich nicht hinbekommen habe, ist dass man die Farbe der Status-LED sinnvoll --> abfragen <-- kann. Laut Doku wird die Farbe gesetzt, der 'Block' wartet die angegeben Zeit, und macht die Status-LED wieder aus. Jede folgende Abfrage hat dann keine Farbe mehr. Auch im Tasten-Interrupt-Zweig habe ich es noch nicht hinbekommen. (Liegt aber bestimmt an mir)

P.S.: Da das hier nicht der richtige Thread für 'EASY-ASURO' ist, ist dies mein letzter Eintrag hierzu.
Entschuldigung bei allen anderen.

Roboaktiv
12.06.2007, 16:23
Aber wenn ich da drauf klicke und den Asuro anschalte (Wei bei dem normalen Flash-Programm) den fährt der Asuro mt dem Progrmm los, was ich noch auf die "C-Schreibmethode" geschreiben.
Das ist das große Problem

Danke für eure zukünftigen Lösungen

Roboaktiv

damaltor
13.06.2007, 16:21
so, nachdem ich heut mal wieder mächtig zugeschlagen habe im forum (bin grade am umziehen, und komme nur alle paar tage mal ins internetcafe) wollte ich mal fragen: was gibts neues? hat jemand mal ein entsprechendes programm geschreiben? ich habe den asuro noch verpackt in irgend einer kiste, und deshalb keine zeit...

Roboaktiv
22.06.2007, 09:50
Hi damaltor,
Willkommen zurück!!
Wie du siehst sind wir ein wenig vom Thema abgekommen. Leider hab ich keinen weiteren Lösungsvorschlag.

Roboaktiv

damaltor
22.06.2007, 23:46
mir ist noch eingefallen, dass man einen i2c-eeprom als speichermedium nutzen könnte... oder auch mehrere... dann wäre das speicherproblem gelöst.

ehenkes
23.06.2007, 08:38
i2c-eeprom als speichermedium
https://www.roboternetz.de/wissen/index.php/I2C_Chip-%C3%9Cbersicht#Memory
Welcher Chip ist hier empfehlenswert? Die oben zitierten EEPROM-Bausteine sind veraltet.

damaltor
26.06.2007, 13:18
mmh... veraltet = billig ;)

ist eigentlich egal, 2 kB sollten wohl reichen. das wäre dann schonmal 4x so viel wie in den onboard-eeprom geht (den man aber trotzdem noch zusätzlich nutzen könnte, das währen dann 2,5kb.)