- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 8 von 8

Thema: Asuro mit einer Fernbedienung steuern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    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

  2. #2
    oberallgeier, ich plane voraussichtlich eine Philips mit RC5 zu benutzen

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    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:

    Code:
    #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...l=1#post264230)

    Aufgedröselt wird der Code dann hier: https://www.roboternetz.de/community...l=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:

    Code:
    	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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Benutzer Stammmitglied Avatar von Spacy Bar
    Registriert seit
    10.05.2014
    Beiträge
    34
    Mein Code dafür hat keine echte Fernsteuerung, sondern nur eine Abfolge von Operation nach eintreffen von Signalen einer Fernsehfernbedienung:
    Code:
    #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

Ähnliche Themen

  1. RP6 mit Fernbedienung steuern
    Von Mario94 im Forum Robby RP6
    Antworten: 16
    Letzter Beitrag: 29.12.2010, 11:17
  2. probleme beim steuern mit fernbedienung
    Von proevofreak im Forum Robby RP6
    Antworten: 7
    Letzter Beitrag: 17.04.2008, 15:03
  3. Asuro erlernt Signal einer Fernbedienung
    Von mathbot im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 14.07.2006, 09:23
  4. Antworten: 16
    Letzter Beitrag: 11.02.2006, 16:39
  5. ASRU mit mul. Fernbedienung steuern?????
    Von Elle im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 31.01.2006, 22:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress