Capitolo Uno

Benvenuto al Capitolo Uno.
Ricordiamo l’esercizio del capitolo precedente, dove ci stavamo allenando ad accendere e spegnere vari led per comporre una sequenza - per esempio:

digitalWrite(2, HIGH);   // turn on LED on pin 2
delay(del);              // wait (length determined by value of 'del')
digitalWrite(2, LOW);    // turn it off
digitalWrite(3, HIGH);   // turn on LED on pin 3
delay(del);              // wait
digitalWrite(3, LOW);    // turn it off
digitalWrite(4, HIGH);   // turn on LED on pin 4
delay(del);              // wait
digitalWrite(4, LOW);    // turn it off
digitalWrite(5, HIGH);   // turn on LED on pin 5
delay(del);              // wait
digitalWrite(5, LOW);    // turn it off
digitalWrite(6, HIGH);   // turn on LED on pin 6
delay(del);              // wait
digitalWrite(6, LOW);    // turn it off
digitalWrite(7, HIGH);   // turn on LED on pin 7
delay(del);              // wait
digitalWrite(7, LOW);    // turn it off
digitalWrite(8, HIGH);   // turn on LED on pin 8
delay(del);              // wait
digitalWrite(8, LOW);    // turn it off
digitalWrite(9, HIGH);   // turn on LED on pin 9
delay(del);              // wait
digitalWrite(9, LOW);    // turn it off

Questo è ripetitivo e noioso, tuttavia è possibile semplificare le cose utilizzando il comando for.

Lo scopo del comando for è quello di far ripetere una parte dello sketch per un certo numero di volte( ovviamente questo numero deve essere intero, poiché non è possibile ripetere un loop 3,141 volte!).
Di seguito è riportato un esempio molto semplice che permette di fare l’effetto supercar, lo stesso visto nell’esercizio del capitolo 0, questa volta utilizzando il ciclo for:

/*
Esercizio 1.1 – uso del comando “for” nell’esercizio 0,1
Creato 10/10/2013
By Simone Sormani

http://myweb96.altervista.org

Basato sullo sketch di John Boxall

*/

int del=100;  //impostiamo un valore default di delay, 1000 millisecondi (un secondo)
void setup()
{
  // inizializziamo I pin digitali come uscite:
  for (int i = 2; i<=9 ; i++)
  {
    pinMode(i, OUTPUT);
  } // fine del ciclo for
} // fine del setup
void loop()
{
  for (int i = 2; i<=9; i++) // lampeggiano I led dal pin 2 al pin 9
  {
    digitalWrite(i, HIGH);
    delay(del);
    digitalWrite(i, LOW);
  }
  for (int i = 8; i>=3; i--) // lampeggiano I led dal pin 8 al pin 3
  {
    digitalWrite(i, HIGH);
    delay(del);
    digitalWrite(i, LOW);
  }
}

Beh, non è meglio? usando for abbiamo risparmiato un sacco di tempo, e l’uso delle variabili permette una modifica più facile dello sketch.

Passando ad altro, vediamo un’altra cosa veloce:
Hai bisogno di un numero intero casuale? Facile!
La funzione random(x) restituisce un valore intero compreso tra 0 e x-1. Per esempio se hai bisogno di un numero casuale compreso tra 0 e 255, utilizza random(256).
Tuttavia, usando random() non è del tutto casuale, è necessario inizializzare il generatore di numeri casuali all’interno del chip di Arduino.
Usate randomSeed(analogRead(0)) , o un altro pin analogico libero. È inoltre possibile specificare un intervallo, per esempio random(10,20) produrrà un numero compreso tra 10 e 19 (il minimo del range è compreso, il massimo è escluso - per questo l’intervallo è 10~19).

Un altro punto all’ordine del giorno è il PWM (pulse width modulation). La modulazione in larghezza dell’impulso è un tipo di modulazione digitale che permette di ottenere una tensione variabile dipendente dal rapporto tra la durata dell’impulso positivo e di quello negativo. L’occhio umano non sarà in grado di  avvertire questo “lampeggio” ma vedrà solo che il led è più o meno luminoso.
Il PWM quindi è considerata una tecnica per ottenere segnali analogici mediante mezzi digitali.

