Corso Base Arduino ed Elettronica Terzo incontro Sensori e comunicazione con il computer Relatore: Roberto Beligni rbeligni@altratecnoloiga.com
Il comunicazione seriale Per comunicare con la seriale abbiamo bisogno di tre fili: RX (pin 0), TX (pin1) e GND La comunicazione seriale in Arduino deve essere abilitata. Per farlo si da il comando: Serial.begin(speed); Il valore speed può assumere : 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 Sulla seriale si può sia scrivere, con il comando: Serial.print(val, format); Serial.println(val, format); //scrive e va che leggere, con il comando Serial.read(); a capo
Il monitor seriale Dato che il nostro circuito non adotta nessun tipo di display il risultato della conversione A/D verrà archiviato nella variabile analogval e verrà inviato sulla seriale con il comando: Serial.println(analogValue, DEC); Il metodo println della classe Serial invia un testo terminato da un caporiga sul canale seriale. Il metodo richiede due parametri: Valore: è il valore che si vuole mandare sul canale; Formato: il formato in cui deve essere espressa la variabile (se omesso assume valore DEC). I formati possono essere: DEC = Decimali OCT = Ottali XEX = Esadecimali BIN = Binari
La conversione A/D La risoluzione del convertitore A/D è di 10 bit, quindi il valore analogico in ingresso, che è una tensione compresa tra 0V e +5V, viene convertito in un numero a 10 bit che può assumere valori che vanno da 0 a 1023. Infatti 2^10 = 1024 La grandezza continua rappresentata dalla tensione è stata quindi discretizzata ed il numero letto rappresenta una approssimazione del valore vero con una risoluzione 5000 mv /1024 = 4,88 mv Quindi ad esempio un valore 756 corrisponde a circa: 756 * 4,88 mv = 3689,28mV approssimato 3,69V
Potenziometro Materiali: Potenziometro 10K ohm A0
Potenziometro int analogval; //Dichiara una variabile void setup() { Serial.begin(9600); //Attiva la comunicazione seriale void loop() { analogval=analogread(a0); //Legge il valore analogico sul pin, lo converte in digitale e lo assegna alla variabile Serial.println(analogVal, DEC); valore sulla porta seriale delay(200); // Attende 200 millisecondi Compilare e premere il pulsante del monitor seriale sull'ide //Scrive il
int analogval; Conversione A/D float volt; approfondimento. void setup() { Realizziamo un Serial.begin(9600); Voltmetro void loop() { analogval=analogread(a0); volt=(analogval*4.88)/1000; Serial.print( Valore A/D ); Serial.println(analogVal, DEC); Serial.println(analogVal, BIN); Serial.print( Volts ); Serial.println(volt, DEC); delay(1000); Compilare e premere il pulsante del monitor seriale.
int analogval; Conversione A/D float volt; approfondimento. void setup() { Realizziamo un Serial.begin(9600); Voltmetro void loop() { analogval=analogread(a0); volt=(analogval*4.88)/1000; Serial.print( Valore A/D ); Serial.println(analogVal, DEC); Serial.println(analogVal, BIN); Serial.print( Volts ); Serial.println(volt, DEC); delay(1000); Compilare e premere il pulsante del monitor seriale.
Uscite PWM Il Duty Cycle (o PWM) è il rapporto che c è tra il segnale positivo e il periodo totale del segnale ad onda quadra ed è espresso in percentuale. Un Duty Cycle dello 0% equivale ad un segnale Basso continuo (0) Un Duty Cycle del 50% il segnale Alto dura quanto quello Basso (127) Un Duty Cycle del 100% equivale ad un segnale Alto continuo (255)
Uscite PWM Con il PWM è possibile simulare una uscita analogica su un piedino digitale. I pin utilizzabili su Arduino sono il 3, 5, 6, 9,10,11 (contrassegnati dal simbolo ~ ) Il PWM su tali piedini, se impostati come uscite digitali, è abilitato di default: pinmode(pin, OUTPUT); Per impostare il valore PWM in uscita su questi pin si usa il comando: analogwrite(pin, valore); Dove valore varia da 0 (PWM = 0%) a 255 (PWM = 100%) Con il PWM si può, per esempio, pilotare motori, creare variatori di luminosità, ecc..
Uscita PWM regolata da un potenziometro Materiali: Diodo LED, Resistenza 220 ohm, Potenziometro 10k ohm, Pulsante N.A. A0 7 11
Uscita PWM regolata da un potenziometro int analogval; //Dichiara una variabile int impopwm; //Dichiara una variabile void setup(){ pinmode(11, OUTPUT); //Imposta il pin 11 come output pinmode(7, INPUT_PULLUP); //Imposta il pin 7 come input Serial.begin(9600); // Abilita la comunicazione seriale void loop(){ analogval=analogread(a0); //Legge il valore analogico sul pin, lo converte in digitale e lo assegna alla variabile impopwm=analogval/4; //Il valore rilevato dall'a/d va da 0 a 1023, mentre il valore di PWM può andare da 0 a 255 quindi deve essere adattato Serial.println(analogVal, DEC); //Scrive sulla seriale il valore Serial.println(impoPWM, DEC); //Scrive sulla seriale il valore analogwrite(11, impopwm); //Scrive il valore convertito sul pin 11 delay(500); //Attende mezzo secondo
Approfondimento sulla programmazione Nell'esempio precedente abbiamo usato il comando: impopwm=analogval/4 In quanto c'era una proporzione diretta tra la lettura dell' A/D e l'uscita del PWM pari a 4:1 Poteva essere usato anche il comando: map(value, fromlow, fromhigh, tolow, tohigh) Per rimappare i valori da un range ad un altro, quindi: ImpoPWM = map(analogval,0,1023,0,255)
Uscita PWM regolata da pulsanti Materiali: Diodo LED, Resistenza 220 ohm, Potenziometro 10k ohm, 2 Pulsanti N.A. 5 7 11 A0
Uscita PWM regolata da pulsanti #define psu 5 #define pgiu 7 #define luce 11 int intensita=5; // PIN 5 aumenta la luminosità // PIN 7 diminuisce la luminosità // PIN 11 uscita pilotaggio LED // Dichara una variabile e gli preassegna il valore 5 void setup() { pinmode(psu, INPUT_PULLUP); pinmode(pgiu, INPUT_PULLUP); pinmode(luce, OUTPUT); void loop() { analogwrite(luce, intensita); // accende la luce con il livello uguale ad ad intensità, al primo loop sara a valore 5 CONTINUA NELLA PROSSIMA SLIDE...
Uscita PWM - Pulsanti.SEGUE DALLA SLIDE PRECEDENTE if (digitalread(psu) == LOW ) { // verifica se psu è premuto, se si aumenta l'intensità intensita+=5; if (intensita>=255) // Verifica se la soglia MAX è stata raggiunta ed evita di superarla intensita=255; if (digitalread(pgiu) == LOW ) { // verifica se pgiu è premuto, se si riduce l'intensità intensita-=5; if (intensita<=5) // Verifica se la soglia MIN è stata raggiunta ed evita di superarla intensita=5; // il LED non si spengerà mai in quanto intensita non scende mai sotto i 5 delay(300); // Ritardo per antirimbalzo pulzante
Il servo-motore Il servo motore è un piccolo motore in C.C. che tramite un sistema di ingranaggi fa ruotare un albero al quale è collegato un potenziometro. La lettura del valore resistivo del potenziometro fornisce la posizione esatta dell'albero. L'elettronica di verifica è contenuta al suo interno. Per essere azionato, oltre all'alimentazione, occorrerà inviare al servo-motore anche una sere di impulsi opportunamente modulati sia in frequenza che in ampiezza.
Il servo-motore Per approfondimenti andare su: http://www.adrirobot.it/servotester/il_servomotore.htm
Il servo-motore Materiali: Diodo LED, Resistenza 220 ohm, Servo-motore, Potenziometro 10k ohm, Pulsante N.A. 7 9 11 A0
Il servo-motore #include <Servo.h> //Carica la libreria Servo non occorre il ; finale Servo myservo; //Crea l'oggetto myservo int analogval; //Dichiara una variabile int impopwm; //Dichiara una variabile int imposrv; //Dichiara una variabile void setup(){ myservo.attach(9); //Imposta il pin 9 come output per servo su myservo pinmode(11, OUTPUT); //Imposta il pin 11 come output per il led pinmode(7, INPUT_PULLUP); //Imposta il pin 7 come input Serial.begin(9600); // Abilita la comunicazione seriale void loop(){ analogval=analogread(a0); //Legge il valore analogico sul pin, lo converte in digitale e lo assegna alla variabile CONTINUA NELLA PROSSIMA SLIDE...
Il servo-motore. SEGUE DALLA SLIDE PRECEDENTE impopwm = map(analogval,0,1023,0,255); //adatta il valore del potenziometro al valore max della luminosità del LED imposrv = map(analogval,0,1023,0,180); //adatta il valore del potenziometro al tipo di servo Serial.println(analogVal, DEC); //Scrive sulla seriale il valore Serial.println(impoPWM, DEC); //Scrive sulla seriale il valore Serial.println(impoSRV, DEC); //Scrive sulla seriale il valore myservo.write(imposrv); //Scrive il valore convertito sul pin 9 analogwrite(11, impopwm); //Scrive il valore convertito sul pin 11
Corso base arduino ed elettronica Licenza Creative Commons Questa opera di Roberto Beligni è concessa in licenza sotto la Licenza Creative Commons Attribuzione Non commerciale Condividi allo stesso modo 3.0 Italia.