In diesem Beitrag möchte ich dir das recht einfache und übersichtliche Multi-Purpose Shield V2 von Keyestudio für den Arduino vorstellen.

Bezug
Das Multifunktionale Shield findest du auf aliexpress.com zu einem Preis von ca. 5,90€ inkl. Versandkosten. Alternativ kannst du das Shield auch im offiziellen Shop von Keyestudio für etwas mehr Geld beziehen.
Aufbau des Multi-Purpose Shield V2 von Keyestudio
Dieses Multifunktionale Shield verfügt über folgende verbaute Bauteile:
- einen Drehpotentiometer
- einen Piezo Buzzer,
- eine 4fach 7 Segmentanzeige,
- drei Buttons,
- sechs SMD LEDs
Des Weiteren sind einige Schnittstellen nach außen gelegt zbsp. um 4 Servomotoren oder aber einen Bluetoothadapter anzuschließen.
Das Shield ist die Version 2 des bereits vorgestellten Multifunktionalen Shields V1 von Keyestudio.
Meiner Meinung nach sollte eine neue Version immer etwas mehr bieten als die Version zuvor, hier ist es genau anders herum. Aber durch die begrenzte Anzahl der Pins (14 digitale und 6 analoge) des Arduino UNOs ist man hier etwas eingeschränkt. Alternativ sollte man hier ggf. einmal über ein Multifunktionales Shield für den Arduino Mega 2560 nachdenken.
Programmieren
Für das programmieren des Shields benötigst du ein passendes Datenkabel und einen Arduino UNO, Leonardo oder Mega 2560.
Natürlich kannst du mit Breadboardkabel auch die einzelnen Bauteile an einen Arduino Nano oder ähnlichem anschließen.
Zum programmieren verwende ich wiederum die Arduino IDE welche du unter https://www.arduino.cc kostenfrei herunterladen kannst.
Pins der Sensoren & Aktoren auf dem Multi-Purpose Shield V2
Sensor / Aktor | Pin |
---|---|
Piezo Buzzer | digitaler Pin D3 |
SMD LEDs | digitaler Pin D8..D13 |
Buttons / Taster | analoger Pin A1..A3 |
Drehpotentiometer | analoger Pin A0 |
Normalerweise würde ich nun jeden einzelnen Sensor / Aktor auf diesem Shield vorstellen und einzeln ein kleines Sketch / Programm präsentieren. Jedoch habe ich diese Bauteile ausgiebig auf dem Blog behandelt und daher möchte ich gerne kleine Projekte zeigen welche du nachprogrammieren kannst.
Zähler mit Display und Sound
Für dieses kleine Projekt benötigst du die 3 Buttons, die 4fach 7 Segmentanzeige und den Piezo Buzzer.
Ziel
Das Ziel soll es sein über die drei Buttons Zahlen auf der 4fach 7 Segmentanzeige aufsteigend oder absteigend zu zählen. Der dritte Button soll als Reset der Anzeige dienen. Zusätzlich soll bei jedem 10er Übergang ein Ton erzeugt werden.
Sketch
#include <Bounce2.h> //Bibliothek um die Taster zu entprellen //Die Taster sind an den analogen Pins A1..A3 angeschlossen #define btnUpPin A1 #define btnResetPin A2 #define btnDownPin A3 //Der Piezo Buzzer ist am digitalen Pin D3 angeschlossen #define piezoBuzzer 3 //das Schieberegister ist an folgenden Pins angeschlossen #define latchPin 4 //ST_CP #define clockPin 5 //SH_CP #define dataPin 2 //DS //Adressen der Segmente im Display int segmente[4] = {0x01, 0x02, 0x04, 0x08}; //Hexadezimalwerte der Zahlen von 0 bis 9 int numbers[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //Konstante für eine Pause zwischen den Tastenbetätigungen const int BTN_PAUSE = 50; Bounce btnUpBounce = Bounce(btnUpPin, BTN_PAUSE); Bounce btnResetBounce = Bounce(btnResetPin, BTN_PAUSE); Bounce btnDownBounce = Bounce(btnDownPin, BTN_PAUSE); //Variable zum halten der aktuellen Zahl int counter = 0; void setup() { Serial.begin(9600); //Taster als Eingänge definieren pinMode(btnUpPin, INPUT); pinMode(btnResetPin, INPUT); pinMode(btnDownPin, INPUT); //Piezo Buzzer als Ausgang definieren pinMode(piezoBuzzer, OUTPUT); //die Pins des Schieberegisters als Ausgang definieren pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); //zunächst das Display einmal löschen / leeren digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST , 0x00); shiftOut(dataPin, clockPin, MSBFIRST , 0x00); digitalWrite(latchPin, HIGH); } void loop() { //die Taster aktualisieren btnUpBounce.update(); btnResetBounce.update(); btnDownBounce.update(); //Wenn der linke Taster losgelassen wird dann... if(btnUpBounce.rose()){ //Zähler um eins erhöhen counter = counter +1; //Wenn der Zähler einen 10er Übergang hat dann einen Ton ausgeben if(counter % 10==0){ tone(piezoBuzzer, 600,95); } } //Wenn der Taster in der Mitte betätigt wird dann den Zähler auf "0" zurücksetzen. if(btnResetBounce.rose()){ counter = 0; } //Wenn der rechte Taster betätigt wird dann den Zähler um eins verringern if(btnDownBounce.rose()){ //aber nur wenn die Zahl größer als 0 ist //negative Zahlen werden nicht angezeigt if(counter >0){ //Zähler um eins verringern counter = counter -1; } else { //alternativ einen Ton ausgeben tone(piezoBuzzer, 900,125); } } displayNumber(counter); } //Die Funktion erhält als Parameter eine Ganzzahlige Zahl //und Splittet diese in die Tausender, Hunderter, Zehner sowie //einer Stellen und zeigt diese auf dem Display an. void displayNumber(int number) { int tausend = number / 1000; int hundert = number % 1000; hundert = hundert / 100; int zehn = number % 100; zehn = zehn / 10; int ein = number % 10; int values[4] = {tausend, hundert, zehn, ein}; for (int a = 3; a >= 0; a--) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST , numbers[values[a]]); shiftOut(dataPin, clockPin, MSBFIRST , segmente[a]); digitalWrite(latchPin, HIGH); delay(5); } }
Video
Servomotor mit Drehpotentiometer steuern
Mit dem Drehpotentiometer kannst du auch einen Servomotor vom Typ SG90 steuern. Wie einfach das geht erfährst du im folgenden Abschnitt. Den benötigten Servomotor findest du auf ebay.de für knapp 4€. Wenn du diesen jedoch in einer größeren Anzahl kaufst dann ist dieser im Einzelpreis deutlich günstiger.
Ziel
Der Wert des Drehpotentiometers (analoger Wert 0..1023) wird auf die möglichen Winkel 0..180 des Servos gemappt und ausgeführt.
In dem Nachfolgenden Beispiel steuere ich ein Pan Tilt Bausatz welcher aus 2 Servos vom Typ SG90 besteht.
Diesen Bausatz habe ich bereits im Beitrag Arduino: Pan Tilt Bausatz vorgestellt.

