Unser Soccerbot wurde um eine IR-Fernbedienung und ein LC-Display erweitert.
Verwendet wird die Universal-Fernbedienung URC22B von www.pollin.de (Bestellnummer 620 090) zum Preis von 3,95 €. Das LC-Display ist per I2C-Bus angeschlossen (Bausatz LCD-I2C-Modul von Pollin, Bestellnummer 810 145 oder unser eigenes LC-Display).
Beachten Sie bitte, dass beide LC-Displays 5 V Betriebsspannung benötigen!
Die I2C-Schnittstelle des Soccrboard liefert leider nur die vollen 15 V aus den Fahrakkus. Deshalb haben wir eine zusätzliche Adapter-Platine mit stabilisierter Stromversorgung entwickelt.
Zu den Grundlagen des RC5-Codes der Fernbedienung gibt es bei www.sprut.de einen interessanten Artikel.
Ein Infrarot-Empfängerchip TSOP1836 wird an den Eingang Digital7 auf dem Soccerboard angeschlossen:
Diese Infrarot-Schaltung ist auf der Adapter-Platine bereits enthalten!
Benötigt werden die folgenden, von mir selbst geschriebenen Bibliotheken:
Diese Bibliotheken müssen in den Ordner C:\Programme\qfix\avr\include kopiert werden.
Auf dem LC-Display muss der I2C-kanal gesteckt werden. Hier als Beispiel unser eigenes LC-Display mit der gesteckten Adresse "34":
Die Datei qfixI2CDefs.h muss modifiziert werden. Dabei muss der korrekte I2C-Kanal des LCD-I2C-Moduls eingetragen werden (in unserem Fall "34"):
//------------------------------------------------------------------ // qfixI2CDefs.h // // This file contains definitions for the qfix I2C protocol. // // Copyright 2005 by KTB mechatronics GmbH // Author: Stefan Enderle //------------------------------------------------------------------ #ifndef qfixI2CDefs_h #define qfixI2CDefs_h const uint8_t I2C_ADDR_BOBBYBOARD = 1; const uint8_t I2C_ADDR_LCD = 34; //Änderung von 2 auf 34 für Pollin-I2C-LCD-Modul #endif |
ACHTUNG: Auf dem LCD-I2C-Modul von Pollin sind die Adressen nicht korrekt aufgedruckt.
Beispiel: Eine als "64" (dezimal) angegebene Adresse muss in der Datei qfixI2CDefs.h als "32" eingegeben werden.
Die Verwirrung kommt daher, dass es vom eingesetzten I2C-Decoder-Chip PCF8574 zwei unterschiedliche Varinaten gibt: PCF8574P (kurze Adressen) und PCF8574AP (lange Adressen).
Siehe dazu das Datenblatt.
Das Hauptprogramm wertet die Fernbedienungsdaten aus und ermöglicht eine Fernsteuerung des Soccerbot mit einer Reichweite im Innenraum von ca. 10 Metern.
ACHTUNG: Die Prozeduren zum Ein- und Ausschalten des LC-Displays lcdOn() bzw. lcdOff() bewirken beim Pollin-LC-Display genau das Gegenteil! Dies wurde bewusst so programmiert, da mein selbst entwickeltes LC-Display ohne Negation des Signals arbeitet.
Schauen Sie sich einfach den Stromlaufplan des LCD-I2C-Moduls von Pollin an. Dort wird das Signal für die Hintergrundbeleuchtung negiert an das LC-Display geführt. Datenblatt
Bis zu vier Roboter können mit vier Fernbedienungen (relativ) unabhängig gesteuert werden:
//--------------------------------------------------------------------------------- // Graupner Soccerbot mit LC-Display und RC5-Fernbedienung // // Autor: Niels Nikolaisen // 23. 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); } } } |
Das Programm rc5_fernsteuerung.cc gibt es hier zum Download.
.