PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kollisionstaster-Programm geht nicht



Zöttl
29.11.2005, 15:10
Hallo!

habe nun den Asuro endlich zum flashen gebracht.

Hab nun folgendes Programm gecodet:



# include "asuro.h"

int main()
{

Init();

char ready[2];



StatusLED(RED);
Sleep(72000);
StatusLED(YELLOW);
Sleep(72000);
StatusLED(GREEN);

SerWrite("I'm gonna to drive on\n\rPress \"go\" and I 'll start...\n\r", 54);
SerRead(ready, 2, 0);

if ((ready[0]=='g')&&(ready[1]=='o'))
{
Sleep(72000);

MotorDir(FWD, FWD);
MotorSpeed(200,200);

SerWrite("\n\n\n\n\rYeah! I'm drivin'", 22);
while(1)
{

if(PollSwitch()>0)
{
SerWrite("I'm pushed on an item!", 22);
StatusLED(RED);
MotorSpeed(100, 100);
Sleep(30000);
MotorSpeed(0, 0);
Sleep(72000);
MotorDir(RWD, RWD);
MotorSpeed(80, 80);
Sleep(360000);
MotorDir(FWD, RWD);
MotorSpeed(100, 100);
Sleep(144000);
MotorDir(FWD, FWD);
Sleep(50000);
MotorSpeed(200, 200);
StatusLED(GREEN);
}


}

}
else
SerWrite("\n\n\n\rI can't drive on, 'cause you 've written false signs\n\n", 58);



while(1);

return 0;

}




Das Einzige was er aber macht, ist fahren und wenn er kollidiert,
schaltet ganz kurz das StatusLED von grün auf rot und das wars...
Trotz der Sleeps? Wie kann das gehen?

Hab ich was vergessen?


mfg

maze2k
29.11.2005, 15:36
Ich glaube die vorgegebene Sleep() Funktion funktioniert nur bis zu 3 ms. Probier mal diese Erweiterung von Sleep (funktioniert bei mir einwandfrei):


/* uses 72kHz timer => Sleep(x) = x/72kHz [sec] */
void Sleep(unsigned char time72kHz)
{
count72kHz = 0;
while (count72kHz < 72);
}

