Workshop Arduino Uno Touw dag 6 juni 2015 Harold Pootjes en Simon Pauw Arduino Uno Pagina 2 Een programmeerbare controller • The Arduino Uno is a programmable microcontroller board based on the ATmega 328. It has 14 digital input/output pins (of which 6 can be used as PWM outputs), 6 analog inputs, a 16 MHz ceramic resonator, a USB connection, a power jack and a reset button. • Kloksnelheid: 16MHz • Voeding van Arduino: via USB-kabel of via externe spanningsbron. Arduino werkt intern met 5Volts spanning Pagina 3 Voorbeelden van toepassing Arduino in de praktijk Pagina 4 Blokschema Pagina 5 Nuttige web adressen • http://www.arduino.cc/ Moeder site • https://www.adafruit.com/ Componenten, libraries • https://www.sparkfun.com/ Idem • http://www.aliexpress.com/ Goedkope componenten • http://fritzing.org/home/ Pagina 6 Schakelingen grafisch Spanning, stroomsterkte en weerstand • Een spanningsbron levert een spanningsverschil over zijn uitgang: b.v. 5 Volt • Als deze uitgangen verbonden zijn via een (stroom)geleidende kring loopt er een stroom: b.v. 0,1 Ampère Volta Ampère • De grootte van die stroom is afhankelijk van de weerstand in de kring: b.v. 470 Ohm • De wet van Ohm zegt: I = U/R Pagina 7 Ohm Digitale en analoge spanning • Analoge spanning kan iedere waarde aannemen tussen 0 en Vmax (of tussen –Vmax en +Vmax) • Als spanning > drempelwaarde => signaal = 1 anders signaal = 0 : Digitaal! Pagina 8 Programmeren van de Arduino • Met de PC kan een programma voor de Arduino geschreven worden • Programmeertaal is C++ • PC moet editor hebben die programma kan compileren en doorsturen naar de Arduino of je moet gebruik maken van een Web-applicatie (Codebender) • Communicatie met Arduino gaat via een serieel kanaal, zowel voor input als output • Een programma voor de Arduino wordt een sketch genoemd Pagina 9 Programmeercyclus • Ontwikkel sketch op PC in IDE (Arduino API , Eclipse met Arduino Plugin of via het Web Codebender) • Compileer en doe een upload naar de Arduino via USB-kabel • Arduino kan nu volledig zelfstandig functioneren • Pc kan eventueel gebruikt worden om resultaten van de Arduino te tonen Pagina 10 Arduino IDE Instellingen • Arduino IDE installeren • Driver ch341se installeren • Arduino type instellen • Com-poort nr instellen Pagina 11 Eclipse kent ook een Arduino plugin • http://www.baeyens.it/eclipse/how_to.shtml#/a Pagina 12 Digitale output • Pin 0 t/m 14 van de Arduino kunnen als digitale input of output geconfigureerd worden. • Een digitale output 0 komt overeen met een spanning van 0 Volt (=gnd) op die Uitgang • Een digitale output 1 komt overeen met een spanning van 5Volt op die uitgang. Pagina 13 Visualisatie van digitale output • Als output = 1, kan een lampje branden. Beter: Light Emitting Diode (LED) in serie met een weerstand van 220 Ohm. Gnd = 0 Volt = - kant Pagina 14 a k Langste poot is anode + Breadboard • Dient om schakelingen te kunnen maken zonder te solderen • Horizontaal aan boven en onderkant zijn alle ingangen verbonden evenals de verticale in het middelste deel. In het midden van breadboard is een scheiding aangebracht Pagina 15 Weerstanden en hun waarden Pagina 16 Hello world voor Arduino Basis Knipper Pagina 17 Arduino IDE 2 Compileren Compileren en naar Arduino oversturen Pagina 18 Toepassing • Voor opdracht 1 Pagina 19 Opdracht 1a : Blink • Gebruik het programma van sheet 14 om een knipperende LED te realiseren, eerst met de ingebouwde (poort 13) • Verbind een LED in serie met een weerstand van 220 Ohm en sluit aan op 5V en gnd. Ga na of de LED brandt • Bouw de schakeling van sheet 19 • Wijzig uw programma zodat nu de eigen LED gaat knipperen Pagina 20 Nogmaals digitale output • Pin 2 t/m 13 van de Arduino kunnen als digitale output geconfigureerd worden waarbij de frequentie geregeld kan worden: de tijd dat de output 1 is en de tijd dat de output 0 is. • Door de tijd dat de uitgang 1 is te variëren kan een analoge spanning op de uitgang gesimuleerd worden: Pulse Width Modulation • Met analogWrite kunnen we een analoge waarde tussen 0 (=0 Volt) en 255 (= 5Volt) op een output pin simuleren Pagina 21 Opdracht 1b: fade • Gebruik dezelfde schakeling maar maak nu gebruik van analogWrite om een LED te realiseren die eerst niet brandt, dan steeds feller gaat schijnen en dan weer langzaam uitdooft en dit steeds opnieuw. • Gebruik een delay omdat anders de verandering van de intensiteit niet goed te zien is. Pagina 22 Input lezen • De Arduino kan met digitalRead(pin) de waarde van een digitale input lezen. Resultaat is een int met waarde 0 of 1 • Digitale input kan gerealiseerd worden met een drukschakelaar. (Zie foto voor aansluiting) • Met analogRead(pin) kan de waarde van een analoge input gelezen worden. Resultaat is een int met waarden tussen 0 en 1023 (= 5Volt) Pagina 23 Problemen bij digitale input • Als een pin als input is gedefinieerd maar niet aangesloten is, kunnen allerlei stoorsignalen opgepikt worden • Als een drukschakelaar verbonden is met een input en uitstaat, hebben zo’n situatie • Als we op de knop drukken moet de ingang 0 worden maar als deze niet ingedrukt is, kan de waarde onbepaald zijn Pagina 24 Oplossing • Extra weerstand opnemen • Arduino heeft ingebouwde weerstand hiervoor dus een externe weerstand is niet nodig • Gebruik: pinMode(11,INPUT_PULLUP); Open levert waarde 1, gesloten 0 • Nieuw probleem: dender Pagina 25 Opdracht 2a • Sluit een drukschakelaar op een van de inputs van de Arduino aan en op de 5Volt. Sluit een led met weerstand aan op een van de outputs. • De led moet aan zijn • Als op de schakelaar gedrukt wordt moet de LED uitgaan en blijven • Als weer op de schakelaar gedrukt wordt, moet de LED weer aangaan • Hint: gebruik een boolean variabele status die aangeeft of de LED brandt of niet Pagina 26 Opdracht 2b • Sluit drie LED’s (rood, geel en groen) • Realiseer een stoplicht waarbij rood en groen drie seconden branden en oranje een seconde • Als dit gelukt is voeg je een drukschakelaar aangesloten op een input toe • Wijzig het geheel zo dat na drukken op de drukschakelaar het stoplicht alleen nog geel knippert. Nogmaals op de schakelaar drukken herstelt de normale knipperlicht functie Pagina 27 Servo: output in de vorm van stand van servo Pagina 28 Opdracht 3 • Sluit een servo aan op de Arduino (let op de kleuren!) en maak een programma waarbij de servo vanuit de neutraal stand langzaam 90 graden naar links draait , daarna 180 graden naar rechts en dan weer terug naar de neutraalstand. • Vervolgens moet de servo 3 seconde niets doen en dan moet het geheel zich herhalen Pagina 29 Gegevens tonen op de pc • De Arduino kan serieel gegevens naar de PC sturen • Hiervoor is een seriële monitor beschikbaar in de vorm van een standaard object Serial • Serial.begin(<baudrate>) meestal 9600 • Serial.print(<value>) of Serial.println(<value>) • Op de pc moet de seriële monitor gestart worden om de print-operaties zichtbaar te maken • Let op! Je kunt geen samengestelde argument gebruiken dus niet b.v. “temperatuur=“+temp; Pagina 30 Output tonen via monitor Pagina 31 Analoge input • De Arduino Uno kent 6 analoge inputs • Iedere input kan een analoge spanning meten tot 5 Volt • Aan boord is een AD-converter die het analoge signaal omzet naar een digitale waarde • Methode analogRead(<pin>) leest het analoge signaal en levert een getal tussen 0 en 1023 • Voor de pin moet je A0 t/m A5 invullen • Omzetten naar werkelijke waarde: *5.0/1023 Pagina 32 Spanningsdeler Wet van Ohm toepassen: I = 5/(100+400) = 0,01 A Nogmaals toepassen op de afzonderlijke weerstanden: U = 0,01 x 100 = 1 Volt U = 0,01 x 400 = 4 Volt (samen moeten ze gelijk zijn aan de spanning van de bron = 5 V) De Voltmeter geeft dus 4 Volt aan De spanning wordt verdeeld over de twee weerstanden en wel in de verhouding van de groottes van die weerstanden: Spanningdeler Pagina 33 LDR • Een LDR is een weerstand waarvan de waarde afneemt met toenemende lichtsterkte • Een LDR kan opgenomen worden in een spanningsdeler • De gemeten spanning is een maat voor de lichtsterkte Pagina 34 Opdracht 4a • Maak een spanningsdeler met een 10 kOhm weerstand en een LDR. • Sluit deze aan op een analoge input van de Arduino • Laat iedere 0,5 sec de gemeten waarde van de input via de seriële monitor zien Pagina 35 Opdracht 4b • We maken met de LDR een lichtschakelaar: als de lichtsterkte onder een bepaald niveau komt moet een LED gaan branden Pagina 36 Opdracht 4c • Gebruik de schakeling van opdracht 4a maar verbind ook een servo met de Arduino. • We gebruiken in plaats van de seriele monitor nu de servo als uitvoer. • We kunnen een schaalverdeling maken in de vorm van een halve cirkel: van 0 tot 5V en de arm van de servo geeft de grootte van de spanning aan • Beweeg uw hand om de grootte van de spanning te beinvloeden Pagina 37 Libraries • Om het werken met bepaalde componenten eenvoudiger te maken, bestaan er een grot aantal libraries voor de Arduino • Servo library was hier een voorbeeld van • Via Add .Zip Libraries kun je zelf libraries toevoegen of via Manage Libraries beheren Pagina 38 I2C communicatie • Veel sensoren communiceren via het i2c protocol, b.v. drukmeter bmp180 • Via library Wire kan gecommuniceerd worden • Er zijn slechts twee signaaldraden nodig SDA en SLC • Er kunnen meerdere componenten in serie geschakeld worden • Voor de component zelf is soms ook een bijbehorende library nodig Pagina 39 Voorbeeld Pagina 40 Opdracht 5 • Verzin iets leuks en maak het • Je kunt gebruik maken van: Eigen componenten BMP 180 druk sensor HCSR04 Afstandssensor Zonnecel DHT 11 Vochtigheid en temperatuur meter ADXL345 3-as g-meter BH1750 Lichtsensor PIR bewegingsdetector OLED display Capacitieve piano WS2812 Programmeerbare leds Pagina 41