Arduino Lektion #113: Multi-Purpose Shield V2 von Keyestudio

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

Multi Purpose Shield V2 von Keyestudio
Multi Purpose Shield V2 von Keyestudio

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.

PanTilt Bausatz auf Bodenplatte montiert
PanTilt Bausatz auf Bodenplatte montiert

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.

Bluetoothmodul HC-06
Bluetoothmodul HC-06

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.

Bluetoothadapter HC-06 gefunden
Bluetoothadapter HC-06 gefunden

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

eingeben des Passwortes für den Aufbau der Verbindung (Pairing)
eingeben des Passwortes für den Aufbau der Verbindung (Pairing)

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.

gekoppeltes Modul HC-06 in der Liste der verfügbaren Geräte
gekoppeltes Modul HC-06 in der Liste der verfügbaren Geräte

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!

deaktivieren der neuen Zeile in der Terminal App
deaktivieren der neuen Zeile in der Terminal App

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:

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.

Multifunktionale Shields
Multifunktionale Shields

Schreibe einen Kommentar

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