Eingebette Systeme
Prof. Dr. Sebastian Zug, Technische Universität Bergakademie Freiberg
Die interaktive Ansicht dieses Kurses ist unter folgendem Link verfügbar.
Der Quellcode der Materialien ist unter https://github.com/liaScript/ArduinoEinstieg/blob/master/Course_00.md zu finden.
Wer bin ich?
Was macht man so an der TUBAF?
Wer sind Sie? Was erwarten Sie vom heutigen Tutorial?
Was heißt das eigentlich "Eingebettetes System"?
{{1-2}}
... ein elektronischer Rechner ..., der in einen technischen Kontext eingebunden ist. Dabei übernimmt der (Kleinst-)Rechner entweder Überwachungs-, Steuerungs- oder Regelfunktionen ... weitestgehend unsichtbar für den Benutzer .. [nach Wikipedia "Eingebettete Systeme"].
Wie programmiere ich einen Mikrocontroller?
{{2-3}}
Compiler wird eine Software genannt, die einen in einer Programmiersprache geschrieben Quellcode so übersetzt, dass sie von Maschinen verstanden werden können.
Was ist das Arduino Projekt?
{{3}}
Arduino ist eine aus Soft- und Hardware bestehende Physical-Computing-Plattform. Beide Komponenten sind im Sinne von Open Source quelloffen. Die Hardware besteht aus einem einfachen E/A-Board mit einem Mikrocontroller und analogen und digitalen Ein- und Ausgängen.
Arduino nutzt eine C/C++ Semantik für die Programmierung, die folgende Grundelemente bedient
- Alle Anweisungen enden mit einem
;
- Variabeln sind typbehaftet (
int
,char
,float
, etc.) - wichtige Schlüsselwörter sind
for
,if
,while
, etc. - Kommentare werden durch
//
eingeleitet
Jedes Arduinoprogramm umfasst 2 grundlegende Funktionen setup()
und loop()
.
void setup() { pinMode(ledPin, OUTPUT); }
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
@AVR8js.sketch
### 2.2 Arduino IDE