Ora è il momento di divertirsi un po’ con il PWM e i colori. Massimo ha citato l’uso di un led rosso, verde e blu per creare qualsiasi colore dello spettro. Questo può essere fatto facilmente(come la maggior parte delle cose) con il tuo Arduino! Puoi ricordarti, da quando eri a scuola a lezioni di arte, che  rosso + giallo = arancio, rosso + verde = blu, e cosi via. È possibile creare lo stesso effetto utilizzando i led, e anche il variare della luminosità tra loro per ottenere l’intero spettro dei colori.
Per prima cosa, diamo un’occhiata a come i colori primari possono essere usati per creare tutti i tipi di colori. Questo esempio illustra brevemente la possibilità di sperimentare con il rosso, il verde ed il blu.

Ecco cosa hai bisogno:

• La tua configurazione standard di Arduino (Computer, cavo, Arduino Uno o compatibile);
• Un LED RGB a catodo comune da 5mm;
• 2 resistenze da 180 ohm 1/4W;
• 1 resistenza da 330 ohm 1/4W;
• Una breadboard e dei jumper
• Una telecamera (opzionale) – per documentare il tuo successo!

Il circuito è abbastanza semplice, tuttavia i piedini del led possono essere ingannevoli..
ecco com’è la loro disposizione:

Le resistenze sono collegate tra le uscite PWM di Arduino i singoli anodi del led. 

 

 

Guarda lo schema seguente:

E qui c’è il codice… oops lo sketch:

/*
Esempio 1.2 -divertirsi con il PWM e il LED RGB - Creato il 04/11/2013
Basato sullo sketch di John Boxall
By Simone Sormani
http://myweb96.altervista.org
*/
int red = 11; // i pin del LED
int green = 9;
int blue = 10;
int i = 0; // per i cicli
int j = 0;
void setup()
{
  pinMode(red, OUTPUT); // dice all'Arduino che il led è un output
  pinMode(green, OUTPUT);
  pinMode(blue, OUTPUT);
}
void loop()
{
  // Per prima cosa, il ciclo di ciascun colore primario per due volte
  for (j = 1; j < 6; j++)
  {  // loop 5 volte
    for (i = 0; i < 255; i++)
    { // loop da 0 a 254 (dissolvenza)
      analogWrite(red, i);      // imposta la luminosità del LED
      delay(20); // Aspetta 10ms perchè analogWrite non è istantaneo
    }
    analogWrite(red,0);
    delay (20);
    for (i = 0; i < 255; i++)
    { // loop da 0 a 254 (dissolvenza)
      analogWrite(green, i);      // imposta la luminosità del LED
      delay(20); // Aspetta 10ms perchè analogWrite non è istantaneo
    }
    delay (20);
    analogWrite(green,0);
    for (i = 0; i < 255; i++)
    { // loop da 0 a 254 (dissolvenza)
      analogWrite(blue, i);      // imposta la luminosità del LED
      delay(20); // Aspetta 10ms perchè analogWrite non è istantaneo
    }
    delay (20);
    analogWrite(blue,0);
  }
  // luce psichedelica
  for (j = 1; j < 10000; j++)
  {
    analogWrite(red,random(255)); // imposta il rosso con luminosità random da 0 a 254
    delay (random(30,51));           // aspetta per un tempo da 30 a 50 millisecondi
    analogWrite(green,random(255));
    delay (random(30,51));
    analogWrite(blue,random(255));
    delay (random(30,51));
  }
}

Qui è possibile vedere il LED in azione:

Il LED utilizzato non è a catodo comune, bensì ad anodo comune, quindi è stato riadattato lo sketch al fine di ottenere un funzionamento simile.

Non era così divertente? Spero ti sia piacuto. Non fissare il led per troppo tempo però…ci stiamo muovendo verso i sensori analogici!

È tempo di conoscere un nuovo comando: if… else.
più spesso il tuo sketch avrà bisogno di prendere una decisione. è un interruttore ON? o un interruttore OFF? Se la variabile pH è uguale a 8657309 manderò quel numero al modulo GSM per comporre il numero! Ancora una volta, con Arduino, è semplice.

Per esempio: se il valore di temperatura è maggiore di 100, spegni il pin 13, altrimenti accendilo.

if (temperature > 100)
{
digitalWrite(13,LOW); //spegni il LED
}
else
{
digitalWrite(13,HIGH); //accendi il led
}

Puoi inoltre estendere questo con else if…

Per esempio: se il valore di temperatura è maggiore di 100, spegni il pin 13, altrimenti se il valore dell’umidità è maggiore di 80 accendi il pin 7.

