Basteln_mit_dem_Arduino-1

Deutscher Amateur-Radio-Club e.V.
Arduino
Mikrocontrollerkurs
Axel Tüner (DF9VI)
1
Arduino Mikrocontroller
Eine Einführung speziell für Jugendliche
Der hier vorgeschllagene Kurs richtet sich an Einsteiger und vor allem
an Jugendliche ab ca. 13 Jahre. Die Teilnehmer erhalten zu Beginn als Einzelteile:
- einen Arduino (fertig oder besser von den Teilnehmern selber löten lassen)
- ein Steckbrett
- ein LC-Display
- einige Verbindungskabel (wire-jumpers) unterschiedlicher Länge(ca. 20 Stück )
- 8 LED´s mit Vorwiderstand (330 Ohm)
-1 Minilautsprecher
-1 Holzbrett
weitere Bauteile kommen dann bei Bedarf hinzu.
Die Kosten für die Erstausstattung liegen bei ca. 35€.
Wir beginnen mit einfachen Übungen an einem Steckbrett. Als Stromversorgung
dient zunächst eine 9V-Blockbatterie. Die Teilnehmer lernen die wichtigsten
elektronischen Bauteile kennen. Sinnvoll sind jetzt auch einige Lötübungen, bei
Jüngeren mit Reisszwecken, Ältere mit kleinen elektronischen Schaltungen
In der nächsten Phase werden Arduino und Steckbrett auf dem Holz montiert.
Das ist wichtig, um ein sauberes Arbeiten zu ermöglichen.
Es folgen erste Programmierübungen. Je nach Aufgabe erhalten die Teilnehmer
dann weitere Bauteile.
Anfangs sollen die Jugendlichen die Programme einfach abschreiben und anschließend
modifizieren. Nach und nach werden alle wichtigen Kommandos erklärt. Später ist ein
selbstständiges Arbeiten anzustreben, wobei natürlich Teamarbeit immer wünschenswert
ist. Die Übungen werden in der Folge immer anspruchsvoller. Zum Abschluss eines
jeden Abends sollten „Hausaufgaben“ gegeben werden, um die Teilnehmer zum
Weiterarbeiten zu Hause zu motivieren.
Diese Unterlagen bieten Material für sicher mehr als ein halbes Jahr (>20 Abende).
Vorsicht beim Umgang mit externen Spannungsquellen (bei Aufbauten mit Motoren)!
Alle Schaltungen und Programme wurden getestet. Diese Unterlage darf beliebig
an Teilnehmer und DARC-Mitglieder weiter gegeben werden. Aber bitte nicht im
Internet veröffentlichen und bitte keine Weitergabe außerhalb der Gruppe oder des
Vereins, da die Bilder u.U, nicht frei von Urheberrechten sind.
Tutorials
http://www.arduino.cc/
http://www.arduino-tutorial.de/
Youtube: Arduino Tutorial
http://www.arduino.cc/playground/Deutsch/HomePage
Interessante Seiten
http://wiring.org.co/learning/tutorials/
http://www.freeduino.de/
http://fff2.at/drupal/content/arduino-projekte
Händler
www.komputer.de/
http://jeelabs.net/projects/hardware/wiki/
http://www.watterott.com/
http://elmicro.com/
3
Übungen mit dem Steckboard
Leuchtdioden
Das Steckboard
4
Übungen mit dem Steckboard
Leuchtdioden
5
Übungen mit dem Steckboard
Leuchtdioden
I=
U=
6
Übungen mit dem Steckboard
Schaltungsvarianten
7
Übungen mit dem Steckboard
Diode
8
Übungen mit dem Steckboard
Transistor
Messen mit dem Ohmmeter:
Farben vertauschen! Plus wird zu Minus und Minus zu Plus!
9
Übungen mit dem Steckboard
Transistor
10
Übungen mit dem Steckboard
Kondensator
11
Übungen mit dem Steckboard
Wechselblinker
12
Übungen mit dem Steckboard
Lautsprecher
13
Der Arduino
LED-blinken
void setup() {
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
}
15
Lauflicht
void setup() {
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
usw.
}
void loop() {
digitalWrite(2, HIGH);
delay(1000);
digitalWrite(2, LOW);
delay(1000);
digitalWrite(3, HIGH);
delay(1000);
usw.
}
16
Taster
void setup() {
pinMode(2, OUTPUT);
pinMode(3, INPUT);
}
void loop() {
if (digitalRead(3) == LOW {
digitalWrite(2, HIGH);
}
}
Auf den Widerstand kann verzichtet werden:
mit:
digitalWrite(3, HIGH);
17
Monitor
Über den Monitor kann man mit dem Arduino sprechen
Serial.begin(9600);
Serial.println(„Guten Tag!“);
if (Serial.available() > 0) {
Eingabe = Serial.read();
}
int a = 5;
int b = 10;
int c = 20;
void setup()
{
Serial.begin(9600);
Serial.print("a = ");
Serial.println(a);
Serial.print("b = ");
Serial.println(b);
Serial.print("c = ");
Serial.println(c);
}
void loop() {
}
18
Blinklicht
Nach einmaligem Betätigen des Tasters sollen die LED´s abwechselnd blinken
19
Lautsprecher
Nach einmaligem Betätigen des Tasters soll die LED leuchten und der
Lautsprecher einen Ton von sich geben.
Wird die Taste nochmals betätigt, soll wieder Ruhe herrschen und die LED
ausgehen.
20
Analog-Eingang
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue, DEC);
}
21
Blinkgeschwindigkeit
int sensorPin = A0;
int ledPin = 13;
int sensorValue = 0;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
sensorValue = analogRead(sensorPin);
digitalWrite(ledPin, HIGH);
delay(sensorValue);
digitalWrite(ledPin, LOW);
delay(sensorValue);
}
22
Bar-Graph
const int analogPin = A0;
const int ledCount = 10;
int ledPins [ ] = {
2, 3, 4, 5, 6, 7,8,9,10,11 };
void setup() {
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
}
void loop() {
int sensorReading = analogRead(analogPin);
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH);
}
else {
digitalWrite(ledPins[thisLed], LOW);
}
}
}
23
Töne
void setup() {
}
void loop() {
int sensorReading = analogRead(A0);
int ton = map(sensorReading, 400, 1000, 100, 1000);
tone(9, ton, 10);
}
24
Töne
Beispielprogramme
//dit dit dit
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
tone (9,800,100); //pin, frequenz (hz), dauer (ms)
delay (200);
tone (9,800,100); //pin, frequenz (hz), dauer (ms)
delay (200);
tone (9,800,100); //pin, frequenz (hz), dauer (ms)
delay (1000);
}
//space-Ton
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
int i;
for (i=0; i<=2000; i=i+20){
tone (9,i,100); //pin, frequenz (hz), dauer (ms)
delay (20);
}
}
25
Töne
Vorschläge für Variationen
- Sirenenton erzeugen
- Tonhöhe mit Potentiometer variieren
- Tonhöhe in Abhöngigkeit vom Lichteinfall (LDR)
- Tonhöhe in Abhöngigkeit von der Temperatur (NTC)
- CQ-Ruf programmieren
- Orgel mit 8 Tastern (Pin 2-9)
- Musikprogramm aus dem Internet laden und ausprobieren
26
Helligkeit in Stufen anzeigen
sensorMin= Ergebnis bei kleinster Helligkeit
sensorMax = Ergebnis bei größter Helligkeit
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorReading = analogRead(A0);
int range = map(sensorReading, sensorMin, sensorMax, 0, 3);
switch (range) {
case 0:
Serial.println("dunkel");
break;
case 1:
Serial.println(„dunkler");
break;
case 2:
Serial.println(„Mittel");
break;
case 3:
Serial.println(„Hell");
break;
}
}
27
LCD anschließen (2x16 Zeichen)
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
//Format is RS, Enable, DB4, DB5, DB6, DB7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
lcd.begin(16, 2);
lcd.print("hello, world!");
lcd.clear();
lcd.setCursor(0,0); //Spalte, Zeile
28
29
LC-Display Typ „Batron“ BT24005
2x40 Zeichen
#include <LiquidCrystal.h>
//Format is RS, Enable, DB4, DB5, DB6, DB7
LiquidCrystal lcd(7,6,2,3,4,5);
void setup(){
lcd.begin(40, 2);
}
void loop(){
lcd.clear();
lcd.setCursor(0,0); //Zeile, Spalte (X,Y)
lcd.print(„Hallo!");
}
Arduino
7
LCD
1
2
3
4
(RS)
5
6
(E)
Arduino
GND
+5V
1KO nach GND
7
GND
6
6
5
LCD
11
12
13
14
A
K
4
3
2
Arduino
2
3
4
5
5,0 Ohm nach +5V
GND
30
31
LC-Display Typ 1602
2x16 Zeichen
#include <LiquidCrystal.h>
//Format is RS, Enable, DB4, DB5, DB6, DB7
LiquidCrystal lcd(7,6,2,3,4,5);
void setup(){
lcd.begin(16, 2);
}
void loop(){
lcd.clear();
lcd.setCursor(0,0); //Zeile, Spalte (X,Y)
lcd.print(„Hallo!");
}
1
15
16
LCD
1
2
3
4
5
6
Arduino
+5V
GND
GND
5
GND
4
LCD
11
12
13
14
15 (A)
16 (K)
Arduino
0
1
2
3
5,0 Ohm nach +5V
GND
32
33
LCD-Befehle
lcd.begin(Spalte, Zeile)
lcd.print(„Halloele“!)
lcd.clear()
lcd.setCursor(0, 0); // top left
lcd.setCursor(15, 0); // top right
lcd.setCursor(0, 1); // bottom left
lcd.setCursor(15, 1); // bottom right
Weitere Kommandos:
LiquidCrystal()
begin()
clear()
home()
setCursor()
write()
print()
cursor()
noCursor()
blink()
noBlink()
display()
noDisplay()
scrollDisplayLeft()
scrollDisplayRight()
autoscroll()
noAutoscroll()
leftToRight()
rightToLeft()
createChar()
Vom Terminal auf das LCD schreiben:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6, 2, 3, 4, 5);
void setup(){
lcd.begin(40, 2);
Serial.begin(9600);
}
void loop()
{
if (Serial.available())
{
lcd.write(Serial.read());
}
}
Anzeige der Zeit seit Einschalten des Arduino
lcd.setCursor(0, 0);
lcd.print(millis()/1000);
34
LCD - Beispielprogramme
//Taster LCD EIN AUS
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
int taster = 0;
void setup() {
lcd.begin(16, 2);
pinMode(9, INPUT);
digitalWrite(9,HIGH);
lcd.clear();
}
void loop() {
taster = digitalRead(9);
if (taster == LOW) {
lcd.home();
lcd.print ("EIN");
}
else {
lcd.home();
lcd.print ("AUS");
}
}
// taster lcd zähler
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
int i = 0;
int taster = 0;
void setup() {
lcd.begin(16, 2);
pinMode(9, INPUT);
digitalWrite(9,HIGH);
lcd.clear();
}
void loop() {
taster = digitalRead(9);
if (taster == LOW) {
lcd.home();
i=i+1;
lcd.print (i);
}
}
Taster an Pin 9
Mit dem Taster zwischen Anzeige
„Ein“ und „Aus“ umschalten
Mit dem Taster höherzählen
und auf dem LCD anzeigen
35
Programme mit dem LDR
int sensorPin = A0;
int sensorValue;
Serial.begin(9600);
void setup() {
}
void loop() {
sensorValue = analogRead(sensorPin);
Serial.println (sensorValue);
delay(500);
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
int sensorPin = A0;
int sensorValue;
void setup() {
lcd.begin(40, 2);
lcd.clear();
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
int sensorPin = A0;
int sensorValue;
int lautsprecher = 13;
void setup() {
lcd.begin(40, 2);
lcd.clear();
}
void loop() {
sensorValue = analogRead(sensorPin);
int tonhoehe = map (sensorValue,0,1023,700,4000);
lcd.home();
lcd.print ("Stufe: "); lcd.print(tonhoehe);
tone (lautsprecher, tonhoehe);
}
„Gemessene“ Werte im Monitor und auf dem
LCD ausgeben, oder in Töne umsetzen
void loop() {
sensorValue = analogRead(sensorPin);
lcd.home();
lcd.print (sensorValue);
delay(500);
}
36
Programme mit dem LDR
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
void setup() {
lcd.begin(16, 2);
lcd.clear();
}
void loop()
{
int x=0; int y = 1;
int ldr = analogRead(A0);
lcd.print("Lichteinfall:");
int bar = map(ldr,300,0,0,16);
for (x=0; x<=bar; x++) {
lcd.setCursor(x,y);
lcd.write(255);
}
delay(30);lcd.clear();
}
Balkenanzeige: Je mehr
Licht, desto weiter läuft der
Balken auf dem LCD. Das
gefüllte Kästchen wird mit
lcd.write(255) erzeugt. Die
Zeile mit dem „map“ muss
dem LDR angepasst werden
(kalibrieren!).
37
„Messen“ von Temperaturen
#define wert1 108
#define temp1 0 //Grad Celsius/10
#define wert2 99
#define temp2 230 //Grad Celsius/10
void setup() {
Serial.begin(9600);
}
void loop() {
// lese Wert vom Analogpin in Variable
int analogValue = analogRead(0);
analogValue=map(analogValue,wert1,wert2,temp1,temp2);
// gebe das Ergebnis mit einer Nachkommastelle aus:
Serial.print("Temperatur: ");
Serial.println((analogValue/10.0),1);
// Warte 1 Sekunde bevor der nächste Wert gelesen wird
delay(1000);
}
38
Programme mit dem NTC
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
int sensorPin = A0;
int sensorValue;
void setup() {
Serial.begin(9600);
lcd.begin(40, 2);
lcd.clear();
}
void loop() {
sensorValue = analogRead(sensorPin);
int ntctemp = map (sensorValue,110,170,30,20);
lcd.home();
lcd.print ("Temp:"); lcd.print(ntctemp);lcd.print (" Grad");
delay(500);
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,2,3,4,5);
int sensorPin = A0;
int lautsprecher = 13;
int sensorValue;
Temperatur auf dem LCD anzeigen
Temperatur als Ton ausgeben
void setup() {
Serial.begin(9600);
lcd.begin(40, 2);
lcd.clear();
}
void loop() {
sensorValue = analogRead(sensorPin);
int ntctemp = map (sensorValue,110,170,30,20);
lcd.home();
lcd.print ("Temp:"); lcd.print(ntctemp);lcd.print (" Grad");
int frequenz = ntctemp * 50;
tone(lautsprecher,frequenz);
}
39
Temperaturen messen mit dem LM35
float tempC;
int tempPin = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
tempC = analogRead(tempPin);
tempC = (5.0 * tempC * 100.0)/1024.0;
Serial.print((byte)tempC);
delay(1000);
2 Typen: LM35CZ teurer und genauer
LM35DZ billiger, etwas ungenauer
Temperaturbereich: -55 bis + 150 °C
Messkurve: 10mV/°C
Genauigkeit: +/ -0,25 Grad im Raumtemperaturbereich
+/- 0,75 Grad über den gesamten Messbereich
Widerstände messen
float Quellspannung=5.0;
int AnalogPin=5;
int R1=1500.0; //Wert des bekannten Widerstands (der mitgelieferte 1,5k-Widerstand)
long Messwert;
float SpannungR2; //Spannung über dem zu messenden Widerstand
float Widerstand;
void setup()
{
Serial.begin(9600);
Serial.println("Widerstand ausmessen");
Serial.println();
}
void loop()
{
//5 Messungen machen und Mittelwert bilden
Messwert=0;
for(int i=0;i<5;i++){
Messwert+=analogRead(AnalogPin);
}
Messwert=trunc(Messwert/5);
//Spannung berechnen
SpannungR2=(Quellspannung/1023.0)*Messwert;
Serial.print("Spannung ueber R2 betraegt ");
Serial.print(SpannungR2,2);
Serial.println(" Volt!");
//Berechnung: (R2 = R1 * (U2/U1))
Widerstand=R1*(SpannungR2/(Quellspannung-SpannungR2));
Serial.print("Der Widerstand hat ");
Serial.print(Widerstand,2);
Serial.println(" Ohm.");
Serial.println();
delay(1000);
}
41
Schalten von Last
Das Relais wird über den Transistor geschaltet. In einem Programm
soll das Relais abwechselnd ein – und ausgeschaltet werden.
Variationen: Relais durch externen Taster schalten
Taster schaltet beim 1. Mal das Relais ein, beim 2. Mal aus
Relais schaltet erst ein, wenn der Taste länger gedrückt wird.
42
Schalten von Last
Relais ein und ausschalten
void setup() {
pinMode (3, OUTPUT);
void loop() {
for (int i = 1; i<=20; i++)
{
digitalWrite (3, HIGH);
delay (1000);
digitalWrite (3, LOW);
delay (1000);
}
delay (2000);
}
43
Ausgabe von analogen Werten
PWM-Ausgänge: 3, 5, 6, 9, 10, and 11..
int ledPin = 9;
pinMode(ledPin, OUTPUT);
Output von 0 - 255
Schreibe ein Programm, in dem die Helligkeit der LED
sich kontinuierlich verändert
44