PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO Programmieren?



Matze 3
27.09.2008, 17:56
Also ich bin neu hier und wollte mal fragen wie ich den asuro programmieren muss damit er bei einer kolision stehen bleibt.... (also wenn man auf einen taster drückt...)

ich habe schon ein programm geschrieben aber das funktioniert nicht...

hai1991
27.09.2008, 18:07
hallo Matze 3

eigentlich genügt eine if-abfrage zur feststellung, ob ein taster gedrückt ist
jedoch sollte man bei PollSwitch beachten, dass sie gerade bei laufendem motor manchmal einen falschen wert liefert

hier ein vorschlag, wie es funktionieren müsste:


#include "asuro.h"

int main(void)
{
Init();
unsigned char sw;

while(1)
{
sw = PollSwitch();
if(PollSwitch() == sw) //Sicherheitsabfrage, um falsche Werte zu vermeiden
MotorDir(BREAK,BREAK);
}
}



noch ein kleiner tipp: mit dem code-button kannst du hier deine programme schön posten

Matze 3
27.09.2008, 18:35
Das geht auch nicht....
kast hier mal jemand ein funktionierendes programm posten??

radbruch
27.09.2008, 21:07
Hallo

Beispiele für Kollisionsprogramme findet man z.B. wenn man in der Suchfunktion (https://www.roboternetz.de/phpBB2/search.php) des Forums nach "motorspeed AND pollswitch" sucht. Allerdings sollte man sich dabei darüber im Klaren sein, dass der asuro dann immer ungebremst gegen das Hinderniss knallt!

Dein Programm könnte man z.B. so ändern:

#include "asuro.h"

int main(void)
{
Init();
unsigned char sw1, sw2, sw3;

while(1)
{
sw1 = PollSwitch();
sw2 = PollSwitch();
sw3 = PollSwitch();

if (sw1 == sw2 == sw3 == 0x01)
MotorSpeed(150, 0);
if (sw1 == sw2 == sw3 == 0x02)
MotorSpeed(200, 0);
if (sw1 == sw2 == sw3 == 0x04)
MotorSpeed(250, 0);
if (sw1 == sw2 == sw3 == 0x08)
MotorSpeed(0, 150);
if (sw1 == sw2 == sw3 == 0x10)
MotorSpeed(0, 200);
if (sw1 == sw2 == sw3 == 0x20)
MotorSpeed(0, 250);
}
}
...dann hat die mehrfacheTastenabfrage auch einen Sinn. Ich habe das allerdings so nicht getestet. Vermutlich wird es auch nicht wie erwartet funktionieren weil die wenigsten asuros auf Anhieb die richtigen Werte liefern ("asuro AND tasten AND kalibrieren"). Zusätzliche Hinweise findet man auch im asurowiki (http://www.asurowiki.de). Der Artikel über die Tastenkalibrierung (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/TastenKalibrierungC) behandelt zwar die Anwendung bei der aktuellen Library, aber der Sachverhalt ist gleich. Die Formel dazu steht in asuro.c am Ende von PollSwitch().

Gruß

mic

Matze 3
28.09.2008, 17:10
kann mir vieleicht jemand hier ein programm posten mit dem ich asuro über infra rot fernsteuern kann??
also das ich den mit den tasten w, a, s, d steuern kann???

weil die tasten funktionieren jetzt...

hai1991
28.09.2008, 17:17
hallo

ich will nicht meckern, aber dieses forum ist eigentlich dazu da, um bei problemen zu helfen, nicht um sich fertige programme schreiben zu lassen.

versuch es lieber zu erst selbst, poste dein programm fals es nicht klappt und dir wird sicher geholfen. zu dem lernt du selber viel mehr

als alternative kannst du aber auch die formussuche benutzen. da gibts sicher schon einige beiträge mit fertigen programmen

Matze 3
30.09.2008, 17:33
ja also ich hab schon mal so ein programm geschrieben....nur des ging nicht.... also der asuro hat garnichts gemacht...

ich hab des nach der anleitung von der asuro cd geschrieben...

hai1991
30.09.2008, 17:59
könntest du das vl posten?

ansonsten hier eine idee wie es vl. funktionieren könnte:


int main()
{
while(1)
{
Zeichen lesen
mit switch dem entsprechend handln (motordir und -speed)
vl kurze pause
}
while(1);


den code zu meinem (hoffentlich richtigen) muster kannst du dir erstmal selber überlegen. bei problemen kannst du natürlich fragen

PS: ich weiß zwar nicht wie viel erfahrung du mit C und robotik hast, aber ich würde dir raten, erst mit linienfolgen, "figuren fahren" oder andere "leichte aufgaben" an zu fangen.
außer du willst unbedingt über hyperterminal steuern

wie schon erwähnt, wenn du fragen hast melde dich

Matze 3
30.09.2008, 18:14
also ich hab eigentlich nicht sehr viel erfahrung mit c....
des programm hab ich nicht mehr....

aber des ging ungefäh so..:

SerRead(ir,1,0);
if (ir == w){
MotorDir(FWD,FWD);
MotorSpeed(100, 100);
}
if (ir == s){
MotorDir(RWD,RWD);
MotorSpeed(100,100)
}
...
...
...

ich glaube eigenlich dass die ir steuerung eifach ist...

hai1991
01.10.2008, 15:06
so, der erste fehler den ich sehe:
wenn nach einem einzellnen buchstaben abfragen willst, musst du ihn unter einfache anführungszeichen ' setzen. zb so:
if (ir == 'w')

kurz zur erklärung:
buchsaben(-ketten) werden im ASCII-code gespeichert. dh anstatt des zeichens wird in der variable eine zahl von 0 - 255 abgespeichert, je nach buchstaben und wenn du nun einen buchstaben in ' schreibst wird nach der entsprechenden zahl abgefragt.


weiters wäre noch interessant welchen typ dein ir hat.

Matze 3
01.10.2008, 16:15
also ir hat unsigned char....
wie muss ich des mit dem ascii code schreine dass wenn ich w drücke asuro nach vorne fährt???

hai1991
01.10.2008, 16:29
im hyperterminal (oder anderes programm) musst du nichts berücksichtigen, nur im code musst du wie oben erwähnt if (ir == 'w') schreiben. das habe ich damit gemeint

Matze 3
01.10.2008, 16:49
also ich hab jetzt ein programm geschrieben....:


#include "asuro.h"

int main(void)
{
Init();
unsigned char ir;

while(1) {
SerRead(ir, 1, 0);
if (ir == "w"){
MotorDir(FWD, FWD);
MotorSpeed(100, 100);
}
if (ir == "s"){
MotorDir(RWD, RWD);
MotorSpeed(100, 100);
}

}
}

das funktioniert aber nicht..

nil.at
01.10.2008, 16:53
Ich schätze mal hai1991 meint, dass du im Programm eine unsigned char variable deklarieren musst. In diese schreibst du dann mittels serread den Wert. Dieser wird mittels Hyperterminal übertragen.
Und dann machst du einfach if (die unsigned char variable (255 zeichen, also passen alle asciis rein) == 'w') also vergleiche ob "w" gedrückt wurde -> und dann eben Motor bewegen.

Matze 3
01.10.2008, 16:57
ich check des nich mit dem ascii....
was muss ich da jetzt genau schreiben???

radbruch
01.10.2008, 17:26
Hallo

" - Bei Zeichenketten (strings, auch bei Länge==1!)
' - Bei Einzelzeichen wenn der ascii-Wert des Zeichens gemeint ist

z.B.: 'a' ist dann ein Platzhalter für eine Konstante mit 65. Man könnte auch direkt 65 schreiben. Oder als Hex oder Bin, entscheidend ist nur, wie man als Programmierer leichter erkennt was gemeint ist. Wenn man bestimmte Bits testen will sagt (PINC & &b110010) mehr aus als (PINC & 50) und wenn man Zeichen einer Tastatur prüfen will ist ein 'w' oder 'Z' einfacher als direkt mit dem asciiwert zu vergleichen.


#include "asuro.h"

int main(void)
{
Init();
unsigned char ir[]="123"; // Seite 65 der asuro-Anleitung

while(1) {
SerRead(ir, 1, 0);
if (ir[0] == 'w')
{
MotorDir(FWD, FWD);
MotorSpeed(100, 100);
StatusLED(RED);
}
if (ir[0] == 's')
{
MotorDir(RWD, RWD);
MotorSpeed(100, 100);
StatusLED(YELLOW);
}
if (ir[0] == 'x')
{
MotorDir(BREAK, BREAK);
MotorSpeed(0, 0);
StatusLED(GREEN);
}
}
}

Gruß

mic

Matze 3
02.10.2008, 18:09
thx......


es funktioniert...!!!

aber asuro fährt solange bis ich eine andere aste drücke....
wie kann ich des machen das asuro stoppt wenn ich die taste los lasse??

nil.at
02.10.2008, 18:57
Bin mir nicht sicher aber versuch mal am Ende der while ir auf 0 zu setzen.

Eigentlich müsste er stehen bleiben wenn du die Taste loslässt weil beim nächsten Schleifendurchlauf ja kein Buchstabe mehr empfangen wird. Aber vielleicht schreibt das Programm intern einfach nichts neues nach ir wenn nichts empfangen wird und somit bleibt die zuvor gedrückte Taste erhalten. Bin mir aber nicht sicher, dazu müsste man sich serRead genauer ansehen.

NrwFlo
03.10.2008, 01:47
Guten Morgen

Also wenn die Taste(z.B 'w') los gelassen wurde, ist ir immer noch "w23" . Beginnt jetzt der neue Schleifendurchlauf, wird mit dem Befehl SerRead(ir,1,0) so lange gewartet bis ein Zeichen eingelesen wurde. Gibst du 10 Sekunden lang kein Zeichen, führt dieser Befehl auch da zu, dass der Schleifendurchlauf 10 Sekunden lang nicht weiter geht.
Dein Asuro fährt deswegen einfach weiter, weil du ihm nicht gesagt hast, dass er stoppen soll, wenn kein Zeichen mehr eingelesen wird.

Wenn man z.B. folgendes Programm schreibt,



#include "asuro.h"

int main(void)
{
char i = 5;

while(1)
{
if (i == 5)
{
MotorDir(FWD,FWD);
MotorSpeed(120,120);
i = 0;
}
}
return 0;
}


Hier fährt der Asuro los, da i = 5 ist und setzt danach i auf 0. Bei den darauf folgenden Schleifendurchläufen passiert gar nix, da die If-Bedingung nicht erfüllt wird. Der Asuro fährt jetzt so lange weiter bis die Batterien alle leer sind, da nirgendwo steht, das er stoppen soll, wenn i nicht mehr 5 ist.

Also die Lösung deines Problems:
-ändere SerRead(ir,1,0) auf SerRead(ir,1,1) oder eine andere Zahl >0, damit er nicht unendlich lang auf die Eingabe eines Zeichens wartet (näheres im Handbuch auf S.65)

-setze nach jedem Schleifendurchlauf ir[0] = 'x' , somit ist beim nächsten Schleifendurchlauf ir = "x23" und da nun nicht mehr bei SerRead gewartet wird, wird die 3. If-abfrage erfüllt und dein Asuro hält automatisch nach loslassen der Taste an.

(hab ich nicht ausprobiert, ist mir nur spontan eingefallen, müsste aber trotzdem klappen)

Gruß

Flo

Matze 3
03.10.2008, 14:21
ich schreibe in meinem programm jetzt ir = 'y'
(ich hab jetzt eine andere if abfrage geschrieben mit y....)

aber jetzt kommt immer diese fehlermeldung...:

error: incompatible types in assignment

radbruch
03.10.2008, 14:32
ir[0] == 'y'

Überlege mal selbst was der Unterschied ist.

nil.at
03.10.2008, 17:07
Ich hab mich jetzt mal an dem Beispiel versucht, allerdings mit einer switch statt zig ifs. als default (also wenn KEIN richtiges Zeichen ankommt) hab ich break,break gewählt, der Asuro soll also stehen bleiben.
Ebenfalls setze ich am Ende eines jeden Durchlaufes die Variable auf einen fiktiven Wert.
Und zu guter Letzt soll SerRead nur 5 Takte lang versuchen einen Wert zu empfangen.

Resultat: Das Programm funktioniert nicht. Und zwar tut sich gar nichts.
Wenn ich bei SerRead den Wert wieder auf 0 (also Endlos) setze fährt der Asuro zwar, bleibt aber nicht stehen wenn die Taste losgelassen wird, was auch logisch ist.
Jemand ne Ahnung wo der Fehler liegt?

Hier mein Code:


#include "asuro.h"

void stopGo(void); //prototyp

int main(void)
{
Init();

MotorSpeed(200,200);
unsigned char dir[] = "123"; //platz für die empf var

while(1)
{
SerRead(dir, 1, 5);

switch(dir[0])
{
case 'w': MotorDir(FWD,FWD);
break;
case 's': MotorDir(RWD,RWD);
break;
case 'a': MotorDir(BREAK,FWD);
break;
case 'd': MotorDir(FWD,BREAK);
break;
case 'm': stopGo();
break;
case 'q': MotorDir(RWD,FWD);
break;
case 'r': MotorDir(FWD,RWD);
break;
default: MotorDir(BREAK,BREAK);
break;
}

dir[0] = '0';
}

return 0;
}

void stopGo(void)
{
static unsigned char x = '0';
if(x == '0')
{
MotorSpeed(0,0);
x = '1';
}
else
{
MotorSpeed(200,200);
x = '0';
}
}

Danke

Matze 3
04.10.2008, 15:35
ok die fernsteuerung funktioniert....

jetzt hab ich aber ein problem beim flashen...:

wenn asuro mit dem flashen fertig ist leuchtet die status led rot auf....(sie sollte doch eigentlich grün aufleuten...) und die backleds leuchten auch....

wenn ich dann das selbe programm nochmal flashe dann leuchtet die status led grün....

aber asuro flash sagt das das programm erfolgreich gflasht wurde...

was stimt mit meinem asuro nicht???

nil.at
06.10.2008, 19:54
Guten Abend,

ich wollte den Thread nochmal hochholen, in der Hoffnung das sich jemand mein Programm am Ende von Seite 1 ansehen und mir den Fehler nennen kann?

Bitte, warum bleibt mein Asuro nicht stehen?

Vielen Dank!

radbruch
06.10.2008, 20:22
Hallo

Wenn SerRead() mit timeout kein Zeichen innerhalb der Timeauszeit empfängt wird ein großes 'T' zurückgegeben. Das könntest du ja prüfen und darauf reagieren.

if (time > timeout) data[0] = 'T';(aus SerRead() in asuro.c)

Dir ist schon klar das du deinem asuro bei Vollgas den Rückwärtsgang reinhaust? Das ist nach "Suche die Tischkante und bleibe dann stehen" und "Kollisionstaster: Mit Vollgas gegen die Wand" eine weitere sichere Methode den Kleinen kaputt zu kriegen.

Gruß

mic

nil.at
06.10.2008, 21:15
Hallo,

und Danke, das werde ich probieren!

Danke auch für den Tipp mit dem Motor!
Wie bei meiner Vorstellung gesagt, ich hab zwar Löten und Programmieren gelernt, aber mit Motoren und anderen mechanischen Bauteilen hatte ich wenig am Hut :) Werde es mir zu Herzen nehmen und die armen Motoren nicht so quälen.

PS: So einen typischen "Suche die Tischkante und bleibe dann stehen" Fehler habe ich schon gemacht :) Resultat: Beide Achsen der rechten Seite waren ab (hab sie ja nur geklebt).
Aus Fehlern lernt man.

Matze 3
02.11.2008, 00:20
gibt es eigentlich eine möglichkeit asuro graphisch zu programmieren??

nil.at
02.11.2008, 01:23
http://www.arexx.com/arexx.php?cmd=goto&cparam=p_asuro_rovipro.dat