Archivi categoria: i miei allievi

Esercizio Arduino in 60 minuti – usare un display OLED

Avevo fatto una promessa ad un amico per un progetto ed ora è arrivato il tempo… 🙂

Qualche tempo fa feci una serie di acquisti elettronici da utilizzare in sperimentazioni che sto conducendo in queste settimane, tra questi un piccolo display OLED da utilizzare per dare espressione ad un piccolo robot didattico di cui sto progettando la struttura da stampare in 3D.
Come sempre questo breve articolo oltre ad essere un tutorial per quanti lo vorranno utilizzare, sarà la mia nota su cui svolgere lezioni con gli allievi.

Ciò che utilizzo è un piccolo display da 0,96 pollici OLED con risoluzione di 128×64 pixel, monocromatico bianco e quindi dalle dimensioni contenutissime solo 2.7 x 2.8 cm che utilizza il protocollo SPI, interessantissimo l’angolo di visione che è maggiore di di 160°. Acquistato su banggood ad un prezzo estremamente contenuto. Fate attenzione che le immagini riportate differiscono leggermente dal prodotto che vi verrà consegnato.
Le dimensioni del display sono tali che lo rendono ad esempio particolarmente adatto per realizzare ad orologi da polso, piccoli dispositivi medici elettronici, o sistemi wearable.
Per ora mostrerò come visualizzare caratteri e immagini, lascerò a voi gli ulteriori sviluppi.

Il driver che pilota il display è un SSD1306, tensione di alimentazione dai 3,3V ai 6V circa.
Il pilotaggio avviene utilizzando solo due pin I/O

oled

oled01

Ma cosa è il protocollo SPI?

Come probabilmente saprete per rendere semplice il trasferimento di informazioni tra sensori e microcontrollori sono stati realizzati due tipologie di protocolli: I2C (Inter-Integrated Circuit) e SPI (Serial Peripheral Interface). Le librerie di arduinio permettono di utilizzare questi protocolli con estrema facilità.
In fase progettuale la scelta del protocollo dipende dal tipo di dispositivo che si vuole utilizzare. Sicuramente potrete trovare in commercio dispositivi che permettono di utilizzare entrambi i protocolli ma è più comune trovare dispositivi che supportano un solo standard.

Non mi dilungherò in questa fase sui pregi e difetti dell’uno o dell’altro protocollo, sarà oggetto di un futuro articolo (già in cantiere) vi dico solamente che il vantaggio principale di I2C e che richiede solamente due linee, una di clock e una linea unica per i dati utilizzata sia come input che come output, per tutti i dispositivi I2C collegati al microcontrollore in cascata, quindi solo due linee a cui collegherete tutti i dispositivi I2C, però la velocità di trasmissione dei dati è inferiore a quella del protocollo SPI, nell’I2C i dati possono viaggiare solo in una direzione alla volta, ciò che non accade nell’SPI.
Nell’SPI i dati possono viaggiare ad una velocità maggiore le linee di input e di output sono separate per cui potrete inviare e ricevere dati contemporaneamente, per contro l’utilizzo di dispositivi SPI richiede una linea di connessione in più che permette di selezionare da parte del master SPI, nel nostro caso Arduino, il dispositivo che si desidera utilizzare.

Vedremo più avanti, con specifici tutorial, la differenza precisa tra questi due protocolli di comunicazione.

SPI dispone di due linee separate per l’input identificata con la sigla MOSI e per l’output identificata con la sigla MISO ed una linea per il clock. A queste tre linee vengono collegati uno o più slave e questi vengono selezionati dal master SPI attraverso la linea Slave Select (SS). Il disegno che segue chiarisce meglio quanto appena detto.

collegamenti-master-slave-spi

Partiamo con la sperimentazione

Schema di collegamento

schema-collegamento01

schema-collegamento02

schema-collegamento03

la corrispondenza di collegamento display -> Arduino è la seguente:

GND -> GND
Vcc -> 3.3V
MOSI -> 11
CLK -> 12
DC -> 9
CS -> 8

Passo 1

E’ indispensabile effettuare il download della libreria da GitHub della libreria Adafruit_SSD1306, fate click sul pulsante “Download ZIP”

github01

Nella pagina di riferimento, su GitHub trovate il link alla libreria Adafruit-GFX che deve essere anch’essa prelevata, anche in questo caso click su “Download Zip” per scaricare la libreria

Nella pagina di riferimento della libreria GFX trovate due risorse utili per la conversione di un immagine BMP in codice esadecimale, saranno utilizzeremo durante questo tutorial.

github02

Passo 2

Rinominiamo le librerie:

Adafruit_SSD1306-master -> Adafruit_SSD1306
Adafruit-GFX-Library-master -> Adafruit-GFX-Library

