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/FlightToMars.md zu finden.
Dienstag 15.08.2023
Zeitfenster | Ursprünglicher Inhalt | Angepasste Inhalte |
---|---|---|
09:30 - 10:00 | Eingebettete Systeme | Mission Control to Mars - Fernsteuerung eines Mikrocontrollers |
10:00 - 11:30 | Sensorplattform | |
11:30 - 12:15 | Mittagspause | unverändert |
12:15 - 14:00 | Mobile Roboter | Einführung Bildverarbeitung mit Python und opencv |
14:00 - 15:30 | 3D Scanner | unverändert |
ab 17:30 | Kennenlernen mit Studierenden und Mitarbeitern |
US Sensor
USB/Serielle | Serielle Bluetooth WLAN
Schnittstelle v Schnittstelle
╔══════════════╗ +-------------+ +-------------+ ╔══════════════╗ ╔══════════════╗
║ Arduino IDE ║ LED-Cmds | Arduino | ----------> | HC-06 | ║ Handy-App ║ ║ Browser ║
║ ║ -----------> | | Messungen | Bluetooth | ║ ║ ║ ║
║ ║ | | | to | ))) ((( ║ ║ ))) ((( ║ App Inventor ║
║ ║ Display Cmds | | <---------- | Serial | ║ ║ ║ ║
║ ║ -----------> | | Commands | | ║ ║ ║ ║
╚══════════════╝ +-------------+ +-------------+ ╚══════════════╝ ╚══════════════╝
| |
v v
Display LED
--------------------------------------------
Phase I
---------------------------------------------------------------------------------------------------------
Phase II
Material:
- Bastelbox mit Arduino und BL Modul
- Rechner mit dem App-Inventor
- Android Device mit Bluetooth
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
### 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
### 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 |
### Serielle Schnittstelle
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?
{{0-1}}
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?
*******************************************************************************
{{1-2}}
*******************************************************************************
**Verzweigungen**
Verzweigungen folgen dem Muster
```c
if (Bedingung) {
// Anweisungen
}
else{
// Anweisungen
}
wobei der else
Abschnitt optional ist.
void loop() { }
@AVR8js.sketch
*******************************************************************************
{{2-3}}
*******************************************************************************
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
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.
## Anwendung 2: Display Steuerung per Serieller Schnittstelle
> **Aufgabe:** Verbinden Sie das Display mit dem Board entsprechend dem
> Beschaltungsplan.
<!-- width="80%" -->
| Arduino | LCD |
| ------- | --- |
| A4 | SDA |
| A5 | SCL |
| GND | GND |
| 5V | VCC |
Achtung für diese Aufgabe müssen Sie die zusätzliche Bibliothek `LiquidCrystal`
installieren. Informieren Sie sich, wie dies umzusetzen ist "How to install a library for Arduino?".
```c Display.ino
#include <Wire.h>
#include <LiquidCrystal_PCF8574.h>
int lcdi2c = 0x27; // <- Hart eingecodete Adresse, die nur für unser
// Beispiel funktioniert, vgl. Datenblatt
void setup()
{
LiquidCrystal_PCF8574 lcd(lcdi2c);
lcd.begin(16, 2);
lcd.setBacklight(255);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Mission zum Mars");
lcd.setCursor(0, 1);
lcd.print("15.08.2023");
}
void loop()
{}
0 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
╔═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╤═╗
0 ║M│i│s│s│i│o│n│ │z│u│m│ │M│a│r│s║
╟─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─╢
1 ║1│5│.│0│8│.│2│0│2│3│ │ │ │ │ │ ║
╚═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╧═╝
Aufgabe: Kombinieren Sie die Beispiele so, dass eine Eingabe auf der seriellen Schnittstelle eine Ausgabe auf dem Display bewirkt.
US Sensor
USB/Serielle | Serielle Bluetooth WLAN
Schnittstelle v Schnittstelle
╔══════════════╗ +-------------+ +-------------+ ╔══════════════╗ ╔══════════════╗
║ Arduino IDE ║ LED-Cmds | Arduino | ----------> | HC-06 | ║ Handy-App ║ ║ Browser ║
║ ║ -----------> | | Messungen | Bluetooth | ║ ║ ║ ║
║ ║ | | | to | ))) ((( ║ ║ ))) ((( ║ App Inventor ║
║ ║ Display Cmds | | <---------- | Serial | ║ ║ ║ ║
║ ║ -----------> | | Commands | | ║ ║ ║ ║
╚══════════════╝ +-------------+ +-------------+ ╚══════════════╝ ╚══════════════╝
| |
v v
Display LED
--------------------------------------------
Phase I
---------------------------------------------------------------------------------------------------------
Phase II
Der App Entwicklungsrechner (Ihr Laptop) und das Android Device müssen sich im gleichen WLAN befinden
iPads unterstützen keine native Bluetooth Kommunikation, sondern nur den modernen Bluetooth Low Energy (BLE) Standard.
{{0-1}}
Offenbar sind die Werte von 0-6 nicht geeignet um diese für die Ansteuerung der LEDs zu verwenden. Wie war das noch mal in welchen Größenordnungen durften die Eingangsgrößen liegen? Welche Anpassungen sind nötig?
Aufgabe: Fügen Sie weitere Strings hinzu, die andere Buttons, Textfelder, Slider oder eine TextToSpeech Komponente aktivieren!
{{1-2}}
Aufgabe: Schalten Sie das grüne Licht wieder aus, wenn "Licht aus" gesagt wurde.
Erweitern Sie Ihre Schaltung um einen HC-06 Bluetooth Dongle und steuern Sie den Status einer LED über die Eingaben der Pins. Die Beschaltung entnehmen Sie dem obigen Schaubild.
#include <SoftwareSerial.h>
char Incoming_value = 0;
const byte rxPin = 2;
const byte txPin = 3;
// Set up a new SoftwareSerial object
SoftwareSerial mySerial (rxPin, txPin);
void setup()
{
mySerial.begin(9600);
mySerial.println("Los geht's");
pinMode(13, OUTPUT);
}
void loop()
{
if(mySerial.available() > 0)
{
Incoming_value = mySerial.read();
mySerial.print(Incoming_value);
mySerial.print("\n");
if(Incoming_value == '1')
digitalWrite(13, HIGH);
else if(Incoming_value == '0')
digitalWrite(13, LOW);
}
}
Frage: Warum brauchen wir die Software-Serial Link Implementierung?
Die .aia Datei finden Sie unter Github-Link
Und jetzt sind Sie gefragt:
- Senden Sie die Messwerte an die Text-to-Speech Schnittstelle
- Steuern Sie die LED durch 3 Slider für die Farbwerte
- Steuern Sie die LEDs durch den Beschleunigungssensor, so dass mit der Neigung die Farben angepasst werden.
- ...