Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Hello mBot Senden/Empfangen
Dieses Beispiel zeigt, wie ein mBot per Infrarotsignal (IR) eine LED auf einem zweiten mBot steuern kann. Der Sender sendet alle 3 Sekunden das Signal „LED_ON“. Der Empfänger schaltet daraufhin die LED für 500 ms auf Rot und wartet anschließend 1 Sekunde, bevor er erneut ein Signal empfängt.
Einsatzmöglichkeiten:
- Grundlagen der IR-Kommunikation zwischen Robotern
- Steuerung von Aktionen basierend auf drahtlosen Signalen, z. B. für Spiele, Schwarmverhalten oder gruppengesteuertes Verhalten
Dieses Beispiel stellt nur die grundlegende Struktur zur Verfügung. Es ist noch keine wirkliche Kommunikation, da lediglich ein Roboter sendet und der andere empfängt.
Quellcode (engl. Sourcecode)
Quellcode mBot-Sender
Listing 1:MinimalesProgramm-Sender.ino
#include <MeMCore.h> MeIR irSender; MeRGBLed led(0, 2); String PROTOCOL_01="a"; // hier immer die Länge 1! void setup() { irSender.begin(); led.setpin(13); led.setColor(0, 0, 0, 0); // LEDs ausschalten led.show(); } void loop() { // Rote LED an, wenn gesendet wird led.setColor(0, 255, 0, 0); // LED rot led.show(); // String über IR senden irSender.sendString(PROTOCOL_01); delay(200); // LED wieder ausschalten led.setColor(0, 0, 0, 0); led.show(); delay(3000); }
Quellcode mBot-Empfänger
Listing 1:MinimalesProgramm-Empfänger.ino
#include <MeMCore.h> MeIR irReceiver; MeRGBLed led(0, 2); void setup() { Serial.begin(9600); irReceiver.begin(); led.setpin(13); led.setColor(0, 0, 0, 0); // LEDs ausschalten led.show(); } void loop() { if (irReceiver.decode()) { // Nachricht empfangen? uint32_t receivedValue = irReceiver.value; // Rohwert uint32_t buttonCode = receivedValue >> 16 & 0xff; switch (buttonCode) { // ASCII als DEC! case 97: onAction_97(); } } } /* * Funktionen */ void onAction_97() { // dec 97 ist ascii-code a! delay(200); Serial.println("received code 97"); led.setColor(0, 0, 255, 0); // LED grün led.show(); delay(300); // LED wieder ausschalten led.setColor(0, 0, 0, 0); led.show(); delay(200); }
Erklärungen zum Quellcode
TODO oder DEC to ASCII mit: char code = (char)buttonCode</color> == 1. Programme hochladen == * Sender-Programm auf mBot 1 laden * Empfänger-Programm auf mBot 2 laden * USB-Kabel trennen, beide mBots einschalten == 2. Testablauf == * Sender (mBot 1): LED blinkt kurz rot, wenn er „LED_ON“ sendet. * Empfänger (Bot 2): LED blinkt kurz grün, wenn „LED_ON“ empfangen wurde.
Übrigens, warum ist es egal, welcher mBot zuerst eingeschaltet wird?
====== Alternative Lösung zum Empfang ====== ++ Eine Alternative zum Empfang von Strings über Infrarot ist im folgenden Codeabschnitt dargestellt. Auf dieser Grundlage lassen sich schnell eigene Protokolle zur Kommunikation über die Infrarot-Schnittstelle erstellen.
Listing 1:AlternativeEmpfang.ino
#include <MeMCore.h> MeIR irReceiver; String msg = ""; void setup() { Serial.begin(9600); irReceiver.begin(); } void loop() { if ( isMessage() ) { String s = getMessage(); Serial.print("received: "); Serial.println(s); } // Weiterer Code (action...) Serial.println("..."); } /** * Funktionen */ bool isMessage() { msg = irReceiver.getString(); return ( msg.length() > 0 ) ? true: false; } String getMessage() { return msg; }
== Erklärung zum Quellcode == Der Code prüft in der loop()-Funktion kontinuierlich, ob eine neue IR-Nachricht empfangen wurde, indem die Funktion isMessage() aufgerufen wird. Wenn eine Nachricht vorhanden ist, wird sie über die serielle Verbindung ausgegeben. Die Funktion isMessage() liest die Nachricht vom IR-Empfänger und überprüft, ob sie nicht leer ist. Die Funktion getMessage() gibt die empfangene Nachricht zurück.
Eine Kommunikation mit Strings ist für ein Protokoll nicht unbedingt die eleganteste Methode, da keine switch
-Anweisung verwendet werden kann. Das sollte bedacht werden.
++