PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro per IR-Transceiver fernsteuern



Mr.Roboto
21.07.2007, 18:43
Servus, hab hier mal ein kleines Programm geschrieben, mit dem man den Asuro per Tastatur(W,A,S,D) fernsteuern kann.
(Natürlich über das Terminalprogramm von Windows)
Evtl. kann es von euch ja jemand gebrauchen.

MfG Mr.Roboto





// Programm von Mr.Roboto - 21.07.07

#include "asuro.h"

#define Motorgeschwindigkeit MotorSpeed(180,200);

int main(void)
{
int i;
char input[1];

do
{

Init();
SerRead(input,1,0);
i=0;


if(input[0]=='w')
{
StatusLED(YELLOW);
do
{
MotorDir(FWD,FWD);
Motorgeschwindigkeit
Sleep(255);
i++;
}while(i<=80);
}

if(input[0]=='s')
{
StatusLED(RED);
do
{
MotorDir(RWD,RWD);
Motorgeschwindigkeit
Sleep(255);
i++;
}while(i<=80);
}

if(input[0]=='a')
{
BackLED(ON,OFF);
do
{
MotorDir(BREAK,FWD);
Motorgeschwindigkeit
Sleep(255);
i++;
}while(i<=80);
}

if(input[0]=='d')
{
BackLED(OFF,ON);
do
{
MotorDir(FWD,BREAK);
Motorgeschwindigkeit
Sleep(255);
i++;
}while(i<=80);
}

}while(1);

}

Sternthaler
23.07.2007, 22:37
Schön, geht auch bei mir. (Ja, ich weiss ich habe ne lange Leitung. Am Transceiver natürlich ;-) )
Es reicht aber wenn du das Init() vor der do-Schleife machst.

Roboaktiv
24.07.2007, 09:42
Ja bei mir geht es auch!Großes Lob! =D>
Jetzt hab ich die SerRead Geschicht verstanden, obwohl ich sie mir noch nie im Handbuch angeschaut hab.
Danke schön!

Kurze Hinzufügung:

if(input[0]=='x')
{
BackLED(ON,ON);
do
{
MotorDir(BREAK,BREAK);
Motorgeschwindigkeit
Sleep(255);
i++;
}while(i<=80);
}
Wenn man dann "X" drückt bleibt er stehen, damit mit man ihn z.B. besser ausschalten kann. Das aber auch nur am Rande.

Mr.Roboto
24.07.2007, 16:37
Bitteschön :-) ... aber das mit dem x braucht man doch nicht .... wenn ich nichts drücke bleibt er doch auch stehen !!

radbruch
24.07.2007, 17:27
Hallo

Kleiner Tipp: Mit der switch/case-Funktion kann man die Abfrage der empfangenen Zeichen recht übersichtlich und elegant lösen:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=287750#287750

Ist zwar für eine TV-Fernbedienung (RC5), zeigt aber wie man case einsetzen kann. Das von der Fernbedienung empfangene Zeichen steht in temp.

Gruß

mic

Mr.Roboto
24.07.2007, 18:15
nix da Switch-Case !!!! [-X ... BACK TO THE ROOTS !!! ... ich steh auf die gute alte IF-Anweisung, net so ein neumodischer Kram !! :cheesy:

Kleiner Spass, jo Switch-Case sieht schon cool aus im Code

Sternthaler
24.07.2007, 18:32
Hallo zusammen,
nichts gegen switch/case. Erhöht die Übersichtlichkeit enorm.
Aber die HEX-Datei wird um Meilen länger. Ich habe mal getestet, dass sich case erst ab ca. 20! verschiedenen Werten lohnt gegenüber dem 'altmodischen' IF.
Also los: Weitere Tastenkommandos erfinden ;-)
w, s, a, d von Mr.Roboto
x von Roboaktiv
0 = Status-LED Aus
1 = Status-LED Grün
2 = Status-LED Gelb
3 = Status-LED Rot
4 = Linien-LED Aus
5 = Linien-LED An
e = schneller
d = langsamer
...

radbruch
24.07.2007, 19:11
Aber die HEX-Datei wird um Meilen länger. Ich habe mal getestet, dass sich case erst ab ca. 20! verschiedenen Werten lohnt gegenüber dem 'altmodischen' IF.
Oh, so habe ich das noch nie betrachtet. Sorry.

