Ing. Cozzolino Francesco www.ingegnercozzolino.altervista.org 1
Che cos è Arduino? Arduino è una piattaforma elettronica di piccole dimensioni con un microcontrollore ATMEL montato sopra e una circuiteria di contorno, inventata da un gruppo di persone tra cui l Italiano Massimo Banzi, utile per creare rapidamente prototipi di impianti di automazione civili ed industriali o di creare circuiti di comando a distanza. Spesso utilizzato per scopi hobbistici e didattici, si sta diffondendo rapidamente nelle scuole per la sua semplicità sia nei collegamenti elettrici che nella programmazione software. Per quest ultimo aspetto sono presenti in rete una miriade di programmi e progetti già svolti. Tutto il software a corredo di Arduino è libero, e gli schemi circuitali sono distribuiti come hardware libero. In questo numero inizieremo a presentare un primo semplice progettino con tanto di programma servendoci di una scheda Arduino UNO il cui costo è di circa 20 euro. In questo numero mostreremo anche come si scarica il software ed il suo ambiente di sviluppo. DOWNLOAD DEL SOFTWARE ED INSTALLAZIONE Il software di Arduino è scaricabile dal sito www.arduino.cc nella sezione download. Se si utilizza come sistema operativo Windows, allora cliccare su windows installer, come si vede in figura. 2
Seguendo tutti i passi, l installazione è estremamente semplice Far lampeggiare un Diodo Led (Per fare questa operazione è necessario avere collegato il microcontrollore Arduino) In questa prima lezione ci proponiamo di collegare un circuito e di scrivere un programma che faccia lampeggiare un diodo led, per fare ciò ci occorrono: Modulo Arduino UNO Cavo di collegamento USB tra Arduino e computer Diodo led Step 1) Collegamento del diodo su Arduino tra il piedino 13 e GND (massa). Attenzione al corretto collegamento 3
Step 2) Per scrivere il programma fare click su start, e poi cliccare sull icona di Arduino, a quel punti si apre la schermata indicata a destra Step 2) Salvare il file con nome ed iniziare a scrivere il seguente programma: void setup () { pinmode(13,output); void loop () { digitalwrite(13,high); 4
delay(3000); digitalwrite(13,low); delay(1000); In una delle prossime lezioni parleremo diffusamente del linguaggio di programmazione, per adesso ci interessa dare la possibilità di capire la semplicità d uso e le potenzialità di Arduino. Ricordando che la parola delay significa ritardo, si può notare che all interno delle parentesi ci sono dei numeri, prima 3000 e poi 1000. Rappresentano il tempo espresso in millisecondi per cui il led resta acceso e spento. In questo caso il diodo led rimane acceso 3 secondi (sarebbero 3000 millisecondi), e spento 1 secondo. Problemi che possono nascere: 1. Per digitare la parentesi graffa nella scrittura dei programmi premere la freccia shift, alt gr e la parentesi quadra Step 3) Una volta scritto il programma si può compilare per vedere se ci sono errori e caricare su microcontrollore Se andrà tutto a buon fine il led si mette a lampeggiare e, mi permetto, il vostro cuore inizierà a battere più forte. Complimenti, siete appena entrati in un mondo nuovo e tutto da scoprire, da dove potete partire e realizzare tante bellissime applicazioni 5
Un ultima nota: può essere che durante il caricamento del software, il computer dia questo errore: Bisogna settare la porta seriale COM giusta. E un operazione semplice, basta seguire le indicazioni che vengono fuori man mano. Semaforo semplice con 3 led In questo secondo esercizio comandiamo tre led che in si accenderanno e spegneranno in sequenza simulando un semaforo. Occorrono 3 led, di colore rosso, giallo e verde, un saldatore, dello stagno ed un filo nero per collegarli al gnd 6
Di seguito il software. Si consiglia di provare a scriverlo senza guardare questo manuale La definizione dei 3 ingressi, denominati verde, giallo e rosso int verde=10; int giallo=11; int rosso=12; La dichiarazione come ingressi void setup (){ pinmode(rosso,output); //inserire led rosso al pin 12// pinmode(verde,output); //inserire led verde al pin 10// pinmode(giallo,output); //inserire led giallo al pin 11// Il ciclo del programma void loop () { digitalwrite(giallo,low); digitalwrite(rosso,high); delay(2000); digitalwrite(rosso,low); digitalwrite(verde,high); delay(2000); digitalwrite(verde,low); digitalwrite(giallo,high); delay(1000); 7
Si consiglia di cambiare i pin di ingresso, il tempo di lampeggiamento ed eventualmente il nome degli ingressi. Il tutto a mò di esercitazione In questo numero vedremo come gestire un ingresso ed un uscita digitale andando a comandare un diodo led tramite un pulsante. Tutto l hardware di cui abbiamo bisogno è indicato in figura: scheda Arduino, Resistenza da 1 k, pulsante, diodo led, bread board, cavetti Il circuito è puramente didattico, rimandiamo al prossimo numero qualche applicazione più sofisticata. Oggi comandiamo semplicemente un led tramite pulsante. Il diodo costituisce l uscita digitale mentre il pulsante rappresenta l ingresso al nostro sistema. Il software da caricare su ATMEL montato su scheda Arduino è il seguente #define LED 13 // LED collegato al pin digitale 13 #define BUTTON 7 // pin di input dove è collegato il pulsante int val = 0; // si userà val per conservare lo stato del pin di input void setup() { pinmode(led, OUTPUT); // imposta il pin digitale come output pinmode(button, INPUT); // imposta il pin digitale come input void loop() { val = digitalread(button); // legge il valore dell'input e lo conserva 8
// controlla che l'input sia HIGH (pulsante premuto) if (val == HIGH) { digitalwrite(led, HIGH); //accende il led else { digitalwrite(led, LOW); //spegne il led Comandiamo un display a Cristalli Liquidi (LCD) #include <LiquidCrystal.h> Scriviamo il software // initialize the library with the numbers of the interface pins LiquidCrystal lcd (12, 11, 5, 4, 3, 2); void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); 9
// Print a message to the LCD. lcd.print("buon Lavoro!"); void loop() { // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setcursor(0, 1); // print the number of seconds since reset: lcd.print(millis()/1000); Interruttore Battimano L interruttore battimani è un divertente progetto ce consente di spegnere e accendere la luce della tua stanza con il semplice battito delle mani Principio di funzionamento Un microfono rileva il battito delle mani trasformandolo attraverso la sua circuiteria in un segnale elettrico apprezzabile dal microcontrollore presente sulla scheda Arduino uno, in quale programmato come di seguito sarà in grado una volta percepito il giusto livello elettrico dal microfono piloterà la scheda di potenza facendo accendere e spegnere la lampada. Lista materiale 10
Realizzazione pratica Alimentare il modulo microfonico dalla scheda Arduino uno a 5 volt e collegare il pin di segnale al pin A0 della scheda Arduino uno come riportato in figura Nb nella schedina microfonica funduino vi è un dotazione un cavetto con colori errati dove il nero è il positivo e quindi va a +5 il giallo è il negativo e va a GND ed il rosso è il segnale e va al pin A0. Passo numero due : adesso bisogna creare la schedina di potenza che controlla la lampada (interfaccia con il microcontrollore) riportiamo sotto lo schema per realizzarla su millefori assemblando i componenti come da schema 11
Una volta realizzata la schedina con un risultato simile a quella sotto in figura non ci rimane che cablarla anche essa con la scheda arduino uno come indicato nello schema sopra Cablare il tutto nel seguente modo : 12
Passo numero tre Ora non ci rimane altro che caricare il seguente programma al microcontrollore di Arduino uno const int analogpin = A0; const int sensib = 600; void setup() { // initialize the LED pin as an output: pinmode(13, OUTPUT); // initialize serial communications: Serial.begin(9600); void loop() { int analogvalue = analogread(analogpin); 13
if (analogvalue > sensib) { PORTB^=B100000; delay(100); Serial.println(analogValue); delay(1); In fine non rimane che collaudare il nostro interruttore battimano. Buon Divertimento Circuito apriscatola x gatti Versione con motore passo passo (Attenzione questo circuito benché perfettamente funzionante può essere utilizzato per imparare a comandare il motore passo passo con Arduino, per quanto riguarda il progetto dell apriscatola in se si consiglia di utilizzare un servomotore) Lista materiale Item Componente Descrizione Quantità 1 Modulo Arduino + cavo 3 Pacco Batterie o PC 9 V 4 fotoresistenza 1 14
5 Resistenza limitatrice 100 1 7 Motore passo passo 1 8 Driver del motore passo passo Scheda elettronica 1 9 Basetta millefori 12 morsetti per millefori 13 Cavi Rosso + nero + Vari colori 15 Ciotola Collegamento Arduino motore passo passo 15
16
17
Software int dirpin = 2; int stepperpin = 3; const int fotoresistenza = 0 ; void setup() { pinmode(fotoresistenza,input); pinmode(dirpin, OUTPUT); pinmode(stepperpin, OUTPUT); Serial.begin(9600); void step(boolean dir,int steps){ digitalwrite(dirpin,dir); delay(50); for(int i=0;i<steps;i++){ digitalwrite(stepperpin, HIGH); delaymicroseconds(100); digitalwrite(stepperpin, LOW); delaymicroseconds(100); void loop(){ Serial.println(analogRead(fotoresistenza)); int lettura=analogread(fotoresistenza); 18
if(lettura > 300){ step(true,1600); delay(500); step(false,1600); delay(5000); Versione servomotore Lo schema elettrico è il seguente: 19
Mentre il software: #include <Servo.h> Servo myservo; // creato servo int fotoresistenza = A0; // analog pin used to connect the potentiometer int rif= 400; void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object void loop() { int analogvalue = analogread (fotoresistenza); if(analogvalue>rif) { myservo.write(90); delay(15); else { myservo.write(0); 20
Auto parking realizzato con conteggio e visualizzazione numero di auto Lista materiale Item Componente Descrizione Quantità 1 Modulo Arduino 2 Cavo Collegamento PC - Arduino 3 Pacco Batterie 9 V 4 Fusibile x batteria 1 A 5 Led IR Tx Sensore passaggio auto 4 6 Fototransistor Rx // 4 7 Resistenza limitatrice 100 2 8 Resistenza 1 k 2 9 LCD 2 x 16 caratteri 1 10 Trimmer 1 k 1 11 Diodo Led Rosso + Verde 2 12 Basetta millefori 13 morsetti per millefori 14 Mammut 15 Cavi Rosso + nero + Vari colori 16 Cavo Flat 12 cavi 17 Struttura in legno di supporto 23 Strip maschi + femmine 21
22
Tabella 1 mappatura PIN Segnali Morsettiera - Colore # PIN Arduino I/O Descrizione #Morsettiera Colore 0 IN Fotocellula 1 0 Blu 1 IN Fotocellula 2 1 giallo 2 OUT Invio dati verso LCD All LCD Bianco/Arancio 3 OUT // // Arancio 4 OUT // // Bianco/Blu 5 OUT // // Bianco 11 OUT Comunicaz. Con LCD // Bianco / rosso 12 OUT // // Bianco 10 OUT Accensione LED Verde 10 Verde 13 OUT Accensione LED Rosso 13 Bianco/Verde #define BUTTON_AVANTI 10 #define BUTTON_INDIETRO 9 #define RED_LED 13 #define GREEN_LED 12 int Contatore = 0; int StatoPulsanteAvanti = 0; // conta il numero di volte che il pulsante è premuto buttonpushcounter // stato corrente del pulsante int StatoPulsantePrecedenteAvanti = 0; int StatoPulsanteIndietro = 0; // stato precedente del pulsante // stato corrente del pulsante int StatoPulsantePrecedenteIndietro = 0; #include <LiquidCrystal.h> 23
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { pinmode(10, INPUT); pinmode(9, INPUT); pinmode(13,output); pinmode(12,output); Serial.begin (9600); // pinmode(9, OUTPUT); //digitalwrite(9, 0); // start with the "dot" off void loop() { StatoPulsanteAvanti = digitalread(button_avanti); conserva // legge il valore dell'input e lo StatoPulsanteIndietro = digitalread(button_indietro); if ((StatoPulsanteAvanti!= StatoPulsantePrecedenteAvanti) (StatoPulsanteIndietro!= StatoPulsantePrecedenteIndietro ) ) { // compara lo stato del pulsante attuale con il precedente if (StatoPulsanteAvanti == HIGH) { // se lo stato è cambiato incrementa il contatore // se lo stato corrente è alto, il pulsante è passato da off a on Contatore++; delay(200); Serial.print("Disponibilita: "); //invio su porta seriale il dato 24
Serial.println(Contatore); lcd.clear(); lcd.print("disponibilità: "); lcd.print(contatore); else if(statopulsanteindietro == HIGH) { // se lo stato è cambiato incrementa il contatore // se lo stato corrente è alto, il pulsante è passato da off a on Contatore--; lcd.clear(); lcd.print("disponibilita: "); lcd.print(contatore); Serial.print("Disponibilita: "); //invio su porta seriale il dato Serial.println(Contatore) StatoPulsantePrecedenteIndietro = StatoPulsanteIndietro; StatoPulsantePrecedenteAvanti = StatoPulsanteAvanti; if (Contatore ==0) { Serial.println("OCCUPATO"); digitalwrite(red_led,1); digitalwrite(green_led,0); // Serial.println("mi riavvio"); else { digitalwrite(red_led,0); 25
digitalwrite(green_led,1); if (Contatore <0) { Serial.println("OCCUPATO"); Contatore = 99; StatoPulsanteIndietro = 0; StatoPulsantePrecedenteIndietro = 0; // Serial.println("mi riavvio"); if (Contatore >=99) { Contatore = 1; StatoPulsanteAvanti = 0; StatoPulsantePrecedenteAvanti = 0; // Serial.println("mi riavvio"); // stampa sulla console "mi riavvio" // Serial.print( Contatore ); 26
Tutor di velocità Lista materiale Item Componente Descrizione Quantità 1 Modulo Arduino 2 Cavo Collegamento PC - Arduino 3 Pacco Batterie 9 V 5 Led IR Tx Sensore passaggio auto 2 6 Fototransistor Rx // 2 7 Resistenza limitatrice 100 2 8 Resistenza 1 k 2 9 LCD 2 x 16 caratteri 1 10 Trimmer 1 k 1 11 Diodo Led Rosso 1 12 Basetta millefori 13 morsetti per millefori 14 Mammut 15 Cavi Rosso + nero + Vari colori 17 Struttura in legno di supporto 18 Macchinina 19 Saldatore + Stagno 20 Pistola a caldo + ricariche 21 Multimetro Digitale 27
28
Tabella 1 mappatura PIN Segnali Morsettiera - Colore # PIN I/O Descrizione #Morsettiera Colore 0 IN Fotocellula 1 0 Blu 1 IN Fotocellula 2 1 giallo 2 OUT Invio dati verso LCD All LCD Bianco/Arancio 3 OUT // // Arancio 4 OUT // // Bianco/Blu 5 OUT // // Bianco 11 OUT Comunicaz. Con LCD // Bianco / rosso 12 OUT // // Bianco 13 OUT Accensione LED Rosso 13 Bianco/Verde const int rx1=5; #define led 13 const int rx2=2; #include <LiquidCrystal.h> LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { lcd.begin(16, 2); pinmode(rx1,input); pinmode(rx2,input); pinmode(led,output); 29
Serial.begin(9600); void loop() { double spazio=0.0031; double tempo=0.0; double velocita=0.0; double t1=0.0; double t2=0.0; int t=1; //Serial.println(analogRead(rx2)); if(analogread(rx1)<100) { t1=millis(); while(t>0) { if(analogread(rx2)<100) { t2=millis(); //prendo il secondo tempo tempo=(t2-t1)/3600000; velocita=spazio/tempo; lcd.clear(); lcd.print("velocita': "); 30
lcd.print(velocita); lcd.setcursor(10,1); lcd.print(" km/h"); Serial.print("velocita': "); //invio su porta seriale il dato Serial.print(velocita); Serial.println(" km/h"); t--; //decremento in modo che t==0 ed esce dal while digitalwrite(led,low); if(velocita>30){ lcd.clear(); lcd.print("velocita': "); lcd.print(velocita); lcd.print(velocita); lcd.setcursor(4,1); lcd.print("rallenta!! "); digitalwrite(led,high); else digitalwrite(led,low); Serial.println("Rallenta "); 31
Serial.flush(); Accensione segnale intelligente Questo progetto prevede di comandare un segnale stradale variandone il valore di velocità visualizzata in caso di pioggia. Il caso proposto prevede due valori di velocità: 90 km/h in caso di mancanza di pioggia e 70 Km/h in caso di pioggia. In pratica è un sensore di pioggia che commuta dall uno all altro valore. Il ritorno al valore più alto quando la pioggia finisce avviene in modo automatico non istantaneamente bensì un certo ritardo (si prevede che dopo la pioggia la strada resti bagnata per un bel pò). Lo schema con relativi componenti di Arduino è il seguente: 32
Infine volendo alimentare il tutto con pannello fotovoltaico di modo da fare un segnale intelligente ed alimentato con fonti rinnovabili (o anche dette pulite) si ha: Per visualizzare i video dei progetti descritti sopra visitare il sito: www.ingegnercozzolino.altervista.org 33
Per i restanti progetti, appartenenti all area.tech c è da implementare il circuito e/o scrivere il software Risposta esatta Il circuito consiste nel creare un supporto di grandezza tipo foglio A4 o un pò più piccolo su cui applicare i pulsanti e nel predisporre Arduino con un certo numero di domande con relative risposte. In caso di riposta esatta la sequenza va avanti da sola mentre in caso di risposta errata si può prevedere di scrivere quella corretta e di andare avanti manualmente con il pulsante di reset. Il punto debole consiste nel fatto che la sequenza di domande è sempre la stessa, si potrebbe scegliere magari con altri pulsanti o con un selettore quale Stendino antipioggia Questo progetto, sebbene molto utile e apprezzato viene qui realizzato in modo didattico comandando un servomotore cui è solidale una copertura o una tenda che si chiude. La potenza del servomotore è molto bassa per cui volendo passare ad un prototipo più grande non sarebbe sufficiente sostituire il servomotore con un motore in corrente continua ed eventuale scheda di comando poiché cambierebbe anche il software. Infine si fa notare che per realizzare questo circuito potrebbe essere sufficiente un relè a doppio scambio ed un trasduttore di pioggia un po più professionale 34
Per visualizzare i video dei progetti descritti sopra visitare il sito: www.ingegnercozzolino.altervista.org 35