Sensoren im Einsatz mit Arduino

Thomas Brühlmann

Impressum

Bibliografische Information der Deutschen Nationalbibliothek

Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über <http://dnb.d-nb.de> abrufbar.

ISBN 978-3-95845-152-0

1. Auflage 2017

www.mitp.de

E-Mail: mitp-verlag@sigloch.de

Telefon: +49 7953 / 7189 - 079

Telefax: +49 7953 / 7189 - 082

© 2017 mitp Verlags GmbH & Co. KG

Dieses Werk, einschließlich aller seiner Teile, ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Dies gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen.

Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften.

Lektorat: Sabine Schulz

Sprachkorrektorat: Petra Heubach-Erdmann

Coverbild: © Thomas Brühlmann

electronic publication: III-satz, Husby, www.drei-satz.de

Dieses Ebook verwendet das ePub-Format und ist optimiert für die Nutzung mit dem iBooks-reader auf dem iPad von Apple. Bei der Verwendung anderer Reader kann es zu Darstellungsproblemen kommen.

Der Verlag räumt Ihnen mit dem Kauf des ebooks das Recht ein, die Inhalte im Rahmen des geltenden Urheberrechts zu nutzen. Dieses Werk, einschließlich aller seiner Teile, ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheherrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Dies gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und Einspeicherung und Verarbeitung in elektronischen Systemen.

Der Verlag schützt seine ebooks vor Missbrauch des Urheberrechts durch ein digitales Rechtemanagement. Bei Kauf im Webshop des Verlages werden die ebooks mit einem nicht sichtbaren digitalen Wasserzeichen individuell pro Nutzer signiert.

Bei Kauf in anderen ebook-Webshops erfolgt die Signatur durch die Shopbetreiber. Angaben zu diesem DRM finden Sie auf den Seiten der jeweiligen Anbieter.

Kapitel 14: Sensor-Board

Anwendungen mit Sensoren sind oft im Platz beschränkt und die Sensoren müssen in ein schmales Gehäuse passen. Ein Arduino Uno mit aufgestecktem Sensor-Shield kann zwar die technischen Anforderungen der Sensor-Lösung erfüllen, aber die Leiterplatten-Abmessungen des Arduino Uno sind zu groß für ein kompaktes Sensor-Gehäuse.

Neben den Abmessungen des Arduino-Boards für den Einsatz als Sensor-Board spielen meist auch die Art der Spannungsversorgung und der Stromverbrauch eine große Rolle. Ein Arduino Uno ist nicht für batteriebetriebene Anwendungen optimiert. Zwar kann man den Arduino Uno mit einer Batterie betreiben, aber die Anwendungszeit wird recht gering sein. Ohne Optimierung der Hardware und der Software ist ein Batteriebetrieb mit dem Arduino Uno nicht rentabel.

Im »Normalbetrieb« ohne externe Beschaltung benötigt ein Arduino Uno rund 20 bis 40 mA. Dieser Stromverbrauch ​wird durch die umfangreiche Schaltung (Leuchtdioden, Eingangsspannungsbereich mit Spannungsregler, FTDI-Wandler mit Microcontroller) auf dem Board hervorgerufen.

Sensor-Board

In diesem Kapitel wird ein Arduino-Board für Sensor-Anwendungen​ vorgestellt, das geringe Abmessungen besitzt und durch die einfache Schaltung auch im Batteriebetrieb eingesetzt werden kann.

14.1  Sensor-Board

Das Sensor-Board ist meine Eigenentwicklung und erfüllt die oben beschriebenen Anforderungen an ein Arduino-Board für den Sensor-Betrieb.

Folgende Punkte kennzeichnen das Sensor-Board​:

In Abbildung 14.1 ist das Sensor-Board zu sehen.

Abb. 14.1: Sensor-Board

Das Sensor-Board ist als Open Hardware realisiert und alle Daten des Projekts sind frei verfügbar. Die Schaltung des Boards und die Daten der Leiterplatten können für eigene Anwendungen verwendet und verändert werden. Die Leiterplattendaten​ stehen im Eagle-Format zur Verfügung.

Projekt- und Leiterplattendaten

http://555circuitslab.com
https://oshpark.com/shared_projects/HOyjPT7S

Schaltung

​Abbildung 14.2 zeigt die Grundschaltung des Sensor-Boards. Die Schaltung ist auf ein Minimum reduziert und ähnelt der Minimalschaltung aus Kapitel 1.

Abb. 14.2: Sensor-Board – Stromlaufplan