Sternthaler
24.07.2007, 20:23
Hallo radbruch, das Sorry ist natürlich überflüssig. Aber wenn Platzprobleme auftauchen, sucht man nach dem letzten zu sparenden Byte.
Das Problem hatte ich vor allem bei dem Programm für die Ermittlung der Parameter für die myasuro.h-Datei aus der LIB.

damaltor
24.07.2007, 21:46
bist du sicher dass das mit den 20 werten stimmt?



zuerst 10 werte mit if

if(wert==1){
anweisung 1;
anweisung 2;
}
if(wert==2){
anweisung 1;
anweisung 2;
}
if(wert==3){
anweisung 1;
anweisung 2;
}
if(wert==4){
anweisung 1;
anweisung 2;
}
if(wert==5){
anweisung 1;
anweisung 2;
}
if(wert==6){
anweisung 1;
anweisung 2;
}
if(wert==7){
anweisung 1;
anweisung 2;
}
if(wert==8){
anweisung 1;
anweisung 2;
}
if(wert==9){
anweisung 1;
anweisung 2;
}
if(wert==10){
anweisung 1;
anweisung 2;
}

jetzt 10 werte mit case:

switch (wert){
case 1:Anweisung 1;
Anweisung 2;
break;
case 2:Anweisung 1;
Anweisung 2;
break;
case 3:Anweisung 1;
Anweisung 2;
break;
case 4:Anweisung 1;
Anweisung 2;
break;
case 5:Anweisung 1;
Anweisung 2;
break;
case 6:Anweisung 1;
Anweisung 2;
break;
case 7:Anweisung 1;
Anweisung 2;
break;
case 8:Anweisung 1;
Anweisung 2;
break;
case 9:Anweisung 1;
Anweisung 2;
break;
case 10:Anweisung 1;
Anweisung 2;
break;
}

hmm.. ich denk das ist in erster linie eine entscheidung der vorliebe, ich mag if ganz gern. aber wenns um menüs geht oder so dann wähle ich meist switch/case

radbruch
24.07.2007, 21:57
Das Problem hatte ich vor allem bei dem Programm für die Ermittlung der Parameter für die myasuro.h-Datei aus der LIB.
Ich verwende(te) die 2.7er-Lib doch nicht. 8-[

mic

Sternthaler
24.07.2007, 23:25
@damaltor
Na gut ich habe fürchterlich übertrieben mit den 'Meilen'.
Ausserdem gebe ich dir natürlich Recht, dass das ganze eine eigene Vorliebe ist.
Aber der HEX-Output bei deinem Beispiel ergibt immerhin 22 Byte Unterschied zugunsten der IF-Orgie.

Size before:
test.elf :
section size addr
.text 1600 0

Size after:
test.elf :
section size addr
.text 1622 0

Je nachdem, welchen der beiden IF_CODE-Zeilen auskommentiert gibt es da die Unterschiede:


#include "asuro.h"

//#define IF_CODE 1
#undef IF_CODE

int main ()
{
char wert, a=0;

wert = PollSwitch ();

#ifdef IF_CODE

if(wert==1){
a=wert+1;
}
if(wert==2){
a=wert+2;
}
if(wert==3){
a=wert+3;
}
if(wert==4){
a=wert+4;
}
if(wert==5){
a=wert+5;
}
if(wert==6){
a=wert+6;
}
if(wert==7){
a=wert+7;
}
if(wert==8){
a=wert+8;
}
if(wert==9){
a=wert+9;
}
if(wert==10){
a=wert+10;
}

#else

switch (wert){
case 1:
a=wert+1;
break;
case 2:
a=wert+2;
break;
case 3:
a=wert+3;
break;
case 4:
a=wert+4;
break;
case 5:
a=wert+5;
break;
case 6:
a=wert+6;
break;
case 7:
a=wert+7;
break;
case 8:
a=wert+8;
break;
case 9:
a=wert+9;
break;
case 10:
a=wert+10;
break;
}

#endif

return a;
}


Benutzt man aber die Variante, dass die IF's eigendlich mit "else if" fortgeführt werden sollten um so halbwegs performat zu sein, reduziert sich dieser Vorteil auf popelige 4 Byte bei dem 10-er Beispiel:
-> Und hier liegt ein entscheidender Vorteil vom swtich/case: Performanter, da ein Sprung zur Stelle erfolgt die gerade benötigt wird und eben nicht ein 'rumraten' wohin es denn nun gehen soll.

Size before:
test.elf :
section size addr
.text 1618 0

Size after:
test.elf :
section size addr
.text 1622 0


#include "asuro.h"

//#define IF_CODE 1
#undef IF_CODE

int main ()
{
char wert, a=0;

wert = PollSwitch ();

#ifdef IF_CODE

if(wert==1){
a=wert+1;
}
else if(wert==2){
a=wert+2;
}
else if(wert==3){
a=wert+3;
}
else if(wert==4){
a=wert+4;
}
else if(wert==5){
a=wert+5;
}
else if(wert==6){
a=wert+6;
}
else if(wert==7){
a=wert+7;
}
else if(wert==8){
a=wert+8;
}
else if(wert==9){
a=wert+9;
}
else if(wert==10){
a=wert+10;
}

#else

switch (wert){
case 1:
a=wert+1;
break;
case 2:
a=wert+2;
break;
case 3:
a=wert+3;
break;
case 4:
a=wert+4;
break;
case 5:
a=wert+5;
break;
case 6:
a=wert+6;
break;
case 7:
a=wert+7;
break;
case 8:
a=wert+8;
break;
case 9:
a=wert+9;
break;
case 10:
a=wert+10;
break;
}

#endif

return a;
}



@radbruch
Ja was soll das denn? Nicht die LIB benutzen, ist das denn erlaubt? ;-)
Der Hinweis von mir bezog sich nur auf die Speicherplatz-Probleme die ich bei dem Asuro-Programmteil hatte um da alle Tests unterzubringen.

