Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Calliope Mini 3 Tutorial: Datenübertragung zwischen Calliope und Arduino über die serielle Schnittstelle

Posted on 7. Februar 20247. Juni 2024 by Stefan Draeger

In diesem Beitrag möchte ich dir erläutern, wie du über die serielle Schnittstelle Daten zwischen dem Calliope und einem Arduino austauschen kannst. Über eine serielle Schnittstelle kannst du Sensordaten und auch Befehle zum steuern eines anderen Mikrocontrollers oder angeschlossenen Aktor senden.

serielle Verbindung zwischen einem Calliope Mini 3 & Arduino UNO R3
Dieses Video auf YouTube ansehen.

Ich habe bereits in verschiedenen Beiträgen hier im Blog sowohl den Calliope Mini 3 als auch den Arduino UNO R3 vorgestellt. Jetzt möchte ich dir anschaulich zeigen, wie du diese beiden Mikrocontroller miteinander verbinden und Daten zwischen ihnen austauschen kannst. Während der Calliope Mini 3 eine Bluetooth-Schnittstelle für drahtlose Datenübertragung bietet, fehlt diese Funktion beim Arduino UNO R3.

Inhaltsverzeichnis

  • Wozu benötigt man eine serielle Verbindung in Zeiten von Bluetooth & WiFi?
  • Benötigte Ressourcen für diesen Beitrag
  • Aufbau der seriellen Verbindung zwischen dem Arduino und Calliope Mini 3
  • Testen der seriellen Verbindung
  • Abfragen der seriellen Schnittstelle am Arduino
  • Abfragen der seriellen Schnittstelle am Calliope Mini 3
  • Schalten einer LED am Arduino mit dem Calliope Mini 3
    • Code am Calliope Mini 3 zum Senden von Befehlen über die serielle Schnittstelle
    • Code am Arduino IDE
  • Steuern eines Servomotors am Arduino mit dem Calliope Mini
  • Regeln der Helligkeit einer LED am Arduino mit dem Lichtintensitätssensor vom Calliope Mini
    • MakeCode Programm zum seriellen senden der gelesenen Lichtstärke
    • Arduino Code zum setzen eines PWM Signals an einer LED

Wozu benötigt man eine serielle Verbindung in Zeiten von Bluetooth & WiFi?

Zunächst möchte ich gerne klären, warum wir uns mit dem Aufbau und der Programmierung einer seriellen Verbindung in Zeiten von Bluetooth und WiFi überhaupt befassen.

Serielle Schnittstellen sind immer noch relevant, da sie eine zuverlässige und einfache Möglichkeit bieten, Geräte miteinander zu verbinden. Sie sind oft schneller, stabiler und benötigen weniger Energie als drahtlose Verbindungen wie Bluetooth / WiFi. Außerdem sind serielle Schnittstellen in vielen eingebetteten Systemen, Sensoren und IoT-Geräten weit verbreitet.

Benötigte Ressourcen für diesen Beitrag

Wenn du die kleine Schaltung und die damit verbundenen Beispiele nachbauen / programmieren möchtest, dann benötigst du:

  • einen Calliope Mini 3* mit Datenkabel,
  • einen Arduino UNO R3* oder Arduino Nano V3 mit passendem Datenkabel,
  • drei Breadboardkabel* 10 cm, männlich – männlich

Für die nachfolgenden Beispiele benötigst du noch:

  • eine 10 mm* oder 5 mm* LED mit 220 Ohm Vorwiderstand*,
  • ein 170 Pin Breadboard*,
  • zwei Printtaster 12 mm x 12 mm* mit Kappe,
  • einen kleinen Servomotor SG90*,
  • diverse Breadboardkabel

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Bauteile für die serielle Verbindung von Calliope zum Arduino
Bauteile für die serielle Verbindung von Calliope zum Arduino

Da der Calliope Mini 3 über diverse Sensoren verfügt, zeige ich dir auch Beispiele in welche wir einen Temperatursensor, Lichtsensor, 3-Achsen Lagesensor verwenden und am Arduino auswerten.

Aufbau der seriellen Verbindung zwischen dem Arduino und Calliope Mini 3

Bauen wir zunächst die serielle Verbindung zwischen den beiden Mikrocontrollern auf. Dazu benötigen wir drei Breadboardkabel (männlich – männlich, 10 cm).