Auf dem ATmega328-Microcontroller ist wie auf allen Arduino-Boards ein Bootloader installiert. Programme werden in dieser Schaltung über den FTDI-Anschluss (K2) und einen USB-Serial-Wandler oder den Programmieranschluss ICSP (K3) und einen Programmieradapter, beispielsweise ein AVRISP mkII (http://www.atmel.com/tools/AVRISPMKII.aspx), hochgeladen.

Die Versorgungsspannung von 3,3 V oder 5 V wird direkt am Stecker K1 angeschlossen.

Die Eingänge und Ausgänge des Sensor-Boards sind auf die Stiftleisten K4 bis K7 geführt. Auf der Leiterplatte sind dabei die Signalbezeichnungen gemäß Arduino-Standard aufgedruckt. Das Signal PD0 des Microcontrollers ist beispielsweise der digitale Ein- oder Ausgang D0, der in der Praxis als Signal RX verwendet wird.

Die Taktfrequenz kann je nach Bedarf gewählt werden. Bei einem Sensor-Board mit 8 MHz kann der Quarz mit den Kondensatoren (Q1) weggelassen werden. Hier ist zu beachten, dass in diesem Fall ein spezieller Bootloader geladen und in der IDE ein anderes Board, ATmega328 on a breadboard (8 MHz internal clock), ausgewählt werden muss. Im nachfolgenden Abschnitt werden der Grund und der Einsatz eines Boards mit einer Taktfrequenz von 8 MHz beschrieben.

Die Konfiguration dieses 8-MHz-Boards kann von der Arduino-Website geladen werden.

https://www.arduino.cc/en/uploads/Tutorial/breadboard-1-6-x.zip

Auf derselben Webseite sind weitere Erklärungen zu dieser Board-Variante beschrieben.

https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

14.1.1  Praxisbeispiel: Grundaufbau Sensor-Board

Mit dem Bestückungsplan aus Abbildung 14.3 gelingt der Aufbau des Sensor-Boards auch einem Einsteiger. Im ersten Schritt lötet man die SMD-Komponenten auf das Board, anschließend den IC-Sockel für den Microcontroller und, je nach Bedarf, die einzelnen Stiftleisten.

Abb. 14.3: Sensor-Board – Bestückungspla​n

Stückliste

  • ​1 Leiterplatte (OSHPark)

  • 1 Microcontroller Atmel ATmega328 (DIL28)

  • 1 Resonator 16 MHz (Q1, Gehäuse SMD, 3,2x1,3 mm)

  • 3 Keramik-Kondensatoren 100 nF (C1-C3, SMD 1206)

  • 1 Widerstand 10 kOhm (R1, SMD1206)

  • 1 IC-Sockel DIL28

  • 2 Stiftleisten 1x3 (K8, K9)

  • 1 Stiftleiste 1x4 (K1)

  • 1 Stiftleiste 1x6 (K2)

  • 1 Stiftleiste 2x3 (K3)

  • 4 Stiftleisten 1x12 (K4-K7)

Aufbau

Die Leiterplatte des Sensor-Boards hat eine Größe von 65x35 mm. Der Microcontroller ATmega328 und die Stiftleisten für die Programmieradapter sowie die Eingänge und Ausgänge können an den entsprechenden Lötpads angelötet werden. Die passiven Komponenten wie der Reset-Widerstand und die Kondensatoren sowie der Quarz für den Systemtakt sind als SMD-Komponenten (Bauteile für die Oberflächenmontage) ausgelegt.

Ein Montageloch erlaubt die stabile Montage des Boards mit einer Montageschraube.

14.1.2  Praxisbeispiel: Programmierung des Sensor-Boards

​Die Programmierung des Sensor-Boards kann auf zwei verschiedene Arten erfolgen, wobei bei beiden Arten ein zusätzlicher externer Adapter benötigt wird:

  • via FTDI-Stecker (K2)

  • via ICSP-Anschluss (K3)

Für Programmierung über den FTDI-Stecker wird ein sogenannter USB-Serial-Adapter benötigt, da auf dem Sensor-Board keine USB-Schnittstelle zur Verfügung steht. Dieser kleine Wandler ist das Bindeglied zwischen dem USB-Anschluss des Rechners und dem Microcontroller auf dem Sensor-Board.

Diese USB-Serial-Wandler, oft auch als FTDI-Wandler benannt, gibt es als Leiterplatten- oder als Kabel-Version.

In Abbildung 14.4 sind die beiden Varianten dargestellt, links die Leiterplattenvariante und rechts das sogenannte FTDI-Kabel.

Abb. 14.4: FTDI-Adapter: USB-Serial-Adpter (links), FTDI-Kabel (rechts)

Beide Versionen dieses USB-Serial-Wandlers werden am 6-poligen FTDI-Anschluss des Sensor-Boards angeschlossen (Abbildung 14.5).

Diese Adapter sind recht günstig und bei verschiedenen Händlern verfügbar.

Für die Programmierung des Sensor-Boards via ICSP-Anschluss (K3) ist ein externes Programmiergerät erforderlich. Das Programmiergerät wird am 2x3-poligen Anschluss mit der Bezeichnung ICSP angeschlossen.

Der Programmupload über den ICSP-Anschluss erfolgt via SPI-Schnittstelle und erfordert keinen Arduino-Bootloader auf dem Microcontroller des Sensor-Boards.

Abb. 14.5: FTDI-Anschluss des Sensor-Boards

Mögliche Programmieradapter sind:

USBTinyISP​ (Adafruit)
https://learn.adafruit.com/usbtinyisp

oder

AVRISP mkII​
http://www.atmel.com/tools/avrispmkii.aspx

Fortgeschrittene Bastler können sich mit einem Arduino-Board einen eigenen, sogenannten In-System-Programmer aufbauen. Die Anleitung auf der Arduino-Website beschreibt diese Lösung ausführlich.

https://www.arduino.cc/en/Tutorial/ArduinoISP

Board-Varianten

​Neben der Standard-Variante mit Protofläche habe ich auch eine Variante für drahtlose Anwendungen mit dem Transceiver RFM12B realisiert. Diese Lösung eignet sich ideal für kleine Sensormodule, die die Messdaten über das 433-MHz-Band versenden (Abbildung 14.6).

Abb. 14.6: Sensor-Board mit RFM12B-Transceiver

Weitere Board-Varianten und zugehörige Erweiterungsplatinen, die direkt auf das Sensor-Board gesteckt werden, habe ich in der Entwicklung.

Prototypen-Board für Sensor-Board

Für eigene Schaltungsanwendungen habe ich ein Prototypen-Board realisiert, das auf das Sensor-Board aufgesteckt werden kann. Dieses Protoboard ist zurzeit noch in der Testphase.

Anwendungsideen des Sensor-Boards

  • Einfaches und günstiges Entwicklungsboard für den Basteltisch

  • Batteriebetriebener Datenlogger

  • Kompaktes Sensormodul für Umweltmessungen im Garten

  • Kompaktes Arduino-Board für viele Anwendungen im Haus

14.2  Low-Power-Betrieb

​Batteriebetriebene Arduino-Boards ermöglichen einen standortunabhängigen Einsatz, beispielsweise als Sensor-Anwendung im oder ums Haus. Der Standort ist dabei unabhängig von einer Steckdose oder einem USB-Adapter.

Beim Betrieb mit einer Batterie müssen Sie ein besonderes Auge auf den Stromverbrauch haben. Im Normalbetrieb, also mit einer Versorgung aus einem Netzgerät oder über den USB-Anschluss müssen Sie sich meist keine Gedanken über den Stromverbrauch machen. Ein paar Milliampere (mA) mehr macht nichts aus. Oft weiß der Anwender nicht, wie viel Strom sein Projekt aus dem Netzteil oder USB-Adapter bezieht.

14.2.1  Praxisbeispiel: Stromverbrauch reduzieren auf dem Arduino-Board

Um den Stromverbrauch eines Arduino-Boards so gering wie möglich zu halten, sollten auf dem Board folgende Punkte in Betracht gezogen werden:

  • Unnötige Hardware entfernen

  • Keine LED oder Anzeige-Elemente im Dauerbetrieb

  • Betriebsspannung minimieren

  • Taktfrequenz minimieren

  • Nicht verwendete Funktionen im Microcontroller deaktivieren

  • Software für Sleep-Funktionen einsetzen

Das Standard-Board Arduino Uno eignet sich nicht optimal für den Batteriebetrieb​, da die oben aufgelisteten Punkte nicht ohne Aufwand umgesetzt werden können.

Unnötige Hardware entfernen

Schaltungsteile mit integrierten Schaltungen (IC) wie USB-Serial-Wandler sind auf einem batteriebetriebenen Board nicht zwingend notwendig und belasten nur den Stromverbrauch. Auf dem Arduino Uno ist dazu ein separater Microcontroller im Einsatz. Im Falle eines Datentransfers über die serielle Schnittstelle kann ein externer FTDI-Adapter verwendet werden.

Keine LEDs oder Anzeige-Elemente im Dauerbetrieb

LEDs für Power-Anzeigen oder serielle Kommunikation müssen für den Batteriebetrieb entfernt werden. Dadurch kann man schnell 10 mA Stromverbrauch einsparen.

Betriebsspannung minimieren

​Das Herabsetzen der Betriebsspannung von 5 V auf 3,3 V minimiert den Stromverbrauch einer Arduino-Schaltung sehr drastisch.

Gemäß Datenblatt des ATmega328-Microcontrollers sollte bei Reduktion der Versorgungsspannung auch die Taktfrequenz heruntergesetzt werden. Das Datenblatt gibt für den 3,3-V-Betrieb eine maximale Taktfrequenz von rund 13 MHz an.

Taktfrequenz minimieren

​Das Minimieren der Taktfrequenz von 16 MHz auf 8 MHz reduziert den Stromverbrauch nochmals um mehrere Milliampere (mA).

Nicht verwendete Funktionen im Microcontroller deaktivieren

Funktionen wie Timer, Watchdog, Brown-out Detection (Funktion zur Erkennung, ob die Betriebsspannung den Schwellenwert nicht unterschreitet) oder Analog/Digitalwandler können, falls in der Anwendung nicht benötigt, deaktiviert werden.

Software für Sleep-Funktionen einsetzen

Sleep-Funktionen in Form von Bibliotheken erlauben die Aktivierung von Schlafphasen des Microcontrollers und ermöglichen den Betrieb in einem Sleep-Modus, was eine bedeutende Abnahme des Betriebsstroms zur positiven Folge hat.

Während des Sleep-Modus ist die Arduino-Anwendung im Ruhezustand. Ein Sensormodul, das regelmäßig Messwerte erfasst, ist im Sleep-Modus quasi im Standby. Nur während einer kurzen Phase wird das Board aktiviert, ein Messwert erfasst und dann wird das Sensormodul wieder in den Sleep-Mode gesetzt.

Mögliche Bibliotheken mit Sleep-Mode-Funktionen sind:

Low-Power​ Library​
https://github.com/rocketscream/Low-Power/

Diese Bibliothek ist speziell für Low-Power-Anwendungen realisiert. Sie erlaubt die Deaktivierung einzelner Microcontroller-Funktionen.

JeeLib Bibliothek​​
https://github.com/jcw/jeelib

Die JeeLib-Bibliothek ist für Anwendungen mit RF-Modulen wie RFM12B entwickelt und beinhaltet auch eine Sleep-Funktion, die ausführlich beschrieben ist.

http://jeelabs.org/2011/12/13/developing-a-low-power-sketch/

14.2.2  Praxisbeispiel: Sensor-Board im Low-Power-Betrieb mit Low-Power-Bibliothek

Das Sensor-Board aus dem ersten Teil dieses Kapitels ist speziell für batteriebetriebene Sensor-Anwendungen realisiert, um Sensordaten zu erfassen und anschließend weiterzuverarbeiten oder weiterzusenden.

Für den Batteriebetrieb​ und die Phasen, in denen keine Sensordaten eingelesen oder verarbeitet werden, kann das Board mit der Low-Power-Library in den Sleep-Mode versetzt werden. Sensordaten werden meist in einem längeren Rhythmus abgefragt.

In diesem Beispiel verwenden wir den längsten Rhythmus der Bibliothek und lassen das Board jeweils für acht Sekunden im Sleep-Modus.

Im ersten Schritt wird im Programmcode die nötige Bibliothek geladen.

//
// Sensor-Board im Low-Power-Betrieb
//
 
#include "LowPower.h"

In der Setup-Funktion sind keine Aktionen nötig. Die serielle Schnittstelle wird nicht gestartet.

void setup()
{
  // keine Funktionen notwendig  
}

Im Hauptprogramm startet der Programmdurchlauf mit der Sleep-Phase von acht Sekunden.

void loop()
{
  // Sleep-Modus für 8 Sekunden, ADC aus, BOD aus
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);

Anschließend kann das Sensor-Board nach der Pause Sensorwerte verarbeiten oder andere Funktionen ausführen.

  // Sensorwerte weiterverarbeiten, beispielsweise Daten senden oder speichern
  //..
}