librerie01

librerie02

Passo 3

Spostiamo le librerie nella cartella “libraries” di Arduino e riavviamo l’IDE

librerie03

Se non ricordate dove è allocata la vostra libraries di Arduino, aprite l’IDE: File -> Preferences
Il percorso della cartella in cui sono memorizzati i vostri sketch è indicata in “Sketchbook location” in essa troverete anche la cartella libraries

librerie04

librerie05

Passo 4

Nella cartella Adafruit_SSD1306 trovate la cartella examples

librerie06

Passo 5

Selezionate l’esempio corrispondente al vostro display, nel mio caso ssd1306_128x64_spi

Il codice che segue vi permetterà di visualizzare a centro display il testo “Salve mondo”:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// visualizzazione di un testo su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);

  // cancelliamo lo schermo
  display.clearDisplay();

  // impostiamo il colore a bianco (in questo tipo di dsiplay possimo impostare solo bianco e nero)
  display.setTextColor(WHITE);

  // fissiamo la dimensione del testo
  display.setTextSize(1);

  // posizioniamo il cursore nella posizione x: 35; y: 32
  display.setCursor(32,32);

  // stampiamo su display il messaggio
  display.print("Salve mondo");

  // abilitiamo il display alla visualizzazione
  display.display();
}


void loop() {
// loop vuoto
}

Passo 6

Vediamo ora come muovere un testo sullo schermo, faremo oscillare il testo “Salve mondo” dall’alto verso il basso”

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// visualizzazione di un testo in movimento su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);

  // cancelliamo lo schermo
  display.clearDisplay();

  // impostiamo il colore a bianco (in questo tipo di dsiplay possimo impostare solo bianco e nero)
  display.setTextColor(WHITE);

  // fissiamo la dimensione del testo
  display.setTextSize(1);
}


void loop() {
  // movimento verso il basso
  for (int i = 0; i < 56; i++) {
    // incrementiamo la coordinata i (coordinata y)
    // fino a quando i < 56
    // Viene fissata la coordinata x
    // per far scorrere il testo sulla stessa colonna
      
    display.setCursor(32, i);
    display.print("Salve mondo");
    display.display();
    display.clearDisplay();
  }
  // movimento verso l'alto
  for (int i = 56; i > 0; i--) {
    // decrementiamo la coordinata i (coordinata y)
    // fino a quando i > 0
    // Viene fissata la coordinata x
    // per far scorrere il testo sulla stessa colonna
    
    display.setCursor(32, i);
    display.print("Salve mondo");
    display.display();
    display.clearDisplay();
  }
}

Come specificato nei commenti per consentire il movimento sulla verticale incrementiamo e decrementiamo la coordinata y della funzione display.setCursor(x, y);

Passo 7

Vediamo ora come visualizzare un’immagine sul display.
Per effettuare questa conversione, come detto in precedenza è necessario convertire un’immagine bitmap in un array di codici esadecimali che verranno inseriti come matrice all’interno dello sketch Arduino, questo tipo di conversione potete effettuarla in diversi modi, per gli utenti Windows esiste l’utilissimo programma: LCD Assistant che vi permetterà di convertire immagini adatte per un gran numero di tipi di display.
Il programma genera un file che può essere utilizzato con qualsiasi compilatore C per AVR, ARM, PIC, 8051 e molti altri.

Poiché sono utente Mac ho utilizzato l’applicazione Java Img2Code che trovate seguendo il link da cui avete prelevato Adafruit-GFX-Library

Al fondo della pagina trovate il link al programma java Img2Code
(Per chi volesse provate trovate sempre nella stessa pagina trovate un link ad un plug-in di GIMP)

scaricate sul vostro computer e fate doppio click su: Image2Code.jar

image2code

Create la vostra immagine, che ovviamente deve essere di dimensione non superiore a 128×64

faccina-uno

Dal programma Image2Code.jar click sul pulsante “Choose file”

image2code02

image2code03

image2code04

image2code05

Selezionate il codice esadecimale generato e inseritelo all’interno dell’array a cui abbiamo dato il nome faccinaUno così come potete visualizzare nel codice

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// visualizzazione di un bitmap su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x30,0x6,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x1c,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x80,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xfc,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7f,0xc0,0x0,0x0,0x1,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfe,0x0,0x0,0x3f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}


void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaUno nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaUno, 128, 64, WHITE);

  // attiviamo il display
  display.display();
}

Passo 8

Nell’esempio ho utilizzato una immagine di dimensioni 128×64 ma ovviamente avrei potuto utilizzare immagini più piccole, come mostrato nel codice seguente in cui utilizzo il bitmap di dimensioni 48×48 px:

