Was ist ein Mikrocontroller?
Ein Mikrocontroller (auch MCU oder µC) ist ein elektronisches Halbleiterelement, welches auf einem einzigen Chip mehrere Elemente, wie eine CPU, eine Uhr, Timer, I/O Ports und Speicher zur Verfügung stellt. Mikrocontroller werden heute in vielfältiger Art und Weise eingesetzt. Elektronische Produkte besitzen fast immer einen Mikrocontroller, welcher für die “Logik” der Produkte verantwortlich ist. Dabei verarbeitet er Eingaben von Sensorenund und reagiert in dem er die Stellung oder Anzeige von Aktuatoren verändert.
...
Hier gibt es eine Dokumentation zur Entstehungsgeschichte und Bedeutung des Arduino
...
analogRead(PIN)
Liesst den Wert eines analogen PIN
...
delay(Wert)
Pausiert das aktuelle Programm für eine definierte Zeit (Zeit wird in Millisekunden angegeben)
Übersicht Arduino Board
Widget Connector | |||||
---|---|---|---|---|---|
|
Übersicht über C/C++
Für Arduino werden wir in C/C++ programmieren. Da Arduino auf Processing aufbaut sieht die Oberfläche und die Syntax beider Programme sehr ähnlich aus. Es gibt jedoch einige Unterschiede, welche wir im Laufe des Workshops beleuchten werden. Ihr solltet schon über einige Grundkenntnisse der Programmierung verfügen. Trotzdem gibt es hier eine kleine Wiederholung. Eine Komplette Referenz für Arduino erhaltet ihr hier.
Übersicht:
Code Block | ||
---|---|---|
| ||
// Hier werden globale Variablen deklariert
void setup()
{
// Die Setup Funktion wird genau einmal am Anfang ausgeführt
}
void loop()
{
// Die Funktion Loop wird permanent ausgeführt
} |
Variablen:
int (byte, int, uint, long, ulong)
Ganzzahlige Variablen
z.B. int x = 22;
...
Operatoren:
Arithmetische Operatoren (+,-,*,/,=,%)
x = 3+2; // x = 5
y = 2-1; // y = 1
z = 5*2; // z = 10
i = 10/2; // i = 5
r = 9%5; // r = 4
Vergleichende Operatoren (,=,==,!=)
Code Block | ||
---|---|---|
| ||
if(x<120) // Bedingung
{
// Auszuführende Aktion
} |
Boolsche Operatoren (&&,||,!)
Code Block | ||
---|---|---|
| ||
if(digitalRead(2) == HIGH) // Bedingung
{
// Auszuführende Aktion
} |
Zusammengesetzte Operatoren (++,–,+=,-=,*=,/=)
x++ // x um eins erhöhen
y– // y um eins verringern
z+=2 // z um zwei erhöhen
i-=5 // i um fünf verringern
Kontroller:
if…
Code Block | ||
---|---|---|
| ||
if(x>120)
{
// Aktion wenn x grösser als 120
} |
if…else
Code Block | ||
---|---|---|
| ||
if(x>120)
{
// Aktion wenn x grösser als 120
}
else
{
// Aktion wenn x kleiner als, oder genau 120
} |
for
Code Block | ||
---|---|---|
| ||
for(int i=0; i<=255; i++)
{
// Setzt i von 0 bis 255
} |
switch case
Code Block | ||
---|---|---|
| ||
switch(var)
{
case 1:
// Aktion wenn var 1 entspricht
break;
case 2:
// Aktion wenn var 2 entspricht
break;
default:
// Aktion wenn var weder 1 noch 2 entspricht
} |
while
Code Block | ||
---|---|---|
| ||
var = 0;
while(var<120)
{
// Aktion welche sich 120 Mal wiederholt
var++;
} |
break
Code Block | ||
---|---|---|
| ||
for(int i=0; i<200; i++)
{
digitalWrite(5,i);
sensorWert = analogRead(0);
if(sensorWert>200)
{
i = 0; // Schleife verlassen
break;
}
delay(100);
} |
return
Code Block | ||
---|---|---|
| ||
int checkSensor()
{
if(analogRead>200)
{
return 1; // checkSensor ist nun 1
}
else
{
return 0; // checkSensor ist nun 0
}
} |
Spezielle Funktionen:
pinMode(PIN)
Definiert ob ein PIN als Eingang oder Ausgang benutz wird
...
|
Übersicht Arduino UNO
Der Standard unter den sehr verschiedenen Arduino Boards ist das Arduino UNO. Dieses Board ist sehr robust und für die meisten Anwendungen völlig ausreichend.
Pins des Arduino Boards
USB
Die USB-Schnittstelle ist eine serielle Schnittstelle, welche zur Programmierung des Arduino verwendet wird. Ausserdem wird über diese Schnittstelle das Arduino mit Strom versorgt. Weitere Informationen unter [USB Schnittstelle]
...
Digitaler Input / Output
Diese Pins können verwendet werden um digitale Events zu erkennen, bzw. schalten (siehe Digitaler Input / , Digitaler Output). Eine spezielle Form ist die Pulse Width Modulation (PWM).
Analoger Input
Diese Pins können benutzt werden um Sensoren auszulesen (siehe Analoger Analog Input). Zwei dieser Pins (A4 und A5) übernehmen zusätzlich eine wichtige Rolle in der Kommunikation über I2Cüber die I2C (de) Schnittstelle.
Power
Hier sind alle Pins versammelt, welche für die grundlegende Spannungsversorgung benötigt werden. Es gibt GND, 5V, 3.3V und Vin.
Aufgaben:
1. Nutz das Blink Beispiel (Exampels/Basic/Blink) und erweitere es um eine zweite LED.
2. Öffne das BlinkWithout Delay Beispiel (Exampels/Digital/BlinkWithoutDelay) und verstehe das Konzept.
3. Programmiere ein Lauflicht mit 3 LEDs, welches sich von einer zur anderen Seite bewegt.
4. Definiert eine eigene Funktion void blinkLED(int _Pin, int _duration) welche es ermöglicht unterschiedliche LEDs mit unterschiedlichen Geschwindigkeiten blinken zu lassen.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH); // set the LED on
digitalWrite(12, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
digitalWrite(12, LOW); // set the LED off
delay(1000); // wait for a second
} |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
// constants won't change. Used here to
// set pin numbers:
const int ledPin = 13; // the number of the LED pin
// Variables will change:
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)
void setup() {
// set the digital pin as output:
pinMode(ledPin, OUTPUT);
}
void loop()
{
// here is where you'd put code that needs to be running all the time.
// check to see if it's time to blink the LED; that is, if the
// difference between the current time and last time you blinked
// the LED is bigger than the interval at which you want to
// blink the LED.
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
// if the LED is off turn it on and vice-versa:
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
// set the LED with the ledState of the variable:
digitalWrite(ledPin, ledState);
}
} |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#define LED_ONE 13
#define LED_TWO 12
#define LED_THR 11
void setup()
{
pinMode(LED_ONE, OUTPUT);
pinMode(LED_TWO, OUTPUT);
pinMode(LED_THR, OUTPUT);
}
void loop()
{
for(int i=13; i<11; i--)
{
digitalWrite(i, HIGH);
delay(500);
digitalWrite(i, LOW);
delay(500);
}
for(int i=11; i<=13; i++)
{
digitalWrite(i, HIGH);
delay(500);
digitalWrite(i, LOW);
delay(500);
}
} |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
int ledPins[3] = {8,9,10}; // Alle LED Pins in einem Array initialisieren
boolean ledStates[3] = {false, false, false}; // Alle LED Status speichern
long previousMillis[3] = {0,0,0}; // Die Zeiten speichern
void setup()
{
for(int i=0; i<3; i++)
{
pinMode(ledPins[i], OUTPUT); // Alle LED Pins sind Output
}
}
void loop()
{
blinkLED(1, 100); // Aufrufen unserer Funktion
blinkLED(2, 1000);
blinkLED(3, 500);
}
void blinkLED(int _Pin, int _duration) // Eigene Funktion
{
if(millis() - previousMillis[_Pin-1] > _duration) // Ist genug Zeit vergangen?
{
previousMillis[_Pin-1] = millis(); // Zeit speichern
ledStates[_Pin-1] != ledStates[_Pin-1]; // Den LED State umdrehen (wenn AUS dann AN)
digitalWrite(ledPins[_Pin-1], ledStates[_Pin-1]); // State setzen
}
} |
Weitere Informationen
Getting Started with Arduino – Massimo Banzi (2008)
Arduino – Die Arduino Website. Bitte anschauen…
Mikrocontroller – Was ist ein Mikrokontroller?
Reflektion
Mikrocontroller
In der ersten Lektion haben wir uns mit dem Mikrocontroller und dessen Schaltung und Programmierung vertraut gemacht. Folgende Inhalte waren dabei wichtig:
- Ein Mikrocontroller ist eine programmierbare elektronische Komponente.
- Wir verwenden die Arduino IDE, welche auf C/C++ basiert ist.
Bauteile
Des weiteren haben wir schon unterschiedliche elektronische Bauteile und Gesetzmässigkeiten angewandt. Dazu zählen:
- Widerstand
- LED
Hier zunächst weitere Informationen zu den betreffenden Bauteilen:
Make Presents: The Resistor
Make Presents: The LED
PWM
Diese Pins werden für die Pulse Width Modulation verwendet
SDA / SCL
Diese Pins finden für die sogenannte I2C (de) Schnittstelle Verwendung über welche sich Sensoren und sonstige Peripherie ansteuern lässst.
RX / TX
Diese beiden Pins werden für die Serielle Kommunikation unter anderem auch für die USB Verbindung zum Computer verwendet.
INT0 / INT1
Diese beiden Pins sind sogenannte Interrupts. Damit lassen sich über eine Interrupt Service Routine sehr schnell stattfindende Events erkennen.
SCK / MISO / MOSI / SS
Diese vier Pins werden für die Kommunikation über die SPI Schnittstelle benötigt. Ein häufiges Anwendungsbeispiel ist das Steuern eines Shift Registers beim Shift Registers.
Spezielle Funktionen
setup()
Wird nur einmal zum Beginn des Programms aufgerufen. Hier werden weitere Funktionen aufgerufen (z.B. pinMode()).
loop()
Der Loop beinhaltet das eigentliche Programm und wird permanent ausgeführt. Die Geschwindigkeit, mit der das Programm aufgerufen wird hängt dabei von der Taktfrequenz des Prozessors und den Funktionen ab, die aufgerufen werden.
pinMode(PIN)
Definiert ob ein digitaler Pin PIN als Input Eingang oder Output genutzt wird.Ausgang benutz wird
digitalRead(PIN)
Liesst den Wert an einem digitalen PIN (vorher als Eingang definiert)
digitalWrite(PIN, Wert)
Schreibt Setzt einen Wert auf einen Pin (zunächst nur HIGH oder LOW).delay(für einen PIN (vorher als Ausgang definiert)
analogRead(PIN)
Liesst den Wert eines analogen PIN
analogWrite(PIN, Wert)
Setzt den PWM Wert eines digitalen PIN (PWM = Pulse Width Modulation)
delay(Wert)
Pausiert das aktuelle Programm für eine definierte Zeit (Zeit wird in Millisekunden angegeben)
delay(Wert)
Hält das Programm für eine definierbare Zeit an. Diese Funktion ist nicht so effektiv, wie die Nutzung von millis().
millis()
Hier wird die Aktuelle Systemzeit (in Millisekunden) zurückgegeben.
Weitere Informationen
- Getting Started with Arduino – Massimo Banzi (2008)
- Arduino – Die Arduino Website. Bitte anschauen…
- Mikrocontroller – Was ist ein Mikrokontroller?