Suchen

Mit Arduino-Boards Sensoren und Peripheriebausteine rasch evaluiert

| Autor / Redakteur: Rich Miron * / Margit Kuther

Entwickler haben das Ziel, die Evaluierung von ICs, Sensoren und Peripheriebausteinen zu beschleunigen. Der Artikel zeigt, wie dies mit Arduino, RTC-ICs von Maxim und Adafruit-Breakout-Boards gelingt.

Firmen zum Thema

RTC-Modul ChronoDot 225 von Adafruit: Acht Jahre betriebsbereit mit einer CR1632-Batterie
RTC-Modul ChronoDot 225 von Adafruit: Acht Jahre betriebsbereit mit einer CR1632-Batterie
(Bild: Adafruit )

Das Internet der Dinge (IoT) hat viele kreative Startup-Unternehmen dazu inspiriert, nach Anbindungsmöglichkeiten für wegweisende Technologien zu suchen. Viele dieser Startup-Unternehmen haben jedoch nur kleine Entwicklungsteams, die sich immer kürzeren Markteinführungszeiten gegenübersehen. Natürlich suchen die Entwickler nach Möglichkeiten, die Evaluierung zu beschleunigen.

Eine Option stellen Entwicklungskits von IC-Anbietern dar, die diese für ihre Lösungen anbieten. Ist ein guter Service inklusive, spricht nichts gegen diesen Ansatz. Eine weitere Option ist die Arduino-Plattform. Arduino hat sich von einem Spielplatz für Hobbybastler zu einer vollwertigen Entwicklungsplattform entwickelt. Im folgenden erfahren Sie, wie Entwickler mit Arduino ICs, Peripheriebausteinen und Sensoren bereits in der Frühphase der Entwicklung evaluieren können, indem sie Open-Source-Hardware in der Form von Breakout-Boards (BOBs) für Sensoren und Peripheriebausteine zusammen mit Open-Source-Software in der Gestalt von Bibliotheken und Beispielprogrammen verwenden. Als Beispiel werden die Echtzeituhren (RTCs, Real Time Clocks) von Maxim Integrated und Breakout-Boards von Adafruit Industries herangezogen.

Der Aufstieg des IoT in den 1980er Jahren

Eines der ersten echten Beispiele für das IoT datiert auf die frühen 1980er Jahre zurück, als ein Coca-Cola-Automat an der Carnegie Mellon University so verdrahtet wurde, dass die Programmierer über das Internet prüfen konnten, ob Getränke verfügbar und gut gekühlt waren, bevor sie sich tatsächlich auf den Weg zum Automaten machten. Seine Bezeichnung als Konzept erhielt das IoT jedoch erst 1999.

Über den exakten Zeitpunkt der tatsächlichen Entstehung des IoT lässt sich streiten. Die beste Definition für den Zeitpunkt der Geburt des IoT, wie wir es heute kennen, ist vielleicht folgende: „Derjenige Zeitpunkt, an dem mehr „Dinge“ oder „Objekte“ als Menschen mit dem Internet verbunden waren.“ Auf dieser Grundlage wurde das IoT Schätzungen zufolge zwischen 2008 und 2009 geboren, wobei das Verhältnis von Dingen zu Menschen von 0,08 in 2003 auf 1,84 in 2010 gestiegen ist.

Der Aufstieg von Arduino in den 2000er Jahren

Die Entstehung des IoT fällt mit dem Aufstieg der Maker-Bewegung in den frühen 2000er Jahren zusammen. Die erste weltweite Bereitstellung der Arduino-Plattform fand 2005 statt. In diesem Jahr kam auch das Magazin Make auf den Markt und nur ein Jahr später fand die erste Maker Faire statt.

Seit ihren Anfängen hat die Arduino-Plattform Open-Source-Umgebungen mit anspruchsvoller Software und Hardware hervorgebracht. Diese gut unterstützten Umgebungen von Arduino mussten nunmehr für professionelle Entwickler zugänglich gemacht werden, um ihnen ihre Arbeit zu erleichtern und die Markteinführungszeit zu verkürzen.

Die Lösung hierfür ergab sich auf ganz natürliche Weise, denn die riesige Umgebung, die um die Arduino-Plattform herum wuchs, brachte einen unerwarteten Nebeneffekt mit sich: Professionelle Ingenieure fingen an, Arduino für die Evaluierung von Sensoren und Peripheriebausteinen zu verwenden, bevor sie diese in ihren eigenen Designs bereitstellten. Hierfür gibt es inzwischen zahlreiche Beispiele, etwa die Echtzeituhr (RTC).

