PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro- dauernd kollision



brandy89
03.10.2008, 14:59
hallo
Ich habe meinen Asuro zusammengelötet und der selbsttest funktionierte.
Ich habe folgendes programm auf meinen Asuro geflasht:

#include "asuro.h"
int main(void) {
Init ();
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(100,100); // Beide Motoren etwa halbe Kraft voraus
StatusLED(GREEN); // Status-Leuchtdiode auf grün schalten
while (PollSwitch()==0) { // Solange keine Kollision erfolgte...
SerWrite("Alles OK!\n",10); // ... Euphorie verbreiten
}
MotorSpeed(0,0); // Kollision! Sofort anhalten!
StatusLED(RED); // Statusleuchtdiode rot schalten
while (1) {
SerWrite("Aua!\n",5); // und weinen!
}
}


Jedoch glaubt mein Asuro, dass nach dem einschalten sofort eine Kollision hat, bleibt stehen und die lampe leuchtet rot.

Könnt ihr mir helfen?

mfg.

radbruch
03.10.2008, 15:28
So vielleicht?

while (PollSwitch()==0 && PollSwitch()==0) {

StatusLED ist nach Init() immer grün.

Gruß

mic

nil.at
03.10.2008, 15:52
Hi und willkommen im Forum!

So ein "ähnliches" Problem hatte ich vor kurzem auch (Link (https://www.roboternetz.de/phpBB2/viewtopic.php?t=43228)), dort wurde mir empfohlen die PollSwitch immer mehrfach zu überprüfen da sie öfters Fehler liefert.
Und sowieso ist es gut die Taster erstmal zu kalibrieren, ich habe dazu den Code von Sternthaler von hier (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=328229) verwendet (18. Post). Damit sehe ich am Hyperterminal sofort welchen Wert welcher Taster liefert.

PS: Verwende um einen Code anzuzeigen bitte die Code-Tags. [.Code] am Anfang und [./Code] am Ende. Allerdings ohne den Punkten.

brandy89
03.10.2008, 17:40
danke für die schnelle antwort!

wenn ich diesen code verwende:
while (PollSwitch()==0 && PollSwitch()==0) {
fährt er zwar, aber wenn ich einen Taster drücke tut sich nichts.

ich bae vorher mit einem anderen programm meine taster ausgewertet
und es ergab folgende werte:
Taster1: 1
Taster2: 2
Taster3: 4
Taster4: 8
Taster5: 16
Taster6: 32

müsste passen, oder?

ich habe auch ein weiteres problem
wenn ich im programm vereinbart habe, die status led soll rot leuchten, leuchtet sie grün und umgekehrt.

radbruch
03.10.2008, 17:52
Hallo

Bei meinem asuro funktioniert das sogar mit dreifacher PollSwitch()-Abfrage. Aber bei dem laufen keine Motoren mit die stören könnten. Schau mal deine Tastenwerte bei laufenden Motoren an, vielleicht ändert sich da was. K1 ist 32! StatusLED ist falschrum eingelötet.

Gruß

mic

brandy89
03.10.2008, 18:05
ok
die status les werde ich morgen gleich umlöten.

hab den asuro von vorne angesehen und dann von links nach rechts die taster getstet.


und die tastenwerte werde ich auch nochmal überprüfen.

DANKE

radbruch
03.10.2008, 18:20
Nach dem Platinenaufdruck (Manual S.16) ist K6 beim Ein-/Ausschalter. Der wird mit PollSwitch() als Wert 1 erkannt:


#include "asuro.h"
int main(void) {
Init ();

while(1)
{
PrintInt(PollSwitch());
SerWrite("\n\r", 2);
Msleep(200);
}
}

brandy89
05.10.2008, 10:25
ich weiß nicht ob das relevant ist, aber wenn ich
(PollSwitch()==1) schreibe, dann fährt er, aber die taster reagieren nicht.

hab jetzt noch mal die taster getestet:



#include "asuro.h"

int main (void)
{
unsigned char x; //definition der pollswitch-variable
unsigned char string [5]; //definition eines string mit max. 5 zeichen

Init ();
while (1)
{
x = PollSwitch (); //taster werden abgefragt
itoa (x, string, 10); //wert wird umgewandelt und in string gespeichert
SerWrite (string, strlen (string)); //string wird an terminal geschrieben
SerWrite ("\n\r", 2); //umbruch an terminal schreiben
//("\n" und "\r" sind je ein byte!)
}
}


er sendet nu "84" und beim drücken der taster ändert sich nichts

radbruch
05.10.2008, 11:19
Hallo

Deine Kommentare gefallen mir. Vorbildlich :)

Um das Problem mit strlen() zu umgehen kann man den String mit 0-Werten vorbelegen. SerWrite() erkennt das als Stringende und bricht die Übertragen beim ersten Zeichen=0 ab obwohl beim Aufruf 5 Zeichen angegeben wurden. (Das ist allgemein die Endekennung eines Strings in C).

Wir wollten doch mit laufenden Motoren testen:


#include "asuro.h"

int main (void)
{
unsigned char x; //definition der pollswitch-variable
unsigned char string [5]; //definition eines string mit max. 5 zeichen

Init ();

/********************************************
/* Achtung! Der asuro kann jetzt losfahren! *
/********************************************/

MotorSpeed(150,150); // elektrischen Krach machen

while (1)
{
StatusLED(RED); // wir senden
for(x=0; x<5; x++) string[x]= 0; // String mit Endekennungen vorbelegen
x = PollSwitch (); //taster werden abgefragt
itoa (x, string, 10); //wert wird umgewandelt und in string gespeichert
SerWrite (string, 5); //string wird an terminal geschrieben
SerWrite ("\n\r", 2); //umbruch an terminal schreiben
//("\n" und "\r" sind je ein byte!)
StatusLED(YELLOW); // wir warten 1/4 Sekunde
for(x=250; x; x--) Sleep(72); // 250 mal eine ms
}
}


Bei mir sind auch hier noch die Tastenwerte richtig, vermutlich weil ich keine Motoren an meinem asuro habe :)

Gruß

mic

brandy89
05.10.2008, 11:45
also
ich habe das programm getestet.
folgendes lese ich aus, wenn ich den asuro einschalte und nichts drücke:



0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
33
0
16
0
0
8
0
0
0
0
5
0
2
0
0
0
0
0
1
0
0
0
0
2
0
0
0
0
0
1
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
00
0
2
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
2
0
0
0
0
0
0
0
1
0
0
2
0
0
0
0
4
0
0
2
0
0
0
0
8
0
0
0
0
0
1
16
0
0
0
33
0
0
0
33
0
33
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
2
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
2
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
2
0
0
0
0
0
4
2
0
2
0
0
0
8
0
0
16
0
0
32
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
1
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
0
0
0
0
0


wenn ich dann die Taster dazu noch drücke kommt:
mit k6 angefangen:



16
0
0
2
0
0
0
0
2
0
4
0
8
7
16
16
2
32
1
0
0





wenn ich einen taster hintereinander drücke kommt


1
1
2
1

2
2
2

4
4
4

8
9
8
7
8
8

16
16
6
16

33
34
32
32
23

radbruch
05.10.2008, 12:13
Hallo

Es dürften bei einzeln gedrückten Tasten nur die sechs Werte 1, 2, 4, 8, 16 und 32 auftreten, alles andere würde bei Tastenabfragen ohne Überprüfung zu unerwarteten Effekten führen. Ganz anders sieht es auch aus wenn man PollSwitch() häufiger ausführt. Dann sind es nicht einzelne Ausreiser sondern ganze Serien!

Das Programm prüft bei laufenden Motoren einen von PollSwitch() gelieferten Wert auf die einzelnen Tasten. Bei unsinnigen Werten werden diese zum Terminal gesendet. K5 (Wert 2) ist Testtaste:


#include "asuro.h"

int main (void)
{
unsigned char x; //definition der pollswitch-variable
unsigned char string [5]; //definition eines string mit max. 5 zeichen

Init ();

/********************************************
/* Achtung! Der asuro kann jetzt losfahren! *
/********************************************/

MotorSpeed(150,150); // elektrischen Krach machen

while (1)
{
for(x=0; x<5; x++) string[x]= 0; // String mit Endekennungen vorbelegen
x = PollSwitch (); //taster werden abgefragt
if(x)
switch(x)
{
case 1: StatusLED(YELLOW); break; // reguläre Tastenwerte prüfen
//case 2: StatusLED(YELLOW); break;
case 4: StatusLED(YELLOW); break;
case 8: StatusLED(YELLOW); break;
case 16: StatusLED(YELLOW); break;
case 32: StatusLED(YELLOW); break;
default : // Schrott empfangen
{
StatusLED(RED);
itoa (x, string, 10); //wert wird umgewandelt und in string gespeichert
SerWrite (string, 5); //string wird an terminal geschrieben
SerWrite ("\n\r", 2); //umbruch an terminal schreiben
break;
}
}
}
}


Bei mir wird bei diesem Test auch einiges an Schrott empfangen. Das ist eben normal und sollte softwaremäßig ausgefiltert werden.

Gruß

mic

[Edit]
Zum Vergleich noch mit einfacher Überprüfung:

if(x) wird zu if(x && (x == PollSwitch()))

Testtaster K5 ist natürlich Schwachsinn. Mehr als eine Taste gleichzeitig ist der Test ;)

brandy89
05.10.2008, 12:46
also bei diesem programm empfange ich garnichts.
bei if(x) drehen die motoren, sendet aber nichts


bei if(x && (x == PollSwitch())) drehen die motoren nicht, man hört aber ein leises surren, sendet aber auch nichts



Habe jetzt noch mal nur die taster getestet.
mit:



#include "asuro.h"

int main (void)
{
unsigned char x; //definition der pollswitch-variable
unsigned char string [5]; //definition eines string mit max. 5 zeichen

Init ();
while (1)
{
x = PollSwitch (); //taster werden abgefragt
itoa (x, string, 10); //wert wird umgewandelt und in string gespeichert
SerWrite (string, strlen (string)); //string wird an terminal geschrieben
SerWrite ("\n\r", 2); //umbruch an terminal schreiben
//("\n" und "\r" sind je ein byte!)
}
}




alle taster tun genau das, was sie sollen nur nicht k1
er sendet immer


33
33
33
33
32
32
32
32
33
33
33
33
32
32
.
.


ist er kaputt?

radbruch
05.10.2008, 14:06
Nein, der ist vermutlich nicht kaputt. Vielleicht kannst du das durch kalibrieren ausbügeln. In asuro.c am Ende der Funktion PollSwitch() steht eine Formel die den ADC-Wert umrechnet. Die sieht bei mir so aus:


//return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
//return ((10240000L/(long)i-10000L)*61L+5000L)/10000;
return ((10240000L/(long)i-10000L)*63L+5000L)/10000;



also bei diesem programm empfange ich garnichts.
bei if(x) drehen die motoren, sendet aber nichts

Es wird nur etwas gesendet wenn mit PollSwitch() ein Wert eingelesen wird der keiner einzelnen Taste entspricht. Wenn man also mehr als eine Taste drückt oder eine Taste einen falschen Wert liefert (mehrfach drücken!) wird der Wert ausgegeben und die StatusLED wird rot. Der nächste gültige Wert schaltet sie dann wieder auf gelb, dabei wird aber nichts ausgegeben.

brandy89
05.10.2008, 14:30
so

ich habe die ursprüngliche formel belassen , nur dass ich satt 61.0, 62.0 geschrieben habe.
nun liefern alle taster die richtigen werte

brandy89
24.10.2008, 11:22
HAllo

schon lange her...

mein asuro funkt immer noch nicht.

mein lehrer meint ich soll in diesem programm:



#include "asuro.h"

int main(void)
{ int Variable;
Init();
Sleep(500);

MotorDir(FWD,FWD); // Beide Motoren auf vorwärts
MotorSpeed(120,120); // Beide Motoren etwa halbe Kraft voraus
StatusLED(GREEN); // Status-Leuchtdiode auf grün schalten

while (PollSwitch()==0) // Solange keine Kollision erfolgte...
{ SerWrite("Alles OK!\n",10); // ... Euphorie verbreiten
}
MotorSpeed(0,0); // Kollision! Sofort anhalten!
StatusLED(RED); // Statusleuchtdiode rot schalten


while (1)
{ SerWrite("AUA!",5); // und weinen!
}
}


Die pollswitch auf eine varibale legen
und dann die varibale anstatt des Aua ausgeben, damit man sieht, welcher taster betätigt worden ist.

nur habe ich keinen ahnung wie ich das machen soll.

könnt ihr mir helfen?

danke

damaltor
27.10.2008, 14:02
wie pollswitch funktioniert weisst du.

wie man etwas zum pc sendet weisst du auch....

was fehlt?

brandy89
27.10.2008, 15:18
ich habe es scho versucht indem ich
variable = PollSwitch
setzte

und statt AUA! wollte ich die variable ausgeben-
nur funktionierte es nicht

radbruch
27.10.2008, 15:55
Hallo

Das funktioniert so nicht weil SerWrite() eine Zeichenkette erwartet und PollSwitch() nur einen Wert liefert. Eine von vielen Möglichkeiten das zu lösen könnte etwa so aussehen:

#include "asuro.h"

// aus: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=328394#328394
void PrintChar(unsigned int x)
{
char ergebnis[5] = {'0','0','0','0','0'};
while (x >=10000) { ergebnis[0]++; x -=10000; }
while (x >= 1000) { ergebnis[1]++; x -= 1000; }
while (x >= 100) { ergebnis[2]++; x -= 100; }
while (x >= 10) { ergebnis[3]++; x -= 10; }
ergebnis[4] +=x;
SerWrite(ergebnis,5);
}
void PrintBin(unsigned int x)
{
char bit=16;
char ergebnis[16];;
while(bit--)
{
ergebnis[15-bit]=0;
while (x >= (1<<bit)) { ergebnis[15-bit]++; x -= (1<<bit); }
ergebnis[15-bit] +='0';
}
SerWrite(ergebnis, 16);
}

int main(void)
{
char taste;
Init();

while(1)
{
taste=PollSwitch();
if(taste && (taste == PollSwitch()))
{
PrintChar(taste);
SerWrite("-", 1);
PrintBin(taste);
SerWrite("\n\r", 2);
}
}
return(0);
}

Die Ausgabe im Terminal sieht dann so aus:

00001-0000000000000001
00001-0000000000000001
00001-0000000000000001
00002-0000000000000010
00002-0000000000000010
00004-0000000000000100
00004-0000000000000100
00015-0000000000001111
00016-0000000000010000
00007-0000000000000111
00008-0000000000001000
00008-0000000000001000
00008-0000000000001000
00016-0000000000010000
00016-0000000000010000
00016-0000000000010000
00032-0000000000100000
00032-0000000000100000
00032-0000000000100000
00002-0000000000000010
00003-0000000000000011
00003-0000000000000011
00004-0000000000000100
00006-0000000000000110
00006-0000000000000110
00006-0000000000000110
00004-0000000000000100
00001-0000000000000001
00001-0000000000000001
00001-0000000000000001
00005-0000000000000101
00005-0000000000000101
00005-0000000000000101
00005-0000000000000101


Übrigens sollte man den von PollSwitch() gelieferten Wert IMMER überprüfen!

Gruß

mic

Famal Gosner
11.04.2009, 10:08
Hallo,

ich krame diesen Thread hier mal aus, damit ich keinen neuen öffnen muss, da das Thema das gleiche ist.

Ich habe wie brandy89 auch das Beispielprogramm als Test laufen, um mit kleinen Schritten in die Welt des Asuros einzutauchen.
Jedoch müsste der Roboter nach gut einer Sekunde sofort mit einem Hindernis kollidieren, was aber nicht der Fall ist. Trotzdem bricht das Programm ab und es leuchtet nur noch die StatusLED rot.

Nach einiger Zeit bin ich dann auf den Thread gestoßen, bei dem der Schalterwert per IR an das Hyperterminal geschickt wird, um die Schalter zu kalibrieren.

Soweit schön und gut, nur auch die Werte, die ich am Hyperterminal auslesen kann, passen alle perfekt. Die Schalter sind mit 1,2,4,8,16,32 belegt und solang keiner gedrückt wird, wird die 0 gesendet.
Das gleiche passt auch noch wenn die Motoren mitlaufen, auch das hab ich getestet.

Trotzdem bricht immer noch das einfache Testprogramm ab, woran liegt das? Ist es irgendeine einfache, aber leicht zu übersehende, Einstellung in der Asuro-Lib?

Gruß und schönes Restfeiertage
Famal Gosner

radbruch
11.04.2009, 10:33
Hallo


Trotzdem bricht immer noch das einfache Testprogramm ab, woran liegt das?Welches ist denn das "einfache Testprogramm"?


Die Schalter sind mit 1,2,4,8,16,32 belegt und solang keiner gedrückt wird, wird die 0 gesendet. Das gleiche passt auch noch wenn die Motoren mitlaufen, auch das hab ich getestet.Bist du wirklich sicher dass keine "Ausreiser" in den Tastenwerten auftreten wenn die Motoren mitlaufen? Oben in meinem Test treten diese Ausreiser häufig auf:

...
00004-0000000000000100
00015-0000000000001111
00016-0000000000010000
00007-0000000000000111
00008-0000000000001000
00008-0000000000001000
...
Dagegen hilft nur mehrfache Abfrage von PollSwitch() mit Plausibilitätsprüfung:

taste1=PollSwitch();
taste2=PollSwitch();
if((taste1>0) && (taste1==taste2))...

oder blockierend:

while(taste1!=taste2) {taste2=taste1; taste1=PollSwitch()}

Gruß

mic

Famal Gosner
11.04.2009, 12:32
Das ist das genannte Testprogramm:

#include "asuro.h"
int main(void)
{
Init();
MotorDir(FWD,FWD);
MotorSpeed(120,120);

while (PollSwitch() == 0) {
BackLED(ON,ON);
}
MotorSpeed(0,0);
StatusLED(RED);
while(1);
return 0;
}

Und ich hab die Werte überprüft, bis auf ein, zwei Ausreißer, bei denen anstatt 32 33 angezeigt wird, ist alles wie es sein sollte....

Aber ich probier es mal mit deinen 2 Ansätzen, vielleicht hilft das :)