faccina-uno

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// visualizzazione di un bitmap su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI   11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0xff,0xff,0xff,0xff,0x0,
0x1,0xff,0xff,0xff,0xff,0x80,
0x3,0xff,0xff,0xff,0xff,0xc0,
0x7,0xff,0x3f,0xfc,0xff,0xc0,
0x7,0xfe,0x1f,0xf8,0x7f,0xe0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x3f,0xfc,0xf,0xf0,0x3f,0xfc,
0x3f,0xfe,0x1f,0xf8,0x7f,0xfc,
0x3f,0xff,0x3f,0xfc,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xe7,0xff,0xff,0xe7,0xfc,
0x3f,0xcf,0xff,0xff,0xf3,0xfc,
0x3f,0x9f,0xff,0xff,0xf9,0xfc,
0x1e,0xf,0xff,0xff,0xf0,0x78,
0x1f,0xcf,0xff,0xff,0xf3,0xf8,
0x1f,0xe7,0xff,0xff,0xe7,0xf8,
0xf,0xf3,0xff,0xff,0xcf,0xf0,
0xf,0xf9,0xff,0xff,0x9f,0xf0,
0x7,0xfc,0x7f,0xfe,0x1f,0xe0,
0x3,0xfe,0x1f,0xf8,0x7f,0xc0,
0x3,0xff,0x0,0x0,0xff,0xc0,
0x1,0xff,0xc0,0x3,0xff,0x80,
0x0,0xff,0xfc,0x3f,0xff,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}


void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaUno nella posizione (40,8) impostando il colore a bianco
  display.drawBitmap(40, 8, faccinaUno, 48, 48, WHITE);

  // attiviamo il display
  display.display();
}

Passo 9

Vediamo ora come visualizzare in sequenza tre immagini differenti.
Il procedimento è molto semplice, e sufficiente inserire gli array corrispondenti al bitmap che si intendono utilizzare.
Nell’esempio che segue ho utilizzato tre immagini:

faccina-uno

faccina-due

faccina-tre

Ho utilizzato i tre array con nome: faccinaUno, faccinaDue, faccinaTre

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// visualizzazione tre bitmap in sequenza su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI  11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x30,0x6,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x1c,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x80,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xfc,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7f,0xc0,0x0,0x0,0x1,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfe,0x0,0x0,0x3f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

const unsigned char PROGMEM faccinaDue [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3e,0x0,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3f,0x80,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3f,0xc0,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf0,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf8,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xfe,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xff,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0x80,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x1c,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xc0,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x1,0xf0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7e,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3f,0xe0,0x0,0x0,0x1,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xfe,0x0,0x0,0x3f,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

const unsigned char PROGMEM faccinaTre [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3c,0x1e,0x0,0x0,0x3c,0x1e,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x7,0x0,0x0,0x70,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x70,0x6,0x0,0x0,0x30,0x7,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x30,0x6,0x0,0x0,0x30,0x6,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x38,0xe,0x0,0x0,0x38,0xe,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1c,0x1c,0x0,0x0,0x1c,0x1c,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xfc,0x0,0x0,0x1f,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xf,0xf8,0x0,0x0,0xf,0xf8,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7,0xf0,0x0,0x0,0x7,0xf0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1,0xc0,0x0,0x0,0x1,0xc0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x18,0x0,0x0,0x0,0x0,0x0,0x0,0xc,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0xe,0x0,0x0,0x0,0x0,0x0,0x0,0x38,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x7,0x80,0x0,0x0,0x0,0x0,0x0,0xf0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,0x3,0xe0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0xfc,0x0,0x0,0x0,0x0,0x1f,0x80,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x7f,0xe0,0x0,0x0,0x3,0xff,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x1f,0xff,0xc0,0x1,0xff,0xfc,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xff,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xff,0xff,0xfc,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xff,0xff,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0xf,0xff,0xff,0xf0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x7,0xff,0xff,0xe0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xff,0xff,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xff,0xff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x7f,0xfe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1f,0xf8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3,0xc0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}

void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaUno nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaUno, 128, 64, WHITE);
  
  // attiviamo il display
  display.display();

  //Manteniamo persistente l'immagine per 1 secondo
  delay(1000);
  
  // cancelliamo lo schermo
  display.clearDisplay();
  
  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaDue nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaDue, 128, 64, WHITE);
  display.display();

  //Manteniamo persistente l'immagine per 1 secondo
  delay(1000);
  
  // cancelliamo lo schermo
  display.clearDisplay();

  // visualizziamo il bitmap di dimensione 128x64 px con nome: faccinaTre nella posizione (0,0) impostando il colore a bianco
  display.drawBitmap(0, 0, faccinaTre, 128, 64, WHITE);
  display.display();
  
  //Manteniamo persistente l'immagine per 1 secondo
  delay(1000);
}

Passo 10

