Tra breve incomincerò un ciclo di lezioni a scuola in cui ad una classe quinta (manutentori) sottoporrò una serie di moduli didattici da tre ore settimanali in cui saranno rivisti concetti di elettronica e misure elettroniche, impiantistica civile ed industriale, per poi giungere all’automazione realizzata con PLC e successivamente con Arduino, ovviamente il tutto finalizzato per l’esame di Maturità.
Mostrerò come realizzare semplici sistemi demotici o di controllo su impianti industriali utilizzando tecnologia a basso costo. Tutte le lezioni avranno quindi una forte connotazione sperimentale.
Da circa due giorni sto disegnando la parte delle lezioni che riguarda brevi esercitazioni in cui il controllo viene effettuato utilizzando Annikken Andee, uno shield che permette di controllare attuatori e sensori direttamente da uno dispositivo iOS o Android. La caratteristica più importante del prodotto risiede nella possibilità di poter realizzare l’interfaccia grafiche per azionare o leggere dati e visualizzare grafici, direttamente dall’IDE di Arduino senza la necessità di implementare un’App apposita per le due piattaforme.
Dovrete installare l’App gratuita Andee e collegarvi allo shield Andee via Bluetooth, nel momento in cui farete l’upload dello sketch su Arduino, all’interno dell’App Andee apparirà l’interfaccia grafica che avrete codificato nello sketch.
Andee è disponibile per iOS, per Android ed esiste una versione nominata “Andee U” venduta con il kit Sentry Gun che supporta contemporaneamente sia iOS che Android.
Dal punto di vista dei tempi didattici e del “divertimento” dello studente, il prodotto è estremamente utile ed anche se si possiede una competenza di base nella programmazione di Arduino, si potranno ottenere buoni risultati in poco tempo soprattutto perché programmare l’interfaccia grafica non è complicato.
Vi rimando alla visione del video che trovate di seguito (perdonate la scarsa qualità), nel primo effettuo con il il mio smartphone: l’accensione e lo spegnimento di una lampada a 220V, di una sirena, rilevazione della temperatura ambiente.
Con circuiti analoghi, affiancati ai normali pannelli per impianti elettrici civili ed industriali, farò controllare: l’accensione di lampade, apertura e chiusura di cancelli, rilevazioni allarmi di qualsiasi genere, controllo motori elettrici e molto altro.
Interessante la possibilità che ho sperimentato del controllo di rotazione di servomotori, stabilire l’angolo di rotazione di un motorino passo passo, oppure far inviare SMS al cellulare in caso di allarmi impostati da programma… e tantissimo altro…
Vi allego inoltre i seguenti video:
Tutte le informazioni utili potrete trovarle sul sito di riferimento.
su cui potrete seguire, nella sezione: resource tutte le lezioni che vi condurranno ad un’utilizzo completo dello scheda.
Per poter utilizzare Andee dovrete quindi: installare l’App corrispondente per il dispositivo mobile che possedete, installare la libreria Andee nell’IDE Arduino e procedere al collegamento tra dispositivo e Andee.
In successivi articoli pubblicherò spiegazioni ed esercitazioni con relativi sketch.
La ricerca di strategie che possano essere adattabili in diversi contesti didattici è un’attività che mi coinvolge parecchio, soprattutto se riguardano l’ampliamento delle competenze digitali degli studenti. Tra queste ricerche da tempo osservo e da un paio di giorni uso CodeBug una soluzione credo interessante per gli allievi più giovani.
CodeBug fornisce un modo divertente e coinvolgente per costruire dispositivi interattivi. La curva di apprendimento non è assolutamente ripida, nessuna barriera dovuta a difficoltà tecnologiche, elettronica ed informatica, per questo motivo risulta perfetto come strumento per accompagnare lo studente in un viaggio assolutamente creativo che introduce, anche per i più piccoli studenti (elementari e medie), nel mondo dell’elettronica e dell’informatica. Il design poi lo rende particolarmente attraente e flessibile e accenderà sicuramente la fantasia dei vostri allievi integrandolo in molteplici attività che si conducono a scuola.
CodeBug rende physical computing e l’elettronica finalmente accessibile a tutti. Come avrete modo di verificare CodeBug permette di avere, tramite la matrice LED che costituisce l’output visivo, le operazioni che si vanno a programmare, ma con esso si potrà anche comandare dispositivi esterni in modo molto semplice così come accade ad esempio con MakeyMakey di cui ho parlato diffusamente in precedenti articoli.
Ma perché così tanto desiderio di parlare di questa scheda elettronica?
Come dicevo all’inizio di questo post: semplice sperimentazione per implementare percorsi didattici alternativi.
Tempo fa avevo seguito con attenzione lo sviluppo di questo progetto e la raccolta fondi su Kickstarter, i fondatori di CodeBug sono maker ma soprattutto insegnanti e quindi attenti agli aspetti educativi, inoltre questa tecnologia, così come accade per Raspberry Pi, MicroBit, ma anche Arduino sono soluzioni a basso costo ed integrabili facilmente e proficuamente nella nostra scuola.
Inoltre vengono diffusamente utilizzati nelle scuole inglesi, ne ho letto le pratiche che ho trovato interessanti, ma ne ho la riprova dalle esperienze vissute in prima persona dall’amico di sempre Paolo che due anni fa decise di cambiare vita e lui con moglie e quattro figli di età: 8, 10, 14, 16 si trasferirono in Inghilterra a Camborne.
Paolo puntualmente mi aggiorna sugli aiuti che la scuola pubblica inglese offre soprattutto a chi si trasferisce in Inghilterra, sulle metodologie didattiche, sulle tecnologie ma soprattutto su quanto ai figli piace andare a scuola! 🙂 Ed io non posso che esserne felice 🙂
Paolo mi conferma nella scuola che frequentano i figli, un’attenzione particolare alle competenze digitali, ma anche valorizzazione delle potenzialità del singolo.
… ma torniamo all’oggetto di questo breve articolo: CodeBug
Parto oggi con la sperimentazione di CodeBug con mia figlia 🙂
Il metodo che disegnerò lo farò diventare una pratica che sperimenterò con alcuni allievi, soprattutto con coloro che hanno di necessità specifiche e questa pratica la mostrerò durante i corsi per docenti che terrò nelle prossime settimane.
Vediamo nel dettaglio cos’è e come si usa CodeBug
CodeBug è una scheda elettronica che ha le fattezze di un piccolo insetto un display di 25 LED e due pulsanti. Non è presente la Bluetooth ma ha un bus di espansione che supporta I2C, SPI e interfacce UART. Dispone di sei connettori che permettono di realizzare circuiti volanti. E’ possibile il collegamento direttamente alla GPIO del Raspberry Pi e programmato in python3 e quindi espandendone notevolmente la sua possibile applicazione.
Il costo contenuto, ho preso la scheda su element14 per 17,53 €
Per essere programmato Codebug deve essere collegato a un computer tramite la porta USB e la scrittura dei programmi avviene attraverso un’interfaccia web mediante un linguaggio visuale a blocchi che ricorda per alcuni aspetti Scratch. Per la programmazione potrete utilizzare qualsiasi computer con qualsiasi sistema operativo purché dotato di browser e connessione internet in quanto l’IDE di programmazione è in cloud. Per far si che i programmi vengano eseguiti in autonomia, senza la necessità di prelevare l’alimentazione dalla porta USB è possibile utilizzare una piccola batteria 2032 che ne permette il funzionamento indipendente.
Il video che segue mostra come sia semplicissimo incominciare ad utilizzare CodeBug:
Ma vediamo nella pratica di cosa si tratta.
Passo 1
Prende il cavo micro USB in dotazione CodeBug
Passo 2
visitate il sito http://www.codebug.org.uk/gettingstarted/ e seguite le istruzioni, così come indicate anche su questo sito, per creare il vostro primo programma CodeBug poi fate click sul pulsante download
Passo 3
Scrivete il programma
Passo 4
Effettuare il download del programma.
Durante il download vi comparirà una finestra riepilogativa che mostra i passi da eseguire per il caricamento del programma su CodeBug
Tenere premuto il pulsante A mentre collegate il cavo USB al computer e fino a quando la spia nell’angolo sinistro della matrice di led di CodeBug non incomincia a lampeggiare, ciò indica che il dispositivo è pronto per ricevere il vostro programma.
Passo 5
CodeBug verrà visualizzato sul vostro computer come unità USB.
Trascinate il programma all’interno di CodeBug.
Passo 6
Quando il programma è stato trasferito in CodeBug il led più vicino al pulsante B sia accenderà.
Premete il pulsante B per avviare il programma.
Bene!
Nelle prossime puntate dettagli sull’uso dei piedini e ulteriori esempi.
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
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.
Partiamo con la sperimentazione
Schema di collegamento
la corrispondenza di collegamento display -> Arduino è la seguente:
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.
Spostiamo le librerie nella cartella “libraries” di Arduino e riavviamo l’IDE
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
Passo 4
Nella cartella Adafruit_SSD1306 trovate la cartella examples
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
Create la vostra immagine, che ovviamente deve essere di dimensione non superiore a 128×64
Dal programma Image2Code.jar click sul pulsante “Choose file”
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:
#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:
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:
#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();
}
}
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.
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?
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.
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:
// 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);
}
}