void sleep(int milliseconds) {
int i;
for (i=0; i<milliseconds; i++) {
Sleep(72);


Dann natürlich sleep() verwenden, nicht Sleep().

Kam denn "I'm pushed on an item!" bei dir überhaupt an?
Wenn ja, dann bau mal am Ende der PollSwitch-Abfrage nochmal ein SerWrite() ein. Dann siehst du im Hyperterminal schon, wie lange die Abfrage + Behandlung dauert.

Zöttl
29.11.2005, 16:01
ahh, werds mal so versuchen.
danke

"I'm pushed on an item!" kam an, ja, mehrmals solange der Taster gedrückt war.
Also nicht sehr lange ^^

maze2k
29.11.2005, 16:15
Hier mal meine (sehr einfache) Kollisionsabfrage:



MotorDir(BREAK, BREAK);
MotorSpeed(0, 0);
StatusLED(YELLOW);

/* compute switch state for each switch */
int switches[6] = { 0, 0, 0, 0, 0, 0 };
int i, switchValue;
for (i=0; i<6; i++) {
switchValue = power(2, (6-i-1));
if (poll-switchValue >= 0) {
switches[i] = 1;
poll -= switchValue;
}
}

/* frontal hit */
if (switches[1] == 1 || switches[4] == 1) {
MotorDir(RWD, RWD);
MotorSpeed(L_HALF, R_HALF);
sleep(300);
if (tickcount % 2 == 0) {
MotorDir(RWD, STOP);
} else {
MotorDir(STOP, RWD);
}
sleep(100 * tickcount);
} else if (switches[0] == 1) {
MotorDir(FWD, FWD);
MotorSpeed(L_HALF, STOP);
sleep(S_EDGE);
} else if (switches[5] == 1) {
MotorDir(FWD, FWD);
MotorSpeed(STOP, R_HALF);
sleep(S_EDGE);
}


Überall wo die Variable tickcount steht, kannst du das auch wegmachen oder eine andere Zeit eingeben. Tickcount ist bei mir eigentlich nur eine Zufallsvariable und zuständig um zu überprüfen, ob wirklich ein "hit" vorkommt oder nur eine elektronische Störung vorliegt (was beim Asuro manchmal komischerweise so ist... Manchmal wird einfach eine Kollision erkannt, obwohl da gar nichts ist).

Kurz zur Erklärung. Das Programm macht folgendes (Nachdem die Kollision überhaupt erkannt wurde natürlich [mit folgender Zeile: "int poll = PollSwitch();"] ):

- Anhalten + Gelbe LED an
- PollSwitch()-Signal aufteilen auf alle 6 Taster
- Frontalen oder links/rechts schrägen Hit erkennen
- Ausweichen

Zöttl
29.11.2005, 18:15
@maze2k

hab nur das Problem das es bei mir z.B. STOP oder R_Half nicht erkennt.

Gibts da eine neue Version von asuro.c?

Zöttl
05.12.2005, 18:01
hallo!

was tun bei folgender Meldung:

test.c:21: error: `L_HALF' undeclared (first use in this function)
test.c:21: error: `R_HALF' undeclared (first use in this function)
test.c:22: warning: implicit declaration of function `sleep'
test.c:24: error: `STOP' undeclared (first use in this function)
test.c:32: error: `S_EDGE' undeclared (first use in this function)

Und nochwas:
ist das normal, wenn er mit neuen Batterien alle 3 Sekunden (!) glaubt, er sei kollidiert obwohl gar nichts im Wege steht?

Bitte um eure Antworten

mfg

m.a.r.v.i.n
06.12.2005, 09:49
Hallo Zöttl,

L_HALF, R_HALF, STOP und S_EDGE sind in dem Beispiel von maze2k nicht definiert. In C macht man das so:



#define L_HALF 100 // linker Motor halbe Kraft
#define R_HALF 100 // rechter Motor halbe Kraft
#define STOP 0 // Motor Stop
#define S_EDGE 1000 // 1 Sekunde warten


Der Compiler ersetzt dann einfach die Konstanten mit den entsprechenden Werten beim compilieren.

Die Funktion sleep() wurde weiter oben im Thread gezeigt. Auch die muß in dein Programm, damit es funktioniert. Den Code vor die main() Funktion
kopieren oder einen Prototypen der Funktion am Anfang des Programmes definieren.



void sleep(int ms); // Prototyp für sleep Funktion


Das Problem mit den Tasten wurde auch schon bis zur Erschöpfung in zig threads erläutert.
Hier nochmal in Kurzfassung. PollSwitch() Funktion 2 x aufrufen (oder 3x).
Die zurückgegeben Werte vergleichen (t1 && t2 nicht 0, und t1 identisch mit t2) und nur dann auswerten.



unsigned char t1, t2;
...

t1 = PollSwitch(); // 1. Abfrage
t2 = PollSwitch(); // 2. Abfrage

if (t1 && t2 && t1 == t2) // Beide Werte müsssen identisch sein
poll = t1;
else
poll = 0;
...



Alle Klarheiten beseitigt? :wink:

Gruß Peter

Zöttl
06.12.2005, 13:20
JA :D

Das mit den defines hätt ich eigentlich wissen müssen...
sorry, hab mich auf Irrwege führen lassen...


Ah, jetzt versteh ichs erst, für was das mit den mehreren Pollswitchabfragen soll.


Danke!

mfg

Lunarman
07.12.2005, 12:42
bei mir ist das jetzt aber so, dass der Asuro die ganze zeit irgendetwas erkennt, obwohl ich nach rat der typen vom School_lab sogar siebenmal abfrage. Vielleicht fragt er jetzt so häufig ab, dass er schon meint, dass da jetzt einfach etwas sein muss ;-)

m.a.r.v.i.n
07.12.2005, 13:00
Hallo Lunarman,

Bei meinem Asuro mußte ich sogar 8x PollSwitch aufrufen, bis das Ergebnis stabil war.
Die Programm Variante mit 2-3 abfragen und dem Vergleich der Ergebnisse funktioniert aber genauso zuverlässig, wenn nicht sogar besser.
Vieleicht hat bei deinem Asuro eine Taste einen Kurzschluß.
Dann hilft nur ein Testprogramm mit Ausgabe der Tastenwerte.
Ein entsprechendes Programm findest sich z.B. hier:
http://asuro.pytalhost.de/pmwiki/pmwiki.php/Main/TastSensorTestC

Gruß Peter