Bis es anschließend im nächsten Programmdurchlauf wieder in den Sleep-Mode gesetzt wird.

14.2.3  Praxisbeispiel: Sensor-Board im Low-Power-Betrieb mit JeeLib-Bibliothek

Die Sleep-Funktion der JeeLib-Bibliothek kann grundsätzlich wie die Delay-Funktion delay() eingesetzt werden. Dazu wird folgende Funktion verwendet:

Sleepy::loseSomeTime(Zeit_in_Millisekunden);

Um diese Sleep-Funktion zu nutzen, muss die JeeLib-Bibliothek geladen werden.

#include <JeeLib.h>

Nun muss ein Stück Code eingefügt werden, um Run-Time-Fehler abzufangen.

ISR(WDT_vect) { Sleepy::watchdogEvent(); }

Nach der Deklaration der benötigten Variablen

int valSensor;
int SensorPin=0;
int LEDPin=6;

werden in der Setup-Funktion nötige Voreinstellungen gemacht. In diesem Beispiel wird der Ausgang für die LED gesetzt.

void setup()
{
  // LED-Ausgang setzen
  pinMode(LEDPin, OUTPUT);
}

Im Hauptprogramm kann nun die eigentliche Funktionalität unseres Sensor-Boards ausgeführt werden. Im Beispiel wird zuerst ein Analogwert am Eingang A0 eingelesen.