Evaluierungsbeispiel für einen Peripheriebaustein mittels RTC

Fast jeder moderne 32-Bit-Mikrocontroller verfügt über eine integrierte Echtzeituhr. Selbiges gilt auch für viele 16-Bit- und sogar 8-Bit-Mikrocontroller. Obwohl dadurch weniger Platz auf der Leiterplatte benötigt wird, die Stückliste kürzer wird und die Kosten für das Endprodukt sinken, hat die Verwendung einer internen Echtzeituhr auch Nachteile. Einer dieser Nachteile ist, dass der Mikrocontroller seine interne Echtzeituhr per Software aktivieren und deaktivieren muss. Wenn es also beispielsweise zu einer Unterbrechung der Stromversorgung kommt und der Mikrocontroller gesperrt wird oder sein Code Probleme verursacht, könnte die Echtzeituhr unbeabsichtigt deaktiviert werden.

Im Vergleich dazu wird eine externe Echtzeituhr als robuster angesehen, da sie über eine separate Stromschiene und einen eigenen Quarz verfügt. Außerdem ist es weniger wahrscheinlich, dass sie von dem auf dem Mikrocontroller ausgeführten Code versehentlich deaktiviert wird. Des Weiteren wird bei der Implementierung der externen Echtzeituhr üblicherweise ein größerer Chip-Fertigungsprozessknoten als beim Mikrocontroller verwendet und ihr größerer Silizium-Footprint machen sie weniger anfällig für Bit-Flips, das heißt, Single-Event-Upsets (SEUs), die durch Strahlung, etwa kosmische Strahlung, verursacht werden.

Beispiele für RTC-ICs: DS1307 und DS3231 von Maxim

DS1307: Das Breakout-Board 3296 von Adafruit ist eine batteriegepufferte Echtzeituhr (RTC).
DS1307: Das Breakout-Board 3296 von Adafruit ist eine batteriegepufferte Echtzeituhr (RTC).
(Bild: Adafruit )

Zwei beliebte RTC-ICs sind DS1307 und DS3231 von Maxim Integrated. Beide Komponenten verfolgen Sekunden, Minuten, Stunden, Tag, Datum, Monat und Jahr. Sie passen sich automatisch an Monate mit weniger als 31 Tagen an, berücksichtigen Schaltjahre und unterstützen den 24- oder den 12-Stunden-Modus. Außerdem kommunizieren beide Komponenten über einen seriellen I2C-Bus mit dem Host-Mikrocontroller und RTC-ICs enthalten einen Messkreis, der Stromausfälle erkennt und automatisch auf die Reserveversorgung umschaltet (üblicherweise eine Batterie), damit die Zeiterfassung aufrechterhalten werden kann.

Selbstverständlich sollten die Datenblätter betrachtet werden, um die Unterschiede zwischen diesen Komponenten zu sehen. Die DS1307 beispielsweise benötigt eine 5-Volt-Spannungsquelle sowie einen externen Quarz. Im Vergleich dazu kann die präzisere DS3231 mit einer Spannungsquelle von 2,3 V bis 5,5 V betrieben werden. Sie ist zudem mit einem integrierten temperaturkompensierten Quarz-Oszillator (TXCO) und einem Quarz ausgestattet. Manchmal sind die Unterschiede zwischen diesen Komponenten nicht sofort erkennbar.

Beispielsweise bieten beide Komponenten einen Rechteckwellenausgang, der, falls er per Software aktiviert wird, einen externen Pull-up-Widerstand benötigt. Für die DS1307 kann der Rechteckwellenausgang jedoch so programmiert werden, dass er ein Signal mit einer Frequenz von 1 Hertz (Hz), 4,096 Kilohertz (kHz), 8,192 kHz oder 32,768 kHz erzeugt. Im Vergleich dazu kann dieser Ausgang für die DS3231 so programmiert werden, dass er ein Signal mit einer Frequenz von 1 Hz, 1,024 kHz, 4,096 kHz oder 8,192 kHz erzeugt.

Bei der DS1307 ist die Genauigkeit der Uhr abhängig von der Genauigkeit des Quarzes sowie der Genauigkeit der Übereinstimmung zwischen der kapazitiven Last der Oszillatorschaltung und der kapazitiven Last, für die der Quarz geschnitten wurde. Im Vergleich dazu bietet die temperaturkompensierte DS3231 eine spezifischere Genauigkeitsangabe von ±2 Minuten pro Jahr von –40 °C bis 85 °C.