Vediamo ora come muovere un’immagine su schermo, utilizzeremo una tecnica simile a quanto visto nel secondo sketch di questo tutorial.
Muoviamo da sinistra verso destra l’immagine:

faccina-uno

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// movimento di un bitmap su display OLED
// Prof. Michele Maffucci
// 02.10.15

// utilizzo di dispositivo SPI
// dispositivo -> Arduino

#define OLED_MOSI  11
#define OLED_CLK   12
#define OLED_DC    9
#define OLED_CS    8
#define OLED_RESET 10

Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

// array dell'immagine convertita
const unsigned char PROGMEM faccinaUno [] =
{
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0xff,0xff,0xff,0xff,0x0,
0x1,0xff,0xff,0xff,0xff,0x80,
0x3,0xff,0xff,0xff,0xff,0xc0,
0x7,0xff,0x3f,0xfc,0xff,0xc0,
0x7,0xfe,0x1f,0xf8,0x7f,0xe0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0xf,0xfc,0xf,0xf0,0x3f,0xf0,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x1f,0xfc,0xf,0xf0,0x3f,0xf8,
0x3f,0xfc,0xf,0xf0,0x3f,0xfc,
0x3f,0xfe,0x1f,0xf8,0x7f,0xfc,
0x3f,0xff,0x3f,0xfc,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xff,0xff,0xff,0xff,0xfc,
0x3f,0xe7,0xff,0xff,0xe7,0xfc,
0x3f,0xcf,0xff,0xff,0xf3,0xfc,
0x3f,0x9f,0xff,0xff,0xf9,0xfc,
0x1e,0xf,0xff,0xff,0xf0,0x78,
0x1f,0xcf,0xff,0xff,0xf3,0xf8,
0x1f,0xe7,0xff,0xff,0xe7,0xf8,
0xf,0xf3,0xff,0xff,0xcf,0xf0,
0xf,0xf9,0xff,0xff,0x9f,0xf0,
0x7,0xfc,0x7f,0xfe,0x1f,0xe0,
0x3,0xfe,0x1f,0xf8,0x7f,0xc0,
0x3,0xff,0x0,0x0,0xff,0xc0,
0x1,0xff,0xc0,0x3,0xff,0x80,
0x0,0xff,0xfc,0x3f,0xff,0x0,
0x0,0x7f,0xff,0xff,0xfe,0x0,
0x0,0x3f,0xff,0xff,0xfc,0x0,
0x0,0x1f,0xff,0xff,0xf8,0x0,
0x0,0x7,0xff,0xff,0xe0,0x0,
0x0,0x1,0xff,0xff,0x80,0x0,
0x0,0x0,0x3f,0xfc,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0,
0x0,0x0,0x0,0x0,0x0,0x0
};

// viene controllato se stiamo utilizzando esattamente un display a 64 righe
#if (SSD1306_LCDHEIGHT != 64)
#error("Assolutamente non corretto! Per favore correggi Adafruit_SSD1306.h!");
#endif

void setup()   {
  Serial.begin(9600);

  // per default by default viene impostata una tensione ionterna di 3.3V
  display.begin(SSD1306_SWITCHCAPVCC);
}


void loop() {
  // cancelliamo lo schermo
  display.clearDisplay();

  // partendo dalla posizione (0,8) spostiamo da sinistra verso destra
  // l'immagine di dimensione 48x48 px con nome: faccinaUno fino alla coordinata (48,8)

  // movimento da SX a DX
  for (int i = 0; i < 80; i++){
    display.drawBitmap(i, 8, faccinaUno, 48, 48, WHITE);
    // attiviamo il display
    display.display();
    // cancelliamo lo schermo
    display.clearDisplay();
  }

  // movimento da DX a SX
  for (int i = 80; i > 0 ; i--){
    display.drawBitmap(i, 8, faccinaUno, 48, 48, WHITE);
    // attiviamo il display
    display.display();
    // cancelliamo lo schermo
    display.clearDisplay();
  }
}

Grazie per aver sperimentato insieme a me 🙂

Usare i relè non è stato mai così semplice – puntata 2

Come gi� accennato qualche post fa, fortunatamente la caparbiet� di due miei studenti Michael e Vlad � tale che sono riusciti a sistemare e mettere in funzione�la strumentazione pneumatica, abbandonata da tempo, �per costruire un pannello didattico che mi permetter� di strutturare percorsi di approfondimento sull’automazione industriale. Poich� questo lavoro � utile �lodevole, mi piace segnalare�l’avanzamento dei lavori su queste pagine con il video che vi allego (un’enorme Grazie al collega Piergiuseppe che li sta guidando).�Ora il�sistema dovr� essere modificato in modo che sposti e riconosca�dei pezzi meccanici in modo da�simulare un percorso di una catena di montaggio e quindi metter� mano alla mia dotazione personale con schede:�sensoristica varia, bluetooth, WiFi, GSM per strutturare le future evoluzioni:

  • Controllo remoto via bluetooth che potr� governare remotamente (tablet o smartphone) il movimento dei pistoni.
  • Controllo remoto via WiFi�che potr� governare remotamente (tablet o smartphone) via internet mediante interfaccia web, il movimento dei pistoni.
  • Tramite scheda GSM, invio degli allarmi.