if (temperature > 100)
{
digitalWrite(13,LOW); //spegni il LED
}
else if (humidity>80)
{
digitalWrite(7,HIGH); //accendi il pin 7
}

Con if…else puoi inoltre utilizzare sei operatori:

•   ==  Uguale
•   > Maggiore di
•   < Minore di
•   >= Maggiore o uguale a
•   <= Minore o uguale a
•   != Diverso da

A questo punto possiamo fare una pausa e prendere un po’ di aria fresca. Perché dopo questa è il momento di…

Esercizio 1.3

Ora noi vogliamo mettere insieme tutto quello imparato finora e fare qualcosa che abbia input analogici, uscite digitali, e un sacco di LED… un voltmetro! Immagina una barra grafica composta da 10 LED, ognuno di essi rappresenta un intervallo di tensione.
L’intervallo del voltmetro sarà da 0 a 10 V DC (corrente continua) – ideale per testare batterie e celle prima di buttarle in spazzatura.

Questo suona come un sacco di lavoro (sketch, non buttare via le batterie), ma non lo è quando si scompone tutto in più piccole attività. Pensiamoci un attimo…

Sappiamo che analogRead() può misurare tensioni tra 0 e 5 volt, e restituire un numero intero compreso tra 0 e 1023. Ah, ma noi vogliamo misurare un massimo di 10V. Facile, utilizziamo un partitore di tensione. Utilizziamo due piccole resistenze di uguale valore (per esempio 560 ohm 1/4W).Poi, dobbiamo convertire il valore letto da analogRead() in un valore di tensione che ci accenderà il rispettivo LED.

Sappiamo che la funzione ci restituirà un valore tra 0 e 1023, nel nostro caso ci riferiamo all’intervallo 0 ~ 10 volt. Così ogni LED si riferisce a un decimo del valore massimo. Quindi il primo LED dovrà accendersi se analogRead() restituisce un valore tra 0 e 102,3 (in realta 102 ritorna come numero intero, non come numero reale). Il secondo LED dovrà accendersi se analogRead() restituirà un valore tra 103 e 205. E così via.

Il resto dovrebbe essere facile… usa le nuove capacità decisionali per decidere quale LED deve accendersi (e non dimenticarti di spegnerlo) mentre tu sei lontano dal circuito…

Ora, ecco cosa hai bisogno:

• La tua configurazione standard di Arduino (Computer, cavo, Arduino Uno o compatibile);
• 10 LED a tua scelta. quelli standard da 5mm vanno bene;
• 3 resistenze da 560 ohm 1/4W;
• Una breadboard e dei jumper
• Una telecamera (opzionale) – per documentare il tuo successo!

Così qui c’è il nostro schema di montaggio:

E qui eccolo nella vita reale:

…e qui il tutto all’azione! Abbiamo collegato un alimentatore variabile per avere una migliore dimostrazione…

…Tuttavia a causa della tolleranza della resistenza e di altri problemi nelle letture analogiche causate dall’utilizzo di una breadboard, il nostro voltmetro era un po’ impreciso. Così ha richiesto un po’ di calibrazione. Ci sono due modi con cui si può ottenere un buon risultato:

• mettendo un resistore variabile nel partitore di tensione, poi collegando una fonte nota, per esempio i 5V provenienti da un regolatore LM7805, quindi regolando la resistenza variabile fino a quando il LED 5 non rimane acceso;

• mettendo un altro voltmetro (per esempio un multimetro) sopra l’ingresso di tensione per misurare la tensione misurata dal nostro voltmetro; utilizziamo le funzioni Serial.begin e Serial.println() per inviare il valore letto al computer tramite l’IDE di Arduino; regoliamo la tensione da misurare fino a coprire 1,2,… 10 V – rilevando cosi le letture sull’uscita seriale.Poi sostituiamo i valori nel ciclo if..then per accendere il relativo LED.

Il secondo metodo è più accurato e facile da fare, così ho anche inserito il codice seriale. 

Come è andata? Ha funzionato al primo colpo? È ok anche se così non fosse, sbagliando si impara…

Ricorda, se hai domande, lascia un commento in fondo a questo post e ti risponderò. Ma per farti risparmiare tempo, qui trovi lo sketch:

Così lo hai. Oggi hai imparato molte cose utili che ti aiuteranno nel tuo cammino con Arduino.
Per ora è tutto, Alla prossima.

Condividi su: