C / C++ für das Internet der Dinge und Hausautomatisierung Einführung Hochschule Fulda FB AI Sommersemester 2017 http://c.rz.hs-fulda.de Peter Klingebiel, HS Fulda, FB AI
Zur Veranstaltung 1 Peter Klingebiel Dipl. Ing. Maschinenbau 10/1995 bis 9/2016 Leiter DVZ HS Fulda Seit 4/2016 FB AI Lehrkraft für besondere Aufgaben Raum 43.008 (C008) Telefon 0661/9640-3024 Sprechstunde: dienstags 12:30 bis 14:00 nach Vereinbarung http://www.hs-fulda.de/~klingebiel mailto:klingebiel@hs-fulda.de Webseite der Veranstaltung Folien, Aufgaben, Demoprogramme, Links usw. http://c.rz.hs-fulda.de C / C++ - Peter Klingebiel - HS Fulda - FB AI 2
Zur Veranstaltung 2 Ziele der Veranstaltung Einführung in Mikrocontroller und ihre Programmierung mit C und C++ am Beispiel der Mikrocontrollersysteme der Arduino-Familie und des ESP8266 Techniken und Programmierung der Steuerung von externen Geräten am Beispiel von Funktechniken (z.b. Bluetooth, 433 MHz-Funk) und WiFi Selbstständiges Erarbeiten von Lösungen im Umfeld des Internet der Dinge und der Hausautomatisierung Erstellen einer Hausarbeit zum selbstgewählten Problem aus dem Umfeld der Veranstaltung in schriftlicher Form mit anschließender Präsentation C / C++ - Peter Klingebiel - HS Fulda - FB AI 3
Mikrocontrollerprogrammierung 1 Besonderheiten Kombination von Controller, Sensoren, Aktoren und Software Physical Computing Kommunikation mit externen Geräten erfordern (viele) digitale und analoge Ein- und Ausgänge Vielfalt von Protokollen zum Ansteuern von und zur Kommunikation mit externen Geräten (z.b. 1 Wire, I2C, ISP) Microkontrollersysteme haben oft kein Betriebssystem, die Programme laufen direkt auf der Hardware bei der Softwareentwicklung: meist Trennung von Entwicklungs- und Zielsystem, z.b. Programmentwicklung auf PC und dann Herunterladen (Flashen) auf Zielsystem Fehlersuche und Debugging oft sehr schwierig C / C++ - Peter Klingebiel - HS Fulda - FB AI 4
Mikrocontrollerprogrammierung 2 Problem Hochsprachen (z.b. C, C++, Java, LUA, Python, ) Assemblersprachen (für reale oder virtuelle Maschine) Maschinensprachen (Bitcode, Bytecode, Microcode) Hardware C / C++ - Peter Klingebiel - HS Fulda - FB AI 5
Analoges Regelsystem 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 6
Analoges Regelsystem 3 Schematischer Aufbau C / C++ - Peter Klingebiel - HS Fulda - FB AI 7
Analoges Regelsystem 3 Wirkungsplan / Regelkreis C / C++ - Peter Klingebiel - HS Fulda - FB AI 8
Analoges Regelsystem 4 Temperaturverlauf C / C++ - Peter Klingebiel - HS Fulda - FB AI 9
Digitalisierung 1 Tendenz zur Digitalisierung analoge Steuerungs- und Regelsysteme digitale, programmierbare, durch Microkontroller gesteuerte Systeme Vorteile: kostengünstiger flexibler leichter erweiterbar und wartbar vernetzbar Bügeleisen mit Internetanschluß??? C / C++ - Peter Klingebiel - HS Fulda - FB AI 10
Arduino 1 Wikipedia: https://de.wikipedia.org/wiki/arduino_(plattform) Arduino (seit März 2015 auch Genuino) Open Source Hardware- und Software-Plattform entwickelt von Massimo Banzi und David Cuartielles für künstlerischen Einsatz von IT-Komponenten benamst nach Arduin von Ivrea, der 1002-1014 italienischer König war Programmierung in C und C++ in einer eigenen Processing-basierten IDE Homepage: https://www.arduino.cc C / C++ - Peter Klingebiel - HS Fulda - FB AI 11
Arduino 2 Vielzahl an Boards, darunter auch für Wearables Vielzahl an Herstellern von Boards / Komponenten Vielzahl an Shields, z.b. Ethernet, WiFi, Sensoren, Unmenge an Zusatzkomponenten wie LEDs, Sensoren, Aktoren, Motoren, Unmenge an Einsatzfeldern, z.b. Robotics, Internet of Things, Hausautomatisierung, Wearables, Viele Anleitungen in Literatur und Internet: Arduino: https://www.arduino.cc/en/guide/homepage Funduino: http://funduino.de/vorwort Netzmafia: http://www.netzmafia.de/skripten/hardware/arduino/index.html Franzis: http://www.elo-web.de/elektronik/angebot/praxisbuch-arduino-aktion C / C++ - Peter Klingebiel - HS Fulda - FB AI 12
USB- Anschluß Arduino Uno R3 1 Reset- Schalter GND Masse Digitale Ein-/Ausgänge Pin 2 bis Pin 13 Serielle Pins In und Out Externe Stromversorgung CPU: Atmel ATmega328 Mikrocontroller 3.3V 5V GND Analoge Ein-/Ausgänge Pin A0 bis Pin A5 C / C++ - Peter Klingebiel - HS Fulda - FB AI 13
Arduino Uno R3 2 C / C++ - Peter Klingebiel - HS Fulda - FB AI 14
Mikrocontroller Atmel ATmega 328 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 15
Arduino Nano V3.0 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 16
Arduino Nano V3.0 2 C / C++ - Peter Klingebiel - HS Fulda - FB AI 17
Arduino Nano V3.0 3 C / C++ - Peter Klingebiel - HS Fulda - FB AI 18
Attiny 85 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 19
Programmierung 1 Programmierung der Arduinosysteme bzw. der Atmel-Mikrocontroller i.d.r. mit Assembler C/C++ (eigentlich C++!) Enwicklungsumgebungen AVR-Entwicklungsumgebungen von Atmel Arduino IDE Arduino IDE AVR-GCC/G++-Compiler minimalistische Oberfläche sehr leicht erweiterbar, z.b. für ESP8266 viele Erweiterungsbibliotheken für Hard- und Software C / C++ - Peter Klingebiel - HS Fulda - FB AI 20
Programmierung 2 C / C++ - Peter Klingebiel - HS Fulda - FB AI 21
Programmierung 3 Beispielprogramm, Sketch genannt: // blink-led10.ino // klin, 28.10.2016 // LED im Sekundentakt blinken const int led = 10; void setup() { pinmode(led, OUTPUT); } void loop() { digitalwrite(led, HIGH); delay(1000); digitalwrite(led, LOW); delay(1000); } // LED an Pin D10 // Initialisierung // LED-Pin als Ausgang // Arbeitsschleife // LED ein // 1 Sekunde warten // LED aus // 1 Sekunde warten C / C++ - Peter Klingebiel - HS Fulda - FB AI 22
Programmierung 4 C-main() muss nicht programmiert werden int main() { } setup(); while(1) loop(); Funktion setup() // Initialisierung // Endlosschleife Initialisierungen des Programms und der Komponenten Funktion loop() Hauptschleife des Anwendungsprogramms, läuft endlos Funktionsaufrufe von eigenen und Bibliotheksfunktionen Code des Algorithmus des Programms C / C++ - Peter Klingebiel - HS Fulda - FB AI 23
Programmierung 5 einige wichtige Funktionen: void pinmode(int p, int m) Eingang p auf Modus INPUT oder OUTPUT einstellen void digitalwrite(int p, int w) Wert v auf Digitalausgang p schreiben int digitalread(int p) Wert von Digitaleingang p lesen void analogwrite(int p, int w) Wert v auf Analogausgang p schreiben int analogread(int p) Wert von Analogeingang p lesen void delay(unsigned long p) Pause von p Millisekunden Referenz: https://www.arduino.cc/en/reference/homepage C / C++ - Peter Klingebiel - HS Fulda - FB AI 24
Adafruit Flora 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 25
Adafruit Flora 2 C / C++ - Peter Klingebiel - HS Fulda - FB AI 26
CJMCU Lilypad 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 27
ESP-01 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 28
Wemos D1 mini 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 29
Wemos D1 mini 2 C / C++ - Peter Klingebiel - HS Fulda - FB AI 30
Atmel Mikrocontroller Memoy 1 C / C++ - Peter Klingebiel - HS Fulda - FB AI 31
Atmel Mikrocontroller Memory 2 der ATmega328 und damit auch die Arduinos, die den Atmega328 verbaut haben (Uno, Nano u.a.) bieten drei Speicherbereiche an: 32 kb Flash-Speicher für Programmcode Programmcode bleibt erhalten davon ca. 2KB für Bootlader 2 kb SRAM-Speicher für Daten Speicher ist flüchtig, Daten gehen verloren im unteren Speicherbereich liegen General Purpose und IO- Register 1 kb EEPROM zum Speichern von Daten C / C++ - Peter Klingebiel - HS Fulda - FB AI 32
IO bei Mikrocontrollern 1 Microkontroller (und allgemein CPUs) kennen zwei Arten, IO-Geräte anzusprechen, d.h. zu lesen und zu schreiben: Port-mapped IO IO-Geräte werden extern angeschlossen und über spezielle Befehle gelesen und geschrieben Bsp: Z80 mit den Befehlen IN und OUT Memory-mapped IO Register und Speicherbereiche von IO-Geräten werden in den Speicherbereich der CPU gemapt Lesen und Schreiben ist damit ein Zugriff auf eine Speicheradresse, z.b. beim ATmega328 C / C++ - Peter Klingebiel - HS Fulda - FB AI 33
IO beim ATmega328 1 der ATmega328 besitzt drei sog. Ports: Port B, Port C und Port D andere Atmel-Prozessoren haben mehr oder weniger dieser Ports (der Attiny85 z.b. hat nur Port B) jedem Port sind drei 8-Bit-Register zugeordnet: DDR Data Direction Register legt Richtung des IO fest, d.h. Lesen (Input) oder Schreiben (Output) PIN Port Input Register enhält zu lesenden Wert PORT Port Output Register erhält zu schreibenden Wert (fast) jedes Bit in diesen Registern ist einem digitalen oder analogen Pin zugeordnet C / C++ - Peter Klingebiel - HS Fulda - FB AI 34
IO beim ATmega328 2 Zuordnung der Bits der Ports zu den Pins des ATmega328 die Zuordnung gilt für jeden Port jeweils für DDR-, PIN- und PORT-Register C / C++ - Peter Klingebiel - HS Fulda - FB AI 35
IO beim ATmega328 3 Lage der Port-Register für die drei Ports B, C und D des ATmega328 im SRAM-Speicher: damit ist ein bitweiser Zugriff auf die Pins möglich C / C++ - Peter Klingebiel - HS Fulda - FB AI 36
Bitoperationen auf Integertypen 1 Bitoperatoren ~ & ^ expr1 op expr2 bzw. ~expr C / C++ - Peter Klingebiel - HS Fulda - FB AI 37
Bitoperationen auf Integertypen 2 Bitshiftoperatoren << >> expr1 op expr2 Bits in expr1 um expr2 Bits verschoben Bsp. 1 << 2 1 um 2 Bits nach links Bsp: n >> 5 n um 5 Bits nach rechts C / C++ - Peter Klingebiel - HS Fulda - FB AI 38
Direkter Portzugriff 1 Beispielprogramm ähnlich Sketch auf Folie 22 // blink-port.ino // klin, 28.10.2016 // LED an Pin 10 im Halbsekundentakt blinken // direkter Zugriff ueber Bit 2 an Portregister PORT B void setup() // Initialisierung { DDRB = B00000100; // LED-Pin 10 als Ausgang } void loop() // Arbeitsschleife { PORTB = B00000100; // LED an Pin 10 ein delay(500); // 1/2 Sekunde warten PORTB &= ~B00000100; // LED an Pin 10 aus delay(500); // 1/2 Sekunde warten } C / C++ - Peter Klingebiel - HS Fulda - FB AI 39
Und los geht s C / C++ - Peter Klingebiel - HS Fulda - FB AI 40