Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Arduino und die IDE

Hinweis - Die Boards Arduino UNO Rx und Arduino UNO WiFi Ry werden im weiteren Text immer als Arduino UNO angesprochen, wenn beide Boards verwendet werden können. In jedem anderen Fall wird das spezielle Board direkt benannt.

 

Durch die unterschiedliche Pinbelegung der beiden Boards kann der Programmcode von einem UNO Rx nicht auf einen UNO WiFi Ry ohne Überprüfung übernommen werden. Die Pinbelegung des jeweils benutzten Boards sollte verfügbar sein.

1 -Einrichten eines Arduino UNO Boards

 

  • Alle Informationen dazu findet man hier.
     

2 - Die Oberfläche der Arduino IDE

 

  • Als Arduino IDE wird von mir immer die neueste Version verwendet. Alle notwendigen Schritte zu Einrichtung der IDE finden sich hier. Man kann zwischen einer älteren oder der neuesten IDE wählen oder alternativ einen Web-basierten Editor einrichten.

3 - Platine und COM-Port einstellen

Die Kommunikation zwischen Rechner und Arduino Board funktioniert nur, wenn vorher im Hauptmenü

  • über Werkzeuge - Platine in der aufpoppenden Liste der Arduino UNO markiert und
  • über Werkzeuge - Port der COM-Port, mit dem der Arduino Uno verbunden ist, ausgewählt wurde.

 

 

 

 

 

 

 

 

Abb. 1

Über das Hauptmenü in der IDE wird über

Werkzeuge - Board

das entsprechende Board eingerichtet und über Werkzeuge - Port

der Port eingestellt, sofern nicht automatisch erkannt.

4 - Die Programmiersprache Arduino C++

(ein kleiner Auszug für die ersten Schritte)

Die Programmstruktur eines Arduino-Programmes ist vorgegeben und setzt sich stets aus zwei Methodenblöcken zusammen:

  • void setup()   und
    void loop()
    

Ein erstes Programm soll der Einstieg in die Welt des Arduino sein.

Übertrage den Programmcode in den Arduino Editor und starte das Programm. Oben rechts in der IDE befindet sich ein kleines Icon - ähnlich einer Lupe - über das sich ein serielles Terminal öffnen lässt. Dort erscheint der Text; alle 10s wird eine neue Zeile geschrieben, solange, bis das USB-Kabel vom Arduino getrennt wird.

Ein erstes sketch mit einer Textausgabe im Terminalfenster (serieller Monitor)

Hilfreich sind auch Kommentarzeilen in einem Programm. Sie geben Auskunft über das Programm und erhöhen die Verständlichkeit des Quelltextes. Es gibt zwei Typen von Kommentaren:

Zeilenkommentar   // 

Blockkommentar   /* kann über mehrere Zeilen gehen */

5 - Das Arduino UNO Board

Auf einem Arduino UNO Board befinden sich

  • 14 digitale (D0 ... D13) und
  • 6 analoge (A0 ... A5) Ports.

Darunter sind Anschlusspin des eingebauten Mikrocontrollers zu verstehen, die als Ein- oder Ausgang programmiert oder festgelegt werden können. Zusätzlich besitzen einzelne Ports Zusatzfunktionen.

Die Anschlüsse

  • D3, D5, D6, D9, D10, (D11) sind mit einer Tilde (~) markiert. Sie können auch als analoge Ausgänge mit einem PWM-Signal genutzt werden.
  • Alle digitalen Anschlüsse des Arduino UNO sind standardmäßig als Eingang geschaltet.

Die Festlegung, ob ein Port Ein- oder Ausgang wird, erfolgt über die Befehle

  • pinMode(pin, OUTPUT);
  • pinMode(pin, INPUT);

Im Mikrocontroller befinden sich integrierte Pull-up Widerstände, die bei Bedarf aktiviert werden können. Dies erfolgt über die Kommandos:

  • pinMode(pin, INPUT);
  • digitalWrite(pin, HIGH);