Evoluzione:

Realizzare su pannello�con�una centralina di programmazione costituita da un Raspberry Pi 2 da utilizzare per programmare la scheda �Arduino che governa il circuito pneumatico.

Grazie Ragazzi.

allievi

Usare i relè non è stato mai così semplice

Le attività che gli studenti mi propongono sono tantissime e sovente capita che alcune proposte, oltre ad essere spendibili da un punto di vista pratico, mi aiutino ad impostare una futura didattica fatta di oggetti che in altro modo verrebbero dismessi o gettati in un angolo a prender polvere.
E’ questo il caso di un vecchio panello di pneumatico che qualche anno fa veniva utilizzato collegato a dei vecchi PLC, negli anni si sono perse diverse componenti e per l’italico disinteresse è stato riposto in un angolo del laboratorio.
Fortunatamente la volontà caparbia e positiva di due mie allievi di 5′, Michael e Vlad, con l’aiuto dell’amico collega Piergiuseppe, ha rimesso in attività il dispositivo. L’idea, nata dal suggerimento dei ragazzi è quella di mostrare come poter pilotare una serie di pistoni usando relè pneumatici e finecorsa, con controllo fatto sia con PLC che con Arduino, ciò mi permetterà, come loro stessi mi hanno chiesto di fare 🙂 di mostrare come è possibile governare oggetti “industriali” (i pistoni) programmando in LADDER con i PLC oppure in C con Arduino. Perchè non raccogliere questa splendida idea e farne una cosa utile?

pannello-in-costruzione-01

pannello-in-costruzione-02

Mentre l’attenzione dei ragazzi in questo momento è concentrata sulla sistemazione del pannello, io ho cercato una soluzione a bassissimo costo e di immediato utilizzo per interfacciare velocemente Arduino ad una serie di relè che mi potesse governare l’attivazione di una serie di contatti.
L’idea iniziale prevedeva la realizzazione di una scheda con una serie di relè e componentistica accessoria di cui dovevo realizzare un semplice PCB, ma una rapida ricerca mi ha permesso di trovare una soluzione migliore, sia dal punto di vista economico che dal punto di vista di praticità in classe, ho optato per l’acquisto della scheda: 8 Channel 5V Relay Module For Arduino UNO 1280 2560 ARM PIC acquisto fatto su Bangood.
La scheda è composta da ben 8 relè costituiti ciascuno un contatto normalmente aperto ed uno normalmente chiuso, il cui circuito di comando è a 5V e quindi direttamente pilotabile dalle uscite di Arduino, sul circuito di potenza potete collegare dispositivi funzionanti ad una tensione massima di 250VCA 10A oppure 30VCC 10A. Ho effettuato una semplice prova pilotando una striscia led alimentata a 12VCC.

rele01

rele02

La scheda è dotata di 12 pin:

  • da IN1 a IN8 abbiamo i comandi dei singoli relè, questi ingressi saranno collegati alle uscite digitali di Arduino
  • Vcc collegato a 5Vcc di Arduino
  • GND collegato al GND di Arduino
  • COM e GND ponticellati tra loro

La scheda dispone, per ciascuno dei relè, di un led che ne mostra l’attivazione.

Nell’esempio riportato di seguito i collegamenti tra scheda Arduino e scheda relè sono:

Arduino -> Scheda relè
Pin3    -> IN1
Pin4    -> IN2
Pin5    -> IN3
Pin6    -> IN4
Pin7    -> IN5
Pin8    -> IN6
Pin9    -> IN7
Pin10   -> IN8
5Vcc    -> VCC
GND     -> GND

rele04

rele03

Sketch di esempio:

// Prof. Michele Maffucci
// 06.02.15
// Esempio di attivazione sequenziale di 8 relè

