1 Deutscher Amateur-Radio-Club e.V. Arduino Mikrocontrollerkurs Axel Tüner (DF9VI)

Post on 06-Apr-2016

214 views 0 download

Transcript of 1 Deutscher Amateur-Radio-Club e.V. Arduino Mikrocontrollerkurs Axel Tüner (DF9VI)

1

Deutscher Amateur-Radio-Club e.V.

Arduino Mikrocontrollerkurs

Axel Tüner (DF9VI)

Arduino MikrocontrollerEine 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 wichtigstenelektronischen 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ßendmodifizieren. Nach und nach werden alle wichtigen Kommandos erklärt. Später ist einselbstständiges Arbeiten anzustreben, wobei natürlich Teamarbeit immer wünschenswertist. Die Übungen werden in der Folge immer anspruchsvoller. Zum Abschluss eines jeden Abends sollten „Hausaufgaben“ gegeben werden, um die Teilnehmer zumWeiterarbeiten 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.

3

Tutorials

http://www.arduino.cc/http://www.arduino-tutorial.de/Youtube: Arduino Tutorial http://www.arduino.cc/playground/Deutsch/HomePage

Händlerwww.komputer.de/http://jeelabs.net/projects/hardware/wiki/http://www.watterott.com/http://elmicro.com/

Interessante Seiten

http://wiring.org.co/learning/tutorials/http://www.freeduino.de/http://fff2.at/drupal/content/arduino-projekte

4

Leuchtdioden

Das Steckboard

Übungen mit dem Steckboard

5

Leuchtdioden

Übungen mit dem Steckboard

6

Leuchtdioden

U=

I=

Übungen mit dem Steckboard

7

Schaltungsvarianten

Übungen mit dem Steckboard

8

Diode

Übungen mit dem Steckboard

9

Transistor

Messen mit dem Ohmmeter:Farben vertauschen! Plus wird zu Minus und Minus zu Plus!

Übungen mit dem Steckboard

10

Transistor

Übungen mit dem Steckboard

11

Kondensator

Übungen mit dem Steckboard

12

Wechselblinker

Übungen mit dem Steckboard

13

Lautsprecher

Übungen mit dem Steckboard

Der Arduino

15

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

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

LED-blinken

16

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

Lauflicht

17

void setup() {                  pinMode(2, OUTPUT);   pinMode(3, INPUT); }

void loop() {

  if (digitalRead(3) == LOW {  digitalWrite(2, HIGH);     }}

Taster

Auf den Widerstand kann verzichtet werden:mit:digitalWrite(3, HIGH);

18

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() {}

Monitor

Über den Monitor kann man mit dem Arduino sprechen

Serial.begin(9600);Serial.println(„Guten Tag!“);

if (Serial.available() > 0) { Eingabe = Serial.read();}

19

Blinklicht

Nach einmaligem Betätigen des Tasters sollen die LED´s abwechselnd blinken

20

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.

21

void setup() {  Serial.begin(9600);}

void loop() {  int sensorValue = analogRead(A0);  Serial.println(sensorValue, DEC);}

Analog-Eingang

22

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);                  }

Blinkgeschwindigkeit

23

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);     }  }}

Bar-Graph

24

void setup() { }

void loop() {    int sensorReading = analogRead(A0);          int ton = map(sensorReading, 400, 1000, 100, 1000);

    tone(9, ton, 10);

}

Töne

25

//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); } }

Beispielprogramme

Töne

26

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

27

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;  }

}

Helligkeit in Stufen anzeigen

sensorMin= Ergebnis bei kleinster HelligkeitsensorMax = Ergebnis bei größter Helligkeit

28

* 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            

LCD anschließen (2x16 Zeichen)

29

30

LC-Display Typ „Batron“ BT240052x40 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!");}

LCD Arduino1 GND2 +5V 3 1KO nach GND4 (RS) 75 GND 6 (E) 6

LCD Arduino11 212 313 414 5A 5,0 Ohm nach +5VK GND

Arduino

7 6 5 4 3 2

31

32

LC-Display Typ 16022x16 Zeichen

LCD Arduino1 +5V2 GND 3 GND4 55 GND 6 4

LCD Arduino11 012 113 214 315 (A) 5,0 Ohm nach +5V16 (K) GND

1

#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!");}

16

15

33

34

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()

Anzeige der Zeit seit Einschalten des Arduinolcd.setCursor(0, 0);lcd.print(millis()/1000);

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());      }}

LCD-Befehle

35

//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); }}

LCD - Beispielprogramme

Taster an Pin 9Mit dem Taster zwischen Anzeige „Ein“ und „Aus“ umschalten

Mit dem Taster höherzählenund auf dem LCD anzeigen

36

#include <LiquidCrystal.h>LiquidCrystal lcd(7,6,2,3,4,5);int sensorPin = A0; int sensorValue;

void setup() { lcd.begin(40, 2); lcd.clear();}

void loop() { sensorValue = analogRead(sensorPin); lcd.home(); lcd.print (sensorValue); delay(500); }

Programme mit dem LDR

#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); }

int sensorPin = A0; int sensorValue;Serial.begin(9600);

void setup() { }

void loop() {

sensorValue = analogRead(sensorPin); Serial.println (sensorValue);

delay(500); }

„Gemessene“ Werte im Monitor und auf demLCD ausgeben, oder in Töne umsetzen

37

#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();}

Programme mit dem LDR

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!).

38

#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 Variableint 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 wirddelay(1000);}

„Messen“ von Temperaturen

39

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;

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); }

Temperatur auf dem LCD anzeigen

Temperatur als Ton ausgeben

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);

Temperaturen messen mit dem LM35

2 Typen: LM35CZ teurer und genauer LM35DZ billiger, etwas ungenauerTemperaturbereich: -55 bis + 150 °CMesskurve: 10mV/°CGenauigkeit: +/ -0,25 Grad im Raumtemperaturbereich +/- 0,75 Grad über den gesamten Messbereich

41

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 Widerstandfloat Widerstand;

void setup(){Serial.begin(9600);Serial.println("Widerstand ausmessen");Serial.println();}

void loop(){//5 Messungen machen und Mittelwert bildenMesswert=0;for(int i=0;i<5;i++){Messwert+=analogRead(AnalogPin);}Messwert=trunc(Messwert/5);

//Spannung berechnenSpannungR2=(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);}

Widerstände messen

42

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.

43

Schalten von Last

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); }

Relais ein und ausschalten

44

Ausgabe von analogen Werten

int ledPin = 9; pinMode(ledPin, OUTPUT);Output von 0 - 255

PWM-Ausgänge: 3, 5, 6, 9, 10, and 11..

Schreibe ein Programm, in dem die Helligkeit der LED sich kontinuierlich verändert