Sketch
#include <Servo.h> #define servo1Pin 7 #define servo2Pin 6 #define rotaryResistor A0 Servo servo1; Servo servo2; //das Schieberegister ist an folgenden Pins angeschlossen #define latchPin 4 //ST_CP #define clockPin 5 //SH_CP #define dataPin 2 //DS //Adressen der Segmente im Display int segmente[4] = {0x01, 0x02, 0x04, 0x08}; //Hexadezimalwerte der Zahlen von 0 bis 9 int numbers[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; void setup() { pinMode(servo1Pin, OUTPUT); pinMode(servo2Pin, OUTPUT); servo1.attach(servo1Pin); servo2.attach(servo2Pin); //die Pins des Schieberegisters als Ausgang definieren pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); //zunächst das Display einmal löschen / leeren digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST , 0x00); shiftOut(dataPin, clockPin, MSBFIRST , 0x00); digitalWrite(latchPin, HIGH); } void loop() { int resistorValue = analogRead(rotaryResistor); int servoValue = map(resistorValue, 0, 1022, 0, 180); servo1.write(servoValue); int servo2Value = map(resistorValue, 0, 1022, 180, 0); servo2.write(servo2Value); displayNumber(servoValue); } //Die Funktion erhält als Parameter eine Ganzzahlige Zahl //und Splittet diese in die Tausender, Hunderter, Zehner sowie //einer Stellen und zeigt diese auf dem Display an. void displayNumber(int number) { int tausend = number / 1000; int hundert = number % 1000; hundert = hundert / 100; int zehn = number % 100; zehn = zehn / 10; int ein = number % 10; int values[4] = {tausend, hundert, zehn, ein}; for (int a = 3; a >= 0; a--) { digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST , numbers[values[a]]); shiftOut(dataPin, clockPin, MSBFIRST , segmente[a]); digitalWrite(latchPin, HIGH); delay(5); } }
Video
Bluetooth zum steuern der LEDs
Im nachfolgenden zeige ich dir ein etwas aufwändigeres Projekt, denn hier wollen wir per Bluetooth die SMD LEDs auf dem Shield steuern (AN/AUS). Du benötigst hier zusätzlich ein Bluetoothmodul welches dem Shield NICHT bei liegt. Das passende Bluetooth Modul HC-06 kannst du auf ebay.de für knapp 4€ inkl. Versandkosten erwerben.
Ziel
Über eine Handy-App (Android / iOS) wird eine Kommunikation mit dem Shield aufgebaut und durch das absenden bestimmter Zeichenfolgen wird eine SMD LED aktiviert bzw. deaktiviert.
Blueoothmodul HC-06
Für den Aufbau benötigst du neben einem Arduino UNO, dem Multi-Purpose Shield V2 zusätzlich ein Bluetooth HC-06 Modul. Dieses Bluetoothmodul findest du du auf ebay.de für knapp 4,5€ inkl. Versandkosten.

