ARDUINO Ing. Francesco Giurlanda [email protected] Cos'è ARDUINO? Il progetto nasce ad Ivrea, nel 2005. Obiettivo: realizzare un sistema di prototipizzazione economico. Al Maggio del 2011 più di 300.000 unità vendute Fondatori: Massimo Banzi e David Cuartielles 2 ARDUINO 1/3 Una piattaforma hardware Open Source di basso costo e grande versatilità Ideale per interagire con l'ambiente attraverso sensori ed attuatori 3 ARDUINO 2/3 Una ambiente software per la programmazione del dispositivo, funzionante su tutti i sistemi operativi (Mac, Linux e Windows). 4 ARDUINO 3/3 Una vasta comunità di sviluppo www.arduino.cc 5 ARDUINO UNO 6 ARDUINO Mega 2560 7 ARDUINO BT 8 ARDUINO Nano 9 ARDUINO Mini 10 ARDUINO LilyPad 11 DIY 12 Caratteristiche tecniche ● Microcontroller ATmega168, ATmega328 o ATmega2560 ● Operating Voltage 5V ● Input Voltage (recommended) 7-12V ● Input Voltage (limits) 6-20V ● Digital I/O Pins 14 (of which 6 provide PWM output) ● Analog Input Pins 6 ● DC Current per I/O Pin 40 mA ● DC Current for 3.3V Pin 50 mA ● Flash Memory 32 KB (ATmega328) of which 0.5 KB used by bootloader ● SRAM 2 KB (ATmega328) ● EEPROM 1 KB (ATmega328) ● Clock Speed 16 MHz 13 Elementi sulla scheda 14 Moduli d'espansione (SHIELD) 15 Arduino Software ● ● ● L'ambiente prende spunto dall'editor GUI di Processing (www.processing.org) Sketch: programma scritto per girare su Arduino. Disponibile per Mac, Win e Linux 16 Collegamento e Arduino board 17 GUI 18 Test ● ● ● ● Carico uno sketch di esempio Compilalo (verifica da errori) Caricare il programma su Arduino Esecuzione sketch 19 Status messages Dipende dalla complessità dello sketch ● ● ● Upload corretto Errore sulla selezione della porta USB Errore sulla selezione della piattaforma 20 Ciclo di sviluppo 21 Linguaggio di programmazione ● Linguaggio simile al C #include … #define … // vars declaration //... void setup(){ } void loop(){ } 22 Tipi di dato ● ● Tipi base: 1 byte: boolean, [unisigned] char, byte 2 byte: [unsigned] int, word 4 byte: [unsigned] long, float, double Tipi derivati: Array: char message[6]; int vals[] = {2, 3, 4}; Classi 23 Funzioni più utilizzate ● pinMode(): configura un pin come INPUT o OUTPUT ● digitalRead(): legge lo stato di un pin HIGH/LOW ● digitalWrite(): imposta lo stato di un pin HIGH/LOW ● analogRead(): legge da un pin analogico ● analogWrite(): imposta un valore ”analogico” ● delay(): attende un intervallo di tempo ● millis(): ritorna il valore corrente del timer 24 INPUT/OUTPUT digitali ● 13 pin INPUT/OUTPUT digitali ● Erogano una corrente max di 40mA ● Anche i 6 pin analogici possono essere utilizzati come pin digitali 25 Bread Board Connessioni 26 Es. 1 – LED lampeggiante 27 Es. 1 – LED lampeggiante int ledPin = 12; void setup() { // LED connected to digital pin 13 pinMode(ledPin, OUTPUT); //pin 12 in modalità OUTPUT } void loop() { digitalWrite(ledPin, HIGH); // LED on delay(1000); // attesa di un secondo digitalWrite(ledPin, LOW); // LED off delay(1000); // attesa di un secondo } 28 Es. 2 – LED on/off con pulsante Arduino Pin 11 pulldown 29 Es. 2 – LED on/off con pulsante int ledPin = 12; int switchPin = 11; int ledState = LOW; // LED // SWITCH // Stato del LED on/off void setup() { pinMode(ledPin, OUTPUT); //pin 12 in modalità OUTPUT pinMode(switchPin, INPUT); //pin 11 in modalità INPUT digitalWrite(ledPin, LOW); } void loop() { if(digitalRead(switchPin)) { ledState = !ledState; digitalWrite(ledPin, ledState); delay(500); } } 30 Interrupts ● 2 pin su Arduino UNO (2, 3) ● 6 pin su Arduino Mega (2, 3, 18, 19, 20, 21) ● Funzioni: attachInterrupt(interrupt, func, mode) detachInterrupt(interrupt) ● Sezioni critiche: noInterrupts() interrupts() ● Mode: LOW, CHANGE, RISING, FALLING 31 Es. 3 - LED on/off con pulsante int ledPin = 12; int ledState = LOW; // LED // Stato del LED on/off void setup() { pinMode(ledPin, OUTPUT); //pin 12 in modalità OUTPUT attachInterrupt(0, change_state, RISING); } void loop() { digitalWrite(ledPin, ledState); noInterrupts(); //sezione critica interrupts(); } void change_state(){ ledState = !ledState; } 32 INPUT/OUTPUT analogico ● INPUT ● Atmega contiene un convertitore analogico-digitale (A/D) a 6 canali Risoluzione 10bit (analogRead(...) 1024 valori) OUTPUT Pulse-Width Modulation (PWM) analogWrite(...) valori tra 0 e 255 Frequenza 490Hz 33 PWM 34 Es. 4 – Dissolvenza LED 35 Es. 4 – Dissolvenza LED int ledPin = 11; void setup() } { // LED void loop() { for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { analogWrite(ledPin, fadeValue); delay(30); } for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { analogWrite(ledPin, fadeValue); delay(30); } } 36 Es. 5 – Interruttore luminoso Arduino Pin A0 pulldown 37 Es. 5 – Interruttore luminoso int ledPin = 12; int sensorPin = 0; int val = 512; // LED // Fotoresistenza // Sogli accensione LED void setup() { pinMode(ledPin, OUTPUT); } void loop() { if(analogRead(sensorPin) > val){ digitalWrite(ledPin, HIGH); }else { digitalWrite(ledPin, LOW); } } 38 Sensori resistivi 39 Comunicazione Seriale EIA RS-232 ● ● Arduino può utilizzare la connessione USB per comunicare con il PC (lib. Serial) Serial.begin(): prepara all'utilizzo di Serial Serial.print(): invio di dati Serial.read(): ricezione dati Comunicare con altri dispositivi (sensori/attuatori che comunicano attraverso protocollo EIA RS-232 ) 40 Comunicazione Seriale EIA RS-232 Arduino non è una vera periferica USB 41 Es. 6 – Lettura di intensità luminosa Arduino Pin A0 pulldwon PC USB 42 Es. 6 – Lettura di intensità luminosa int photocellPin = 0; int photocellReading; void setup() { Serial.begin(9600); } void loop() { photocellReading = analogRead(photocellPin); Serial.print("Analog reading = "); Serial.println(photocellReading); delay(100); } 43 Es. 6 – Lettura di intensità luminosa Serial Monitor Analog Analog Analog Analog Analog Analog Analog Analog Analog Analog Analog Analog Analog Analog reading reading reading reading reading reading reading reading reading reading reading reading reading reading = = = = = = = = = = = = = = 940 938 932 882 882 878 840 623 502 421 409 412 412 415 44 Es. 7 – Controllo luci da PC USB PC 45 Es. 7 – Controllo luci da PC int val; void setup() { Serial.begin(9600); for(int i = 2; i < = 11; i++) pinMode(i, OUTPUT); } void loop() { val = Serial.read(); if(val >= '0' && val <= '9'){ val = val – '0' + 2; // Conversione da codifica ASCII a num. Pin ledsoff(); digitalWrite(val, HIGH); } } void ledsoff() { for(int i = 2; i < = 11; i++) digitalWrite(i, LOW); } 46 Comunicazione Seriale 2 IC ● Inter Integrated Circuit (I2C): un sistema di comunicazione seriale bifilare utilizzato tra circuiti integrati ● Un master, uno o più slave ● Fino a 127 dispositivi, max data rate 1Mbps ● 2 Molti dispositivi integrano I C 47 2 I C & ARDUINO ● Funzione integrata nel chip ATmegaXXX ● Lib. Wire ● Pin A4 → SDA ● Pin A5 → SCK 48 2 Dispositivi I C Touch sensor EEPROM Bussola Trasmettitori RF Molti altri. (giroscopio, accelerometro, Motori...) LCD display Sensore di 49 Temperatura & Umidità 2 Es. 8 – Com. I C tra due Arduino I2C Master I2C Slave 50 2 Es. 8 – Com. I C tra due Arduino //I2C MASTER #include <Wire> int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); Wire.begin(); } void loop() { digitalWrite(ledPin, HIGH); Wire.beginTransmission(4); Wire.send(HIGH); Wire.endTransmission(); delay(1000); digitalWrite(ledPin, LOW); Wire.beginTransmission(4); Wire.send(LOW); Wire.endTransmission(); delay(1000); } // join i2c bus (address optional for master) // trsmette al device #4 // invia un byte // fine trasmissione // trsmette al device #4 // invia un byte // fine trasmissione 51 2 Es. 8 – Com. I C tra due Arduino //I2C SLAVE #include <Wire> int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); Wire.begin(4); Wire.onReceive(receiveEvent); } void loop() { delay(100); } // join i2c bus with address #4 // register event // funzione eseguita quando si ricevono dati dal master // questa funzione è registrata come evento void receiveEvent(int howMany) { digitalWrite(ledPin, Wire.receive()); } 52 Librerie ● EEPROM ● Ethernet ● Firmata (comunicazioni seriali con applicazioni sul PC) ● LiquidCrystal (visualizzazione su LCD) ● SD ● Servo, Stepper (controllo di motori) ● SoftwareSerial ● Wire (TWI/I2C) ● ... 53 54