Wenn man also davon ausgeht, dass es bezüglich der Datenblätter zwischen diesen beiden Komponenten keine „Dealbreaker" gibt, wie würden Entwickler sie in der realen Welt bewerten? Eine Lösung wäre die Entwicklung und Erstellung kundenspezifischer Breakout-Boards (BOBs) sowie die zusätzliche Entwicklung des Codes, um sie anzusteuern. Schneller und kostengünstiger wäre die Verwendung serienmäßig produzierter Breakout-Boards und von Code, der im Rahmen der Hardware- und Softwareumgebungen von Arduino entwickelt wurde.

RTC-Breakout-Boards: Adafruit DS1307 und ChronoDot

Arduino Uno Rev. 3: Arduino hat sich zu einer vollwertigen Designplattform entwickelt.
Arduino Uno Rev. 3: Arduino hat sich zu einer vollwertigen Designplattform entwickelt.
(Bild: Arduino.cc )

Zwei beliebte Breakout-Boards für die ICs DS1307 und DS3231 sind das DS1307-Echtzeituhr-Breakout-Board 3296 und das Breakout-Board 255 (ChronoDot Ultra-Precise Real-Time Clock V2.1) von Adafruit. In Kombination mit einem geeigneten Mikrocontroller-Entwicklungsboard, beispielsweise dem Arduino Uno R3, und mithilfe von Open-Source-Bibliotheken und Beispielcode, der über das Internet heruntergeladen werden kann, können professionelle Entwickler von Embedded-Systemen und IoT-Geräten sofort mit ihrer Arbeit beginnen. Sobald die Bewertungen der Entwickler abgeschlossen sind, können sie die entsprechenden Teile des Open-Source-Hardwaredesigns für die Breakout-Boards direkt in ihre eigenen Designs integrieren. Auf ähnliche Weise lassen sich die Open-Source-Bibliotheken und der auf Basis der Open-Source-Beispiele entwickelte Code für ihre Produkte verwenden.

Tipps und Tricks zur Hardware für Softwareentwickler

Wie bereits erwähnt, kommunizieren sowohl DS1307 als auch DS3231 über einen seriellen I2C-Bus mit dem Host-Mikrocontroller. Einer der häufigsten Fehler, die Softwareentwicklern unterlaufen, ist, dass sie die für beide Signale (SCL und SDA) dieses Busses erforderlichen Pull-up-Widerstände vergessen. Weder das DS1307-Breakout-Board noch das DS3231-Breakout-Board (ChronoDot) sind mit diesen Widerständen ausgestattet, obwohl die ChronoDot über mit R1 und R2 gekennzeichnete Pads verfügt, an die sie angeschlossen werden können.

Der Grund dafür, warum keine Pull-up-Widerstände vorhanden sind, ist der, dass ein I2C-Bus mit mehreren Komponenten (ICs oder Breakout-Boards) verbunden werden kann. Der I2C-Bus verwendet eine 7-Bit-Adresse, für die 27 = 128 gilt. Die Adresse 0000000 ist jedoch eine Adresse für allgemeine Aufrufe, die zur Adressierung aller mit dem Bus verbundenen Komponenten verwendet wird, wodurch der Bus theoretisch 127 diskrete Komponenten unterstützen kann. In der Praxis wird die reale Anzahl der Komponenten, die unterstützt werden können, jedoch von der Kapazität des Busses vorgegeben; inklusive der Kapazität der Leiterbahnen und der Lasten, die auf insgesamt 400 Picofarad (pF) begrenzt ist.

Es gibt eine Formel, die von Hardwareentwicklern verwendet wird, um den Gegenwert mehrerer parallel geschalteter Widerstände berechnen zu können. Für unseren Fall betrachten wir das folgende Beispiel: Wenn zwei Komponenten identische Pull-up-Widerstände haben, ist der berechnete Widerstand halb so groß. Wenn vier Komponenten identische Widerstände haben, ist der berechnete Widerstand ein Viertel dieses Werts.