Danke schonmal

radbruch
11.04.2009, 12:58
Nochmals hallo


Jedoch müsste der Roboter nach gut einer Sekunde sofort mit einem Hindernis kollidieren, was aber nicht der Fall ist.
Also wenn er mit dem einfachen while(PollSwitch() == 0) eine Sekunde vorwärts düst ist dein asuro schon sehr gut. Viele andere würden damit vermutlich überhaupt nicht losfahren.

Die Tastenauswertung ist eine der Unzulänglichkeiten die der einfach aufgebaute asuro serienmässig mitbringt. Ich sehe das aber eher positiv denn so lernt man vermutlich mehr über die einzelnen Funktionen als wenn alles auf Anhieb funzen würde.

btw: Init() in asuro.c endet so:

...
StatusLED(GREEN);

MotorDir(FWD,FWD);
MotorSpeed(0,0);
sei();
}
Deshalb ist nach Init() MotorDir() immer FWD und StatusLED() immer grün. Wollte ich nur mal anmerken.

Ach, und noch was: Man kann die Tasten auch ohne ADC auswerten, allerdings kann man dann nicht unterscheiden welche Taste gedrückt wurde:
http://www.arexx.com/forum/viewtopic.php?t=323
http://www.arexx.com/forum/viewtopic.php?p=1956#1956

Vielleicht kann man auch beide Verfahren kombinieren, erst wenn ein Tastendruck erkannt wurde mit PollSwitch() untersuchen welche es ist.

Gruß

mic

Famal Gosner
11.04.2009, 13:26
ich mein für den Anfang ist es ja nicht besonders wichtig, welcher Taster genau gedrückt wurde. Wills ja nicht gleich übertreiben, sondern nur langsam anfangen :)

Reicht wenn er gegen eine Wand fährt und dann wieder zurück etc pp

hai1991
11.04.2009, 14:19
hallo zusammen

nu so bzgl den ausreißern bzw richtigen Werte bei PollSwitch():
hast du beim testen mit laufenden motoren den asuro in der hand gehalten, oder wirklich fahren lassen?
vl macht das einen unterschied

Famal Gosner
11.04.2009, 16:36
ich hatte ihn aufgebockt, weil ansonsten wirds nen bisschen schwer mit dem IR-Empfänger, oder wie habt ihr das gelöst?
Durchs Aufbocken werden die Motoren ja nicht belastet, also könnte schon ein Unterschied machen...mal testen, dafür eignen sich ja so Feiertage wunderbar :)

Gruß