Hallo!
Matthias Edler-Golla
matthias.edler-golla@hm.edu
http://matthias-edler-golla.de
Matthias Edler-Golla
matthias.edler-golla@hm.edu
http://matthias-edler-golla.de
ich hoffe nicht…
Innerhalb der ersten 4 Semester habt Ihr vier aufeinander aufbauende Module, die alle direkt oder indirekt mit Interaction Design zu tun haben:
… dafür dann aber 4 × 45min!
Das Teilmodul Digitales Prototyping ist als Fortsetzung des Kurses 301.2 Webdesign für ID-Studierende zu sehen. Die im Webdesign vermittelten Kenntnisse im Bereich von HTML/CSS/Javascript werden in diesem Kurs mit Grundlagen des „Physical Computings“ kombiniert:
Mit HTML/CSS/Javascript ist es relativ einfach möglich, interaktive Prototypen von Smartphone- bzw. Tablet-Applicationen (kurz „Apps“ genannt) zu erstellen. Kombiniert man diese Web-Apps mit Sensoren, Aktoren und Daten z.b. von Microcontrollern (Arduino, Raspberry Pi …) entstehen mehr oder weniger komplexe Prototypen digitaler Produkte, mit denen die Interaktion zwischen Mensch & Maschine getestet werden kann.
Arduino Uno mit Ultraschall-Sensor, LCD-Display und Piezo-Modul
Physical Computing bedeutet im weitesten Sinne, interaktive, physische Systeme durch die Verwendung von Hardware und Software zu erstellen. Diese Systeme reagieren auf Ereignisse in der realen, analogen Welt und/oder wirken auf sie ein.
Wikipedia
Die Grundlagen in Processing bzw. p5.js sind ein guter Start ins Physical Computing – das Programmieren von Arduino verwendet fast die gleiche Entwicklungsumgebung und Programmiersprache…
Daniel Shiffmann hat eine ganze Reihe super Tutorials zu Processing, p5.js (und mehr gemacht)
Bitte schaut Euch diese noch mal:
Bild von matthew venn
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. Die Entwicklungsumgebung basiert auf Processing (p5.js) und soll auch technisch weniger Versierten den Zugang zur Programmierung und zu Mikrocontrollern erleichtern.
Das erste Board wurde 2005 von Massimo Banzi und David Cuartielles entwickelt. Der Name „Arduino“ wurde von einer Bar in Ivrea übernommen, in der sich einige der Projektgründer gewöhnlich trafen.
Massimo Banzi half beim Erfinden von Arduino, diesem kleinen, einfach anzuwendenden Open-Source-Mikrocontroller, der tausende Menschen auf dem Globus dazu inspiriert hat, coole Sachen zu fabrizieren -- von Spielzeug bis hin zu Satelliten. Denn wie er sagt: „Man braucht von niemandem die Erlaubnis, um etwas Großartiges zu erschaffen.“
Es gibt noch sehr viele andere Arduino-Boards für unterschiedliche Einsatzzwecke!
Die Farbe der LED ist egal!
Macht Euch mit dem Buttons am oberen Rand des Fenster vertraut…
// LED ein- und ausschalten
// Einstellungen am Anfang
void setup() {
// LED auf 13 als OUTPUT
pinMode(13, OUTPUT);
}
// diese Schleife läuft endlos…
void loop() {
digitalWrite(13, HIGH); // LED anschalten
delay(1000); // LED 1 sek anlassen
digitalWrite(13, LOW); // LED ausschalten
delay(1000); // LED 1 sek auslassen
}
Kopiert mal den Code und fügt ihn in Eure Arduino IDE ein…
Arduino hat ein „eingebautes“ Nachschlagewerk, dass auch offline funktioniert!
Dazu den gewünschten Begriff markieren und mit der rechten Mousetaste anklicken. Unter „Find in Reference“ wird dann ein Browserfenster geöffnet…
Klickt man dort auf Language, erhält man einen Überblick über die häufigsten Code-Elemente…
direkt in der Arduino IDE enthalten
Damit Ihr mit dem Arduino kommunizieren könnt, müsst Ihr das richtige Arduino-Board (hier Uno) und den richtigen Port auswählen!
Dann könnt Ihr den Blink-Sketch auf das Board hochladen und probieren, ob dieser funktioniert…
Schreibt einen eigenen Arduino-Sketch, der folgendes macht:
…und dann geht es wieder von vorne los…
Sichert den Sketch unter doppelblink auf Eurem eigenen Rechner unter Dokumente>Arduino
Die LED blinkt nur 5 mal und hört dann auf…
int ledPin = 13; // an welchem Pin ist die LED angeschlossen?
int anzahl = 5; // Anzahl der Wiederholungen
int i = 0; // Variable zum Zählen
int vz = 500; // Verzögerung in Milisekunden
// Einstellungen am Anfang
void setup() {
pinMode(ledPin, OUTPUT); // LED auf Pin 13 als OUTPUT
}
void loop() {
if (i < anzahl) {
digitalWrite(ledPin, HIGH); // LED an
delay(vz);
digitalWrite(ledPin, LOW); // LED aus
delay(vz);
i = i + 1; // bei jeder Runde 1 dazu
} else { // wenn die Zahl >= Anzahl ist…
digitalWrite(ledPin, LOW);
}
}
Wie müsst Ihr den Code ändern, dass die LED bei jeder Wiederholung um eine halbe Sekunde länger leuchtet?
Ändern: Mit dem Code unten blinkt die LED nur 5 mal und hört dann auf…
int ledPin = 13; // an welchem Pin ist die LED angeschlossen?
int anzahl = 5; // Anzahl der Wiederholungen
int i = 0; // Variable zum Zählen
int vz = 500; // Verzögerung in Milisekunden
// Einstellungen am Anfang
void setup() {
pinMode(ledPin, OUTPUT); // LED auf Pin 13 als OUTPUT
}
void loop() {
if (i < anzahl) {
digitalWrite(ledPin, HIGH); // LED an
delay(vz);
digitalWrite(ledPin, LOW); // LED aus
delay(vz);
i = i + 1; // bei jeder Runde 1 dazu
} else { // wenn die Zahl >= Anzahl ist…
digitalWrite(ledPin, LOW);
}
}
Am Breadboard sind an den äußeren Rändern die Bahnen + und – waagrecht miteinander verbunden. Im inneren Bereich sind die Bahnen senkrecht verknüpft…
Der gezeigte Aufbau soll nur die Funktionsweise erklären.
Baut diesen so nicht auf – die LED wird überhitzt und brennt durch!
… es gibt auch 5-Band-Widerstände – die entsprechende Legende findet Ihr im Arduino Project Book auf Seite 41!
für Lösung runterscrollen…
1 | 0 | 102 | ±5% = 10 × 100 = 1000Ω = 1kΩ mit ±5% Toleranz
Baut die abgebildete Konstellation bitte genau nach! Der Widerstand muß 220Ω haben, sonst brennt die LED durch…
AnalogWrite bedeutet, dass man feine Abstufungen (hier 256 Stufen) einstellen kann. DigitalWrite lässt nur zwei Werte (an/aus, 0/1, ja/nein) zu…
int led = 6; // An Pin 6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
void setup() {
// Den Pin zur Ausgabe festlegen.
pinMode(led, OUTPUT);
}
void loop() {
// max. Wert wäre hier 255
// Die LED leuchtet nun mit 25 % Helligkeit.
analogWrite(led, 64);
}
Ändert mal den Wert bei analogWrite(); – mehr als 255 geht nicht…
gleicher Aufbau wie beim vorherigen Sketch!
int led = 6; // An Pin 6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
int richtung = 1; // richtung gibt an, ob die LED heller oder dunkler werden soll
int i; // zum Hoch- und Runterzaehlen in der for-Schleife
void setup() {
// Den Pin zur Ausgabe festlegen.
pinMode(led, OUTPUT);
// Ausgabe-Werte im Serial Monitor ermöglichen
Serial.begin(9600);
}
void loop() {
for (i = 0; i <= 255; i++) {
analogWrite(led, i * richtung); // die LED wird langsam heller bzw. dunkler
// Ausgabe der Werte im Serial-Monitor
Serial.print(i); // i als Wert im Serial-Monitor ausgeben
Serial.print(", richtung: ");
Serial.println(richtung);
delay(10); // 10 Milisekunden Verzögerung
}
// an den äußeren Rändern der Schleife ändert sich die Richtung
if ((i >= 255) || (i <= 0)) {
richtung = -richtung;
i = 0;
}
}
Öffnet diesen, indem Ihr auf das Lupen-Symbol klickt!
gleicher Aufbau wie beim vorherigen Sketch!
Baut den Versuchsaufbau und den Sketch so aus, dass 2 LEDs animiert leuchten! Ändert den Code so, dass die eine LED am hellsten leuchtet, wenn die andere am dunkelsten ist.
int led = 6; // An Pin 6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
int richtung = 1; // richtung gibt an, ob die LED heller oder dunkler werden soll
int i; // zum Hoch- und Runterzaehlen in der for-Schleife
void setup() {
// Den Pin zur Ausgabe festlegen.
pinMode(led, OUTPUT);
// Ausgabe-Werte im Serial Monitor ermöglichen
Serial.begin(9600);
}
void loop() {
for (i = 0; i <= 255; i++) {
analogWrite(led, i * richtung); // die LED wird langsam heller bzw. dunkler
// Ausgabe der Werte im Serial-Monitor
Serial.print(i); // i als Wert im Serial-Monitor ausgeben
Serial.print(", richtung: ");
Serial.println(richtung);
delay(10); // 10 Milisekunden Verzögerung
}
// an den äußeren Rändern der Schleife ändert sich die Richtung
if ((i >= 255) || (i <= 0)) {
richtung = -richtung;
i = 0;
}
}
Verwendet hierfür einen 10kΩ Widerstand
int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
void setup() {
pinMode(fotozelle, INPUT);
Serial.begin(9600);
}
void loop() {
int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen
Serial.print("Helligkeitswertes der Foto-Zelle: ");
Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle
delay(100);
}
Öffnet den Serial Monitor und schaut, welche Werte ausgegeben werden, wenn Ihr z.B. die Fotozelle mit der Hand abdeckt oder mit einen Taschenlampe draufleuchtet.
Theoretisch sollten die Werte zwischen 0 und 1023 liegen…
Schließt den Serial Monitor und öffent den Serial Plotter (Menüleiste>Tools>Serial Plotter).
Dort erhaltet Ihr den dazugehörigen Graphen, der laufend aktualisiert wird.
Verwendet einen 10kΩ Widerstand bei der Fotozelle und einen 220Ω Widerstand bei der LED
int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
int led = 6; // An Pin D6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
void setup() {
pinMode(fotozelle, INPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen
Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle
// hell ist ein Wert zwischen 0 und 1023
// die LED verträgt aber nur Wert zwischen 0 und 255
// deswegen teile ich hell durch 4; (probiert auch mal 3 aus, weil Fotozelle real nicht bis 1024 geht…
// 255 - hell/4 bewirkt, dass die LED umso dunkler wird, desto heller das Umgebungslicht ist
analogWrite(led, 255 - hell / 4);
delay(100);
}
Wie müsst Ihr den Code ändern, dass die LED umso heller wird, desto heller das Umgebungslicht wird?
Verwendet einen 10kΩ Widerstand bei der Fotozelle und einen 220Ω Widerstand bei der LED
int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
int led = 6; // An Pin D6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
void setup() {
pinMode(fotozelle, INPUT);
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen
Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle
// hell ist ein Wert zwischen 0 und 1023
// die LED verträgt aber nur Wert zwischen 0 und 255
// deswegen teile ich hell durch 4; (probiert auch mal 3 aus, weil Fotozelle real nicht bis 1024 geht…
// 255 - hell/4 bewirkt, dass die LED umso dunkler wird, desto heller das Umgebungslicht ist
analogWrite(led, 255 - hell / 4);
delay(100);
}
Verwendet einen 10kΩ Widerstand bei der Fotozelle und einen 220Ω Widerstand bei der LED.
Das Piezo-Element braucht keinen Widerstand und es spielt auch keine Rolle, wierum Ihr es auf das Breadboard steckt.
int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
int led = 6; // An Pin D6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
int piezo = 3; // Piezo bei D3 angeschlossen
void setup() {
pinMode(fotozelle, INPUT);
pinMode(led, OUTPUT);
pinMode(piezo, OUTPUT);
Serial.begin(9600);
}
void loop() {
int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen
Serial.print("Helligkeitswertes der Foto-Zelle: ");
Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle
analogWrite(led, 255 - hell / 4);
// wenn es zu dunkel wird, geht der Alarm an
if (hell < 550) {
playTone(300, 160); // externe Funktion, siehe unten!
}
delay(300);
}
// duration in mSecs, frequency in hertz
void playTone(long duration, int freq) {
duration *= 1000;
int period = (1.0 / freq) * 1000000;
long elapsed_time = 0;
while (elapsed_time < duration) {
digitalWrite(piezo, HIGH);
delayMicroseconds(period / 2);
digitalWrite(piezo, LOW);
delayMicroseconds(period / 2);
elapsed_time += (period);
}
}
Da kommt einiges zusammen!
int fotozelle = A0; // Pin Zuweisung bei A0; Widerstand 10 kOhm
int led = 6; // An Pin D6 ist eine LED mit Widerstand 220 Ohm angeschlossen.
int piezo = 3; // Piezo bei D3 angeschlossen
void setup() {
pinMode(fotozelle, INPUT);
pinMode(led, OUTPUT);
pinMode(piezo, OUTPUT);
Serial.begin(9600);
}
void loop() {
int hell = analogRead(fotozelle); // Wert, den Fotozelle ausgibt, wird gelesen
Serial.print("Helligkeitswertes der Foto-Zelle: ");
Serial.println(hell); // Ausgabe des Helligkeitswertes der Foto-Zelle
analogWrite(led, 255 - hell / 4);
// wenn es zu dunkel wird, geht der Alarm an
if (hell < 550) {
playTone(300, 160); // externe Funktion, siehe unten!
}
delay(300);
}
// duration in mSecs, frequency in hertz
void playTone(long duration, int freq) {
duration *= 1000;
int period = (1.0 / freq) * 1000000;
long elapsed_time = 0;
while (elapsed_time < duration) {
digitalWrite(piezo, HIGH);
delayMicroseconds(period / 2);
digitalWrite(piezo, LOW);
delayMicroseconds(period / 2);
elapsed_time += (period);
}
}
Verwendet einen 10kΩ Widerstand bei der Fotozelle.
Das Piezo-Element braucht keinen Widerstand und es spielt auch keine Rolle, wierum Ihr es auf das Breadboard steckt.
// Aus dem „Arduino Projects Book“, S. 71ff
int sensorValue;
int sensorLow = 1023;
int sensorHigh = 0;
// const = unveränderbarer Wert
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
// Kalibriert die Fotozelle
// in diesem Zeitraum die Hand über die Zelle so bewegen
// dass die gewünschten Max- und Min-Werte eingestellt werden können
while (millis() < 5000) {
sensorValue = analogRead(A0);
if (sensorValue > sensorHigh) {
sensorHigh = sensorValue;
}
if (sensorValue < sensorLow) {
sensorLow = sensorValue;
}
}
// wenn die LED ausgeht, ist das Kalibrieren fertig
digitalWrite(ledPin, LOW);
}
void loop() {
sensorValue = analogRead(A0);
// 50 - 4000 = Range of Frequency of Piezo
// map überträgt die Sensor-Werte auf die Range der Frequency
int pitch = map(sensorValue, sensorLow, sensorHigh, 50, 4000);
// Ton an Pin8, 20 Millisekunden Länge
tone(8, pitch, 20);
// LED an, wenn pitch sehr niedrig ist
if (pitch < 300){
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
delay(10);
}
Spielt mal mit den Werten der Frequenz und auch der Tonlänge…
220Ω Widerstand bei der LED
Bitte achtet darauf, dass auf dem Sensor tatsächlich „Temp“ steht und dass Ihr diesen richtigherum (flache Seite Richtung Arduino) eingebaut habt!
// Arduino Project Book, Seite 43ff
// Analoger Eingang 0
int sensorPin = A0;
// Widerstand hier wieder 220Ω
int ledPin = 2;
// Grenzwert-Temperatur, wenn LED an/ausgehen soll
float grenzwert = 24.0;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// roher Sensor-Wert
int sensorVal = analogRead(sensorPin);
Serial.print("Sensor Wert roh: ");
Serial.println(sensorVal);
// Umrechung in Volt (muss zwischen 0V und 5V liegen!)
float voltage = (sensorVal / 1024.0) * 5.0;
Serial.print("Volt: ");
Serial.println(voltage);
// Temperatur in Celsius
float temperature = (voltage - 0.5) * 100;
Serial.print("Temperatur: ");
Serial.print(temperature);
Serial.println(" C\n"); // \n erzwingt eine Leerzeile
// Wenn die Temperatur unter einen bestimmten Wert fällt
// soll die LED angehen
if (temperature < grenzwert){
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
// Messung alle 0.5 sek
delay(500);
}
Erweitert den Temperatur-Sensor-Sketch um folgende Funktion:
Es gibt eine weitere LED; die erste geht an, wenn die Temperatur unter einen bestimmten Wert fällt; die zweite LED geht an, wenn die Temperatur über diesen Wert geht. (Die erste LED ist dann aus). Verwendet dazu nach Möglichkeit unterschiedliche LED-Farben
Wer schafft es, 3 LEDs anzusteuern?
Mögliche Abstufungen: 1. Grenzwert: 24° C, 2. Grenzwert: 27°C
// Code-Schnipsel für die Bedingungen
if (temperature < grenzwert_1) { // unterer Bereich
// Bereich zwischen den Grenzwerten, durch 2 Bedingungen bestimmt!
// deswegen das &&
} else if (temperature > grenzwert_1 && temperature < grenzwert_2) {
} else { // oberer Bereich
}