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
© Copyright 2025 ExpyDoc