Prof. Dr. Sebastian Zug, Technische Universität Bergakademie Freiberg
Dieser Kurs wurde mit LiaScipt erstellt. Die interaktive Ansicht dieses Kurses ist unter folgendem Link verfügbar.
{{0-1}}
Schauen wir uns ein Anwendungsbeispiel an ...
"Mainstream cars may have up to 10 million lines of code and high-end luxury sedans can have nearly 100 million." (Your average car is a lot more code-driven than you think Link)
{{1-2}}
... und warum die ganz kleinen Systeme? Ich will Webentwickler werden!
{{1-2}} Link zu den Webseiten des Institutes: https://tu-freiberg.de/fakult1/inf
- 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 .. 1.
- 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.
{{3}} https://www.arduino.cc/
{{3}}
2
{{0}} 2.1 Die Hardware
{{1}}
2.2 Aufbau eines Arduino-Programmes
Arduino nutzt eine C/C++ Semantik für die Programmierung, die folgende Grundelemente bedient
void setup() { pinMode(ledPin, OUTPUT); }
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
@AVR8js.sketch
Was unterscheidet die Programmierung eines eingebettenten Systems von einem PC?
*******************************************************************************
{{2}}
********************************************************************************
**2.3 Arduino IDE**
<!-- width="80%" -->
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
********************************************************************************
{{3}}
**2.4 ... und jetzt mal praktisch**
## 3. Unser Projekt
*"Entwickeln Sie einen Distanzmesser, der einen Abstandswert ermittelt und ausgibt"*
<!-- width="50%" -->
[^1]
[^1]: Firma Bosch "Laser Distanzmesser Zamo"
{{1}}
> **Frage:** Was brauchen wir dafür?
### Distanzmessung mit Ultraschall
... Was war das noch mal, "Schallgeschwindigkeit"
<!-- width="40%" -->
[^1]
[^1]: roboticlab.eu "Funktionsweise eines Ultraschall-Entfernungsmessers."
Für eine gleichförmige Bewegung können wir den Weg als Produkt aus dem Messintervall und der halben Laufzeit abbilden.
$$s = v \cdot \frac{t}{2}$$
{{1-2}}
******************************
Leider gibt es ein Problem, die Schallgeschwindigkeit ist nicht konstant! Annäherungsweise gilt
$$V (m/s) = 331.3 + (0.606 × T) $$
Versuchen wir eine kleine Fehlerabschätzung, wenn wir den Temperatureinfluss ignorieren.
```python CalcUltraSonicSpeed.py
def calcUSspeed(T):
return 331.3 + (0.606 * T)
print(calcUSspeed(25) / calcUSspeed(0))
@Pyodide.eval
{{2-3}}
Link auf die Dokumentation der Funktion PulseIn
Link
const int trigPin = 8;
const int echoPin = 9;
//float temp = 25;
//const float us_speed = (331.3 + (0.606 * temp)) / 1000 / 1000 * 100;
long duration;
float distance;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
Serial.print(duration);
delay(50);
}
Wie integrieren wir die Abbildung auf cm? Das schauen wir uns jetzt mit dem realen System an Link.
{{0-1}} Welches Display zu welchem Zweck?
{{2}}
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║h│e│l│l│o│ │w│o│r│l│d│ │ │ │ │ ║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║T│U│ │F│r│e│i│b│e│r│g│ │ │ │ │ ║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
{{2}}
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7); // diese Pins werden benutzt
void setup()
{
lcd.clear(); // LCD löschen
lcd.begin(16, 2); // verfügbare Spalten und Zeilen
lcd.setCursor(0,0); // 0. Spalte (= ganz links) und 0. Zeile (= oben)
lcd.print("Hello World!");
lcd.setCursor(0,1);
lcd.print("TU Freiberg");
}
void loop()
{
// Hier passiert nichts
}
{{1}}
Ausblick: scrollDisplayLeft()
Arduino Dokumentation
Welche Funktionen brauchen wir also?
.------------------------.
| |
v |
╔══════════════════════╗ |
║ Distanz einlesen ║ n mal |
╚══════════════════════╝ |
| |
v |
╔══════════════════════╗ |
║ Mittelwert berechnen ║ |
╚══════════════════════╝ |
| |
v |
╔══════════════════════╗ |
║ Ausgabe Display ║ |
╚══════════════════════╝ |
| |
'------------------------╯
{{1}}
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
int lcdi2c = 0x27;
LiquidCrystal_PCF8574 lcd(lcdi2c);
const int trigPin = 8;
const int echoPin = 9;
float temp = 25;
const float us_speed = (331.3 + (0.606 * temp)) / 1000 / 1000 * 100;
float distance;
void showMeanDistance(){
lcd.setCursor(0, 0);
lcd.print("Distanz ");
lcd.print(distance, 2);
// Todo Positionskorrektur
lcd.setCursor(0, 1);
lcd.print("Temperatur ");
lcd.print(temp, 0);
}
void readMeanDistance(){
long duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * us_speed / 2;
Serial.println(distance);
// Todo Messungen glätten
}
void setup()
{
lcd.begin(16, 2);
lcd.clear();
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop()
{
readMeanDistance();
showMeanDistance();
delay(50);
}
{{0-1}}
Unser Chef hat sich neue Ideen ausgedacht ...
- Die Auflösung ist ihm zu gering!
- Bestimmte Materialien werden nur schlecht erkannt.
- Das Display wäre schlecht ablesbar und wir sollten unser Messsystem mit dem Mobiltelefon koppeln ...
{{1-2}}
Worüber würden wir in einem ingenieurwissenschaftlichen Studium sprechen?
- Was läuft hinter der Bühne ab? Wie arbeiten die einzelnen Komponenten des Rechners?
- Wie kann man die Qualität und Robustheit der Messung steigern?
- Wie setzen wir den Entwicklungsprozess um?
... diese und alle anderen Fragen rund ums Studiums beantworte ich gern gleich im Anschluss, oder ...
Informationstage / Schnupper-Events an der TU Bergakademie
- Frühjahrsakademie MATHEMATIK (29.03. bis 9.04.)
- Schüleruniversität (26.07. - 3.09.) http://tu-freiberg.de/schueleruni/anmeldung
- Campustag (5.06.)
Weiterführende Materialien auf der Basis von LiaScript gibt es unter https://github.com/SebastianZug/VL_ProzeduraleProgrammierung. Hier werden sowohl die Konzepte von C als auch der objektorientierten Programmierung eingeführt.
{{2}}
Danke für die Aufmerksamkeit!
Footnotes
-
nach Wikipedia "Eingebettete Systeme" ↩
-
aus entsprechendem Artikel "Spiegel Online" http://www.spiegel.de/netzwelt/gadgets/arduino-erklaert-das-kann-der-microcontroller-a-1105328.html ↩