PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mein erstes vernünftiges Programm?



radbruch
04.01.2007, 00:38
Hallo

Mein Ansatz für das Anstossproblem (https://www.roboternetz.de/phpBB2/viewtopic.php?t=26250l) dieser Tage und der Versuch einer zuverlässigen Tastenabfrage sieht so aus:


/* asuro fährt nach Anstoss einstellbare Zeit drehend(!) zurueck
mic 4.1.2007
*/
#include <asuro.h>

unsigned long zurueckzeit; // Zeit Rueckwaerts in Millisekunden
unsigned char sw,sw0,sw1,sw2; // Zwischenspeicher für Schalter k1-k6

int main(void) {
Init();

zurueckzeit=0; // vorwärts losfahren
MotorDir(FWD,FWD);
MotorSpeed(150,150);
BackLED(OFF,OFF);

/* Achtung! Das funzt nur wenn die Taster richtig erkannt werden!
*/

do {
sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;

if (!zurueckzeit && (sw==32)) {
zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(90,150);
BackLED(ON,OFF);
}

if (!zurueckzeit && (sw==16)) {
zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(90,150);
BackLED(ON,OFF);
}

if (!zurueckzeit && (sw==2)) {
zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(150,90);
BackLED(OFF,ON);
}

if (!zurueckzeit && (sw==1)) {
zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(150,90);
BackLED(OFF,ON);
}

if (zurueckzeit && (Gettime() > zurueckzeit)) { // Lange genug zurueck?
zurueckzeit=0;
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
BackLED(OFF,OFF);
}

}while (1); // mainloop (Endlosschleife)

return 0;
}

Die Tasten werden 3x abgefragt und bei Gleichheit als gültig gewertet.

Die Funktionen der Tasten:

k1(Wert1): asuro fährt kurze Zeit rückwärts drehend rechts mit BackLED
k2(Wert2): asuro fährt lange Zeit rückwärts drehend rechts mit BackLED
k5(Wert16): asuro fährt lange Zeit rückwärts drehend links mit BackLED
k6(Wert32): asuro fährt kurze Zeit rückwärts drehend links mit BackLED

Das funktioniert bei meinem asuro fast tadellos. "Fast" weil unglaublicherweise dies geschah:

http://img201.imageshack.us/img201/8526/anstossjh5.gif

Blöderweise werden k3 und k4 nicht abgefragt. Aber wer hätte gedacht, dass die Testfahrt nach zwei Minuten so endet?

Gruß

mic

radbruch
04.01.2007, 02:31
Aber hallo,

dass kann ich ja so nicht auf mir sitzen lassen. Hier das Update mit "Rettungsanker":


/* asuro fährt nach Anstoss einstellbare Zeit drehend zurueck mit timeout

Der timeout "rettet" unser Baby wenn es feststeckt,
(aber nur, wenn die Raeder nicht unterm Sofa eingeklemmt sind ;-)

mic 4.1.2007
*/
#include <asuro.h>

unsigned long zurueckzeit; // Zeit Rueckwaerts in Millisekunden
unsigned long timeout; // zu lange kein Taster gedrückt
unsigned char sw,sw0,sw1,sw2; // Zwischenspeicher für Schalter k1-k6

int main(void) {
Init();

zurueckzeit=0; // vorwärts losfahren ohne timeout
timeout=Gettime()+7000; // ein Defaultwert für Standartzimmer
MotorDir(FWD,FWD);
MotorSpeed(150,150);
BackLED(OFF,OFF);
FrontLED(OFF);

/* Achtung! Das funzt nur wenn die Taster richtig erkannt werden,
sonst bleibt der asuro auf freier Strecke stehen!
*/

do {
sw0=PollSwitch(); // Schalter einlesen und für eine Runde speichern
sw1=PollSwitch();
sw2=PollSwitch();
//(sw0==sw1==sw2)?(sw=sw0):(sw=0); // swx gleiche Tasten?
if ((sw0==sw1) && (sw0==sw2)) sw=sw0; else sw=0;

if (!zurueckzeit && (sw==32)) {
zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(90,150);
BackLED(ON,OFF);
}

if (!zurueckzeit && (sw==16)) {
zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(90,150);
BackLED(ON,OFF);
}

if (!zurueckzeit && (sw==2)) {
zurueckzeit=Gettime()+1500; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(150,90);
BackLED(OFF,ON);
}

if (!zurueckzeit && (sw==1)) {
zurueckzeit=Gettime()+750; // Aktuelle Zeit plus x millisek. zurueck
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(150,90);
BackLED(OFF,ON);
}

if (zurueckzeit && (Gettime() > zurueckzeit)) { // Lange genug zurueck?
zurueckzeit=0;
MotorSpeed(0,0);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
BackLED(OFF,OFF);
FrontLED(OFF);
}

if (Gettime() > timeout) { // wir stecken fest :-(
zurueckzeit=Gettime()+750;
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(0,150);
BackLED(ON,ON); // Mit voller Beleutung zurueck, etwas Show muss sein ;-)
FrontLED(ON);
}

if (zurueckzeit) timeout=Gettime()+7000; // abhängig vom Gelände ;-)

}while (1); // mainloop (Endlosschleife)

return 0;
}

Neue Funktion:

Der asuro flipt aus wenn er sich festfährt.

Ich bin der Herr und er ist der Knecht!

Gruß

mic

radbruch
04.01.2007, 03:13
Unglaublich! Nach ein paar Minuten blieb er hier stecken:

http://img405.imageshack.us/img405/7826/anstoss5tfr3.gif
Vollbild (http://img390.imageshack.us/img390/3598/anstoss5fu5.jpg)

Ich muss das nochmal überdenken....

(Sorry für die miese Dokumentation, aber meine Videocam schläft leider schon)

Gruß

mic

momomu
04.01.2007, 06:01
Dies hat nun nichts mit Software zu tun.
Es ist ein echtes Hardware (konstruktives) Problem des Asuro. Der Einfachheit halber wurden nur die 6 Schalter verbaut, so daß er an manchen Stellen "gefühllos" ist. Ich bin gerade dabei, eine Mechanik zu bauen und zu optimieren, welche diese Probleme vermeidet.

gtacelt
04.01.2007, 11:13
Ich hab mal im Forum ein Programm gesehen, da wurde das Problem gelöst.
Da erkannte der Asuro mittels Odometrie, ob er sich "festgefahren" hat oder nicht.

Serious
04.01.2007, 11:31
Ja, das ist ganz einfach, hab ich auch schon implementiert. Einfach messen, ob die Geschwindigkeit sehr stark unter den Normalwert fällt.

Storchi hat das glaub ich mal geschrieben.

damaltor
04.01.2007, 15:52
heyho,

erstmal: bitte nicht so riesige bilder posten!!

dann: es gibt hier im forum eine methode, die unabhängig von den tastern die kollision abgefragt wird (über die odometrei werte). sucht mal. diese funktion funktioniert nämlich auch, wenn keinder der taster erwischt wurde und auch zB rückwärts.

radbruch
04.01.2007, 20:05
Hallo

Danke für die Anteilnahme, dass mit der Bildgröße tut mir leid, es war schon spät..

Natürlich geht das alles besser, wurde schon zig mal gemacht und die Programme stehen irgendwo im Forum zum Download bereit. Aber ich habe mir den asuro zugelegt weil ich das selbst machen möchte, zum einen, weil ich etwas c lernen möchte und zum anderen weil ich das Programmieren mit mangelhafter Hardware liebe (im Ernst!).

Da ich ja noch Anfänger bin, mir aber die "Sleep(xxx) und tu solange nichts"-Programme gar nicht gefallen und ich meinen asuro noch beschnuppere sind meine Programme noch bescheiden. Aber immerhin klappt nun meine Tastenabfage zuverlässig und meine Programme laufen als Loop ohne Warteschleifen (noch ohne Interrupts). Das ist schon mal ok nach der kurzen Zeit. Und bevor ich mich auf pulsbreitenmodulierte Drehzahl- und Lageregelungen stürzte möchte ich erst noch die restliche Sensorik austesten.

Gruß

mic

stochri
04.01.2007, 21:26
Storchi hat das glaub ich mal geschrieben.

Stimmnt, ich war's: https://www.roboternetz.de/phpBB2/viewtopic.php?p=214058

Der Sourcecode befindet sich im Thread.

Mein Nickname ist allerdings sto-chri und hat nix mit einem Storch zu tun....

Gruß,
stochri

radbruch
04.01.2007, 22:19
stochri hat auch die Methode der Mehrfachabfrage der Taster schon vor zwei Jahren beschrieben. Danke an dieser Stelle.

mic