Eine integrierte LED mit Vorwiderstand, kann über die vorkonfigurierte Konstante LED_BUILTIN bei einem Arduino Board (UNO, NANO) aufgerufen werden.

  • pinMode(LED_BUILTIN, OUTPUT); // Deklaration in void setup()
    digitalWrite(LED_BUILTIN, HIGH);  // Aufruf in void loop()

Das Arduino UNO WiFi Rev2 Board enthält zusätzlich eine integrierte IMU (Inertial Measurement Unit), LSM6DS3TR mit:

  • Temperatursensor
  • Beschleunigungssensor
  • Gyroskop

und ein Wi-Fi- und Bluetooth®-Modul NINA-W102 von u-Blox.

6 - Die digitalen Eingänge

 

Für sie gibt es nur zwei Zustände: Null, (0) oder Eins (1); dabei entspricht dem Zustand 0 eine Spannung von 0 Volt und dem Zustand 1 eine Spannung von +5 Volt oder +3,3 Volt, je nach angelegtem Steckernetzteil.

Die Eingänge sind sehr hochohmig. Soll der Status eines Tasters, Schalters über einen Eingang abgefragt werden, dann muss der Eingang des Controllers dazu auf ein festes Potential (entweder zum Beispiel auf +5 V oder GND) gesetzt werden, damit Störquellen das Eingangssignal nicht verfälschen.

Abbildung 1 - Störsignale an einem Eingang des Arduino UNO.

Dazu bedient man sich sogenannter Pull-up oder Pull-down Widerstände.

Abbildung 2 - Pull-up Widerstand und Pull-down Widerstand mit Taster

Macht man das nicht, kann es leicht passieren, dass man am Eingang Signale misst, die tatsächlich nicht von der dahinter befindlichen Schaltung kommen müssen, sondern durch die Umgebung eingefangen worden sind.

Taster mit internem Pull-Up Widerstand
Material
  • 1x  Arduino UNO
  • 1x  Steckernetzteil
  • 1x  Taster, offen
  • 2x  Steckdraht