void loop()
{
  // Analogwert einlesen
  valSensor = analogRead(SensorPin);

Danach können weitere Funktionen ausgeführt werden. Als Beispiel wird kurz die Leuchtdiode ein- und dann wieder ausgeschaltet.

// Sensorwert weiterverarbeiten
  // ...
  // Anzeige Messvorgang
  digitalWrite(LEDPin, HIGH);
  Sleepy::loseSomeTime(100);
  digitalWrite(LEDPin,LOW);

Die kurze Verzögerungszeit zwischen Ein- und Ausschalten der LED wird mit der Sleep-Funktion Sleepy::loseSomeTime(100) ausgeführt.

Anschließend wird das Board für 10000 Millisekunden, das entspricht zehn Sekunden, in den Sleep-Mode versetzt.

  // Sleep-Modus für 10 Sekunden
  Sleepy::loseSomeTime(10000);
}

Die maximale Sleep-Dauer kann maximal 60 Sekunden, also 60000 Millisekunden betragen. Falls Sie eine längere Sleep-Dauer benötigen, können Sie, gemäß dem Entwickler der JeeLib-Bibliothek, eine For-Schleife ausführen.

for (byte i = 0; i < 120; ++i)
      Sleepy::loseSomeTime(60000);

Mit 120 Durchläufen bekommt man so eine Verzögerung von 120 Minuten.