Wir verwenden jedoch nicht die digitalen Pins D0 & D1 vom Arduino UNO R3, denn diese sind mit dem USB-Anschluss verbunden. Immer wenn wir ein neues Programm auf den Mikrocontroller aufspielen möchten, müssen wir dann die Verbindung zwischen den beiden Mikrocontrollern trennen.

Als alternative können wir jeden beliebigen anderen digitalen Pin vom Arduino verwenden. Denn wir lösen dieses Problem im Code mit SoftwareSerial.

serielle Verbindung zwischen einem Calliope Mini 3 und einem Arduino UNO R3
serielle Verbindung zwischen einem Calliope Mini 3 und einem Arduino UNO R3
Arduino UNO R3Calliope Mini 3Farbe
digitaler Pin D10 – RXP1 – TXlila
digitaler Pin D11 – TXP0 – RXorange
GNDGNDweiß

Das Pinout vom Calliope Mini 3 findest du entweder einmal auf der Rückseite des Mikrocontrollers und auch nachfolgend in der Grafik.

Pinout der Buchsenleiste am Calliope Mini 3
Pinout der Buchsenleiste am Calliope Mini 3

Testen der seriellen Verbindung

Zunächst möchte ich dir gerne zeigen, wie du deine serielle Verbindung testen kannst. Das ist besonders wichtig, wenn der Code mal nicht so funktioniert, wie du es erwarten würdest und du dich auf die Fehlersuche begeben musst.

In der Arduino IDE bekommst du ein kleines Tool, mit welchem du dir die Daten von der seriellen Schnittstelle ausgegeben und auch soweit dieses Zahlen sind, in einem Liniendiagramm visualisieren kannst.

Abfragen der seriellen Schnittstelle am Arduino

Der nachfolgende Code funktioniert für die meisten Mikrocontroller der Arduino Familie, ich beziehe mich jedoch auf den am meisten verbreiteten, den Arduino UNO R3.

Mit dem nachfolgenden Code geben wir die empfangenen Daten auf der seriellen Schnittstelle des Arduinos aus und damit können wir dann diese im seriellen Monitor oder seriellen Plotter (soweit diese aus Zahlen bestehen) betrachten.

#include <SoftwareSerial.h>

// erster Parameter 10 für Pin RX,
// zweiter Parameter 11 für Pin TX
SoftwareSerial softwareSerial(10, 11);

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  //auf der "normalen" seriellen Schnittstelle
  Serial.begin(9600);
  //beginn der seriellen Kommunikation mit 9600 baud
  //auf der neuen seriellen Schnittstelle
  softwareSerial.begin(9600);
}

void loop() {
  //Wenn Daten an der Schnittstelle anliegen, dann...
  if (softwareSerial.available() > 0) {
    //auslesen und ausgeben der Daten
    Serial.println(softwareSerial.readString());
  }
  
}

Mit diesem kleinen Programm lassen wir die Daten, welche vom Calliope Mini 3 gesendet wurden, auf der „normalen“ seriellen Schnittstelle ausgeben.

Abfragen der seriellen Schnittstelle am Calliope Mini 3

Eine serielle Verbindung klappt auch in die andere Richtung, daher können wir ebenso gut am Calliope Mini 3 die Daten anzeigen. Hier haben wir die Möglichkeiten, die Daten auf der 5×5 LED Matrix in einem Lauftext anzuzeigen. Wenn die Daten nur aus Zahlen bestehen, dann kannst du diese Werte auch im Datenlogger anzeigen.

Der Datenlogger kann nur Zahlen anzeigen. Ein kleiner Hack wäre es den Text als Spaltenname zu verwenden, jedoch ist dieses nicht wirklich brauchbar.

Das kleine Programm dazu sieht wie folgt aus:

Programm in MakeCode zum lesen der seriellen Schnittstelle am Calliope Mini 3
Programm in MakeCode zum lesen der seriellen Schnittstelle am Calliope Mini 3

Hier die HEX-Datei zum download und importieren in MakeCode.

Programm – lesen der seriellen Schnittstelle am Calliope Mini 3Herunterladen

Im nachfolgenden kleinen Video demonstriere ich dir, wie ein Text vom Arduino an den Calliope gesendet und dieser als Lauftext auf der 5×5 LED Matrix angezeigt wird.