Aufgaben
  • Übertrage das Programm Taster_internerPullUp.ino in den Editor und speichere es ab.
  • Starte das Programm und überprüfe, ob es korrekt arbeitet.
  • Kommentiere anschließend die Zeile digitalWrite(Taster, HIGH); aus (beginne die Zeile mit //) und korrigiere die Zeile digitalWrite(LED, HIGH) in digitalWrite(LED, LOW)
  • speichere das Programm erneut ab.
  • Starte das Programm und beobachte die Reaktion der LED.
  • Gehe mit der Hand in die Nähe der Steckdrähte; wird dadurch die Schaltung beeinflusst?

Der Schaltungsaufbau

Das Programm Taster_internerPullUp

Abbildung 3 - Programm Taster_internerPullUp.ino mit auskommentierter Zeile und veränderter Abfragezeile in der IF - Schleife.

Einen digitalen Eingang abfragen

Da am Eingang nur die Zustände 0 oder 1 anliegen, werden beim Abfragen eines Eingangs auch nur diese beiden Zustände erscheinen. Die Abfrage erfolgt über das Kommando

  • digitalRead(pin);

7 - Die analogen Eingänge

Die sechs analogen Ports A0 bis A5 besitzen alle einen 10 Bit A/D Wandler mit einer Referenzspannung von 5 Volt, so dass sich gleichzeitig sechs analoge Signale im Bereich zwischen 0V und 5V verarbeiten lassen. Eine 10 Bit Auflösung entsprechen 1024 digitalisierte Werte und damit einer Genauigkeit von ca. 5 mV.

Die Referenzspannung generiert das Board aus der Versorgungsspannung - bei uns immer 5 Volt. Sie lässt sich über das Kommando analogReference umstellen.

Eingelesen werden analoge Werte mit Hilfe des Kommandos

  • analogRead(pin)

Der über analogRead(pin) eingelesene Wert wird einer Variablen vom Typ int übergeben und im Programm weiter verarbeitet.

Potenziometer am analogen Eingang
Material
  • 1x  Arduino UNO
  • 1x  Spannungsversorgung, 5V
  • 1x  USB-Verbindungskabel
  • 1x  Potentiometer 10kOhm
  • 3x  Steckdraht
Aufgaben
  • Übertrage das Programm AnalogPOTI.ino in den Editor und speichere es ab.
  • Starte das Programm und öffne den seriellen Monitor.
  • Bewege den Schleifer des Potenziometers in verschiedene Positionen. Überprüfe, ob sich die Werte im Monitor verändern.

Schaltungsaufbau

Das Programm AnalogPOTI.ino

Terminalanzeige

Analoge Eingänge lasse sich auch als digitale Ports (Eingang oder Ausgang) einsetzen; sie erhalten dann die Portnummern 14 - 19.

8 - Analoge Ausgabe

Die Ausgabe analoger Spannungswerte erfolgt über das Verfahren der Puls-Weiten-Modulation (PWM) und wird im Programm durch Aufruf des Kommandos

  • analogWrite(pin, tastverhaeltnis);

umgesetzt. Der Parameter Pin beschreibt den Ausgabeport und tastverhaeltnis (das Verhältnis von Pulsdauer zu Pulsperiode). Der Parameter nimmt Werte zwischen 0 (Tastverhältnis: 0%) und 255 (Tastverhältnis: 100%) an. Um zu verstehen, was damit für ein Signal gemeint ist, schauen wir es uns mit dem Oszilloskop an.

Ausgabe einer pulsweitenmodulierten Pulsfolge
Material
  • 1x  Arduino UNO
  • 1x  Spannungsversorgung, 5V
  • 1x  USB-Verbindungskabel
  • 2x  Steckdraht
Aufgaben
  • Übertrage das Programm pwm_1.ino in den Editor und speichere es ab.
  • Schließe die Messspitze des Oszilloskops an P3(~) an.
  • Starte das Programm.
  • Bei korrekter Eingabe sollte das unten stehende Oszillogramm sichtbar sein.

Das Programm pwm_2.ino

Bei korrekter Eingabe des Programms ergeben sich die folgenden Oszillogramme.

Abbildung 4 - Eingestelltes Tastverhältnis: 20; Frequenz der festen Rechteckschwingung an P3: 488,5 Hz; Impulslänge: < 0,3ms
Abbildung 5 - Tastverhältnis: 20; fixe Frequenz der Rechteckschwingung an P5: 977 Hz; Impulslänge: < 0,1ms

Erhöht man das Tastverhältnis, wird die Impulslänge größer. Für ein Tastverhältnis von 200 ergibt sich die folgende Darstellung.

Abbildung 6 - Tastverhältnis: 200; Frequenz der Rechteckschwingung an P3: 488,5 Hz; Impulsbreite: ca. 1,6ms

Bleibt jetzt nur noch zu klären, wie man aus einer Impulsfolge ein analoges Ausgangssignal macht.

Die Grundidee ist einfach; dazu betrachten wir drei verschiedene Pulsfolgen mit unterschiedlichem Tastverhältnis und bestimmen die Spannung über die Zeiteinheit.

Abbildung 7 - mittlere Spannung über der Zeiteinheit aufgetragen bei drei unterschiedlichen Tastverhältnissen

Durch die Variation des Tastverhältnisses lassen sich mit einer Pulsfolge analoge Spannungswerte darstellen. Es gilt allgemein: Je höher das Tastverhältnis, desto höher der analoge Spannungswert.

Zur Bestimmung des Spannungswertes in Abhängigkeit vom Tastverhältnis gilt:

Im Kommando analogWrite wird das Tastverhaeltnis über den entsprechenden Parameter als ein Wert zwischen 0 und 255 angegeben. Dadurch verändert sich Formel (1) in

Um das PWM-Signal technisch in ein analoges Signal zu überführen, müssen die Pulse herausgefiltert und der sich ergebende mittlere Spannungswert gespeichert werden. Das erledigt eine sogenannte RC-Kombination aus einem Widerstand und einem Kondensator.

Analoge Spannungswerte von PWM-Signalen bestimmen
Material
  • 1x  Steckbrett
  • 1x  10µF Elektrolytkondensator
  • 1x  Widerstand, 2 kOhm
  • 2x  Steckdraht
Aufgaben
  • Baue die Schaltung nach Schaltskizze auf dem Steckbrett auf.
  • Verbinde die beiden Tastköpfe des Oszilloskops mit den in der Schaltskizze eingezeichneten Punkten.
  • Übertrage das Programm analogSpannung.ino in den Editor und speichere es ab.
  • Starte das Programm und bestimme die Spannungswerte für unterschiedliche Tastverhältnisse.

Schaltskizze

Abbildung 8 - RC-Schaltung mit Anschluss der Tastköpfe des Oszilloskops

Das Programm

Die folgenden Abbildungen zeigen die mittleren Spannungswerte für drei verschiedene Tastverhältnisse.

Abbildung 9 - Tasterverhältnis: 100%; rote Kurve: Eingangssignal; blaue Kurve: mittlere Spannungsgröße. Gemessen: 4,8 V
Abbildung 10 - Tasterverhältnis: 50%; rote Kurve: Eingangssignal; blaue Kurve: mittlere Spannungsgröße. Gemessen: 2,52 V
Abbildung 11 - Tasterverhältnis: 25%; rote Kurve: Eingangssignal; blaue Kurve: mittlere Spannungsgröße. Gemessen: 1,25 V

9 - Ausgesuchte Befehle aus Arduino C++

Befehl Syntax Beschreibung
void setup()

void setup()

{

 statements

}

wird nur einmal ausgeführt und enthält Grundeinstellungen

Der Datentyp VOID wird nur bei Funktionen benutzt und gibt an, dass die Funktion ohne Rückgabewert arbeitet.

void loop()

void loop()

{

 statements

}

hier steht das eigentliche Programm, das ständig wiederholt wird. Der Datentyp VOID wird nur bei Funktionen benutzt und gibt an, dass die Funktion ohne Rückgabewert arbeitet.

Befehle

Befehl Syntax Parameter
pinMode() pinMode(Pin, Modus)

Pin   Portpin

Modus INPUT, OUTPUT oder INPUT_PULLUP

delay() delay(millisekunde) Millisekunde
digitalWrite() digitalWrite(Pin, Wert)

Pin   Portpin

Wert  HIGH, LOW

digital Read() digitalRead(Pin) Pin   Portpin
Serial.begin() Serial.begin(speed, config)

speed Baudrate in bits per second

config setzt data, parity und stop bit

Serial.println() Serial.println(val, format)

val   Wert der gedruckt wird - jeder Datentyp

format legt das Zahlensystem oder die Dezimalstellen bei Fließkommazahlen fest.
for-Schleife

for (Startbedingung; Abbruchbedingung; Schleifenzähler ändern)

{ Befehlsblock }

for (int i=0; i < 11; i++)

{ ... Befehlsblock

}

while-Schleife

while(Bedingung)

{ Befehlsblock }

while(i < 5)

{ ... Befehlsblock }

do-while Schleife

do

{ Befehlsblock }

while (Bedingung);

do

{ ... Befehlsblock }

while (i < 5);

Variablentypen

Variablentyp Bezeichnung Zahlbereichsumfang Beispiel
int integer, ganze Zahl

-32768 ... +32767

 

int port3 = 1;

digitalWrite(port3, HIGH);

long integer -2.147.483.648 ... +2.147.483.647 long wert1 = 50000;
float Fließkommazahl -3,4028235E-38 ... +3,4028235E+38 float wert2 = 4.8;
char Zeichen, Character jedes Zeichen oder äquivalente ASCII-Zeichen char Zeichen = 'a';

Weitere Elemente der Programmiersprache Arduino C werden in jeder Lektion im Register Arduino UNO, wenn sie gebraucht werden, umfassend erläutert. Eine umfassende deutsche Beschreibung der Programmiersprache findet man hier.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf