Arduino PREMESSA Arduino è un prototipazione framework rapida e opensource l'apprendimento che permette veloce dei la principi fondamentali dell'elettronica e della programmazione. È composto da una piattaforma hardware per il physical computing sviluppata presso l'Interaction Design Institute, un istituto con sede ad Ivrea, fondato da Olivetti e Telecom Italia. Il nome della scheda deriva da quello di un bar di Ivrea frequentato da alcuni dei fondatori del progetto. Questa si basa su un circuito stampato che integra un microcontrollore con PIN connessi alle porte I/O, un regolatore di tensione e un'interfaccia usb che permette la comunicazione con il computer. A questo hardware viene affiancato un ambiente di sviluppo integrato (IDE) multipiattaforma (Linux, Apple Macintosh e Windows). Questo software permette di scrivere programmi con un linguaggio semplice e intuitivo derivato da C e C++ chiamato Wiring, liberamente scaricabile e modificabile. Arduino può essere utilizzato per lo sviluppo di oggetti interattivi stand-alone ma può anche interagire, tramite collegamento, con software residenti su computer, come Adobe Flash, Processing, Max/MSP, Pure Data, SuperCollider, Vvvv. (Nota bene: questa premessa è tratta integralmente da Wikipedia). TIPI DI SCHEDE ARDUINO Sempre da Wikipedia : Fino a oggi sono state commercializzate tredici versioni dell'hardware Arduino. Serial Arduino, programmata con una porta seriale DB9. Fa uso del microcontroller ATmega8 Arduino Extreme, con interfaccia di programmazione USB, facente uso del chip ATmega8 Arduino Mini, una versione in miniatura facente uso di un ATmega168 a montaggio superficiale Arduino Nano, una versione ancora più piccola della Mini, utilizzante lo stesso controller ATmega168 SMD e alimentata tramite USB LilyPad Arduino, un progetto minimalista (scheda circolare dal diametro di 50mm, per circa 8mm di spessore), per applicazione su indumenti, con lo stesso ATmega168 in versione SMD[5] Arduino NG, con un'interfaccia USB per programmare e usare un ATmega8 Arduino NG plus, con interfaccia di programmazione USB, con un ATmega168 Arduino BT, con interfaccia di programmazione Bluetooth e con un ATmega168 Arduino Diecimila, con interfaccia di programmazione USB e con un ATmega168 in un package DIL28 Arduino Duemilanove, facente uso del chip Atmega168 (o Atmega328 nelle versioni più recenti) e alimentata in corrente continua tramite USB, con commutazione automatica tra le sorgenti di alimentazione Arduino Mega, che fa uso di un ATmega1280 a montaggio superficiale per I/O e memoria addizionale. Arduino Uno, evoluzione della Duemilanove, con un differente chip, programmabile e più economico, dedicato alla conversione USB-seriale. Arduino Mega2560, che fa uso di un ATmega2560 ed è un'evoluzione dell'Arduino Mega. Proprio a causa del tipo di elettronica opensource (in pratica gli schemi elettrici sono disponibili sul sito di riferimento) tutti coloro che hanno la possibilità di sviluppare schede elettroniche possono realizzare legalmente gli Arduino ma – al pari del SW opensource – hanno l'obbligo di salvare in rete gli schemi elettrici (nel caso in cui abbiano apportato modifiche o migliorie). Con queste premesse alcuni produttori cinesi hanno immesso nel mercato schede Arduino a bassissimo costo e, attualmente la scheda Arduino Mega2560, ha un prezzo di circa 25€ presso tali produttori (a fronte di un prezzo di circa il doppio presso il primo produttore italiano). A tutte le schede Arduino è possibile aggiungere altre schede elettroniche (dette “shield”) che espandono le funzionalità: ad esempio la scheda ethernet permette di aggiungere funzionalità di rete alla scheda base, altri shield permettono il pilotaggio di motorini passo-passo oppure il pilotaggio di carichi elettrici di potenza ben più elevata di quella disponibile dalle porte originali. ARDUINO MEGA 2560 L'ISISS di Morciano è attualmente in possesso di 2 schede Arduino MEGA 2560 mentre lo scrivente ne ha una (di origine italiana) e aspetta il recapito di un'altra (da un seller cinese su eBay). Tutte e 3 le schede attualmente utilizzabili sono dotate di shield ethernet (vedi in seguito). Le specifiche di massima della scheda sono: Microcontroller ATmega2560 Operating Voltage5V Input Voltage (recommended) 7-12V Input Voltage (limits) 6-20V Digital I/O Pins54 (of which 14 provide PWM output) Analog Input Pins 16 DC Current per I/O Pin 40 mA DC Current for 3.3V Pin 50 mA Flash Memory 256 KB of which 8 KB used by bootloader SRAM 8 KB EEPROM 4 Clock Speed 16 MHz KB La scheda dispone di 54 ingressi/uscite digitali (di cui 14 possono essere utilizzate come uscite PWM),4 UART (porte seriali) e 16 ingressi analogici. La memoria da 256 KB (meno 8 KB per il bootloader) ospita il programma utente (quello scritto da noi). I dati del programma che devono permanere allo spegnimento della scheda possono essere memorizzati (tramite un'opportuna libreria) nella EEPROM da 4 KB. L'alimentazione della scheda avviene tramite porta USB oppure tramite plug esterno. La comunicazione tra microcontrollore (che utlizza una seriale standard) e la porta USB avviene tramite un altro microcontrollore Atmega8U2 che provvede a tutte le conversioni di protocollo. L'ambiente di sviluppo (IDE) di Arduino è (anch'esso) opensource ed è scaricabile (sia l'eseguibile che il sorgente) dal sito ufficiale. In windows l'archivio che contiene l'IDE comprende anche una cartella di driver. Quando si connette Arduino (tramite cavo USB) al computer vengono richiesti i driver del dispositivo (occorre indicare la cartella driver dell'archivio scompattato). Una volta installato il driver, Arduino viene visto dal PC come un dispositivo collegato a una porta seriale: il numero della porta è indicato in “gestione periferiche” → “porte COM e LPT”. Per quanto riguarda il collegamento tra Arduino MEGA 2560 e il mondo esterno occorre tenere presente che i PIN (piedini metallici) sono per lo più contrassegnati con un numero e, in particolare i PIN : da 1 a 13 sono di tipo digitale (I/O) e, se configurati come PIN di uscita, possono generare segnali di tipo PWM (pulse width modulation). 0,1,14,15,16,17,18,19 sono per la comunicazione seriale. 20,21 sono usati per il protocollo I2C (20=SDA serial data line – 21=SCL serial clock line. dal 22 al 53 sono di input o output digitale (no PWM) da A0 ad A15 sono di input analogico; il convertitore A/D è a 10 bit quindi la tensione di ingresso compresa tra 0V e 5V viene mappata in 1024 punti. Rimanenti sono usati per i 5V in uscita (per alimentare i dispositivi esterni), la massa (GND), i 3,3V , il reference , ecc. STRUTTURA DI MASSIMA DI UN PROGRAMMA PER ARDUINO Una volta installato l'IDE di Arduino (il programma che permette la sua programmazione), possiamo scrivere un programma di esempio che ha la funzione di far accendere un LED (per lo schema di collegamento vedi pagine successive) collegato al pin 10. /* LED sempre acceso sul pin 10 ; questo è un commento e NON un'istruzione valida */ void setup() { // initialize the digital pin as an output. pinMode(10, OUTPUT); } void loop() { digitalWrite(10, HIGH); // set the LED on } In breve ogni programma Arduino è composto almeno da una funzione setup() nella quale si impostano le funzioni dei PIN e da una funzione loop() che esegue le sue istruzioni (appunto) all'interno di un ciclo (o loop) infinito. Tutte le istruzioni e le funzioni di base del linguaggio sono ampiamente descritte nel language reference di Arduino. Ad esempio il pinMode(10, OUTPUT) della pagina precedente significa: “definisci il PIN 10 come PIN di uscita (OUTPUT)” e digitalWrite(10, HIGH) significa: “imposta a livello alto – cioè 5V rispetto a massa - il PIN 10”. Poichè quest'ultima istruzione (chiamata di funzione) è inserita all'interno del blocco loop, la stessa verrà eseguita all'infinito (loop) con la velocità intrinseca del sistema. In pratica un LED collegato (tramite resistenza) al PIN 10 rimarrà accesso fino a quando Arduino sarà alimentato. Per una più approfondita comprensione della struttura di programmazione è sufficiente leggere la sezione “IDE di Arduino” presente su wikipedia a questo indirizzo. HARDWARE ESTERNO AD ARDUINO Sono molti i dispositivi collegabili ad Arduino ma, per le prime prove, useremo dei LED, dei dispositivi a semiconduttore (diodi) che emettono luce (visibile o nell'infrarosso) se percorsi da corrente. I LED hanno due piedini detti anodo e catodo e, a differenza delle lampadine a filamento, hanno una polarità di alimentazione : + sull'anodo e – sul catodo. In genere la corrente necessaria è compresa tra 5 e 30 mA (milliAmpere) e, tenendo conto della caduta di tensione (che dipende dal colore del diodo) ai capi del LED (vedi sorgente di alimentazione qui) occorre interporre tra la e il LED una resistenza per limitare la corrente stessa. Ecco un esempio di schema elettrico di riferimento : In questo schema il LED ha l'anodo posto alla sua sinistra e il catodo alla sua destra. Il catodo è collegato a massa (il triangolino tratteggiato). L'anodo, tramite una resistenza da 220 ohm è collegato al PIN 13 di Arduino. Se il PIN 13 è programmato come uscita digitale e, in un certo istante è a livello alto (cioè 5V), supponendo che il LED abbia una tensione ai suoi capi di circa 2V, sulla resistenza sono applicati circa 3V e la corrente che scorre su di essa è pari a 3V/220 ohm = 0,0136 A (ampère) cioè 13,6 mA (milliAmpere) – una corrente accettabile per LED standard. Tutta questa premessa serve per far comprendere che le resistenze limitatrici di corrente sono necessarie ogni volta che usiamo un LED collegato ad Arduino! Se non le inseriamo c'è il rischio che le uscite del micro Atmega2560 si rovinino in modo definitivo. LISTA PROGRAMMI DA REALIZZARE (21/02/2012) Come buon proposito (!) nella prima giornata del corso possiamo realizzare i seguenti programmi: 1. LED sempre acceso sul pin 10 programma const int ledPin=10; //variabile intera contenente il numero del pin void setup() { // initialize the digital pin as an output. pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(10, HIGH); // set the LED on } /* Questo è un commento su più righe: il compilatore “salta” queste righe. In questo programma potete cliccare su alcune parole chiave (keyword) e sarete indirizzati alla pagina WEB di Arduino relativa alla parola specifica. */ schema elettrico di collegamento 2. LED acceso al PIN 10 con la pressione di un pulsante collegato al pin 8 Nota: il LED si accende SOLO quando il pulsante è premuto programma const int buttonPin = 8; const int ledPin = 10; // the number of the pushbutton pin // the number of the LED pin // variables will change: int buttonState = 0; // variable for reading the pushbutton status void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); } void loop() { // read the state of the pushbutton value: buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (buttonState == LOW) { // turn LED on: digitalWrite(ledPin, HIGH); } else { // turn LED off: digitalWrite(ledPin, LOW); } } schema elettrico di collegamento Osservazioni sullo schema elettrico Lo schema di collegamento del LED è quello visto nel precedente esercizio. Il pulsante P1 ha un pull-up resistor (resistenza) da 10 Kohm che porta a 5V la tensione all'ingresso del PIN 8 quando il pulsante P1 non è premuto. Se P1 è premuto, poiché lo stesso pone in corto circuito il PIN 8 con la massa (ground – GND) , la tensione su PIN 8 è di 0 volt. A livello di programma, per rilevare la pressione del pulsante, occorre verificare se c'è un livello basso (LOW) nel PIN 8. 3. LED in toggle mode pilotato dal bottone sul pin 8 Nota: il LED si accende e si spegne in modo alternativo quando il pulsante è premuto programma const int buttonPin = 8; const int ledPin = 10; // the number of the LED pin int ledState = LOW; // the current state of the output pin int buttonState; void setup() // the current reading from the input pin { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { // read the state of the switch into a local variable: buttonState=digitalRead(buttonPin); if(buttonState==LOW) { ledState=!ledState; //toggle..... digitalWrite(ledPin, ledState); delay(200); } } schema elettrico di collegamento Lo schema elettrico di collegamento è identico a quello dell'esercizio 2 4. LED sul pin 10 che lampeggia (blink) con periodo di lampeggio variabile programma void setup() { pinMode(10, OUTPUT); } int T=250; void loop() { do { digitalWrite(10, HIGH); // set the LED on delay(T); // wait for a second digitalWrite(10, LOW); delay(T); // set the LED off // wait for a second T=T-10; }while(T>30); digitalWrite(10, LOW); // set the LED off T=30; do { digitalWrite(10, HIGH); delay(T); // set the LED on // wait for a second digitalWrite(10, LOW); delay(T); // set the LED off // wait for a second T=T+10; }while(T<260); digitalWrite(10, LOW); // set the LED off //delay(1000); T=250; } schema elettrico di collegamento Lo schema elettrico di collegamento è identico a quello dell'esercizio 1 5. LED sul pin 10 con luminosità variabile (fade) in modo continuo e periodico. Modalità PWM programma int brightness = 0; int fadeAmount = 5; // how bright the LED is // how many points to fade the LED by void setup() { // declare pin 10 to be an output: pinMode(10, OUTPUT); } void loop() { // set the brightness of pin 10: analogWrite(10, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; // reverse the direction of the fading at the ends of the fade: if (brightness == 0 || brightness == 255) fadeAmount = -fadeAmount ; // wait for 30 milliseconds to see the dimming effect delay(30); } schema elettrico di collegamento Lo schema elettrico di collegamento è identico a quello dell'esercizio 1 6. Gioco di luce con 4 LED. programma const int led1 = 10; // the number of the LED pin const int led2 = 11; // the number of the LED pin const int led3 = 12; // the number of the LED pin const int led4 = 13; // the number of the LED pin int conteggio=0; int mode=0; void setup() { pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(led4, OUTPUT); } void ledON_OFF(int quale) { digitalWrite(quale, HIGH); delay(100); digitalWrite(quale, LOW); } void loop() { conteggio++; if(mode==0) { ledON_OFF(led1); ledON_OFF(led2); ledON_OFF(led3); ledON_OFF(led4); ledON_OFF(led1); ledON_OFF(led4); ledON_OFF(led3); ledON_OFF(led2); } else { ledON_OFF(led1); ledON_OFF(led3); ledON_OFF(led2); ledON_OFF(led4); ledON_OFF(led1); ledON_OFF(led3); ledON_OFF(led4); ledON_OFF(led2); } if(conteggio==5) { conteggio=0; mode=!mode; for(int i=10;i<14;i++) digitalWrite(i, HIGH); delay(1000); } } schema elettrico di collegamento Nota: per ottenere un effetto di “rotazione” occorre inserire i 4 LED in una piastrina di plastica in modo che gli stessi stiano sui vertici di un rombo 7. Utilizzo di un dispositivo di INPUT complesso (il nunchunk della console di gioco Wii) peri il pilotaggio di alcuni LED. programma Poichè il programma è un po' complesso consiglio di effettuare il download dello stesso da qui. Il programma permette di controllare la luminosità di 4 LED posti n”ei 4 punti cardinali” in funzione della posizione del joystick del nunchunk. schema elettrico di collegamento I LED hanno lo stesso schema dell'esercizio 6. Il nunchunk è un controller della console da gioco Wii (Nintendo) ed è dotato di un cavo a 4 poli (4 fili elettrici di collegamento) che termina in un connettore proprietario. Tagliando il connettore (!) compaiono i seguenti quattro fili: filo bianco : GND GND di Arduino filo rosso: alimentazione 5V 5V di Arduino filo verde: data PIN 20 (SDA) di Arduino PIN 21 (SCL) di Arduino filo giallo: clock In pratica il nunchunk è un dispositivo che si collega ai sistemi da controllare tramite un'interfaccia I2C o TWI (two wire interface). Poichè Arduino possiede l'interfaccia I 2C e la libreria Wire (vedi la parte iniziale del programma) per la sua gestione, è possibile leggere i dati dal nunchunk per arrivare ad assegnare a due variabili intere x e y valori dipendenti dalla posizione del joystick e, ad altre due variabili intere, valori 0 e 1 dipendenti dalla pressione dei tasti denominati “C” e “Z”. 8. LED sul pin 10 con luminosità variabile (fade) e lampeggio programma int ledPin=10; int fade=0; int deltafade=5; void setup() { pinMode(ledPin, OUTPUT); } void loop() { analogWrite(ledPin,fade); fade+=deltafade; if(fade < 5) deltafade=5; if(fade > 250) { for(int i=1;i<=5;i++) { analogWrite(ledPin,0); delay(100); analogWrite(ledPin,255); delay(100); } deltafade=-5; } delay(50); } schema elettrico di collegamento Lo schema elettrico di collegamento è identico a quello dell'esercizio 1 9. Trasmissione via porta seriale di una frase da Arduino al computer programma int singleshot=1; void setup() { // initialize the serial port speed. Serial.begin(115200); } void loop() { if(singleshot<=10) { Serial.print("Trasmissione seriale da Arduino MEGA 2560"); singleshot++; } } schema elettrico di collegamento Non ci sono componenti esterni da collegare alla scheda Arduino. Note generali: Arduino Mega 2560 possiede 4 porte seriali (UART con standard RS-232 – altre informazioni sulle comunicazioni seriali sono disponibili qui). La comunicazione sulla prima porta seriale avviene tramite la porta USB, le altre tre porte si programmano come da esempio accessibile da qui e i rispettivi PIN di collegamento sono: 19 (RX1) e 18 (TX1) 17 (RX1) e 16 (TX1) 15 (RX1) e 14 (TX1) Attenzione! Queste ultime tre porte seriali utilizzano lo standard (TTL – 0V e 5V) e NON POSSONO essere collegate direttamente a dispositivi RS-232 (ad es. modem 56K) che utilizzano differenti livelli di tensione. Per risolvere questo problema è possibile utilizzare dei componenti elettronici che interfacciano le seriali TTL alle seriali RS-232 (MAX232). Note (uso del programma): una volta effettuato l'upload del programma su Arduino, dall'IDE selezionare Tools → Serial Monitor, pigiare il pulsante di RESET di Arduino e ... leggere a computer il risultato! Tutti i programmi di tipo “terminale TTY” dovrebbero funzionare correttamente (Hyperterminal in Windows xp, Putty notevole programmino per telnet SSH e seriale che non necessita di installazione, GtkTerm per Linux). A prescindere dal programma utilizzato, ricordarsi di impostare la velocità di comunicazione seriale uguale a quella definita nel programa per Arduino e di impostare la corretta porta di comunicazione (COM1, COM2, ecc.) 10. Multimetro analogico a 2 canali con trasmissione seriale dei valori letti programma int incomingByte = 0; int sensor1Pin = A0; int sensor2Pin = A1; int sensorValue = 0; void setup() { // initialize the serial port speed. Serial.begin(115200); } void loop() { if (Serial.available() > 0) { incomingByte = Serial.read(); switch(incomingByte) { case 97: Serial.println("Hai premuto il bottone A0 "); Serial.println("Ricezione dati PIN analogico A0 : "); break; case 98: Serial.println("Hai premuto il bottone A1 "); Serial.println("Ricezione dati PIN analogico A1 : "); break; } } switch(incomingByte) { case 97: sensorValue = analogRead(sensor1Pin); Serial.print("punti : "); Serial.print(sensorValue); Serial.print("\tTensione [V] : "); Serial.println((float)((sensorValue*5.0)/1024.0)); break; case 98: sensorValue = analogRead(sensor2Pin); Serial.print("punti : "); Serial.print(sensorValue); Serial.print("\tTensione [V] : "); Serial.println((float)((sensorValue*5.0)/1024.0)); break; } delay(500); } schema elettrico di collegamento Note sullo schema : questo schema ha l'unico scopo di impostare due differenti tensioni tra il pin A0 e GND (5V) e tra il pin A1 e GND in modo da verificare con un programma terminale che, premendo “a” si legga la tensione sull'ingresso A0 e premendo “b” si legga la tensione sull'ingresso A1. In realtà è possibile collegare agli ingressi A0 e A1 un qualsiasi sistema elettrico-elettronico che generi tensioni comprese tra 0 e +5V. Note (uso del programma): una volta effettuato l'upload del programma su Arduino, dall'IDE selezionare Tools → Serial Monitor, pigiare il pulsante di RESET di Arduino e – sempre nel programma terminale – inserire il carattere “a” e invio. Arduino trasmetterà i valori letti dall'ingresso A0. Se si inserisce il carattere “b” e invio si leggeranno i valori letti dall'ingresso A1. Da qui è possibile scaricare un programmino scritto in C# che permette anche il salvataggio su file di testo dei dati ricevuti. 11. Trasmissione seriale del valore della temperatura ambiente (LM35) programma const float maxVin = 5.0; const float maxNumPoints=1023.0; const float t_vs_V_LM35=0.01; const float R1=55.8; const float R2=13.8; const float NumPoints_vs_t= maxVin/(t_vs_V_LM35*maxNumPoints*(1.0+R1/R2)); char incomingByte; int sensorPin = A0; int sensorValue = 0; float temperatura; void setup() { // initialize the digital pin as an output. Serial.begin(115200); Serial.println ("ACQUISIZIONE DATI PORTA A0:\n"); } void loop() { sensorValue = analogRead(sensorPin); temperatura=(float)sensorValue*NumPoints_vs_t; Serial.print("Temperatura ambiente : "); Serial.print(temperatura); Serial.println(" gradi Celsius"); delay(3000); } schema elettrico di collegamento Note sullo schema : in questo schema è presente un LM35, sensore di temperatura a 3 pin, la cui uscita in tensione è pari a 10 mV per ogni grado centigrado misurato. Nel caso, ad esempio, di una temperatura di 20 °C la tensione alla sua uscita è pari a 200 mV cioè 0,2 V, a 30 °C la tensione è di 0,3V. Poichè il range di tensioni misurabili agli ingressi analogici è di 0-5V è chiaro che occorre amplificare la tensione in uscita dal LM35 per sfruttare meglio i 10 bit del convertitore A/D di Arduino. E' per questo motivo che nello schema è presente anche un amplificatore operazionale LM324 che ha la caratteristica di funzionare bene (in modo lineare) anche se alimentato con un'unica tensione (i 5V che alimentano Arduino). Poichè LM324 è in configurazione amplificatore non invertente, il suo guadagno di tensione dipende dal rapporto tra i valori delle resistenze (R1/R2) – come mostrato nello schema. Con un Gv di circa 5 si ottiene circa 1V di uscita a 20 °C e 1,5V a 30 °C. E' bene che la tensione di uscita dell'LM324 sia (di molto) inferiore ai 4-5V in modo da evitare fenomeni di saturazione. L'uscita dell'amplificatore operazionale è collegato all'ingresso analogico A0 di Arduino. circa e agli ingressi A0 e A1 un qualsiasi sistema elettrico-elettronico che generi tensioni comprese tra 0 e +5V. Note (uso del programma): una volta effettuato l'upload del programma su Arduino, dall'IDE selezionare Tools → Serial Monitor e leggere direttamente il valore di temperatura misurato ogni 3 secondi. 12. Misura della temperatura a intervallo variabile programma const float maxVin = 5.0; const float maxNumPoints=1023.0; const float t_vs_V_LM35=0.01; const float R1=55.8; const float R2=13.8; const float NumPoints_vs_t= maxVin/(t_vs_V_LM35*maxNumPoints*(1.0+R1/R2)); char incomingByte; int sensorPin = A0; int sensorValue = 0; unsigned long time1; unsigned long time2; unsigned long delta; float temperatura; int int int int LED1=41; LED2=45; LED3=49; LED4=53; int int int int PUSH1=39; PUSH2=43; PUSH3=47; PUSH4=51; int int int int p1; p2; p3; p4; int int int int l1 l2 l3 l4 = = = = LOW; LOW; LOW; LOW; void setup() { // initialize the digital pin as an output. Serial.begin(115200); pinMode(LED1, pinMode(LED2, pinMode(LED3, pinMode(LED4, OUTPUT); OUTPUT); OUTPUT); OUTPUT); pinMode(PUSH1, pinMode(PUSH2, pinMode(PUSH3, pinMode(PUSH4, time1=millis(); INPUT); INPUT); INPUT); INPUT); } void loop() { p1=digitalRead(PUSH1); p2=digitalRead(PUSH2); p3=digitalRead(PUSH3); p4=digitalRead(PUSH4); if(p1==LOW && !l2 && !l3 &&!l4) { l1=!l1; //toggle..... digitalWrite(LED1, l1); delay(200); } if(p2==LOW && !l1 && !l3 &&!l4) { l2=!l2; //toggle..... digitalWrite(LED2, l2); delay(200); } f(p3==LOW && !l2 && !l1 &&!l4) { l3=!l3; //toggle..... digitalWrite(LED3, l3); delay(200); } if(p4== LOW && !l1 && !l2 &&!l3) { l4=!l4; //toggle..... digitalWrite(LED4, l4); delay(200); } if(l1) delta=1000; if(l2) delta=2000; if(l3) delta=3000; if(l4) delta=4000; time2=millis(); if(time2-time1>delta && (l1 || l2 || l3 || l4)) mostra_temp(); } void mostra_temp() { sensorValue = analogRead(sensorPin); temperatura=(float)sensorValue*NumPoints_vs_t; Serial.print("Temperatura ambiente : "); Serial.print(temperatura); Serial.println(" gradi Celsius"); time1=millis(); time2=millis(); } schema elettrico di collegamento Oltre allo schema dell'esercizio 11 occorre aggiungere i seguenti componenti: Note sullo schema : anche in questo schema è presente un LM35, sensore di temperatura a 3 pin, ma , in aggiunta sono presenti anche 4 pulsanti con 4 LED. Note (uso del programma): una volta effettuato l'upload del programma su Arduino, dall'IDE selezionare Tools → Serial Monitor e leggere direttamente il valore di temperatura misurato con intervallo selezionabile dalla pressione di uno dei 4 pulsanti. 13. Visualizzazione di una frase in un display LCD programma #include <LiquidCrystal.h> LiquidCrystal lcd(53, 51, 49, 47, 45, 43); char frase1[20]="prova LCD "; char frase2[16]="con Arduino"; char car='*'; void setup() { lcd.begin(16, 4); lcd.setCursor(0,0); lcd.print(frase1); lcd.setCursor(0,1); lcd.print(frase2); } void loop() { for(int i=-4;i<12;i++) { lcd.setCursor(i,2); lcd.print(car); delay(500); lcd.setCursor(i,2); lcd.print(" "); } } schema elettrico di collegamento Supponendo di collegare ad Arduino un comune per 4 righe (16x4) del tipo qui mostrato: il cui pinout è il seguente: display LCD testuale di 16 colonne e la tabella di collegamento dipende da quale overload del costruttore dell'oggetto LiquidCrystal si è utilizzato : nel caso di questo esercizio se ne è utilizzato uno a 6 parametri perciò la corrispondenza PIN LCD – PIN Arduino è la seguente: PIN LCD PIN Arduino 1 GND 2 +5V 3 Non collegato 4 53 5 GND 6 51 7 Non collegato 8 Non collegato 9 Non collegato 10 Non collegato 11 49 12 47 13 45 14 43 15 +5V (vedi nota) 16 GND Note sullo schema : nella tabella in basso della precedente pagina i PIN di Arduino in grassetto sono i parametri del costruttore della variabile (oggetto) di nome lcd. In pratica si collegano solo i PIN relativi ai 4 bit D4-D7 (modalità 2 nibble) risparmiando 4 PIN di collegamento su Arduino. I PIN 15 e 16 dell'LCD sono quelli dei LED di backlight per cui il catodo (16) è collegato a massa (GND) e l'anodo (15) è collegato a +5V tramite una resistenza da 220 ohm. Il piedino 3 dell'LCD è quello di regolazione del contrasto e dev'essere collegato a un trimmer da 10 Kohm come da figura a lato. Note (uso del programma): una volta effettuato l'upload del programma su Arduino e regolato il trimmer del contrasto, il display dovrebbe mostrare la frase riportata nella foto di pag.23 e un asterisco si dovrebbe “muovere” da sinistra a destra nella terza riga (con ciclo infinito). 14. Creazione caratteri custom per il display LCD programma #include <LiquidCrystal.h> LiquidCrystal lcd(53, 51, 49, 47, 45, 43); byte ghost[8] = {14,31,21,31,31,31,21,0}; byte smile[8] = {0,10,10,0,17,14,0,0}; int colonna; int riga; void setup() { lcd.createChar(1, ghost); lcd.createChar(2, smile); lcd.begin(16, 4); randomSeed(millis()/1000); } void loop() { mostra(random(1,3),random(0,64)); } void mostra(int quale, int dove) { riga=dove/16; colonna=dove%16; if(riga>1) colonna-=4; //nelle 2 ultime righe la colonna inizia da -4 !! lcd.setCursor(colonna,riga); lcd.write(quale); delay(500); lcd.setCursor(colonna,riga); lcd.write(" "); } schema elettrico di collegamento Lo schema elettrico di collegamento è identico a quello dell'esercizio 13. Note sul programma : per la creazione di caratteri custom (personalizzabili) occorre utilizzare la funzione createChar che richiede 2 parametri: il primo è un numero da 0 a 7 che identifica il particolare carattere custom, il secondo è il nome del vettore di 8 byte che contiene la matrice di pixel del carattere. Poichè quest'ultimo è formato da una matrice di 5 colonne per 8 righe, ciascun byte del vettore convertito in binario ha i suoi 5 bit LSB (in pratica il numero va da 0 a 31) che impostano il pixel acceso (bit a 1) o spento (bit a 0). Byte maggiori di 31 hanno comunque i 3 bit MSB non utilizzati. Per chi non avesse voglia (o tempo) di fare i conti esiste un programmino per windows (che non necessita di installazione) che, a partire da una comoda interfaccia grafica, crea un file di testo contenente gli 8 byte del carattere. 15. Visualizzazione temperatura ambiente su display LCD programma #include <LiquidCrystal.h> #include <String.h> LiquidCrystal lcd(53, 51, 49, 47, 45, 43); const float maxVin = 5.0; const float maxNumPoints=1023.0; const float t_vs_V_LM35=0.01; const float R1=55.8; const float R2=13.8; const float NumPoints_vs_t= maxVin/(t_vs_V_LM35*maxNumPoints*(1.0+R1/R2)); char incomingByte; int sensorPin = A0; int sensorValue = 0; float temperatura; String temp; void setup() { lcd.begin(20, 4); lcd.setCursor(0,0); temp="temperatura : "; lcd.print (temp); } void loop() { sensorValue = analogRead(sensorPin); temperatura=(float)sensorValue*NumPoints_vs_t; delay(500); lcd.setCursor(0,2); lcd.print("t = "); lcd.print(temperatura); temp=" gradi C"; lcd.print(temp); delay(2500); } schema elettrico di collegamento Per il display LCD lo schema elettrico di collegamento è identico a quello dell'esercizio 13. Per il sensore di temperatura (LM35) lo schema è identico a quello dell'esercizio 11. Note sul programma : il programma mostra sull'LCD la temperatura misurata dal solito sensore LM35 ed è un'unione del programma 11 e del programma 13. L'unica particolarità di rilievo è la libreria String (che in realtà, in questo particolare caso, non è strettamente necessaria) che permette una gestione facilitata delle stringhe rispetto ai vettori di caratteri. 16. Scrittura di frasi su display LCD tramite nunchunck. programma Il programma è scaricabile da lunghezza. qui e il suo listato non è stato riportato a causa della sua schema elettrico di collegamento Per il display LCD lo schema elettrico di collegamento è identico a quello dell'esercizio 13. Per il nunchunck occorre riferirsi allo shema elettrico dell'esercizio 7. Note sul programma : il programma permette la scrittura di frasi impostate con la periferica di input nunchunck. Premendo il tasto C in prima riga, prima colonna appare il carattere A e, tendo sempre premuto C, appaiono tutti i caratteri dell'alfabeto inglese. Dopo la Z appare uno spazio (per separare le parole) e poi si rivede il carattere A e così via. Premendo il tasto Z si ottiene il loop inverso: Z Y X W ….ecc. Premendo il tasto C unitamente al joystick verso qualche direzione, si sposta la posizione del cursore di scrittura. Premendo contemporaneamente C e Z il display si “pulisce” e il puntatore ritorna in posizione (0,0). A prescindere dal dispositivo di input utilizzato, a mio avviso, la particolarità più interessante di questo programma è l'uso della libreria EEPROM che permette il salvataggio dei dati (gestiti dal programma) su memoria non volatile. In questo esercizio la libreria è utile per salvare le frasi mostrate dall'LCD. La programmazione è molto semplice poiché fa uso di due sole funzioni dal nome immediato : write(). 17. Utilizzo di LCD con differenti colori di backlight. programma #include <LiquidCrystal.h> LiquidCrystal lcd(53, 51, 49, 47, 45, 43); int red=41; int green=39; int blue=37; int conta=0; void setup() { pinMode(red, OUTPUT); pinMode(green, OUTPUT); pinMode(blue, OUTPUT); lcd.begin(20, 4); //big display 20 colonne, 4 righe lcd.setCursor(0,0); lcd.print("ciao, mondo!"); } void loop() { conta++; switch (conta) { case 1: digitalWrite(red, LOW); digitalWrite(green,HIGH); digitalWrite(blue,HIGH); break; case 2: digitalWrite(red, HIGH); digitalWrite(green,LOW); digitalWrite(blue,HIGH); break; case 3: digitalWrite(red, HIGH); digitalWrite(green,HIGH); read() e digitalWrite(blue,LOW); conta=0; break; } delay(1000); } schema elettrico di collegamento Per il display LCD lo schema elettrico di collegamento è simile a quello dell'esercizio 13 tranne che per gli ultimi PIN del display stesso. Con riferimento alla tabella di corrispondenza PIN LCD – PIN Arduino riportata nell'esercizio 13 ocorre apportare alcune modifiche strettamente dipendenti dal datasheet del display. Ad esempio, il datasheet del display utilizzato in questo esercizio è osservabile da qui. PIN LCD PIN Arduino 15 +5V (vedi nota) 16 41 17 39 18 37 Come si può osservare dal datasheet il PIN 15 è LEDA cioè LED- anode e quindi, in questo caso va collegato direttamente ai 5V (senza interporre in serie nessuna resistenza) mentre i PIN 16,17 e 18 sono LEDK, cioè i catodi dei LED di colore – rispettivamente – rosso, verde e blu. In questo caso occorre inserire in serie a ciascuno dei tre catodi (PIN 15,16,17) una resistenza limitatrice di corrente (220 ohm). Per ottenere il cambio di colore di sfondo occorre quindi utilizzare altri 3 PIN digitali (41,39,37) che, con la loro uscita a livello basso (LOW) permettono l'accensione del LED corrispondente. In definitiva il collegamento dei LED di backlight dipende strettamente dallo specifico tipo di display. I PIN dell'LCD compresi tra 1 e 14 devono essere collegati ad Arduino esattamente come i PIN del display dell'esercizio 13. Note sul programma : il programma mostra una breve frase sul display e, ogni secondo la backlight cambia colore grazie a una variabile conta che può valere solo 1,2,3 (oppure 0). I programmi fin qui descritti sono disponibili in questa pagina WEB. 18. Server WEB per la distribuzione di 5 valori analogici programma #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1, 175); EthernetServer server(80); void setup() { Ethernet.begin(mac, ip); //inizializza il dispositivo ethernet server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n' && currentLineIsBlank) { // send a standard http response header client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println(); for (int Ch = 0; Ch < 6; Ch++) { client.print("analog input "); client.print(Ch); client.print(" is "); client.print(analogRead(Ch)); client.println("<br />"); } break; } if (c == '\n') { // you're starting a new line currentLineIsBlank = true; } else if (c != '\r') { // you've gotten a character on the current line currentLineIsBlank = false; } } } // give the web browser time to receive the data delay(1); // close the connection: client.stop(); } } schema elettrico di collegamento Occorre solamente l'ethernet shield collegato ad Arduino, l'elettronica necessaria per applicare dei segnali analogici alle prime 6 porte di Arduino e (ovviamente) un cavo di rete per collegare Arduino a uno switch. Note sul programma : il programma rende Arduino un WEB server la cui unica pagina (servita!) mostra il numero di punti (corrispondenti alla tensione di ingresso) sui PIN analogici da A0 ad A5. In pratica, utilizzando un qualsiasi browser puntato all'indirizzo http://192.168.1.175 è possibile visualizzare lo stato dei primi 6 ingressi analogici. Con le prime istruzioni comprensive della funzione setup() si crea un server (di nome server !) che inizia l'ascolto per connessioni in ingresso all'indirizzo sopra scritto e alla porta 80 (di default dei web server). Nel tempo in cui un client è connesso (while...) e se ci sono byte in arrivo dal client il server lo legge (client.read()) e se il carattere è un newline e currentLineIsBlanck è true viene eseguito un ciclo for per 6 volte in cui sono mostrati i valori (espressi in punti) letti dal convertitore A/D negli ingressi da A0 ad A5. Con l'istruzione break si esce dal ciclo while. 19. Server telnet (chat multiclient) programma #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 1, 175 }; //byte gateway[] = { 192, 168, 1, 1 }; //byte subnet[] = { 255, 255, 255, 0 }; EthernetServer server(23); void setup() { Ethernet.begin(mac, ip); server.begin(); } void loop() { EthernetClient client = server.available(); if (client) { // read bytes from the incoming client and write them back // to any clients connected to the server: server.write(client.read()); } } schema elettrico di collegamento Occorre solamente l'ethernet shield collegato ad Arduino e (ovviamente) un cavo di rete per collegare Arduino a uno switch. Note sul programma : il programma rende Arduino un server telnet (che ha di default la porta 23). In pratica ogni byte ricevuto da un qualsiasi client connesso viene ritrasmesso dal server a tutti i client connessi. Il risultato è un rudimentale server di chat! 20. Accensione di un LED in rete programma #include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192,168,1, 217 }; EthernetServer server(80); String query; int acceso; void setup() { acceso=false; query = String(""); Ethernet.begin(mac, ip); server.begin(); pinMode(13,OUTPUT); } void loop() { EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); query.concat(c); if (c == '\n') { if (query.indexOf("cambia") > 0) { acceso=!acceso; digitalWrite(13,acceso); } client.print("<a href='/cambia'>"); if(acceso) client.print("Spegni"); else client.print("Accendi"); client.print("<pre>");// per DEBUG!! client.print(query); // per DEBUG!! client.print("</pre>");//per DEBUG!! break;//fermo il ciclo } // fine if (c=='\n') ... } // fine if(client... } //fine while delay(1); client.stop(); query = String(""); } } schema elettrico di collegamento Occorre l'ethernet shield collegato ad Arduino e un LED collegato al PIN 13 (tramite resistenza – vedi pagina 5). Note sul programma : il programma mostra nel browser di un computer che punta all'URL http://192.168.1.217 una semplice pagina con un link. Cliccando su quest'ultimo il LED si accende/spegne (modo toggle). 21. Accensione di un LED in rete (click su immagine) programma Il programma è del tutto simile al precedente (ed è scaricabile da qui) ma si “clicca” su un'immagine piuttosto che su una parola per cambiare lo stato del LED. La cosa può sembrare banale ma, se non si dispone di una memoria microSD per la memorizzazione delle immagini, NON si può ricorrere all'attributo src all'interno di un tag <IMG src=... Una soluzione (parziale) per immagini molto piccole (icone o poco più) è quella mostrata in questo articolo . Schema elettrico di collegamento Ovviamente lo schema elettrico è quello del precedente esercizio. Note sul programma : a differenza del precedente esercizio la pagina WEB servita mostra l'immagine di una piccola lampadina nei due stati, acceso e spento, che coincidono con lo stato fisico del LED collegato ad Arduino. 22. WEB data logger : pachube.com programma Questo programma permette l'acquisizione dei dati tramite Arduino e la trasmissione via internet degli stessi al sito pachube.com. Questo sito è un data collector in rete che, permette la visualizzazione di grafici, la memorizzazione dei dati e il controllo di dispositivi (collegabili alla rete) tramiti semplici interfacce WEB. In questo specifico esempio Arduino legge da A0 la temperatura misurata dal sensore LM35 e, tramite pachube, è possibile visualizzare il grafico della temperatura. schema elettrico di collegamento Oltre ai due shield Arduino ed ethernet sono necessari alcuni dei circuiti già visti per la misura della temperatura. Note sul programma : il programma utilizza il metodo HTTP PUT e la chiave APIKEY e il FEEDID devono essere forniti da pachube.com previa registrazione al sito. 23. Client Twitter programma Il programma scaricabile da qui permette l'invio automatico di tweet su Twitter. Ovviamente occorre inserire nel costruttore di twitter una chiave alfanumerica che è facilmente scaricabile dal sito del programmatore. Schema elettrico di collegamento Nient'altro oltre i due shield Arduino ed ethernet. 24. Protodomotica da www.giannifavilli.it programma Il programma scaricabile da qui mostra una pagina WEB da cui si legge la temperatura ambiente e si imposta l'accensione di un LED. La pagina stessa effettua un refresh ogni 30 secondi circa. schema elettrico di collegamento Diodo LED e sensore di temperatura LM35. 25. Formattazione FAT16/FAT32 di una microSD card programma Il programma scaricabile da qui permette la formattazione di una microSD card creando un file system FAT16 o FAT32. Sono necessarie le librerie SdFat e SdFatUtil presenti in questo sito (dopo aver scompattato il file compresso, copia la cartella SdFat nella cartella libraries dell'IDE Arduino – informazioni dettagliate sono disponibili nella cartella html). schema elettrico di collegamento Shield Arduino ed ethernet con la microSD inserita nell'apposito alloggiamento della scheda ethernet. Note sul programma : il programma comunica tramite monitor seriale. Da terminale seriale è possibile scegliere il tipo di formattazione. Personalmente ho formattato (con successo) FAT32 una microSD da 4GB. 26. WEB server su microSD programma Il programma scaricabile da qui permette l'utilizzo del filesystem FAT32 su microSD per fornire pagine WEB a partire da un file di nome “index.htm” memorizzato nella root della scheda. Nei precedenti programmi WEB server (programmi 20 e 21) erano presenti due grosse limitazioni: la necessità di inserire i TAG HTML all'interno del programma stesso e l'impossibilità di operare con file di grandi dimensioni (immagini e altro). Con questo programma (leggermente modificato - per utilizzare il router di casa – rispetto all'originale – utimo codice della pagina) questi limiti sono superati. Come nell'esercizio 25 sono necessarie le librerie SdFat e SdFatUtil. schema elettrico di collegamento Shield Arduino ed ethernet con la microSD inserita nell'apposito alloggiamento della scheda ethernet. Note sul programma : il programma permette l'utilizzo di un index.htm che può fare riferimento a immagini (anche di medie dimensioni) presenti in sottocartelle della microSD. 27. Lettura RFID di un Tag premessa L'RFID è quella tecnologia che permette l'identificazione e le transazioni commerciali sicure tramite l'avvicinamento (senza contatto utilizzando segnali radio) di una carta dotata di microchip (detta tag) a un lettore/scrittore generalmente collegato a un sistema automatico di erogazione di beni o servizi. La tecnologia usata in questo esempio è quella a 13,56 Mhz i cui dispositivi sono prodotti dalla Mifare. L'accesso in lettura/scrittura dei tag (che hanno un numero di identificazione diverso per ogni esemplare) è subordinato al successo di una fase di autenticazione. Ecco qui le specifiche di un chip RFID e qui le specifiche di un tag. programma Il programma scaricabile da qui permette di leggere il numero di identificazione della tag e di trasmetterlo via seriale al computer. Attenzione!: è necessaria inserire la libreria MF (una volta scompattata la cartella!) nella cartella libraries dell'IDE di Arduino schema elettrico di collegamento Oltre al shield Arduino è necessaria una scheda elettronica RFID del tipo mostrato in questo documento alle pagg. 117 e 118. I collegamenti elettrici tra Arduino e la scheda sono esattamente quelli mostrati a pag. 117. 28. Lettura e scrittura RFID di un Tag programma Il programma scaricabile da qui permette di leggere il numero di identificazione della tag, di leggerne un dato numerico, di sottrarre uno da esso e di riscriverlo nella tag stessa. Per la premessa e l'uso del programma leggere attentamente quanto scritto nell'esempio 27. schema elettrico di collegamento Lo stesso dell'esempio 27. 29. Lettura RFID di un Tag a 125 KHz premessa Le tecnologie RFID sono molto differenziate e, in queste slide è possibile vedere una panoramica generale sull'argomento. Negli esercizi precedenti è stato usato un reader/writer a 13,5 Mhz (di mia proprietà). Il laboratorio 44 dell'ISISS di Morciano ha però a disposizione 20 shield RFID con tecnologia a 125 KHZ (da qui lo schema elettrico) dotati di lettori ID-12 della Innovations le cui specifiche sono qui riportate. Questi lettori riescono a fornire, una volta che un tag RFID (compatibile) viene loro avvicinato, uno stream di byte che presenta il seguente formato: in cui: Il primo byte rappresenta lo Start TX e vale 0×02 DATA è composto da 10 byte che rappresentano l’ID del tag CHECK SUM vale 2 byte e si ottiene ponendo in XOR i 10 byte di dati Il byte 14 è un Carrier Return e vale 0×13 il byte 15 è un Line Feed e vale 0×10 il byte 16 rappresenta l’End TX e vale 0×03 Poichè questo shield RFID è predisposto per collegarsi all'unica porta seriale di un Arduino Uno, occorre fare una piccola modifica per poterlo utilizzare con Arduino MEGA. Come si può vedere dalla foto il PIN 7 dello shield RFID è stato (volutamente) storto per non connetterlo al corrispondente PIN del MEGA 2560. Quel PIN corrisponde all'uscita seriale TTL dell'ID-12 e dev'essere collegato al PIN 19 (RX1) del MEGA 2560. programma Il programma scaricabile da qui (leggermente modificato dall'originale presente in questo sito) svolge le seguenti funzioni: Memorizza in EEPROM il codice del tag RFID (dopo aver premuto il pulsante per circa 3 secondi si accende il LED verde, a quel punto rilascia il pulsante e avvicina il tag) Dopo aver memorizzato il codice, avvicinando il tag si accende il LED verde e, col monitor seriale, è possibile vedere il codice del tag stesso. Avvicinando un diverso tag (con differente ID) si accende il led rosso (di errore): Accendendo arduino col tasto premuto si può cancellare la EEPROM memorizzarne un altro tag. (per Tutti gli stati del sistema sono osservabili tramite monitor seriale (9600 baud) schema elettrico di collegamento Come già scritto, il PIN 7 dello shield RFID va collegato al PIN 19 di arduino dopo averlo scollegato dal PIN 7 di arduino. Se si ha intenzione di utilizzare il relè dello shield occorre applicare una tensione continua positiva di 11-12V tra l'ingresso Vin e massa poiché il relè dello shield è un subminiatura a 12V 30. Tastierino alfanumerico (KeyPad) con trasmissione seriale premessa I tastierini a matrice sono molto utilizzati nell'ambito dei sistemi a microcontrollore e sono costituiti da una pulsantiera che collega elettricamente la riga con la colonna relative al pulsante premuto. Nell'esempio in figura il tastierino ha 4 righe (dalla R0 alla R3) e 3 colonne(dalla C0 alla C2) di pulsanti. Il sito ufficiale di Arduino mette a disposizione da qui la libreria keypad.h che permette una raffinata gestione dei tastierini numerici. Nella pagina del sito è presente tutta la documentazione necessaria e la libreria (keypad.zip) con le istruzioni per la sua installazione. Sempre con riferimento all'immagine di cui sopra la pressione del tasto “6” corrisponde al cortocircuito tra R1 e C2. Il tastierino va collegato agli ingressi digitali di Arduino e la libreria keypad permette facilmente l'assegnazione (e la corrispondenza) tra i PIN scelti e le righe e le colonne della tastiera. programma Il programma scaricabile da qui permette di visualizzare il simbolo del tasto premuto tramite il monitor seriale. Inoltre, con la pressione dei tasti 1,2,3,4,*,# e 0 si possono accendere o spegnere dei LED posizionati come nell'esercizio n. 6 (pag. 13). schema elettrico di collegamento Oltre ai LED di cui sopra (vedi esercizio n. 6) il tastierino 4x3 è collegato come da seguente tabella: PIN Keypad PIN Arduino R0 22 R1 24 R2 26 R3 28 C0 30 C1 32 C2 34 31. Tastierino alfanumerico (KeyPad) con tasti “toggle programma Il programma, prelevabile da qui, è simile al precedente ma permette di utilizzare i tasti in modalità “toggle” : premendo una volta un tasto si attiva una funzione, premendo una seconda volta si disattiva. schema elettrico di collegamento Vedi esercizio 30. 32. Display grafico con forme geometriche in movimento premessa Arduino può pilotare svariate tipologie di display LCD e i precedenti esempi dal 13 al 17 mostrano alcune possibilità di utilizzo di LCD di tipo testuale (su cui possono essere visualizzati in linea di massima solo dei caratteri ASCII). Esiste però una vastissima categoria di display LCD di tipo grafico, le cui dimensioni sono date in pixel (12864 = 128 x 64 pixel, ad esempio) su cui è possibile “disegnare” delle primitive geometriche oppure “accendere” singoli pixel. Questi display (dal costo contenuto) possono essere utilizzati come interfacce utente per apparecchiature varie oppure per realizzare videogiochi di tipo “arcade”. La scuola ha in dotazione 20 display di questo tipo (128x64 pixel) che possono essere gestiti dalla libreria u8glib (universal 8bit graphic library) accessibile da qui. La libreria ha molte funzioni documentate nel reference. I display grafici possono comunicare con arduino (o altri controller) in modalità parallela o seriale: nel primo caso è presente un bus dati a 8 bit (da D0 a D7) mentre nel secondo è presente una linea dati e una di clock. programma Il programma scaricabile da qui permette di visualizzare una circonferenza al centro del display con un cerchio pieno che “si muove” sulla circonferenza stessa. Analizzando il programma si vede che, nella seconda riga, è presente la chiamata alla funzione (costruttore) del display grafico selezionato (in questo caso ST7920 con collegamento parallelo a 8 bit) cioè l'istruzione: U8GLIB_ST7920_128X64 u8g (22, 24, 26, 28, 30, 32, 34, 36, 48, U8G_PIN_NONE, U8G_PIN_NONE, 50, 52); Andando a vedere l'elenco dei dispositivi supportati dalla libreria (nella terza riga dell'ST7920) c'è il costruttore col significato dei parametri: U8GLIB_ST7920_128X64 ( d0, d1, d2, d3, d4, d5, d6, d7,en, cs1, cs2, di, rw) schema elettrico di collegamento Ciò significa che i 7 bit del bus parallelo sono collegati ai PIN 22,24,..., 36 di arduino MEGA 2560, i PIN cs1 e cs2 non sono collegati ad arduino (perchè non esistono nel nostro display), il PIN en (enable) è collegato al PIN 48 di arduino, il PIN di (data/instruction) è collegato al PIN 50, infine il PIN rw (read/write) è collegato al PIN 52 di arduino. Riassumendo il collegamento elettrico: PIN LCD funzione PIN Arduino 1 GND GND 2 Vcc +5V 3 Vo Centro potenziom. 4 RS (DI) 50 5 RW 52 6 EN 48 7 DB0 22 8 DB1 24 9 DB2 26 10 DB3 28 11 DB4 30 12 DB5 32 13 DB6 34 14 DB7 36 15 PSB Non collegato 16 NC Non collegato 17 RST Non collegato 18 Vout Non collegato 19 BLA +5V (vedi nota) 20 BLK GND Nota: BLA è l'anodo del diodo LED di backlight e va collegato ai +5V con in serie una resistenza da 220 ohm (BLK è il catodo del LED). E' qui possibile vedere un breve video dell'animazione mostrata a display. 33. Voltmetro (finto) analogico con range 0-5V programma Il programma scaricabile da qui mostra a display grafico il valore della tensione analogica presente sul PIN A0 di arduino. Il display mostra una lancetta che indica il valore letto su un arco di circonferenza (come in un display analogico). schema elettrico di collegamento E' identico a quello dell'esempio precedente con, in più, un potenziometro (da 10 Kohm fino a 470 Kohm) i cui estremi sono collegati a +5V e GND e il centrale all'ingresso A0. 34.Telecomando a infrarossi premessa La scuola ha a disposizione 20 telecomandi a infrarossi e altrettanti ricevitori a infrarossi da utilizzare con arduino. I protocollo utilizzato per il riconoscimento dei tasti è il NEC le cui caratteristiche dettagliate sono riportate a pag. 77 di questo documento che, essendo il manuale di istruzioni di un corposo kit di arduino MEGA in vendita su Ebay, è stato fonte preziosa di ispirazione per l'organizzazione di questo corso.Il protocollo si basa sulla trasmissione di uno stream di bit del tipo visibile nella figura seguente: I bit “0” hanno un livello alto di circa 0.5 ms e uno basso della stessa durata mentre i bit “1” hanno lo stesso livello alto ma il livello basso dura circa 1.5 ms. Viene prima trasmesso l'indirizzo del dispositivo poi il codice del comando (tasto) premuto. Per sicurezza sia il comando che il codice sono trasmessi prima in logica positiva poi in logica negativa (è così possibile un controllo sulla correttezza del dato). programma Il programma (ricavato dal documento di cui sopra e scaricabile da l'indirizzo e il codice del tasto premuto del telecomando. qui) mostra a seriale schema elettrico di collegamento Il ricevitore a infrarossi, con riferimento all'immagine qui mostrata, ha i PIN di collegamento da sinistra verso destra: PIN FUNZIONE ARDUINO 1 GND GND 2 Vcc +5V 3 DATA PIN 8 35.Sensore a ultrasuoni premessa Per misure di distanza tra qualche centimetro e qualche metro sono oggi disponibili dei sensori a ultrasuoni che misurano il tempo di andata e ritorno del segnale (con frequenza di circa 40 KHz) verso e da un ostacolo. Uno di questi, l'HCSR-04 (acquistabile a pochi euro online) è un piccolo circuito elettronico con soli 4 PIN che permette la misura di distanza tra 2-3 cm e 4m. Un ottimo articolo è leggibile su settorezero, sito con vari articoli di elettronica amatoriale. Il principio di funzionamento è molto semplice: dopo che si è posto a livello alto l'ingresso trigger per almeno 10 microsecondi, il circuito emette 8 burst a 40 Khz che vengono riflessi dall'ostacolo. Il micro pone a livello alto il PIN echo per una durata di tempo proporzionale alla distanza dell'ostacolo. Il circuito è molto lineare e affidabile. programma Il programma (scaricabile da qui) mostra a seriale la distanza in centimetri tra il sensore e l'ostacolo. Da notare la funzione pulseIn(echoport,HIGH) che ritorna un long che contiene i microsecondi in cui il PIN echo è stato a livello alto. schema elettrico di collegamento Vcc a +5V // GND a GND // Trig al PIN 22 // Echo al PIN 23. 36.Sensore a ultrasuoni con visualizzazione su display programma Il programma (scaricabile da qui) richiede il sensore dell'esempio precedente e un display del tipo dell'esempio 17. La misura di distanza viene visualizzata sul display. schema elettrico di collegamento Per l'HCSR-04 è uguale allo schema del precedente esempio. Il display va collegato come negli esempi 13 e 17 seguendo lo schema delle pagine 24 e 29 di questo documento. 37.Servo motore premessa I servomotori (o servo meccanismi detti anche RC servo cioè remote controlled servo) sono degli attuatori rotativi composti da un motorino in continua e da un sistema elettronico che permette la rotazione del perno del motorino in un range 0°-180°. L'angolo formato dal perno con la sua posizione di zero (riposo) è imposto dalla lunghezza di un impulso fornito tra uno dei suoi ingressi e massa. Una buona introduzione sui servocomandi è fornita in questa pagina. In pratica i servocomandi sono utilizzati per effettuare una rotazione meccanica di ampiezza (angolare) limitata e sono collegati a ruote (per variare la direzione di marcia di modellini di auto-robot- ecc.) o ad altri carichi meccanici (sono molto utilizzati anche in aeromodellistica). Per arduino la libreria utilizzata è Servo (fa parte delle librerie di base) e permette facilmente il pilotaggio del servo con la funzione myservo.write(deg) in cui deg è l'angolo espresso in gradi. programma Il programma (scaricabile da qui) fa ruotare alternativamente il perno di un servomotore (di tipo Tower Pro SG90) da 0 a 180 gradi e viceversa. schema elettrico di collegamento il servo meccanismo ha 3 fili di collegamento: il marrone a GND, il rosso ai +5V e il giallo di comando che va collegato al PIN 53 di arduino. 38.Telecomando bluetooth premessa Occorre in questo caso premunirsi di una scheda bluetooth-seriale tipo HC-05 reperibile qui. Questa scheda permette la ricezione di comandi via bluetooth e l’invio degli stessi alla scheda arduino tramite porta seriale. programma Il programma scaricabile da qui permette il pilotaggio analogico di un LED RGB tramite un programma Android. Il programma necessita inoltre della libreria SoftwareSerial.h scaricabile (in forma compressa) da qui. Una volta scaricata e scompattata, la libreria dev’essere copiata nella cartella libraries di arduino. inizializzazione del modulo HC-05 Occorre prima partire da una breve analisi di RGB.ino il programma per Arduino MEGA 2560. Il programma usa una libreria (SoftwareSerial.h) che gestisce un collegamento seriale (non compreso in quelli standard di Arduino) a bassa latenza (basso ritardo). I PIN di Arduino sono il 10 (RXD – collegato al TXD di HC-05) e il 9 (TXD – collegato a RXD di HC-05). La velocità iniziale (di default) è 38400 bps (mySerial.begin(38400) ). In questo modo si realizza il collegamento seriale tra HC-05 e Arduino. Poiché si vuole vedere a PC i caratteri trasmessi dal modulo verso Arduino, occorre usare una seriale standard tra Arduino e il computer: si usa la RX0 e TX0 cioè quella collegata alla porta USB, infatti la si inizializza con Serial.begin(38400). Come riportato nel doc dell’HC-05 (BMX_Bluetooth_quanxin.pdf) a pag. 3 (“Steps to configure the module as master device”) occorre: 1. Collegare HC-05 ad Arduino MEGA 2560 con lo schema di HC-05.pdf 2. Collegare Arduino al PC e programmarlo con bluetooth.ino 3. Scollegare Arduino dal PC (togliere il cavo USB) 4. Scollegare il filo dei 3.3 V (che alimenta l’HC-05) da Arduino 5. Ricollegare Arduino al PC 6. Predisporre il monitor seriale di Arduino come in figura È molto importante la velocità (38400 baud) e l’opzione “Sia NL che CR” (new line and carriage return). Attenzione! La nuova versione di Arduino ha un monitor seriale che NON comprende i 38400 baud! Occorre usare la vecchia versione “Arduino 1.0.3” oppure un monitor seriale tipo hyperterminal. 7. Ricollegare il filo dei 3.3 V (che alimenta l’HC-05) ad Arduino. La frequenza di lampeggio del LED di HC-05 dovrebbe essere molto più bassa di prima. 8. Ora, scrivendo i comandi riportati in “BMX_Bluetooth_quanxin.pdf” – ad esempio AT (+ invio - nel monitor seriale) il modulo HC-05 dovrebbe rispondere con OK !! 9. A questo punto scrivere AT+ORGL (+ invio - nel monitor seriale) per portare il setting di HC-05 ai suoi valori di default. 10. Scollegare Arduino dal PC (togliere il cavo USB). 11. Ricollegare Arduino al PC (il lampeggio del LED di HC-05 è ritornato normale) Il sistema è ora predisposto per ricevere via Bluetooth i comandi per il pilotaggio del LED RGB. programma Android Il programma scaricabile da qui è in formato “esportato da Eclipse”. Eclipse è un IDE per sviluppo programmi Android. Tutto il kit di sviluppo è scaricabile da qui (Android Development Tools). Occorre modificare il programma e ricompilarlo perché funzioni col modulo HC-05 acquistato. Infatti, ciascun modulo HC-05 ha un proprio indirizzo fisico (MAC address) diverso da ciascun altro. Per importare il programma in Eclipse occorre (da quest’ultimo) eseguire questi passi: Dal menù file scegliere la voce Import. Nella finestra di dialogo di Import scegliere la voce Existing projects into Wokspace e cliccare su Next. Selezionare Select archive file e scegliere il file bt_android.zip scaricato prima. Cliccare su Finish. L’istruzione contenente l’indirizzo da modificare è contenuta in BtLED => src => com.btled => MainActivity.java ed è la seguente: mmDevice=mBluetoothAdapter.getRemoteDevice("20:13:07:18:43:94"); in cui l’indirizzo da cambiare è quello in grassetto. Per trovare l’indirizzo giusto del proprio HC05 occorre (da un telefono Android): Accendere il bluetooth Andare in impostazioni (del bluetooth) Alla richiesta di collegare il dispositivo dovrebbe far vedere il MAC address Inserire il PIN 1234 Prima di ricompilare il programma BtLED (da Eclipse) occorre verificare che le API (application programming interface) di arduino siano presenti nel computer: in pratica cliccare su Windows => Android SDK Manager; in questo modo si apre la finestra in cui occorre verificare che le SDK platform di Android – versioni 4.1.2, 4.2.2 e 4.3 - siano installate (se non lo sono cliccare sui checkbox relativi e sul pulsante Install). Per ricompilare il programma modificato (e caricarlo sul telefono) occorre scegliere dal menù di Eclipse Run e poi Run. Naturalmente il telefono Android deve avere il cavetto di collegamento USB al PC e deve avere i drivers corretti. Nel caso in cui non siano stati trovati driver validi si può utilizzare il programma SnapPea (scaricabile da qui) installato nel PC contenente Eclipse.