Benutzer-Werkzeuge

Webseiten-Werkzeuge


hello_mbot_senden_empfangen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
hello_mbot_senden_empfangen [2025/02/04 08:42] torsten.roehlhello_mbot_senden_empfangen [2025/02/17 12:48] (aktuell) – [Hello mBot Senden/Empfangen] torsten.roehl
Zeile 2: Zeile 2:
 // //
 Dieses Beispiel zeigt, wie ein mBot per **Infrarotsignal (IR)** eine LED auf einem zweiten mBot steuern kann.   Dieses Beispiel zeigt, wie ein mBot per **Infrarotsignal (IR)** eine LED auf einem zweiten mBot steuern kann.  
-Der **Sender** sendet alle **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. // +Der **Sender** sendet alle **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:**   **Einsatzmöglichkeiten:**  
   * Grundlagen der **IR-Kommunikation** zwischen Robotern     * Grundlagen der **IR-Kommunikation** zwischen Robotern  
   * Steuerung von Aktionen basierend auf **drahtlosen Signalen**, z. B. für **Spiele, Schwarmverhalten oder gruppengesteuertes Verhalten**     * Steuerung von Aktionen basierend auf **drahtlosen Signalen**, z. B. für **Spiele, Schwarmverhalten oder gruppengesteuertes Verhalten**  
 +
 +
 +
 <WRAP center round tip 85%> <WRAP center round tip 85%>
  
Zeile 12: Zeile 17:
 </WRAP> </WRAP>
    
-==== Quellcode (engl. Sourcecode) ==== +===== Quellcode (engl. Sourcecode) ===== 
-=== Quellcode mBot-Sender ===+==== Quellcode mBot-Sender ====
 <Code c linenums:1 | Listing 1:MinimalesProgramm-Sender.ino> <Code c linenums:1 | Listing 1:MinimalesProgramm-Sender.ino>
 #include <MeMCore.h> #include <MeMCore.h>
 +MeIR irSender;
 +MeRGBLed led(0, 2); 
 +String PROTOCOL_01="a"; // hier immer die Länge 1!
  
-MeIR irSender;  // IR-Modul initialisieren+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);  
 +
 +</Code> 
 +==== Quellcode mBot-Empfänger ==== 
 +<Code c linenums:1 | Listing 1:MinimalesProgramm-Empfänger.ino> 
 +#include <MeMCore.h> 
 + 
 +MeIR irReceiver; 
 +MeRGBLed led(0, 2);
  
 void setup() { void setup() {
-    Serial.begin(9600);+  Serial.begin(9600); 
 +  irReceiver.begin(); 
 +  led.setpin(13); 
 +  led.setColor(0, 0, 0, 0);  // LEDs ausschalten 
 +  led.show();
 } }
  
 void loop() { void loop() {
-    irSender.sendString("LED_ON");  // Sendet das Signal "LED_ON" +  if (irReceiver.decode()) { // Nachricht empfangen? 
-    delay(2000);  // 2 Sekunden warten+ 
 +    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);
 +}
 +
 +
  
 </Code> </Code>
-=== Quellcode mBot-Empfänger === +==== Erklärungen zum Quellcode ==== 
-<Code c linenums:1 | Listing 1:MinimalesProgramm-Empfänger.ino+//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. 
-#include <MeMCore.h>+// 
 +== 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 **<color #ed1c24>blinkt kurz rot</color>**, wenn er "LED_ON" sendet.   
 +  * **Empfänger (Bot 2):** LED **<color #22b14c>blinkt kurz grün</color>**, wenn "LED_ON" empfangen wurde.   
 + 
 +<WRAP center round tip 85%> 
 +Übrigens, warum ist es egal, welcher mBot zuerst eingeschaltet wird? 
 +</WRAP> 
 + 
 + 
 + 
 +====== Alternative Lösung zum Empfang ====== 
 +++++ Eine Alternative zum Empfang von Strings über Infrarot ist im folgenden Codeabschnitt dargestellt. | 
 + 
 +<Code c linenums:1 | Listing 1:AlternativeEmpfang.ino>
 #include <MeMCore.h> #include <MeMCore.h>
  
-MeIR irReceiver;  // IR-Modul initialisieren +MeIR irReceiver; 
-MeRGBLed led(0, 2) // LED am Port 0 mit 2 LEDs+ 
 +String msg = "";
  
 void setup() { void setup() {
-    Serial.begin(9600);+  Serial.begin(9600); 
 +  irReceiver.begin(); 
 } }
  
 void loop() { void loop() {
-    if (irReceiver.decode()) {  // Prüfen, ob ein IR-Signal empfangen wurde 
-        String message = irReceiver.getString();  // Empfangene Nachricht abrufen 
-        irReceiver.reset();  // Empfänger zurücksetzen 
  
-        if (message == "LED_ON") {   +  if ( isMessage() ) { 
-            led.setColor(0, 255, 0, 0);  // Erste LED auf Rot setzen +    String s = getMessage(); 
-            led.setColor(1, 255, 0, 0);  // Zweite LED auf Rot setzen +    Serial.print("received: "); 
-            led.show(); +    Serial.println(s); 
-            delay(500);  // LED für 500 ms anlassen +  } 
-             +  // Weiterer Code (action...)   
-            led.setColor(0, 0, 0, 0);  // LEDs ausschalten +  Serial.println("..."); 
-            led.setColor(1, 0, 0, 0); + 
-            led.show(); +
-            delay(1000) // 1 Sekunde warten, bevor erneut ein Signal empfangen wird + 
-        +/** 
-    }+ * Funktionen 
 + *
 +bool isMessage() { 
 +  msg = irReceiver.getString(); 
 +  return ( msg.length() > 0  ) ? true: false;    
 +
 + 
 +String getMessage() { 
 +  return msg;
 } }
  
 </Code> </Code>
-=== Erklärungen zum Quellcode ===+ 
 +== 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. 
 + 
 +<WRAP center round info 95%> 
 +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. 
 +</WRAP> 
 + 
 + 
 +++++ 
hello_mbot_senden_empfangen.1738658574.txt.gz · Zuletzt geändert: 2025/02/04 08:42 von torsten.roehl