damaltor
25.07.2007, 13:50
hrhr... da hast du natürlich recht... ;)

Sternthaler
25.07.2007, 23:26
@damaltor
Deine neue Fußzeile läßt mich folgende Vermutung anstellen:
Bist du Fan von Prinzenrolle? Dann sollten wir uns mal zusammentun mit einer großen Familienpackung. (Eine für dich und eine für mich natürlich) ;-)

damaltor
26.07.2007, 21:36
prinzenrolle fetzt... aber ja! doppelkekse fetzen auch und kosten etwa 1/4 vom original. aber sie gehen eben nicht in die keksdose :(

aber jo, lass uns mal doppelkeks-abend machen XD

Roboaktiv
27.07.2007, 11:14
... wenn ich nichts drücke bleibt er doch auch stehen !!
bei mir Fährt er immer, wenn man einemal eine Taste gedrückt hat. Weiß allerdings nicht, woher das kommt. Vielleicht, wenn man zulange eine Taste drückt?

Mr.Roboto
27.07.2007, 12:45
wenn du mein programm nutzt, dürfte das nicht sein, evtl. speicherst du das eingegebene zeichen in eine variable, wenn du dann kein neues zeichen eingibts, fragst du das gespeicherte ab, nicht das, was aktuelle über die tastatur kommt

Roboaktiv
28.07.2007, 23:09
Soweit ich weiß benutz ich dein Programm. Zumindest benutz ich. Vielleicht kommt es zwischen den verschiedenen Libaries zu irgendwelchen Fehler. Ich benutze die von der Asuro CD. Die ist vom 17.10.2003. Kann es sein ,das du irgendeine andere Libary hast?

Gruß Roboaktiv

Mr.Roboto
29.07.2007, 12:08
jo, ich benutz die aktuelle Version, hab aber in dem programm nur standard funktionen verwendet, denk isch :-)

Sternthaler
30.07.2007, 01:30
Hallo,
es existiert kein Unterschied zwischen der CD-Version und der aktuellen LIB.
Beide Versionen sind absolut identsch.
Da Mr.Roboto die SerRead()-Funktion ja im 'blocking'-Mode aufruft, muss sie auch lange warten, bis das eine geforderte Zeichen kommt.
Wenn aber tatsächlich einmal ein Zeichen (w,s,a,d) zum Starten der Motoren gekommen ist, gibt es auch keinen Code mehr, der die Motoren stoppt.
Die 'große' while-Schleife landet dann ja wieder im SerRead(), wartet dort auf ein nun nicht kommendes Zeichen, und die Motoren drehen weiter.
Somit geht es also so wie Mr.Roboto sagt. Bei mir tut's das jedenfalls auch genau so. Er läuft, und läuft, und läuft, .... und genau dafür braucht man die lange Leitung ;-)