Schalten einer LED am Arduino mit dem Calliope Mini 3

Als Erstes möchte ich dir gerne zeigen, wie du eine LED am Arduino mit dem Calliope Mini 3 schalten kannst. Es gibt diverse LEDs, ich verwende gerne die 10 mm LED für solche Schaltungen, da hier der 220 Ohm Vorwiderstand entfällt.

Code am Calliope Mini 3 zum Senden von Befehlen über die serielle Schnittstelle

In MakeCode schreiben wir nun ein kleines Programm, in welchem wir zunächst beim Starten die serielle Verbindung auf die Pins P0 & P1 mit 9600 Baud umleiten.

Wenn der Taster A betätigt wird, dann soll ein A über die serielle Schnittstelle gesendet. Wird der Taster B betätigt, dann wird ein B gesendet.

Alternativ kann man auch noch das Logo auf der Rückseite verwenden und mit diesem einen weiteren Befehl senden.

MakeCode - Programm zum senden von Befehlen über die serielle Schnittstelle am Calliope Mini
MakeCode – Programm zum senden von Befehlen über die serielle Schnittstelle am Calliope Mini

Hier das kleine Programm für MakeCode zum Importieren.

Programm – Calliope Mini 3 Taster zum serielles senden von BefehlenHerunterladen

Code am Arduino IDE

Am Arduino müssen wir jetzt die Befehle vom Calliope Mini empfangen und auswerten. Wie zuvor bereits erläutert verwende ich eine SoftwareSerial Schnittstelle, da diese es einfacher erlaubt das Programm zu wechseln, ohne die Verkabelung zum Calliope Mini zu trennen.

#include <SoftwareSerial.h>

//10mm LED am digitalen Pin D7 angeschlossen
#define ledBlau1 7
//5mm LED am digitalen Pin D6 angeschlossen
#define ledBlau2 6

// RX, TX
SoftwareSerial softwareSerial(10, 11);

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
  softwareSerial.begin(9600);

  //definieren das die Pins der LEDs als Ausgang dienen
  pinMode(ledBlau1, OUTPUT);
  pinMode(ledBlau2, OUTPUT);
}

void loop() {
  //Wenn Daten an der seriellen Schnittstelle 
  //anliegen, dann...
  if (softwareSerial.available() > 0) {
    //lesen der gesamten Zeile
    String data = softwareSerial.readString();
    //entfernen der unnötigen Leerzeichen 
    //am Anfang und Ende
    data.trim();
    //Ausgeben der empfangenen Daten auf 
    //dem seriellen Monitor der Arduino IDE
    Serial.println(data);
    //Wenn ein "A" empfangen wurde, dann...
    if (data == "A") {
      //LEDs aktivieren
      digitalWrite(ledBlau1, HIGH);
      digitalWrite(ledBlau2, HIGH);
    } else if (data == "B") {
      //Wenn ein "B" empfangen wurde, 
      //dann sollen die LEDs deaktiviert werden
      digitalWrite(ledBlau1, LOW);
      digitalWrite(ledBlau2, LOW);
    }
  }
}

Steuern eines Servomotors am Arduino mit dem Calliope Mini

Statt eine LED kannst du auch einen Servomotor steuern. Der hier verwendete Servomotor kann einen Winkel zwischen 0° und 180° ansteuern. Den Servomotor schließen wir am digitalen Pin D9 beim Arduino UNO an.

Wir belassen das Programm auf dem Calliope Mini wie zuvor und ändern lediglich das kleine Programm am Arduino.

#include <Servo.h>

#include <SoftwareSerial.h>

//Der Servomotor ist am digitalen Pin D9 angeschlossen
#define servoPin 9

// RX, TX
SoftwareSerial softwareSerial(10, 11);

//Erzeugen eines neuen Servoobjektes
Servo servo;

//Feld zum speichern der Servoposition
int servoPosition = 0;

//Konstante mit dem Wert wieviele Schritte der Servomotor fahren soll
const int SERVO_STEPS = 20;

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
  softwareSerial.begin(9600);
  //verbinden des Pins des Servomotors mit dem Servoobjekt
  servo.attach(servoPin);
  //anfahren der Position 0
  servo.write(servoPosition);
}

