Skip to content

Latest commit

 

History

History
553 lines (393 loc) · 16 KB

3days_Introduction_day1.md

File metadata and controls

553 lines (393 loc) · 16 KB

LiaScript

Mikrocontroller & App-Entwicklung - Tag 1

Prof. Dr. Sebastian Zug, Technische Universität Bergakademie Freiberg


Welcome

Herzlich Willkommen!

Die interaktive Ansicht dieses Kurses ist unter folgendem Link verfügbar.

Der Quellcode der Materialien ist unter https://github.com/liaScript/ArduinoEinstieg/blob/master/3days_Introduction_day1.md zu finden.

Vorstellungsrunde

                                 {{0-1}}

Forschung

!?Schwimmroboter

Lehre

Welcome


{{1-2}}

Und Ihr?

  • Was für Programmiererfahrung habt Ihr bereits?
  • Welche Programmiersprachen mögt Ihr und warum?
  • Wie viele Zeilen hatte das umfangreichste Programm, dass Ihr schon geschrieben habt?

Planungen für diese Woche

Wochentag Zeit Inhalt
Montag (Mikrocontroller) 09:00 - 10:00 Grundlage C, Hello World, Serielle Schnittstelle
10:10 - 11:30 Taster, Distanzsensor, Mehrfarben-Leds
11:40 - 12:30 Display
12:30 Sprint Meeting
Dienstag (App Entwicklung) 09:00 - 10:30 Einführung MIT-App Inventor
10:40 - 11:55 Beispielanwendungen
11:55 _Sprint Meeting _
12:00 - 13:00 Freie Anwendungsentwicklung
Mittwoch (Integration) 09:00 - 10:30 Bluetooth Kommunikation im App Inventor
10:40 - 11:55 Fernsteuern des Mikrocontrollers über die App
11:55 _Sprint Meeting _
12:00 - 13:00 Freie Anwendungsentwicklung

Einführung

Welcome

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.

https://www.arduino.cc/

Arduino Hardwarefamilie


Arduino Programmierung

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

Cheat-Sheet

Aufbau eines Arduino-Programmes

Jedes Arduinoprogramm umfasst 2 grundlegende Funktionen setup() und loop().

```cpp arduino.cpp const int ledPin = 13;

void setup() { pinMode(ledPin, OUTPUT); }

void loop() { digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW); delay(1000);
}

@AVR8js.sketch

### Arduino IDE

![Bildtext](images/ArduinoIDE_Screenshot.jpg "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  |

### 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?

```cpp arduino.cpp void setup() { Serial.begin(9600); int counter = 0; for (int i = 0; i < 10; i++){ Serial.println(counter); counter = counter + 1; } }

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.

```cpp arduino.cpp void setup() { Serial.begin(9600); float value = 5.234; Serial.print(value); if (value > 10){ Serial.println(" - Der Wert ist größer als 10!"); }else{ Serial.println(" - Der Wert ist kleiner als 10!"); } }

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


Einstiegsübung

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
}

Systematische Fehlersuche

Ok, Ausgaben klappen, wie sieht es mit Eingaben aus?

Bildtext

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

int setup() {
  pinMode(ledPin, INPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH)
  } else {
    digitalWrite(buttonPin, LOW);
  }
}

Und wie gehen wir bei der Fehlersuche vor?

  1. Ruhe bewahren!

  2. Ruhe bewahren!

  3. Situation prüfen

    • Syntaktischer Fehler (Dein Kompiler meckert!)

    • Logischer Fehler (Du hast einen Denkfehler!)

    • Hardwarefehler (Ups, draufgetreten!)

  4. Fehlermeldung aufmerksam lesen

  5. ggf. Hypothesen aufstellen und prüfen

Aufgabe: Debuggen Sie den obigen Quellcode!.

Aufgabenkomplexe

MangoLabsSet

Serielle Schnittstelle als Eingabe

Die Arbeit mit der seriellen Schnittstelle vom Arduino zum PC kennen Sie bereits. Aber das Ganze funktioniert auch umgekehrt.

```c ardunino.cpp char incomingByte;

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.

### Taster als Erweiterung

*Langweilig ... ! Das ist doch kein echtes eingebettetes System!*

![BildSchalterlogik](images/Microswitch_bb.png)<!-- 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.

Aufgabe: Aktiviere ein 3-maliges Blinken nach dem drücken des Tasters.

Distanzsensor als Input

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?"

Link

// 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.

Es wird bunt

Integration einer Mehrfarben LED als Erweiterung der Ausgabe

RGB

Diode

// 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

[^1] https://www.informatikzentrale.de/rgb-farbmodell.html