//--------------------------------------------------------------------------------- // Graupner Soccerbot mit LC-Display und RC5-Fernbedienung // // Autor: Niels Nikolaisen // 3. Februar 2012 // // Hardware: TSOP 1836 (IR-Empfänger) am Eingang Di7 (Digital7) // LC-Display am I2C-Bus // IR-Fernbedienung www.Pollin.de; Typ URC22B; Bestellnummer: 620 090 // // Weitere Informationen: www.elektronik.nmp24.de // // Zusätzlich benötigte Bibliotheken: RC5.h von Niels Nikolaisen // LCD.h von Niels Nikolaisen // // In qfixI2CDefs.h muss der I2C-Kanal des LC-Displays eingetragen werden. // Aktuell einegestellte Adresse: const uint8_t I2C_ADDR_LCD = 34; // Das entspricht der von uns verwendeten LCD-Harware. // // Dokumentation der LCD-Hardware auf www.elektronik.nmp24.de // //---------------------------------------------------------------------------------- /*Codierungen der Pollin-Fernbedienung URC22B: Fernbedienungs-Code RC5-Kanal STOP VORWÄRTS RÜCKWÄRTS LINKS RECHTS 0027 0 43 42 46 11 10 0223 2 43 42 xx 11 10 0335 5 53 46 44 50 52 0334 6 53 46 44 50 52 Auf Grund der Tatsache, dass der Code 0223 keine RÜCKWÄRTS-Taste unterstützt und der Tastencode "46" auch schon bei "VORWÄRTS" im Code 0334 und 0335 verwendet wird, wurde "RÜCKWÄRTS" vorerst nicht implementiert. Der Soccerbot muss also erst auf der Stelle wenden (Befehle LINKS oder RECHTS), um dann in die entgegen gesetzte Richtung fahren zu können. Die Fernbedienungs-Code-Nummern mussten empirisch ermittelt werden, da die RC5-Kanäle den Codes fest zugeornet sind. Mittels dieser verschiedenen Codes und Kanäle können nun bis zu vier Roboter mit vier Fernsteuerungen gleichzeitig und unabhängig gesteuert werden. Grundsätzlich funktionieren offenbar nur die Codes von Philips und Marantz mit RC5. Es mussten also alle Code-Nummern dieser Hersteller ausprobiert werden. */ #include "qfixSoccerBoard.h" #include "LCD.h" #include "RC5.h" #include "qfixI2C.h" #include "qfixI2CDefs.h" #define SPEED1 150 // Verschiedene Motordrehzahlen #define SPEED2 150 #define SPEED3 250 #define SPEED4 200 #define INVALID 99 // ungültiger RC5-Befehl // Konstanten für den Powerschuss-Mechanismus #define SHOT_CHANNEL 5 // Motorport 5 für Schuss-Mechanismus #define SHOT_BUTTON 1 // Hier ist Taste "1" an der Fernbedienung gemeint #define SHOT_POWER 255 // Schuss-Stärke #define SHOT_DURATION 50 // in Millisekunden SoccerBoard robot; LCD lcd; // you can use this constructor if the ID is 0 //LCD lcd(); // use this if the ID is not 0. replace 1 by the ID I2C i2c; int main() { lcd.init(); lcd.clear(); Init_RC5(); //Der nach dem Einschalten ermittelte Kanal wird hier abgespeichert: uint8_t rc5_channel_tmp=0; // Einschalten des Soccerbot und dadurch RC5-Kanal durch Drücken einer FB-Taste auswählen rc5_data=INVALID; //Wenn INVALID, dann noch keine Taste gedrückt while(rc5_data==INVALID) { lcd.print("Bitte Play-Tastedrücken!"); lcd.cursorhome(); } rc5_channel_tmp=rc5_channel; //Kanal abspeichern lcd.clear(); lcd.print("Der Kanal wurde erkannt!"); msleep(10000); rc5_data=INVALID; // Rücksetzen, sonst schießt er gleich! lcd.clear(); while(true) { // Steuern des Robots mit RC5 über drei Cursortasten der Universal-Fernbedienung URC22B von www.Pollin.de if (rc5_channel == rc5_channel_tmp) { // Letzten Tastencode und aktuellen Kanal anzeigen //if (rc5_data != INVALID) { lcd.cursorhome(); lcd.print("Taste:"); lcd.print_integer(rc5_data); lcd.print("-Kanal"); lcd.print_integer(rc5_channel); } // Taste gedrückt an Fernbedienung? switch(rc5_data) { case INVALID: board.motorsOff(); break; case 43 : board.motorsOff(); // Playtaste: 43 oder 53 = STOPP break; case 53 : board.motorsOff(); // Playtaste: 43 oder 53 = STOPP break; case 42 : //board.motorsOff(); robot.motor(0,-SPEED3); // 42 oder 46 = vorwärts robot.motor(1,SPEED3); break; case 46 : //board.motorsOff(); robot.motor(0,-SPEED3); // 42 oder 46 = vorwärts robot.motor(1,SPEED3); break; case 11 : board.motorsOff(); robot.motor(0,SPEED1); // 11 oder 50 = links drehen robot.motor(1,SPEED1); robot.motor(2,SPEED1); break; case 50 : board.motorsOff(); robot.motor(0,SPEED1); // 11 oder 50 = links drehen robot.motor(1,SPEED1); robot.motor(2,SPEED1); break; case 10 : board.motorsOff(); robot.motor(0,-SPEED1); // 10 oder 52 = rechts drehen robot.motor(1,-SPEED1); robot.motor(2,-SPEED1); break; case 52 : board.motorsOff(); robot.motor(0,-SPEED1); // 10 oder 52 = rechts drehen robot.motor(1,-SPEED1); robot.motor(2,-SPEED1); break; case SHOT_BUTTON : robot.motor(SHOT_CHANNEL,SHOT_POWER); msleep (SHOT_DURATION); robot.motor(SHOT_CHANNEL,0); msleep (SHOT_DURATION); rc5_data=INVALID; // Rücksetzen, sonst schießt er dauernd! break; } // msleep(100); } } }