Mr.Roboto
30.07.2007, 18:08
Servus Sternthaler,
du sagst, dass kein zeichen zum stoppen der motoren kommt, und der Asuro somit immer weiterfährt, aber andererseits sagst du, dass SerRead() auf ein zeichen wartet. Das ist doch ein widerspruch!!!

Also nochmal für alle:
-------------------------
1. Programm startet
2. SerRead()-Funktion wartet uf ein zeichen
3. Zeichen wird eingegeben
4. Zeichen wird per IFs geprüft
5. Dem Zeichen zugehörige Bewegung wird ausgeführt
6. do-while-Schleife beginnt von vorne
7. SerRead() wartet wieder auf die eingabe von Zeichen, das programm wird nicht weiter ausgeführt, bevor nicht ein zeichen eingegeben wird, das ist wie in C bei der Funktion scanf(), das zuletzt eingegebene Zeichen ist zwar in der variable input[0] gespeichert, da das programm aber angehalten ist, bis ein neues zeichen eingegeben wird, KANN DER ASURO NICHT WEITERFAHREN !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ich hab echt kein peil, warum der asuro bei euch nicht stoppt


MfG Mr.Roboto

Mr.Roboto
30.07.2007, 18:22
!!!!!!!!!!!!!!!!!!!!!!!! ICH HAB DAS PROBLEM GEFUNDEN !!!!!!!!!!!!!!!!!!!!!!!!
---------------------------------------------------------------------------------

Ihr habt scheinbar die Init()-Funktion nicht in der do-while-Schleife drin, so wie sie bei mir im Programm ist, bei euch wird Init() nur beim Start des Programmes ausgeührt, bei mir wird Init() bei jedem Schleifendurchlauf ausgeführt.
Da Init() die Ausgänge des Microcontrollers sozusagen auf "NULL" setzt (Ausganszustand), dies aber bei euch nicht passiert, bleiben die Ausgänge des Microcontrollers so lange auf ihrem pegel, bis ein neuer befehl kommt.
Also schreibt einfach Init() in die Schleife, damit es immer 1x pro Schleifendurchlauf ausgeführt wird und schon funktioniert das Programm reibungslos!

Was lernen wir daraus ?????
---------------------------------
Nicht einfach ein funktionierendes Programm abändern
und dann wundern, warum es nicht mehr funktioniert !!!!



Endlich haben wir das gelöst, ich hab mir schon echt sorgen über meine programmierkentnisse gemacht :-)

Also, gebt mir nochmal rückmeldung, ob es läuft!!!!!

MfG Mr.Roboto

Sternthaler
31.07.2007, 01:10
Oh du meine Güte.
Und ich gebe noch den 'Spitzentipp', das man das Init() wohl besser aus der Schleife rausnimmt. (Dann geht es natürlich nicht wie von dir gewünscht.)

Ist schon OK, ich war's.

Habe aber dafür einen angepassten Spitzentipp:


int main(void)
{
int i;
char input[1];

Init();

do
{
MotorSpeed (0,0);
SerRead(input,1,0);
.
.

Nun brems ich auch. ;-)

Mr.Roboto
31.07.2007, 12:02
das war schon ne schwere Geburt :-) .... ooohh man, echt bekloppt!!!
was kann man denn nochmal mit dem asuro machen, mir fällt nichts mehr sinnvolles ein, die scheiß linienverfolgung funktioniert zwar, aber is ziehmlich kacke mit der ausdruckbaren linienarena, asuro nervt mich irgendwie an !!

damaltor
31.07.2007, 12:29
naja dann sollte aber nicht die init funktoin in jedem einzelnen schleifendurchlauf aufgerufen werden, das ist doch unnötig... setz lieber ein MotorSpeed(0,0) in die schleife.