Abschlussbemerkungen

In den verschiedenen Kapiteln dieses Buches haben Sie eine Vielzahl von Sensoren kennengelernt und praktisch eingesetzt. Dieses Wissen ist nun eine gute Basis für eigene Sensor-Anwendungen und praktische Lösungen.

Ich wünsche Ihnen viel Spaß und spannende Projekte.

Kapitel 13: Sensor-Shield

Die in den vorherigen Kapiteln beschriebenen Sensoren werden im Einsatz meistens entfernt vom Arduino-Board platziert. Die Verbindung vom Sensor zum Arduino erfolgt dabei über einzelne Drahtverbindungen oder über ein mehrpoliges Kabel. Auf dem Arduino-Board selbst werden die Signale der Sensoren an den vorhandenen Buchsenleisten angeschlossen.

​Viele Bastler nutzen zusätzlich als Schnittstelle zwischen Arduino-Board und Sensor ein Steckbrett, auf dem oftmals noch zusätzliche Komponenten, beispielsweise Vor- oder Pull-up-Widerstände oder Kondensatoren für die Spannungsstabilisierung, aufgesteckt werden. Für einen stabileren Einsatz empfiehlt sich, statt des Steckbretts ein Proto-Shield einzusetzen. Das Proto-Shield kann direkt auf das Arduino-Board gesteckt werden. Die zusätzlichen elektronischen Bauteile können stabil und sicher auf dem Proto-Shield aufgelötet werden.

13.1  Das Sensor-Shield

Für universelle Sensor-Anwendungen habe ich ein Sensor-Shield realisiert, um verschiedene Sensoren direkt am Arduino-Board anzuschließen. Das Shield eignet sich ideal für den Test der in den vorigen Kapiteln beschrieben Sensoren und als stabile Universalplatine für eine produktive Sensor-Anwendung.

Das Sensor-Shield bietet folgende Anschlussmöglichkeiten und Zusatzfunktionen:

In Abbildung 13.1 ist das Sensor-Shield dargestellt.

Abb. 13.1: Sensor-Shield

Die Sensoren werden an den Grove-Steckern, den Stiftleisten oder den Arduino-Buchsenleisten angeschlossen.

13.2  Shield-Schaltung

Die Schaltung des Sensor-Shields ist in Abbildung 13.2 dargestellt.

Im Schaltplan ist die Leiterplatte mit »Arduino Uno R3« bezeichnet. Alle weiteren Bauteile und Stecker auf dem Shield werden an den digitalen und analogen Pins angeschlossen.

Die Sensoren NTC und LDR werden jeweils mit einem Pulldown-Widerstand angeschlossen. Der Analogwert des NTC ist am analogen Eingang A3 angeschlossen, der Analogwert des LDR an A2.

Der DHT-Sensor kann über eine 4-polige Stiftleiste angeschlossen werden. Das digitale Signal wird am digitalen Pin D2 des Arduino eingelesen.

Die Leuchtdiode PWR ist die Anzeige der 5-V-Versorgungsspannung und leuchtet, wenn am Shield 5 V angelegt werden.

Abb. 13.2: Schaltung Sensor-Shield

Die RGB-Leuchtdiode mit den Vorwiderständen für die drei internen Leuchtdioden (Rot, Geld und Blau) ist ein Common-Anode-Typ. Die einzelnen Leuchtdioden leuchten auf, sobald man die entsprechenden Anschlüsse mit gnd verbindet.

Die weißen Grove-Stecker sind im Schaltplan mit J1 bis J5 bezeichnet. Grove ​ist ein modulares System mit vielen Sensormodulen und wurde durch den chinesischen Hersteller Seeed Studio entwickelt.

http://www.seeedstudio.com/wiki/Grove_System

Alle Module und Sensoren dieses Systems können über ein standardisiertes Anschlusssystem mittels 4-poliger Anschlussstecker angeschlossen werden. Die Anschlussbelegung der Grove-Stecker unterscheidet sich jeweils nach Art des angeschlossenen Sensors (Analog, Digital, I2C-Bus). Alle Signale der Grove-Stecker werden auf Standard-Arduino-Pins geführt. Als Basis für den Einsatz der Grove-Module dient meist ein Grove-Basisshield, auf dem mehrere Grove-Stecker vorhanden sind. Zu beachten ist, dass die weißen, 4-poligen Grove-Stecker keinen Standard-Pinabstand im Zoll-Raster (0,1 Zoll entspricht 2,54 mm) haben. Im Grove-System beträgt der Pinabstand 2 mm.