void loop() {
  //Wenn Daten an der seriellen Schnittstelle
  //anliegen, dann...
  if (softwareSerial.available() > 0) {
    //lesen der gesamten Zeile
    String data = softwareSerial.readString();
    //entfernen der unnötigen Leerzeichen
    //am Anfang und Ende
    data.trim();
    //Ausgeben der empfangenen Daten auf
    //dem seriellen Monitor der Arduino IDE
    Serial.println(data);

    //Variable zum speichern der neuen Servoposition
    int newServoPosition = 0;
    //Soll der Wert auf oder ab gezählt werden?
    bool countUp = false;
    //Wenn der empfange Wert "A" ist UND
    //die aktuelle Servoposition kleiner als 180 ist, dann...
    if (data == "A" && servoPosition < 180) {
      //der aktuellen Servoposition die Schritte welche gefahren
      //werden sollen hinzu addieren
      newServoPosition = servoPosition + SERVO_STEPS;
      //das Feld countUp auf true setzen,
      //so das später das Feld um 1 incrementiert wird
      countUp = true;
    } else if (data = "B" && servoPosition > SERVO_STEPS) {
      //Wenn jedoch ein "B" empfangen wurde UND die
      //aktuelle Servoposition größer als die Schritte die gefahren werden sollen
      //ist, dann soll dieser Wert abgezogen werden
      newServoPosition = servoPosition - SERVO_STEPS;
      //die Variable countUp wird hier nicht manipuliert / verändert, da
      //wir diese bereits mit false initialisiert haben
    }
    //Schleife, sollange der Wert von servoPosition ungleich des Wertes
    //der Variable newServoPosition ist, mache...
    while (servoPosition != newServoPosition) {
      //prüfen in welche richtung die Variable verändert werden soll
      if (countUp) {
        servoPosition = servoPosition + 1;
      } else {
        servoPosition = servoPosition - 1;
      }
      //anfahren von einem Grad
      servo.write(servoPosition);
      //eine kleine Pause von 25 ms.
      delay(25);
      //ausgeben der neuen Servoposition auf dem seriellen Monitor
      Serial.println(servoPosition);
    }
  }
}

Regeln der Helligkeit einer LED am Arduino mit dem Lichtintensitätssensor vom Calliope Mini

Der Lichtintensitätssensor vom Calliope Mini 3 liefert Werte in bereich von bis 255 das passt sehr gut auf den Wertebereich eines PWM Signals mit welchem wir sehr einfach die Helligkeit einer LED regeln können.

Wenn wir mit einer Taschenlampe auf die LED Matrix leuchten dann erhöht sich der Wert bis zu einem maximum von 255.

MakeCode Programm zum seriellen senden der gelesenen Lichtstärke

Hier das kleine Programm zum auslesen der Lichtstärke am Calliope Mini 3 und absenden über die serielle Schnittstelle.

Und natürlich das Programm als HEX-Datei zum download und importieren in MakeCode.

Programm – lesen und senden der Lichtstärke am Calliope Mini 3 über die serielle SchnittstelleHerunterladen

Arduino Code zum setzen eines PWM Signals an einer LED

Da der Wert vom Lichtintensitätssensor vom Calliope Mini einen Wert zwischen 0 und 255 liefert können wir diesen 1:1 für unser PWM Signal verwenden und müssen diesen hier lediglich nur empfangen und der LED aks analogen Wert zuweisen.

#include <Servo.h>

#include <SoftwareSerial.h>

//die LED ist am digitalen PWM Pin 9 angeschlossen
#define led 9

// RX, TX
SoftwareSerial softwareSerial(10, 11);

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
  softwareSerial.begin(9600);
  //Pin der LED als Ausgang definieren
  pinMode(led, OUTPUT);
}

void loop() {
  //Wenn Daten an der seriellen Schnittstelle
  //anliegen, dann...
  if (softwareSerial.available() > 0) {
    //lesen der gesamten Zeile
    String data = softwareSerial.readString();
    //entfernen der unnötigen Leerzeichen
    //am Anfang und Ende
    data.trim();
    //Ausgeben der empfangenen Daten auf
    //dem seriellen Monitor der Arduino IDE
    Serial.println(data);
    //schreiben des empfangenen Wertes als PWM Signal auf den Pin der LED
    //mit der Funktion toInt() wird die Zeichenkette in eine Zahl umgewandelt
    analogWrite(led, data.toInt());
  }
}

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}