PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro mit einer Fernbedienung steuern



asuro_alex
19.04.2013, 20:55
Hallo leute,

ich bin absoluter anfänger in sachen programmieren, jedoch soll ich jetzt als projekt für die schule, den asuro mit einer fernbedienung steuern.
ich habe keine ahnunn was die werte heißen die mir im hyperterminal/ occonsole angezeigt werden, wenn ich an meiner normalen tv-fernbedienung eine taste drücke. auch die programme die ich bisher gesehen habe, sagen mir nichts und ich verstehe sie nicht.

bitte dringend um Hilfe, Danke ;)

Valen
20.04.2013, 09:31
Welcher Art von Fernbedienung soll das werden? Ein Infrarot Fernbedienung wie bei ein Fernseher? Oder darf das auch eigene Kommando-signalen sein die von ein Rechner aus gesendet werden zu Asuro? (über Infrarot-sicht, oder Kabelverbindung)


Ein Fernseher wird meistens mit das RC5 oder RC6 Protocol betrieben: http://de.wikipedia.org/wiki/RC-5


Die Serielle Schnitstelle von dein PC/Hyperterminal wird das nicht verstehen, weil es eine Länge reihe von Bits betrifft. Statt Gruppen von 10 bits die ein Byte vorstellen in das Serielle Protokol.


Hier gibt es schon einige beispielen von beiden Arten:


http://home.kpn.nl/h.van.winkoop/Asuro/Software/AsuSfwPagFrm.htm

asuro_alex
20.04.2013, 16:26
Es sollte eine Fernbedienung vom Fernsehr sein.(Philipps) Wie soll ich dann die ausgesendeten Bits ermitteln?

oberallgeier
20.04.2013, 16:49
... Wie soll ich dann die ausgesendeten Bits ermitteln?Ist es eine Fernbedienung von einem Philips-Fernseher oder soll es mal eine sein/werden? Und macht die RC5? Andernfalls könnte es etwas diffiziler werden.

Für RC-5 hat ja valen schon die zwei Links genannt, die für Dich notwendig sind. In dem Beispielcode von Henk steht eine komplette Beschreibung mit Code. Getestet hatte ich dies nicht am asuro, aber Henks Programme laufen eigentlich immer ;.-.)

Valen
21.04.2013, 09:27
Ein Programm schreiben das RC5, oder welches ähnliches Protokol auch, interpretiert mit nur Anfänger Programier Verständnis wurde ich als eine ganz schwierige Sache beurteilen. Damit das richtig und Verlass-bar Funktionieren soll muss man den Timers und Interuptroutinen benutzen. Weil die Dauer von den Bits Zeit-kritisch sind. Muss du Alles selbst rausfinden, oder darfst du schon Fertige Code von andere Leute benutzen?

Die Erweiterte Code-bibliothek hat auch schon fertige RC5 Funktionen drin:

http://www.asurowiki.de/pmwiki/pub/html/main.html

asuro_alex
22.04.2013, 15:51
oberallgeier, ich plane voraussichtlich eine Philips mit RC5 zu benutzen :-)

radbruch
22.04.2013, 17:30
Hallo

RC5 ist halt recht gut dokumentiert und die Bitlängen lassen sich von der Trägerfrequenz des IR-Signals ableiten. Da beim asuro auch sleep() vom Timer des Trägersignals abgeleitet ist, kann man RC5 mit dem asuro auch ohne aktuelle Library recht einfach einlesen:


#include "asuro.h"

#define pow1 150 // Langsame Geschwindigkeit
#define pow2 200 // Schnelle Geschwindigkeit
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))

unsigned int count, temp; // Zaehler, IR-Kommando
unsigned char daten[14], ir_status; // IR-Datenspeicher, IR-Eingangspegel

