====== 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. //
{{ :inf:msr:infrared.png?450 |}}
**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 ====
#include
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 ====
#include
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 ====
//Dieses Beispiel erfordert, dass die gesendeten Strings eine Länge von 1 haben. Empfangen werden sie, indem das Zeichen als ASCII-Wert interpretiert wird (im Dezimalformat). Damit ist dieses Beispiel bewusst als ein einfaches, exemplarisches Beispiel gedacht. Sie sind herzlich eingeladen, eigene Erweiterungen und Verbesserungen zu implementieren. Informieren Sie sich im Internet auch über das ASCII-Format.
//
== 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. |
#include
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 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.
++++