// inizializzazione delle 8 uscite digitali dalla 2 alla 9
void setup() {
  for (int i=2; i<10; i++) {
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for (int r=2; r<10; r++) { // sequenza di attivazione e disattivazione dei contatti degli 8 relè 
    digitalWrite(r, HIGH);
    delay(250);
    digitalWrite(r, LOW);
    delay(250);
  }
}

Controllo accensione di una striscia led a 12Vcc

rele05

Esercizio Arduino in 5 minuti – usare un Sensor Tracking

Continuo la recensione del kit sensori di cui avevo parlato qualche giorno fa con questo breve post che nasce dall’esigenza di un lettore del blog che mi ha chiesto come utilizzare il sensor tracking incluso nella confezione. Il sensore si presenta come una piccola scheda elettronica i cui componenti principali sono costituiti da un led emettitore ad infrarossi ed un ricevitore.
Un’applicazione in cui io sfrutto questo sensore è ad esempio per la realizzazione di robot segui linea o ancora per realizzare un contagiri e controllare la velocità di rotazione dei miei prototipi robotico.
Potrete ad esempio di distinguere, per brevi distanza dal sensore, le differenze bianco/nero incontrate su una superficie. Su un apposito pin verrà emesso un segnale di tipo TTL che andremo a leggere con Arduino.

Il sensore è costituito da tre pin, GND, OUT (il segnale) e Vcc.
La sensibilità del sensore può essere regolata mediante un apposito trimmer.

Sensor-Tracking-03

Nell’esempio descritto, per avere percezione visiva e sonora della transizione tra bianco e nero ho utilizzato un led connesso al pin 12 ed buzzer connesso al pin 7. Utilizzerò un foglio bianco su cui ho disegnato due strisce nere.

Sensor-Tracking-01

Sensor-Tracking-02

Collegamenti:

Sensore – Arduino:

pin segnale OUT -> pin digitale 7
– negativo -> GND
+ positivo -> 5V

Buzzer – Arduino

pin segnale S -> pin digitale 4
+ positivo -> 5V
– negativo -> GND

Lo sketch è estremamente semplice è dovrete semplicemente verificare la presenza dello stato HIGH sul pin 7 di Arduino, accendere il led se si è sulla linea nera ed emettere un suono, oppure se si è sul bianco spegnere il led e non emettere suono.

// Prof. Michele Maffucci
// 25.01.15
// Utilizzo di un Sensor Tracking e di un buzzer passivo

const int pinSensore = 7;
// pin a cui è collegato il sensore

const int pinLed = 12;
// pin a cui è collegato il led

const int pinBuzzer = 4;
// pin a cui è collegato il buzzer

const int frequenza = 440;
// frequenza emessa dal buzzer (440 Hz)

void setup()
{
  // inizializzazione del pin sensore, led e buzzer
  pinMode(pinSensore, INPUT);
  pinMode(pinLed, OUTPUT);
  pinMode(pinBuzzer,OUTPUT);
}

void loop()
{
  // conserviamo nella variabile var lo stato del sensore
  int val = digitalRead(pinSensore);

  // verifichiamo se viene letto "NERO"
  // se vero accendiamo il led
  if(val == HIGH)
  {
    digitalWrite(pinLed, HIGH);   // accende il led
    tone(pinBuzzer, frequenza);   // viene emesso dal buzzer un suono a frequenza fissata
    delay(5);                     // attesa di 5 millisecondi (in modo da percepire il suono emesso)   
  }
  // altrimenti spegniamo il led
  else
  {
    digitalWrite(pinLed, LOW);   // spegne il led
    noTone(pinBuzzer);           // non viene emesso nessun suono dal buzzer
  }
}

Kit di sensori per sperimentazione con Arduino

Tutti i sensori in commercio necessitano di un circuito elettronico di contorno che ne permette l’interfacciamento al microcontrollore è quindi indispensabile per chi desidera effettuare sperimentazioni avere competenze elettroniche adeguate che certamente non si hanno per i molti (studenti, maker, ecc…) che incominciano ad utilizzare Arduino. Le difficoltà che si hanno nelle prime fasi di sperimentazione potrebbero essere superato considerando il sensore una black box di cui sappiamo qual’è la grandezza fisica che rilevano e quali sono le funzioni dei piedini da collegare alla scheda Arduino, questo metodo è praticamente identico a quanto già si fa a scuola utilizzando ad esempio i Lego Mindstorms, la concentrazione va sulla programmazione e non sul singolo componente, la tecnologia la si studia in una fase successiva, quando il percorso didattico lo permette. Il vantaggio principale nell’operare in questo modo è che si riesce ad implementare artefatti sufficientemente complessi che hanno come obiettivo quello di far percepire il proprio apprendimento e di accettare in una fase successiva la difficoltà nella comprensione dettagliata (interna) di ogni singolo circuito elettronico.
I motivi di questo mio operare inoltre si rifà ad una breve sperimentazione sulla dispersione scolastica in cui ho necessità di rimotivare alcuni allievi e quindi ho bisogno di offrire degli strumenti che possano dare immediatamente “soddisfazione” e voglia di costruire.
La “cavia” 🙂 per la mia progettazione, prima che i miei allievi, è stato il giovane liceale (mio figlio) che entra per la seconda volta come protagonista su queste pagine, infatti ho deciso di regalargli un kit di sensori estremamente interessante costituito da ben 37 sensori acquistato su Bangood ad un prezzo conveniente che in questo periodo inoltre risulta in offerta. Ho avuto modo di utilizzare tutti i sensori e ritengo che con questo kit potrete sviluppare una quantità elevata di esperimenti. Perché ho scelto questo kit? Ho analizzato diverse soluzioni su diversi store on-line, ma il rapporto qualità/prezzo risultava il migliore.
Per facilitarne l’utilizzo sto creando un breve manuale con gli sketch di base per utilizzare i vari sensori in modo che si possa in autonomia effettuare i primi esperimenti, li aggiungerò volta per volta anche perché li utilizzerò nei prossimi giorni anche a scuola.
Spero di rispondere, con questa mia proposta, a quanti in queste vacanze mi hanno chiesto consigli sulla dotazione di base per incominciare con Arduino pur avendo conoscenze scarse o nulle in elettronica.
Non entrerò nel dettaglio del funzionamento fisico, l’atteggiamento ora e nei successivi post, che parleranno di questo kit, sarà quello di descrizione dei mattoncini con gli sketch di esempio che potrete poi voi migliorare ed ampliare. All’interno degli sketch trovate la spiegazione sul funzionamento delle varie parti di codice.

scatola-sensori

sensori

Questa la lista dei sensori del kit (tratto dal sito Bangood)

1 x Active buzzer module
1 x Passive buzzer module
1 x Common cathode RED&GREEN LED module
1 x Two color common cathode LED module
1 x Knock sensor module
1 x Shock switch sensor module
1 x Photo resistor sensor module
1 x Push button module
1 x Tilt switch module
1 x RGB LED module
1 x Infrared transmit module
1 x RGB colorful LED module
1 x Hydrargyrum switch sensor module
1 x Colorful auto flash module
1 x Magnet-ring sensor module
1 x Hall sensor module
1 x Infrared receive sensor module
1 x Analogy hall sensor module
1 x Magic ring module
1 x Rotate encode module
1 x Light break sensor module
1 x Finger pulse sensor module
1 x Magnetic spring module
1 x Obstacle avoidance sensor module
1 x Tracking sensor module
1 x Microphone sensor module
1 x Laser transmit module
1 x Relay module
1 x Analog temperature sensor module
1 x 18b20 temperature sensor module
1 x Digital temperature sensor module
1 x Linear hall Sensor module
1 x Flame sensor module
1 x High sensitive voice sensor module
1 x Humidity sensor module
1 x Joystick PS2 module
1 x Touch sensor module

Una premessa necessaria prima di incominciare con la descrizione e l’utilizzo dei sensori del kit acquistato su Bangood e di dare qualche nozione su cosa sono i sensori e gli attuatori, in modo che sia più semplice procedere con la sperimentazione.

Riprendo quanto già pubblicato nelle mie slide

I sistemi elettronici per interagire con il mondo fisico, utilizzano:

  • sensori che hanno il compito di percepire quantità fisiche dell’ambiente
  • attuatori, dispositivi che compiono un’azione in funzione di ciò che è stato rilevato dal sensore ed elaborato da un circuito elettronico.

Sensori e attuatori vengono anche detti trasduttori.

Un trasduttore è quindi un dispositivo in grado di convertire una grandezza fisica in un’altra.

In generale i trasduttori che convertono grandezze fisiche in segnali elettrici saranno collocati in ingresso ad un circuito elettronico, come Arduino e vengono denominati sensori.

Trasduttori che a partire da segnali elettrici in ingresso permettono di controllare o modificare una grandezza fisica esterna sono detti attuatori.

Esempi di sensori

Il termometro a mercurio converte la variazione della temperatura nella variazione di lunghezza di una colonnina di mercurio.

termometro

Il microfono che converte il suono in segnale elettrico.

microfono

Sensori di luce: Fototransitor, fotodiodo, fotoresistenza, pannello solare. La variazione di luce viene convertita in una variazione di una grandezza elettrica: resistenza, corrente elettrica, ecc…

sensori-luce

Esempi di attuatori

L’altoparlante è un attuatore che converte un segnale elettrico in onde sonore per questo motivo viene anche definito come un trasduttore elettroacustico.

altoparlante

La molla converte una forza in uno spostamento lineare

molla

Potenziometro, converte uno spostamento lineare in una variazione di resistenza

potenziometro

Termistore, trasforma una temperatura in una variazione di impedenza.

termistore

Sensori del kit

BUZZER

I buzzer possono essere di due tipi: attivi e passivi
I buzzer attivi hanno al loro interno un’oscillatore che emetterà suono se vengono alimentati, mentre quelli passivi non posseggono un oscillatore interno e quindi per emettere suono è indispensabile fornire al buzzer un segnale ad onda quadra tra i 2Khz e i 5 Khz.

Sperimentazione Buzzer attivo

buzzer-passivo

schema-buzzer-passivo

  • Pin S del sensore collegato al pin 4 di Arduino
  • Pin sensore a GND di Arduino
  • Pin alimentazione sensore (centrale) collegato a +5V di Arduino

buzzer-passivo-foto

// Prof. Michele Maffucci
// 08.01.15
// Utilizzo del buzzer passivo

const int pinBuzzer = 4;
// pin a cui è collegato il buzzer

int frequenzaquenza;
// variabile in cui memorizzare il valore della frequenza

void setup()
{
  pinMode(pinBuzzer,OUTPUT); // inizializzazione del pin a cui è collegato il buzzer
}

void loop()
{
  for(int i = 200; i <= 1000; i++) // loop di frequenze da 200 a 1000 hz { tone(pinBuzzer,i); // viene emesso dal buzzer un suono a frequenza i delay(5); // attesa di 5 millisecondi (in modo da percepire il suono emesso) } delay(3000); // attesa di 3 secondi. La frequenza più alta sarà emessa per 4 secondi for(int i = 1000; i >= 200; i--)  // loop di frequenze da 100 a 200 hz
  {
    tone(pinBuzzer,i);   // viene emesso dal buzzer un suono a frequenza i
    delay(5);            // attesa di 5 millisecondi (in modo da percepire il suono emesso)   
  }
}

Sperimentazione Buzzer attivo

buzzer-attivo

schema-buzzer-attivo

  • Pin S del sensore collegato al pin 11 di Arduino
  • Pin sensore a GND di Arduino
  • Pin alimentazione sensore (centrale) collegato a +5V di Arduino

buzzer-attivo-foto

// Prof. Michele Maffucci
// 08.01.15
// Utilizzo del pinBuzzer attivo

const int pinBuzzer = 11;
// pin a cui è collegato il buzzer

void setup()
{
  pinMode(pinBuzzer,OUTPUT);  // inizializzazione del pin a cui è collegato il buzzer
}

void loop()
{
  int a,b;

  // la condizione del while è sempre vera "1" quini il ciclo sarà infinito
  // all'interno di ogni ciclo sul pin a cui è collegato il buzzer viene inviata
  // un segnale alto per x ms ed un segnale basso per y ms il periodo totale dell'onda
  // sarà T = x + y e quindi la frequenza sarà f = 1/T

  while(1)
  {
    // emissione di una segnale a frequenza di 500 hz
    for(a=0;a<80;a++)
    {
      digitalWrite(pinBuzzer,HIGH);
      delay(1);                      // attesa di 1 ms
      digitalWrite(pinBuzzer,LOW);
      delay(1);                      // attesa di 1 ms
    }
    // emissione di una segnale a frequenza di 250 hz
    for(b=0;b<100;b++)
    {
      digitalWrite(pinBuzzer,HIGH);
      delay(2);                  // attesa di 2 ms
      digitalWrite(pinBuzzer,LOW);
      delay(2);                  // attesa di 2 ms
    }
  }
} 

Sensore di battito

Il sensore di battiti vi permetterà di rilevare vibrazioni anche molto lievi, infatti è costituito da una piccolissima molla che posta in vibrazione chiude un contatto.

battito

schema-sensore-battito

  • Pin S del sensore collegato al pin 7 di Arduino
  • Pin sensore a GND di Arduino
  • Pin alimentazione sensore (centrale) collegato a +5V di Arduino

battitto-foto

// Prof. Michele Maffucci
// 08.01.15
// Sensore di battito

const int pinBattito = 7;    // pin a cui è collegato il il sensore
const int pinLed =  13;      // pin a cui è collegato il LED che rileva il battito
                             // viene usato il led L collegato al pin 13


int statoBattito = 0;        // variabile in cui memorizzare lo stato del sensore

void setup() {
  // inizializzazione del pin a cui è collegato il LED ad output
  pinMode(pinLed, OUTPUT);
  
  // inizializzazione del pin a cui è collegato il sensore ad input
  pinMode(pinBattito, INPUT);     
}

void loop(){
  // lettura dello stato del sensore
  statoBattito = digitalRead(pinBattito);

  // verifica se il sensore rileva un battito
  // il sensore è attivo basso
  
  // se rileva un battito il sensore è ad HIGH:
  if (statoBattito == LOW) {     
    // accendel il LED 
    digitalWrite(pinLed, HIGH);
    delay(1000);
  } 
  else {
    // spegne il LED:
    digitalWrite(pinLed, LOW); 
  }
}

Nelle prossime puntate la descrizione degli altri sensori.