int main(void) {

Init();
do{
temp=0;
while (PIND & (1 << PD0)) //warten auf die Flanke des Startbits
{if keine_taste StatusLED(GREEN); else StatusLED(RED); // Tastenspielerei
if taste BackLED(ON,ON); else BackLED(OFF,OFF);}
StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug

for (count=0; count<14; count++) { // im Gesamten warten wir auf 14 bits
/*
lt. Spettel-Diagramm betraegt die Bitlaenge 1,778 ms. Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64
*/
Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken für Ausgabe an Terminal
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen
//Msleep(2000); // Zeit um den IR-Transceifer ueber den asuro zu bringen
SerWrite("\n\r",2);
SerWrite(daten,14); // Bitmuster zum PC senden
SerWrite("-",1);
PrintInt(temp); // erkannte Daten zum PC senden

/* asuro steuern.
Mit dem 10er-Block der Fernbedienung kann der asuro nun gesteuert werden:
Alle anderen Tasten stoppen den asuro
*/

switch (temp) {
case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break;
case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break;
default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
}
StatusLED(GREEN); //endlos
//Msleep(1000);

}while (1);
return 0;
}(Aus https://www.roboternetz.de/community/threads/28119-Weg-aufzeichnen-und-Aufzeichnung-abspulen?p=264230&viewfull=1#post264230)

Aufgedröselt wird der Code dann hier: https://www.roboternetz.de/community/threads/42364-Odometrie-Fernsteuerung-Fragen-Probleme?p=406385&viewfull=1#post406385

Das Prinzip: Man wartet auf die Flanke des Startbits und liest die folgenden 14 Datenbits in dem Moment ein, wenn die manchestercodierten Bits den richtigen Pegel haben:


temp=0;
while (PIND & (1 << PD0)); //warten auf die Flanke des Startbits
StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug

for (count=0; count<14; count++) { // wir warten auf 14 Bits

Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel einlesen
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken für Ausgabe an Terminal
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen


In temp steht dann der RC5-Wert, in daten[] der dazugehörige ascii-String zur Ausgabe an einem Terminal.

Gruß

mic

Spacy Bar
05.06.2014, 19:51
Mein Code dafür hat keine echte Fernsteuerung, sondern nur eine Abfolge von Operation nach eintreffen von Signalen einer Fernsehfernbedienung:
#include "asuro.h"
void start(void){
unsigned char los[12];
StatusLED(YELLOW);
SerRead(los, 12, 0);
SerWrite("Fahre Los!\n\r", 13);
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(245,255);
BackLED(OFF,OFF);
}
void stop(void){
unsigned char pause[15];
SerRead(pause, 15, 0);
SerWrite("Halte an!\n\r", 12);
MotorDir(BREAK,BREAK);
StatusLED(YELLOW);
BackLED(OFF,OFF);
}
void restart(void){
unsigned char bwd[12];
SerRead(bwd, 12, 0);
SerWrite("Fahre zurück!\n\r",16);
MotorDir(RWD,RWD);
MotorSpeed(245,255);
StatusLED(RED);
BackLED(OFF,OFF);
}

void left(void){
unsigned char leftcommand[12];
SerRead(leftcommand, 12, 0);
SerWrite("Fahre nach links!\n\r",20);
MotorDir(FWD,FWD);
MotorSpeed(190,255);
StatusLED(GREEN);
BackLED(ON,OFF);
}

void right(void){
unsigned char rightcommand[12];
SerRead(rightcommand, 12, 0);
SerWrite("Fahre nach rechts!\n\r", 21);
MotorDir(FWD,FWD);
MotorSpeed(255,200);
StatusLED(GREEN);
BackLED(OFF,ON);
}

void leftb(void){
unsigned char leftbcommand[12];
SerRead(leftb, 12, 0);
SerWrite("Fahre rückwerts nach links!\n\r",30);
MotorDir(RWD,RWD);
MotorSpeed(190,255);
StatusLED(RED);
BackLED(ON,OFF);
}

void rightb(void){
unsigned char rightbcommand[12];
SerRead(rightbcommand, 12, 0);
SerWrite("Fahre rückwerts nach rechts!\n\r",31);
MotorDir(RWD,RWD);
MotorSpeed(255,200);
StatusLED(RED);
BackLED(OFF,ON);
}

void end(void){
unsigned char endcommand[15];
SerRead(endcommand, 15, 0);
SerWrite("Schlafe!\n\r",11);
MotorDir(BREAK,BREAK);
StatusLED(OFF);
BackLED(OFF,OFF);
Sleep(255);
Sleep(255);
}

int main(void)
{

Init();
while(1){
start();
stop();
stop();
left();
stop();
stop();
right();
stop();
stop();
restart();
stop();
stop();
leftb();
stop();
stop();
rightb();
stop();
stop();
end();
end();
}
return 0;
}

Ich hoffe der Code erschlägt dich nicht.

LG
Spacy Bar