Dieses Bluetoothmodul habe ich bereits im Beitrag Arduino Lektion 21: Bluetooth Modul HC-06 ausgiebig vorgestellt. In diesem Beitrag möchte ich dir zeigen wie du dieses Modul verwendest um die SMD LEDs des Multi-Pupose Shield V2 von Keyestudio schaltest.
Das Modul wird auf den 6 Pin Sockel gesteckt dabei muss natürlich auf die korrekte Polung geachtet werden.
Sketch
Wenn du das Sketch auf den Microcontroller hochladen möchtest DARF das Bluetoothmodul nicht aufgesteckt sein, denn es werden die beiden digitalen Pin 1 & 0 benötigt. Diese beiden Pins sind jedoch durch TX & RX der seriellen Verbindung belegt somit kommt es dann durch die IDE zu einem Timeout.
#include <SoftwareSerial.h> #define TX 1 //TX Pin des Bluetoothadapters am digitalen Pin 1 #define RX 0 //RX Pin des Bluetoothadapters am digitalen Pin 0 #define led1 13 #define led2 12 #define led3 11 #define led4 10 #define led5 9 #define led6 8 //Variablen zum speichern des Status der LEDs int led1Status = 0; int led2Status = 0; int led3Status = 0; int led4Status = 0; int led5Status = 0; int led6Status = 0; SoftwareSerial BT(RX, TX); char a; //Variable um das Zeichen vom Bluetoothadaper zu speichern void setup(){ //Pins der LEDs als Ausgang definieren pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); pinMode(led5, OUTPUT); pinMode(led6, OUTPUT); BT.begin(9600); } void loop(){ //Wenn Daten anliegen dann... if (BT.available()){ //lesen der Daten a=(BT.read()); switch(a){ case '1': led1Status = led1Status == 1?0:1; activateLED(led1, led1Status); break; case '2': led2Status = led2Status == 1?0:1; activateLED(led2, led2Status); break; case '3': led3Status = led3Status == 1?0:1; activateLED(led3, led3Status); break; case '4': led4Status = led4Status == 1?0:1; activateLED(led4, led4Status); break; case '5': led5Status = led5Status == 1?0:1; activateLED(led5, led5Status); break; case '6': led6Status = led6Status == 1?0:1; activateLED(led6, led6Status); break; } } } //Diese Funktion aktiviert bzw. deaktiviert eine LED void activateLED(int pin, int statusLED){ digitalWrite(pin, statusLED==0?LOW:HIGH); }
Aufbau der Verbindung mit einem mobilen Gerät
Für den Test benötigst du ein Bluetoothfähiges Gerät (iPhone, Android, oder ähnliches). Ich verwende mein Huawei P20 lite. Und natürlich eine Bluetooth Terminal Software bzw. eine App. Da ich ein Android Handy nutze schaue ich mich im Playstore um und nutze die App „Serial Bluetooth Terminal„. Diese ist kostenfrei und sehr intuitiv zu bedienen.
Damit man mit der App eine Verbindung aufbauen kann muss man zunächst das Handy mit dem Bluetoothadaper verbinden, hierzu aktiviert man Bluetooth und sollte in der Liste der Geräte den Eintrag „HC-06“ auffinden.

Nach einem tip auf diesen Eintrag kann eine Verbindung aufgebaut werden, ggf. wird ein Passwort abgefragt. Das initiale Passwort im Modul ist 1234.

Als nächstes geht es nun in der Terminal App weiter. Hier müssen wir aus der Liste der verfügbaren Geräte den bereits gekoppelten Adapter HC-06 auswählen.

Da unserer Programm auf dem Arduino erwartet das nur Zahlen von 1 bis 6 gesendet werden, müssen wir in der App unter den Settings > Send das hinzufügen einer neuen Zeile beim Absenden deaktivieren.
Das Sketch auf dem Arduino ist jedoch so geschrieben das nur die Zahlen von 1 bis 6 behandelt werden, es wird somit nicht auf die Zeilenumbrüche und andere Sonderzeichen reagiert. Wir könnten somit die Einstellung auch weglassen!

Damit ist die App fertig eingerichtet und wir können nun die Zahlen 1 bis 6 absenden und die entsprechenden LEDs sollten aktiviert bzw. deaktiviert werden.
Video
alternative Multifunktionale Shields
Ich habe bereits einige folgende Multifunktionale Shields vorgestellt:
- Multifunktionales Shield „Easy Module MIX V1“ von YwRobot
- Arduino Lektion 85: Multifunktionales Shield von Open-Smart
- Arduino Lektion 57: Multifunktionales Shield (Teil2)
- Arduino Lektion 36: Multifunktionales Shield
Diese Shields liegen Preislich in der gleichen Richtung wie dieses bieten jedoch etwas mehr Funktionalitäten und bieten somit einen deutlicheren Mehrwert für Anfänger.