Stückliste

  • 1 Leiterplatte Sensor-Shield, Rev. A (http://555circuitslab.com/)

  • 2 Headerleiste 6-polig (JP1, JP2)

  • 2 Headerleisten 8-polig (JP3, JP4)

  • 5 Grove-Stecker 4-polig (J1, J2, J3, J4, J5)

  • 1 Stiftleiste 4-polig (DHTx, JP8)

  • 4 Widerstände 1 kOhm (R4, R5, R6, R7)

  • 1 Widerstand 4,7 kOhm (R3)

  • 2 Widerstände 10 kOhm (R1, R2)

  • 1 RGB-LED 5 mm (RGB)

  • 1 LED grün 3 mm (PWR)

13.3  Anschlussmöglichkeiten

​In Abbildung 13.3 sind die Anschlussmöglichkeiten des Sensor-Shields dargestellt.

Abb. 13.3: Sensor-Shield – Anschlussmöglichkeiten

RGB

Die Ansteuerung der RGB-LED erfolgt über drei Anschluss-Pads. Wie bereits erwähnt, können die drei internen Leuchtdioden über ein GND-Signal angesteuert werden. In der Praxis führt man die drei Anschlüsse der RGB-Leuchtdiode auf freie digitale Pins. Im Beispiel werden die Pins D9, D10 und D11 verwendet (Abbildung 13.4).

Abb. 13.4: Sensor-Shield – Anschluss RGB

DHTx

Über die 4-polige Stiftleiste kann direkt ein Umweltsensor der DHT-Reihe angeschlossen werden. Die Anwendung mit dem DHT-Sensor ist in Abschnitt 9.1.1 beschrieben.

Grove Digital

Anschlussmöglichkeit für zwei digitale Grove-Module.

Auf dem Grove-Stecker sind folgende Signale angeschlossen (Tabelle 13.1).

Grove Stecker (Pin-Nr.)

Signal (D3/D4)

Signal (D4/D5)

1

D3

D4

2

D4

D5

3

+5 V

+5 V

4

GND

GND

Tabelle 13.1: Grove Digital – Anschlussbelegung

Grove I2C

Anschlussmöglichkeit für zwei Grove-Sensoren, die über den I2C-Bus angesteuert werden. Die I2C-Bus-Leitungen sind auf die Anschluss-Pins A4 (SCA) und A5 (SCL) geführt.

Auf dem Grove-Stecker sind folgende Signale angeschlossen (Tabelle 13.2).

Grove Stecker (Pin-Nr.)

Signal

1

SCL

2

SDA

3

+5 V

4

GND

Tabelle 13.2: Grove I2C – Anschlussbelegung

Beispiele für passende Grove-Module mit I2C sind:

Barometer-Sensor

http://www.seeedstudio.com/wiki/Grove_-_Barometer_Sensor

OLED-Display

http://www.seeedstudio.com/wiki/Grove_-_OLED_Display_96*96

Grove Analog

Anschlussmöglichkeit für ein analoges Grove-Modul.

Auf dem Grove-Stecker sind folgende Signale angeschlossen (Tabelle 13.3).

Grove Stecker (Pin-Nr.)

Signal

1

A1

2

A0

3

+5 V

4

GND

Tabelle 13.3: Grove Analog – Anschlussbelegung

Beispiele für passende analoge Grove-Module:

Air-Quality-Sensor
http://www.seeedstudio.com/wiki/Grove_-_Air_Quality_Sensor_v1.3
Loudness-Sensor
http://www.seeedstudio.com/wiki/Grove_-_Loudness_Sensor

NTC

Anschlussmöglichkeit für einen externen NTC-Temperatursensor.

LDR

Anschlussmöglichkeit für einen externen Fotowiderstand (LDR).

Pads +5 V, GND

Die jeweils drei Lötpads mit +5 V und GND liefern die Versorgungsspannung für eigene Anwendungen.

Proto-Pads

Die freien Lötpads der Prototypenfläche können für eigene Schaltungen und Funktionen verwendet werden.

13.4  Anschlussbelegung

Die Anschlussbelegung des Sensor-Shields ist in Tabelle 13.4 aufgeführt.

Stecker/Funktion

Arduino-Pin

Bemerkung

RGB LED

-

3 freie Anschlusspads für Verbindung zu Arduino-Pins

DHTx Sensor

Data an D2

 

Grove D3/D4

D3, D4

 

Grove D4/D5

D4, D5

 

Grove I2C

SCL an A5
SDA an A4

 

Grove Analog

A0, A1

 

Power-LED

-

Anzeige +5-V-Versorgung

NTC

A3

 

LDR

A2

 

Tabelle 13.4: Sensor-Shield – Anschlussbelegung

In Tabelle 13.5 sind die Arduino-Pins und deren Verbindung zu den einzelnen Shield-Funktionen aufgelistet.

Arduino-Pin

Stecker/Funktion

Bemerkung

D0

-

RX von Arduino

D1

-

TX von Arduino

D2

Data vonDHTx-Sensor

 

D3

Grove D3/D4

 

D4

Grove D3/D4, D4/D5

 

D5

Grove D4/D5

 

D6

-

 

D7

-

 

D8

-

 

D9

-

 

D10

-

 

D11

-

 

D12

-

 

D13

-

 

A0

Grove A0/A1

 

A1

Grove A0/A1

 

A2

LDR

 

A3

NTC

 

A4

I2C (SDA)

 

A5

I2C (SCL)

 

Vin

-

Nicht angeschlossen

GND

GND

 

5V

+5 V

 

3V3

-

Nicht angeschlossen

Res

-

Nicht angeschlossen

Aref

-

Nicht angeschlossen

Tabelle 13.5: Sensor-Shield – Anschlussbelegung Arduino-Pins

13.5  Anwendungsmöglichkeiten

13.5.1  Praxisbeispiel: Ansteuerung RGB-LED

Die Ansteuerung der RGB-LED erfolgt mittels der digitalen Pins D9, D10 und D11. Wie bereits erwähnt, müssen dazu die drei Signale mit der RGB-Leuchtdiode gemäß Abbildung 13.4 verdrahtet werden.

Für die Darstellung einer Farbe muss nun der sogenannte RGB-Code mit den Farbwerten für Rot, Gelb und Blau übergeben werden. Dabei wird für die Ansteuerung die Funktion setColor() verwendet. Im Funktionsaufruf werden die Farbwerte für die drei Farben übergeben.

​setColor(Wert Rot, Wert Grün, Wert Blau);

In der Funktion selbst werden die im Funktionsaufruf übergebenen Farbwerte als PWM-Signal ausgegeben. Da die RGB-LED als Common-Anode-Typ mit einem LOW-Signal leuchtet, muss auch der PWM-Wert invertiert werden. Dazu wird der Farbwert von 255 subtrahiert.

void setColor(int red, int green, int blue)
{
  // RGB-Werte ausgeben
  analogWrite(redPin, 255-red);
  analogWrite(greenPin, 255-green);
  analogWrite(bluePin, 255-blue);
}

Möchten Sie beispielsweise die RGB-LED in der Farbe Violett darstellen, sieht der Aufruf wie folgt aus:

setColor(200, 0, 255);

Listing 13.1 zeigt die Ansteuerung der RGB-Leuchtdiode und die Darstellung von verschiedenen Farben.

int redPin = 9;
int greenPin = 10;
int bluePin = 11;
 
void setup()
{
  // Pins als Ausgänge setzen
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
}
 
void loop()
{
  // gelb
  setColor(250, 105, 0);
  delay(1000);
 
  // orange
  setColor(250, 40, 0);
  delay(1000);
 
  // rot
  setColor(255, 0, 0);
  delay(1000);
 
  // blau
  setColor(10, 10, 255);
  delay(1000);
 
  // pink
  setColor(255, 0, 100);
  delay(1000);
 
  // violett
  setColor(200, 0, 255);
  delay(1000);
 
  // grün
  setColor(0, 255, 0);
  delay(1000);
 
  // weiss
  setColor(255, 255, 255);
  delay(1000);}
 
void setColor(int red, int green, int blue)
{
  // RGB-Werte ausgeben
  analogWrite(redPin, 255-red);
  analogWrite(greenPin, 255-green);
  analogWrite(bluePin, 255-blue);
}

Listing 13.1: Farben ausgeben mit RGB-LED

13.5.2  Praxisbeispiel: Analogwert-Monitor mit RGB

Die auf dem Sensor-Shield integrierte RGB-LED kann als Anzeige-Element für viele Anwendungsfälle verwendet werden. Bekanntlich kann die RGB-Leuchtdiode einen großen Farbbereich darstellen und eignet sich somit ideal als optisches Display für verschiedene Mess- oder Sensorwerte.

​Dieses Projekt beschreibt einen kleinen optischen Monitor, der den gemessenen Analogwert nicht als absolute Zahl, sondern als Farbe ausgibt. Der Farbbereich ist in zwölf Stufen aufgeteilt. Abbildung 13.5 zeigt die Farbe als sogenanntes »RGB Color Wheel«.

Bei jeder Farbe ist zusätzlich der RGB-Code der Farbe angegeben, der später im Programmcode verwendet wird, um die jeweilige Farbe darzustellen.

​Der RGB-Monitor wandelt einen am Analogeingang (A0) gemessenen Analog-Wert in eine Farbe des »Color Wheels« um. Der Messbereich beträgt dabei 0 bis 5 Volt und kann von einem Sensor oder einem anderen Teil der Schaltung geliefert werden. Im Beispiel wird die Spannung mittels eines verstellbaren Widerstands, Potenziometer genannt, generiert.

Abb. 13.5: Farben – RGB Color Wheel

Stückliste (RGB-Monitor)

  • 1 Arduino-Board

  • 1 Steckbrett

  • 1 Sensor-Shield

  • 1 Potentiometer

  • Jumper-Wire

Abbildung 13.6 zeigt die Verdrahtung des externen Potentiometers.

Abb. 13.6: Steckbrettaufbau: RGB-Monitor

Im Programmcode für den RGB-Monitor werden zuerst verschiedene Variablen deklariert.

Wir definieren zwölf Farben und jede Farbe hat drei Werte für Rot, Grün und Blau.

int color=12;
int colorValue=3;

Die drei Leuchtdioden der RGB-LED werden an Pin 9, 10 und 11 angeschlossen.

int redPin = 9;
int greenPin = 10;
int bluePin = 11;

Zusätzlich werden noch Variablen für den internen Gebrauch deklariert.

int TempPin = 0;
int valA0=0;
int valAmap=0;

Der Farbcode für die zwölf Farben wird nun in einem mehrdimensionalen Array gespeichert.

int ledRGB[12][3] = {
  {255, 0, 0}, 
  {255, 127, 0}, 
  {255, 255, 0},
  {127, 255, 0},
  {0, 255, 0},
  {0, 255, 127},
  {0, 255, 255},
  {0, 127, 255},
  {0, 0, 255},
  {127, 0, 255},
  {255, 0, 255},
  {255, 0, 127}
  };

In der Setup-Routine werden die drei Ausgänge für die Leuchtdioden gesetzt und die serielle Schnittstelle gestartet.

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(9600);
  Serial.print("RGB Matrix..");
}