Wichtige Grundeinstellungen:
+ Richtigen Port für den Programmiervorgang auswählen (Tools -> Port)
+ Richtigen Controller auswählen (Tools -> Board)
+ Richtige Baudrate für die Serielle Schnittstellen
### 2.3 Hello World
*Und jetzt sind Sie dran!*
Laden Sie das Beispielprogramm "Blink" in Ihren Editor:
Datei -> Beispiele -> Basics -> Blink
Kompilieren und flashen Sie das Programm! Wichtige Tastaturbefehle sind dabei
| Tastenkombination | Bedeutung |
| ----------------- | ------------------------ |
| Strg-R | Kompilieren (Ve**R**ify) |
| Strg-U | Flashend (**U**pload) |
| Strg-T | Code korrekt einrücken |
| Strg-Shift-M | Seriellen Monitor öffnen |
| Strg-L | Cursor auf Zeile setzen |
### 2.4 C++ Basiskonstrukte und die Serielle Schnittstelle
{{0-1}}
*******************************************************************************
Was fehlt? Ich möchte irgendwie in den Rechner schauen können :-)
Die Serielle Schnittstelle (häufig auch als UART) bezeichnet ermöglicht das
Versenden und den Empfang von Textnachrichten. Damit können Sie zum Beispiel
Messwerte ausgeben oder das Erreichen bestimmter Programmpositionen anzeigen.
Die folgenden Beispiele vermitteln grundlegende Programmierkonstrukte in C++.
Diese können in der Simulation ausgeführt werden.
<div>
<span id="simulation-time"></span>
</div>
```cpp arduino.cpp
void setup() {
Serial.begin(9600);
Serial.println("Hello World");
}
void loop() {
}
@AVR8js.sketch
Arduino kennt zwei Varianten der Ausgabe mit print
- das einfache print
und println
. Welchen Unterschied vermuten Sie?
{{1-2}}
Schleifen
Was müssen wir tuen, um die Zahlen von 1 bis 10 auf dem Terminal anzuzeigen?
void loop() { }
@AVR8js.sketch
Welche "Einsparmöglichkeiten" sehen Sie als erfahrener Programmierer in dem Beispiel? Wie kann der Code, mit der gleichen Ausgabe kürzer gestaltet werden?
*******************************************************************************
{{2-3}}
*******************************************************************************
**Verzweigungen**
Verzweigungen folgen dem Muster
```c
if (Bedingung) {
// Anweisungen
}
else{
// Anweisungen
}
wobei der else
Abschnitt optional ist.
void loop() { }
@AVR8js.sketch
*******************************************************************************
{{3-4}}
*******************************************************************************
Bedingungen werden dabei wie folgt formuliert:
<div>
<span id="simulation-time"></span>
</div>
```c ardunino.cpp
void setup() {
Serial.begin(9600);
int a = 2;
if (a == 2) {Serial.println("a ist gleich zwei!");}
if (a <= 5) {Serial.println("a ist kleiner oder gleich fünf!");}
if (a != 3) {Serial.println("a ist ungleich drei!");}
char b = 'g';
if (b == 'z') {Serial.println("In b ist ein z gespeichert!");}
else {Serial.println("In b ist kein z gespeichert!");}
}
void loop() {
}
@AVR8js.sketch
Für die Ausgabe von komplexeren, vorformatierten Ausdrücken können Sie auf einen
Befehl aus der C++ Standard-Bibliothek zurückgreifen sprintf
Eine anschauliche Dokumentation findet sich unter: link
Aufgabe 1: Schreiben Sie einen Code, der das SOS Morsesignal über die Led ausgibt!
Welche Anpassungen sind dafür an unserem Beispiel vornehmen?
const int ledPin = 13;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin ledPin as an output.
pinMode(ledPin, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
-
Referenzübersicht Arduino
- deutsch (unvollständig) https://www.arduino.cc/reference/de/
- englisch https://www.arduino.cc/reference/en/
Die Arbeit mit der seriellen Schnittstelle vom Arduino zum PC kennen Sie bereits. Aber das Ganze funktioniert auch umgekehrt.
void setup() { Serial.begin(9600); }
void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); Serial.write(incomingByte); if (incomingByte == 'A'){ Serial.println("A gelesen"); } } }
@AVR8js.sketch
> **Aufgabe:** Erweitern Sie den Code, so dass wir die LED über 'A' an- und
> 'B' ausschalten können. Dazu "mischen" Sie den Code aus dieser und der vorangegangen Aufgabe.
### 4b. Taster als Erweiterung
*Langweilig ... ! Das ist doch kein echtes eingebettetes System!*
<!-- width="60%" -->
```c ActivateLed.ino
const int buttonPin = 2; // Pin des Buttons
const int ledPin = 13; // Pin der LED
// variables will change:
int buttonState = 0; // Variable für die Speicherung
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
}
Aufgabe: Der Taster schaltet die LED ein und nach 3 Sekunden geht sie von selbst wieder aus.
Langweilig ... ! Wir wollen einen echten Sensor!
Aufgabe: Schalten Sie die LED mittels Ultraschallsensor an und aus (distanzabhäniger Lichtschalter)
Verbinden Sie den Ultraschallsensor mit Ihrem Board entsprechend dieser Belegung:
Sensor IO | Pin am Board |
---|---|
VCC | 5V |
GND | GND |
Echo | 11 |
Trigger | 12 |
ACHTUNG: Sie müssen für die Integration des Sensors noch die Bibliothek
NewPing
installieren. Finden Sie dafür allein einen Weg? Recherchieren sie in
den Arduino Foren zur Frage "How to install a library for Arduino?"
// Loesung
#include <NewPing.h>
const int triggerPin = 12;
const int echoPin = 11;
const int maxDistance = 400;
const int ledPin = 13;
NewPing sonar(triggerPin, echoPin, maxDistance);
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
delay(50);
Serial.println(sonar.ping_cm());
}
Erweitern Sie das Programm so, dass eine Aktivierung der LED erfolgt, wenn ein Hindernis näher als 10cm kommt.
Integration einer Mehrfarben LED als Erweiterung der Ausgabe
// Methoden aus dem Lösungsvorschlag der MangoLabs
const int redPin = 11;
const int greenPin = 10;
const int bluePin = 9;
void setColourRgb(unsigned int red, unsigned int green, unsigned int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
void setup() {
// Start off with the LED off.
setColourRgb(0,0,0);
}
void loop() {
setColourRgb(255, 0, 0);
delay(1000);
}
Aufgabe: Wechseln Sie die Farben der LED in Abhängigkeit von der Entfernung