Ist bereits eine I2C-Komponente mit Pull-up-Widerständen vorhanden, ist kein weiteres Handeln erforderlich. Fehlen Pull-up-Widerstände und ist sich der Entwickler sicher, dass später kein Breakout-Board mit integrierten Pull-up-Widerständen hinzugefügt werden soll, sollten für die Pull-up-Widerstände am besten zwei Widerstände mit 4,7 Kiloohm (kΩ) verwendet werden. Wenn jedoch die Möglichkeit besteht, dass noch ein Breakout-Board mit Pull-up-Widerständen ergänzt wird, sollten an diesem Punkt zwei Widerstände mit 10 kΩ hinzugefügt werden, da diese sowohl vor als auch nach dem Ergänzen des anderen Breakout-Boards zum Bus ihren Dienst verrichten.

Tipps und Tricks zur Software für Hardwareentwickler

Die Bibliothek „Wire“ ist eine Kommunikationsbibliothek, die die Zweidrahtkommunikation mit I2C-Komponenten erleichtert. Für Arduino wird sie im Rahmen der inte-grierten Entwicklungsumgebung (IDE) bereitgestellt, sodass ein Entwickler am Anfang des Programms lediglich die Anweisung #include <Wire.h> hinzufügen muss.

Der wahre Trick besteht darin, eine geeignete RTC-Bibliothek zu finden. Die Bibliothek RTClib von Adafruit ist eine gute Wahl und kann von Github heruntergeladen werden. Nutzer ergänzen anschließend am Anfang des Programms die Anweisung

#include "RTClib.h"

Später, üblicherweise nach der Definition aller konstanten Werte, ist es an der Zeit, die Echtzeituhr mit der Anweisung

RTC_ DS1307 RTC;

oder

RTC_DS3231 RTC;

(abhängig vom verwendeten Breakout-Board) zu instanziieren.

Ist der Entwickler so weit, alle Programmeinstellungen vorzunehmen (im Rahmen der Funktion setup() für einen Arduino-Sketch), sind folgende Anweisungen zu ergänzen: Wire.begin(); und

RTC.begin();

Damit werden die I2C-Kommunikation und das RTC-Subsystem initialisiert.

Die auf der erwähnten Github-Seite bereitgestellten Beispiele ermöglichen es einem Entwickler, rasch das aktuelle Datum und die genaue Uhrzeit einzustellen. Weniger offensichtlich ist, wie auf den Rechteckwellenausgang zugegriffen wird. Dieser Ausgang ist standardmäßig deaktiviert, um Strom zu sparen. Eine Möglichkeit, diesen Pin zu verwenden, besteht darin, ihn zu aktivieren und beispielsweise auf 1 Hz einzustellen. Dieses Signal lässt sich dann verwenden, um am Host-Mikrocontroller einen Interrupt auszulösen.

Einem Softwareentwickler wird es keine Schwierigkeiten bereiten, alle hierfür erforderlichen Schritte im Bibliothekscode durchzuführen. Für einen Hardwareentwickler kann es jedoch problematischer sein, sich durch diesen Code zu arbeiten. Daher lautet eine kurze Zusammenfassung wie folgt:

Für die DS1307 müssen lediglich eine oder mehrere Anweisungen der Form

RTC.Ds1307SqwPinMode(<option>);

hinzugefügt werden, wobei die für „option“ unterstützten Werte ON, OFF, SquareWave1HZ, SquareWave4kHz, SquareWave8kHz und SquareWave32kHz lauten. Ebenso müssen für die DS3231 eine oder mehrere Anweisungen der Form

RTC.Ds3231SqwPinMode(<option>);

ergänzt werden, wobei die für „option“ unterstützten Werte ON, OFF, DS3231_SquareWave1Hz, DS3231_SquareWave1kHz, DS3231_SquareWave4kHz und DS3231_SquareWave8kHz lauten.

Fazit: Aufgrund kleinerer Teams und immer kürzerer Markteinführungszeiten müssen sich Entwickler mehreren Fachbereichen und Aufgaben widmen und dabei fortwährend nach Möglichkeiten suchen, die Bewertung von ICs, Sensoren und Peripheriebausteinen zu beschleunigen und die hierfür nötigen Ausgaben zu senken. Erleichtern kann dies Arduino in Kombination mit Open-Source-Hardware in Form von Breakout-Boards (BOBs) für Sensoren und Peripheriebausteine und Open-Source-Software in der Gestalt von Bibliotheken und Beispielprogrammen.

Dieser Beitrag ist erschienen in der Fachzeitschrift ELEKTRONIKPRAXIS Ausgabe 3/2020 (Download PDF)

* Rich Miron ist Applications Engineer bei Digi-Key, USA

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de (ID: 46301326)