Im Hauptprogramm wird jeweils zuerst der Wert am analogen Eingang A0 eingelesen. Der Wertebereich liegt dabei zwischen 0 und 1023. Mittels der Funktion wird dieser Wertebereich auf den Bereich 0 bis 11 umgewandelt. Dies entspricht den zwölf Farbwerten unseres RGB-Monitors.

void loop()
{
  // Analogwert einlesen
  valA0=analogRead(TempPin);
  valAmap=map(valA0, 0, 1023, 0, 11);

Der in der Variablen valAmap gespeicherte Wert ist der Verweis auf den Farbwert im Array. Der Wert 5 würde also dem Farbwert {0, 255, 127} aus dem Array entsprechen.

Für die drei Farbwerte für die Leuchtdioden werden nun diese drei Werte ausgelesen.

  // Werte RGB Color
  // LED rot
  int colR=ledRGB[valAmap][0];
  // LED grün
  int colG=ledRGB[valAmap][1];
  // LED blau
  int colB=ledRGB[valAmap][2];

Der Wert für Rot wäre in diesem Beispiel 0, für Grün 255 und für Blau 127.

Zur Kontrolle wird der Inhalt von valAmp noch auf die serielle Schnittstelle ausgegeben.

  // Ausgabe Wert
  Serial.println(valAmap);

Nun wird die Farbe der RGB-Leuchtdiode gesetzt, indem man die Funktion setColor() aufruft und die drei Farbwerte übergibt.

  setColor(colR, colG, colB);

Am Ende wird noch eine kleine Verzögerung ausgeführt und dann beginnt der Programmablauf wieder am Anfang.

In der Funktion setColor() werden jeweils die drei Farbwerte mitgegeben. Diese werden in der Funktion in den internen Variablen red, green und blue gespeichert.

void setColor(int red, int green, int blue)
{

Da die verwendete RGB-LED eine vom Common-Anode-Typ ist, muss die Ansteuerung invertiert werden. Dies erfolgt jeweils durch die Subtraktion des Farbwerts von 255.

  red=255-red;
  green=255-green;
  blue=255-blue;

Mit dem Ansteuern der einzelnen Leuchtdioden über ein PWM-Signal ist die gewünschte Farbe eingestellt.

  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);
}