Roboaktiv
31.07.2007, 12:30
Theoretisch müsste es bei mir auch klappen.
Praktisch......................geht auch!

Ich mal mir immer die Linien, die der ASURO abfahren soll, dass geht auch gut. Blöd ist, dass die Fototransistoren alles so genau nehmen. Man kann so gut wie kein Programm schreiben, das der ASURO auf nem weißen Blatt rumfährt und wenn der da runter kommt dreht er um und fährt woandershin.
Wenn dir nix mehr einfällt kannst du ja weiter mit den Erweiterungsplatinen machen. Im ASURO Buch Band 1 findest du mehr Informationen über die Ultraschallsensoren und im 2. Band gibt es was über Wärmeerkennung und was über nen LCD-Display.

Gruß Roboaktiv

Roboaktiv
02.08.2007, 11:27
Ich hab gerade gesehen, dass im 2.Band auch ne optische Abstandnsmessung erklärt wird.

Sternthaler
02.08.2007, 14:38
@Roboaktiv
Ja, das ist richtig.

Aber hier im Forum gibt es das ganze 'für umsonst'. Man muss nur eine, im Winkel von 45 Grad, spiegelnde Fläche oberhalb der IR-Hardware anbringen und die richtige Software laden.

Roboaktiv
03.08.2007, 12:05
Super! Jetzt hab ich das Buch schon :-) Naja!Ich wollt mit diesen Aussagen eigendlich nur bezwecken, dass nicht den Spaß am ASURO verliert.

Gruß Roboaktiv

Sternthaler
03.08.2007, 18:39
Hallo Roboaktiv,
das Buch sollte man sich meiner Meinung nach auch keinesfalls entgehen lassen. Ist auf alle Fälle sein Geld wert.
Wo, wie, was, wer? - verliert den Spaß am Asuro? So schnell bestimmt keiner.
Deshalb meine Anregung hier im Forum nach Spiegel-Pappe im 45 Grad Winkel selber zu suchen ;-). Dann gibt es bestimmt auch noch so einige andere Suchtreffer die über einen herfallen und nicht mehr loslassen. :evil:

Roboaktiv
03.08.2007, 22:44
Das hab ich weiter oben gesehen:

asuro nervt mich irgendwie an !!
und ich dachte mir wenn Mr.Robot keine weiteren Ideen hat, soll er sich mal an die Erweiterungsplatine machen.

Mit dem Büchern 1-2(gibt es eigendlichauch schon 3? Hab da ma was in Babd 2 gelesen) bin ich auch sehr mit zufrieden!

Gruß Roboaktiv

PS:Ich hab Angst vo Sachen, die übereinenfallen und nicht mehr loslassen! :cry: :^o

damaltor
03.08.2007, 23:17
den dritten band gbts noch nich, mal sehen was sie sich dann einfallen lassen... =)

Sternthaler
04.08.2007, 16:59
Irgendwo habe ich zum dritten Band gelesen, dass sie sich auf die Regelungstechnik stürzen wollten. Ach ja, steht im Band II auf Seite 13.
ABER, woanders habe ich gelesen, dass es keinen Band III mehr geben soll, da es heißt, der Aufwand gegenüber der verkauften Buchanzahl würde sich nicht lohnen. Ich hoffe/bibber/bete, dass ich das nur in einem Albtraum gehört habe.

Erweiterungsplatinen machen ist selbstversändlich eine gute Idee für 'Angenervte'. ;-)


PS:Ich hab Angst vo Sachen, die übereinenfallen und nicht mehr loslassen! :cry: :^oKeine Angst, ich kenne eine Gruppe namens Anonyme-Asurianer. Die können helfen ;-)

Roboaktiv
04.08.2007, 17:49
Schaut mal hier:
http://arexx.com/arexx.php?cmd=goto&cparam=p_asuro
bei Zubehör weiter unten neben dem Bild vom 1. Band steht auch was vom 3. Band. Und wenn der Herausgeber was davon erzählt scheint die "Nichterstellung" des Buches wohl zumglück ein Albtraum gewesen zu sein.

So ist das halt mit den Albträumen. Manche träumen was von keinem zufünftigen 3. Band und andere träumen von Sachen, die ein überfallen und nicht mehr loslassen. :-)