Nach dem Einschalten des Arduino-Boards kann mit dem Potenziometer ein Analogwert zwischen 0 und 1023 eingestellt werden. Die Farbe der RGB-Leuchtdiode verändert sich nun gemäß dem Farbmuster des »Color Wheels« aus Abbildung 13.5.

Listing 13.2 zeigt das gesamte Programm für den RGB-Monitor.

int color=12;
int colorValue=3;
 
int redPin = 9;
int greenPin = 10;
int bluePin = 11;
 
int TempPin = 0;
 
int valA0=0;
int valAmap=0;
 
int ledRGB[12][3] = {
  {255, 0, 0}, 
  {255, 127, 0}, 
  {255, 255, 0},
  {127, 255, 0},
  {0, 255, 0},
  {0, 255, 127},
  {0, 255, 255},
  {0, 127, 255},
  {0, 0, 255},
  {127, 0, 255},
  {255, 0, 255},
  {255, 0, 127}
  };
 
void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(9600);
  Serial.print("RGB Matrix..");
}
 
void loop()
{
  // Analogwert einlesen
  valA0=analogRead(TempPin);
  valAmap=map(valA0, 0, 1023, 0, 11);
  // Werte RGB Color
  // LED rot
  int colR=ledRGB[valAmap][0];
  // LED grün
  int colG=ledRGB[valAmap][1];
  // LED blau
  int colB=ledRGB[valAmap][2];
  // Ausgabe Wert
  Serial.println(valAmap);
  // Ansteuerung RGB
  setColor(colR, colG, colB);
  delay(50);
}
 
void setColor(int red, int green, int blue)
{
  red=255-red;
  green=255-green;
  blue=255-blue;
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);
}

Listing 13.2: RGB-Monitor

13.6  Bezugsquellen

Das Sensor-Shield ist als Open-Source-Hardware realisiert und darf von jedem Bastler und Maker verwendet, verbessert und erweitert werden.

Die Daten der Leiterplatte im Eagle-Format sind frei verfügbar. Das Projekt wird laufend optimiert und weiterentwickelt.

Meine Website

http://555circuitslab.com/

OSH Park

https://oshpark.com/shared_projects/3WYS48q6