L’alfabeto del PLC – PLC Siemens 1200 – Lezione 1

(ultima modifica: 06.04.2021)

Così come feci diversi anni fa con Arduino con l’Alfabeto di Arduino, voglio iniziare una nuova avventura con i PLC iniziando a condividere con voi i molti appunti che negli anni ho prodotto sull’uso dei del PLC, nello specifico PLC Siemens 1200 e Siemens LOGO8! Per entrambi ne mostrerò passo passo l’utilizzo allegandone esercizi e sperimentazioni. Come sicuramente saprete le dotazioni per un laboratorio di Automazione scolastico richiedono investimenti importanti, pertanto per far si che questi appunti siano fruibili da tutti tenderò a svolgere esercizi e spiegazioni che potranno essere svolti da chiunque senza avere grandi dotazioni tecnologiche e quindi mantenendo contenute le spese. Suggerirò kit specifici o elementi che potranno essere autocostruiti in qualsiasi laboratorio di meccanica ed elettronica dell’ITIS. Questi appunti subiranno sicuramente modifiche e correzioni che potranno essere svolte anche in fase successiva alla scrittura del documento, pertanto per rendere più evidente l’aggiornamento della lezione aggiungerò in testa al documento la data che mostra l’ultima modifica effettuata. Queste lezioni sono derivate dalle sperimentazioni mie e dei miei studenti, basandosi sulla vasta documentazione messa disposizione da Siemens, documentazione che è stata rivista e sintetizzata e resa compatibile con i percorsi didattici svolti negli istituti tecnici ad indirizzo elettronico e automazione che devono essere inseriti all’interno dei programmi di Sistemi e TPSEE. Troverete una vasta disponibilità di corsi e libri fatti molto bene, soprattutto i Webinar svolti da Siemens, molto spesso però sono corsi pensati per professionisti o insegnanti che io stesso ho seguito, sono svolti da professionisti del settore molto preparati in cui però molto spesso non viene tenuto in conto l’approccio didattico che bisogna avere con ragazzi delle scuole superiori, pertanto è indispensabile una rimodulazione dei contenuti per poi poterli presentare adeguatamente. Sicuramente se state iniziando questo percorso di studio, indispensabile partire dai numerosi Webinar di Siemens SCE Italia, da cui sicuramente potrete imparare moltissimo. Gli appunti che scriverò avranno la struttura di un manuale che potrete ovviamente migliorare, espandere e condividere. Se siete lettori di questo blog, avrete sicuramente notato che  preferisco il testo scritto al video, un po’ perché riesco ad essere più celere nella sistemazione degli appunti che realizzo per i miei studenti ed un po’ perché il testo scritto mi aiuta a pensare e migliorare l’azione didattica in presenza. Come sempre non posso assicurare una periodicità costante, perché in primis dovrò pensare alle lezioni a scuola e costruire slide ed esercizi per gli studenti, ma sicuramente produrrò lezioni più lunghe e strutturate che pubblicherò su queste pagine. Le lezioni possono essere seguite da chiunque, non saranno necessarie competenze elevate di informatica ed elettronica, dove necessario integrerò con semplici spiegazioni. Chiedendovi grande pazienza e comprensione per eventuali sviste e correzioni, vi auguro buona lettura 🙂

Cos’è un PLC e perché viene utilizzato
Cosa significa PLC?

PLC è la sigla di Programmable Logic Controller (controllore a logica programmabile). Questo termine descrive un dispositivo che comanda un processo (ad es. una macchina per la stampa di giornali, un impianto per il riempimento di sacchi di cemento, una pressa per pezzi stampati in plastica ecc… ).

Il PLC esegue un programma ed elabora i segnali digitali ed analogici provenienti da sensori e diretti agli attuatori presenti in un impianto industriale.

Si tratta di un oggetto hardware componibile. La caratteristica principale è la sua robustezza estrema; infatti normalmente è posto in quadri elettrici in ambienti rumorosi, con molte interferenze elettriche, con temperature elevate o con grande umidità. In certi casi il PLC è in funzione 24 ore su 24, per 365 giorni all’anno, su impianti che non possono fermarsi mai.

La struttura del PLC viene adattata in base al processo da automatizzare. Durante la progettazione del sistema di controllo, vengono scelte le schede adatte alle grandezze elettriche in gioco. Le varie schede vengono quindi inserite sul BUS o rack del PLC.

Il PLC funziona seguendo le istruzioni di un programma contenuto in una memoria del dispositivo.

Come il PLC comanda il processo di lavoro?

Il PLC comanda il processo di lavoro nel modo seguente:

gli attuatori vengono collegati con una tensione di comando – ad es. a 24V – dalle connessioni del PLC chiamate uscite. In questo modo è possibile accendere e spegnere un motore, aprire e chiudere una valvola o accendere e spegnere una lampada.

Il PLC da dove riceve le informazioni sugli stati del processo?

Il PLC riceve le informazioni sul processo dai cosiddetti datori di segnale (i dispositivi collegati in input), che sono cablati con gli ingressi del PLC. Questi datori di segnale possono essere ad es. sensori che riconoscono se un pezzo si trova in una determinata posizione o anche semplici interruttori o tasti che possono essere aperti o chiusi. Inoltre essi si distinguono in contatti normalmente chiusi, che a riposo sono chiusi, e contatti normalmente aperti, che a riposo sono aperti.

Qual è la differenza tra contatti normalmente aperti e normalmente chiusi?

I datori di segnale (apparati di input al PLC) si suddividono in contatti normalmente aperti e contatti normalmente chiusi.
L’interruttore indicato di seguito è un contatto normalmente aperto, ovvero che si chiude esattamente quando viene azionato.

Dati digitali memorizzati in bit, byte, parole – richiami.

L’unità minima di informazione utilizzata nei sistemi digitali è il bit (“binary digit”). Un bit memorizza può esprimere due soli stati: “0” (falso o non vero) o “1” (vero).

Un esempio di sistema “binario” che può assumere due soli stati è l’interruttore della luce, che determina lo stato “luce accesa” o “luce spenta”, il cui “valore” è memorizzabile in un bit. Il valore digitale dell’interruttore risponde alla domanda: “La luce è accesa?” Se è accesa (“vero”) il valore è 1, se è spenta (“falso”) il valore è 0.

La CPU organizza i bit di dati in gruppi. Un gruppo di 8 bit viene chiamato byte . Ogni bit del gruppo è definito da una posizione con un proprio indirizzo e ha un indirizzo di byte e indirizzi di bit da 0 a 7.

Un gruppo di 2 byte è chiamato parola (word). Un gruppo di 4 byte è una doppia parola (double word).

Per i numeri si utilizza il sistema binario (base 2). Una parola può rappresentare un numero compreso tra -32768 e +32767. Il bit con valore 215 viene utilizzato per denotare un numero negativo (se la posizione 215 ha valore “1” il numero è negativo).

Nota
La CPU supporta inoltre gruppi di 8 byte che formano un tipo di dati “long real” (numero reale lungo) (LReal) per la memorizzazione di valori molto grandi o molto precisi. Il campo del tipo di dati LReal va da +/-2,23 x 10-308 a +/-1,79 x 10308

In che modo il SIMATIC S7-1200 indirizza i singoli segnali di ingresso/uscita?

L’indicazione di un determinato ingresso o di una determinata uscita all’interno del programma è definita indirizzamento.

Gli ingressi e le uscite dei PLC sono per in genere riuniti in gruppi di 8 su unità di ingressi o di uscite digitali. Questi ottetti sono definiti byte. A ciascun gruppo di questo tipo viene assegnato un numero, il cosiddetto indirizzo a byte.
Per indirizzare i singoli ingressi e uscite all’interno di un byte ogni byte viene suddiviso in otto singoli bit numerati dal bit 0 al bit 7. In questo modo si ottiene l’indirizzo a bit.

Il PLC rappresentato di seguito ha i byte di ingresso 0 e 1 e i byte di uscita 0 e 1.

Esempio

Per indirizzare ad es. il quinto ingresso digitale, occorre indicare l’indirizzo seguente:

%I 0.4

%I identifica che l’indirizzo è di tipo ingresso

0 è l’indirizzo del byte

4 è l’indirizzo del bit.

Indirizzo a byte e indirizzo a bit sono sempre separati da un punto.

ATTENZIONE: per l’indirizzo al bit, il quinto ingresso è indicato 4 perché si inizia a contare da 0.

Esempio

Per indirizzare ad es. la decima uscita, occorre indicare l’indirizzo seguente:

%Q 1.1

%Q identifica che l’indirizzo è di tipo uscita

1 è l’indirizzo del byte

1 è l’indirizzo del bit.

ATTENZIONE: per l’indirizzo al bit, la decima uscita è indicata con 1 perché si inizia a contare da 0.

Come si realizzano le combinazioni logiche nel programma del PLC?

Le combinazioni logiche vengono utilizzate per definire le condizioni di attivazione di un’uscita.
Nel programma del PLC le istruzioni si possono creare con i linguaggi di programmazione come ad esempio: schema a contatti (KOP) o schema funzionale (FUP) o altri indicati di seguito.

Linguaggi di programmazione per PLC

La programmazione dei PLC può essere effettuata con diversi linguaggi di programmazione. Il primo linguaggio di programmazione prevedeva la diretta trascrizione di uno schema funzionale di un circuito di comando cablato con un approccio assolutamente elettrotecnico. Nel tempo le case costruttrici di PLC hanno introdotto terminologie ed ambienti di sviluppo diversi.

Le norme IEC 1131 definiscono quali sono i linguaggi utilizzati nella programmazione dei PLC.

Tutte le CPU dei PLC possono essere programmate nei linguaggi base LADDER (KOP in ambiente Siemens), FUP e IL (AWL in ambiente Siemens).

  • LADDER Diagram
    conosciuto anche come linguaggio a contatti (KOP in ambiente Siemens), è tra i linguaggi grafici più utilizzati.
  • Instruction List o Lista di Istruzioni (AWL in ambiente Siemens)
    è un linguaggio di programmazione testuale vicino al linguaggio macchina, ricorda l’Assembler, è più adatto ai programmatori esperti, a volte l’AWL consente di risolvere problemi difficilmente risolvibili con gli editor KOP e FUP.
  • FUP – Schema a blocchi funzionali (FB in ambiente Siemens)
    è un linguaggio a “porte logiche” che permette di disegnare uno schema classico dell’elettronica digitale. E’ molto usato nei sistemi di controllo dei grandi impianti di processo.
  • Sequential Function Chart (SFC) o Diagramma Funzionale Sequenziale, derivazione del GRAFCET in cui il funzionamento di un’automazione viene descritto in stati chiamati anche passi.
  • SCL, linguaggio ad altro livello che ricorda il linguaggio Pascal.

Di seguito uno mappa che descrive i vari linguaggi di programmazione, distinti per: testuali e grafici:

Rappresentazione del programma in LADDER

Di seguito un brevissima introduzione del linguaggio LADDER, in una lezione successiva ne farò i dovuti approfondimenti.

E’ tra i primi linguaggi di programmazione più utilizzati per PLC, ancora molto utilizzato con PLC della fascia mini e base ed è l’unico linguaggio comune a tutti i PLC attualmente in commercio. In fase iniziale questo linguaggio di programmazione simulava le logiche realizzate con i relè, ma negli anni sono stati introdotti blocchi funzionali in grado di realizzare operazioni di calcolo complesse.

Operatori LADDER principali

La parola BOBINA è di derivazione elettromeccanica e richiama la bobina di un relè, ma in LADDER non si intende la bobina del relè, ma con essa si vuole indicare una variabile digitali il cui valore/stato viene memorizzato in specifiche aree di memoria del PLC.

Con un PLC è possibile realizzare tutte le combinazioni logiche che si desidera vediamo di seguito gli operatori logici fondamentali.

Operatore logico AND

Una lampada deve accendersi quando due interruttori, normalmente aperti, vengono azionati contemporaneamente.

Tabella della verità

Logica cablata

Programma LADDER

La lampada si accende esattamente quando vengono azionati entrambi gli interruttori. Quindi quando gli interruttori S1 e S2 sono attivati la lampada P1 è accesa.

Combinazione logica AND in FUP

Nello schema funzionale FUP la combinazione logica AND si programma con un linguaggio grafico ed è rappresentata nel modo seguente:

Collegamento del PLC

Per applicare questa logica al programma di un PLC naturalmente entrambi gli interruttori devono essere cablati con gli ingressi del PLC. Qui S1 è cablato con l’ingresso I 0.0 e S2 con l’ingresso I 0.1. Inoltre, la lampada P1 deve essere collegata a un’uscita, ad es. Q 0.0.

Operatore logico OR

Una lampada deve accendersi quando uno o entrambi gli interruttori normalmenti aperti vengono azionati.

Tabella della verità

Logica cablata

(Nello schema M indica la Massa)

Programma LADDER

La lampada si accende esattamente quando uno o entrambi gli interruttori vengono azionati. Quindi quando viene azionato l’interruttore S1 o S2 la lampada P1 è accesa.

Combinazione logica OR in FUP

Nello schema funzionale FUP la combinazione logica OR si programma con un linguaggio grafico ed è rappresentata nel modo seguente:

Collegamento del PLC

Per applicare questa logica al programma di un PLC naturalmente entrambi gli interruttori devono essere cablati con gli ingressi del PLC. Qui S1 è cablato con l’ingresso I 0.0 e S2 con l’ingresso I 0.1. Inoltre, la lampada P1 deve essere collegata a un’uscita, ad es. Q 0.0.

Operatore NOT (negazione)

Nelle combinazioni logiche è spesso necessario verificare se un contatto normalmente aperto NON è azionato o se un contatto normalmente chiuso è azionato e quindi nell’ingresso corrispondente non passa la tensione.

Tabella della verità

Programma LADDER

Questa interrogazione è possibile programmando una negazione nell’ingresso della combinazione logica AND oppure OR.
Nello schema funzionale FUP la negazione di un ingresso in una combinazione logica AND si programma con la seguente rappresentazione grafica:

Viene applicata la tensione all’uscita %Q 0.0 esattamente quando %I 0.0 non è collegato e %I 0.1 è collegato.

Per completezza di seguito vengono rappresentate le funzioni logiche di base in linguaggio LADDER.

Operatore NOR

L’operazione può essere effettuata su due o più variabili di ingresso. Se chiamiamo con
I0.0 e I0.1 le variabili di ingresso e con Q0.0 la variabile di uscita, la somma logica negata assumerà lo stato logico 1 solo se tutte le variabili di ingresso sono allo stato 1, in tutti gli altri casi l’uscita assumerà il valore 1.

Tabella della verità

Programma LADDER

Operatore NAND

L’operazione può essere effettuata su due o più variabili di ingresso. Il prodotto logico negato NAND assumerà il valore 1 se tutte le variabili di ingresso assumeranno il valore 0, in tutti gli altri casi l’uscita assumerà il valore 1.

Tabella della verità

Programma LADDER

Operatore XOR

L’operazione può essere effettuata su due o più variabili di ingresso. l’OR esclusivo assumerà il valore 1 e solo se vi è almeno un ingresso che differisce dagli altri, mentre varrà 0 se tutti gli ingressi assumono lo stesso valore.

Tabella della verità

Programma LADDER

Operatore XNOR

L’operazione può essere effettuata su due o più variabili di ingresso. Il NOR esclusivo assumerà il valore 1 se e solo se tutti gli ingressi hanno il medesimo valore logico, è equivalente alla negazione della porta XOR.

Tabella della verità

Programma LADDER

Per approfondimenti sulle porte logiche seguire il link.

Nella prossima lezione verrà mostrata una descrizione generale degli ingressi e delle uscite del PLC Siemens S7-1200, come viene scritto ed eseguito un programma nel PLC, impostazione dell’interfaccia di TIA Portal e molto altro.

Buona Making a tutti 🙂

Pubblicato in automazione | Contrassegnato , , , , , , , , | Lascia un commento

Conosciamo BBC micro:bit V2

E’ ormai da qualche mese disponibile sul mercato la versione 2 di BBC micro:bit e mi ero ripromesso di fare una breve recensione indicandone le differenze rispetto alla prima versione. Approfitto di questo breve periodo di pausa per indicare le nuove funzionalità in modo che siano note anche ai corsisti che stanno seguendo in queste settimane il mio corso sulla didattica laboratoriale. Ho preso a riferimento le informazioni che possono essere trovate sul sito microbit.org, trovate tutti i link in questo post.

La caratteristica più evidente di questa nuova versione è la presenza del microfono e dell’altoparlante integrati sulla scheda che permetteranno il rilevamento e la riproduzione di suoni senza la necessità di collegare un dispositivo esterno.

Interessantissima anche l’aggiunta del rilevamento tattile capacitivo sul logo disposto sulla scheda.

Aggiunta una modalità di risparmio energetico ed aumentata la potenza di calcolo.
La nuova versione del micro:bit funziona senza problemi con tutti i blocchi MakeCode e nell’ambiente di programmazione sono stati aggiunti nuovi blocchi specifici per la V2. Ciò accadrà anche nel caso in cui voi vogliate programmare in MicroPython. Quindi se avete prodotto del codice per la V1, questo funzionerà senza problemi anche con la V2.

Caratteristiche

  • Altoparlante integrato sulla scheda
  • Microfono MEMs con indicatore LED che ne indica il funzionamento
  • Logo capacitivo sensibile al tocco
  • Modalità sleep/off incorporata ciò vuol dire che la scheda può essere spenta con le batterie collegate
  • Regolatore di corrente in grado di fornire fino a 190mA di corrente ai componenti elettronici esterni collegati alla scheda

Miglioramenti

  • Connettore Edge dentellato, ciò rende più facile collegare clip a coccodrillo e filo conduttivo
  • Indicatore LED di alimentazione. Oltre all’indicatore di attività USB, un LED di alimentazione mostra se il micro: bit è acceso o spento
  • Antenna placcata oro, per identificare facilmente il componente radio/Bluetooth

Specifiche hardware
Una descrizione dettagliata sull’hardware può essere trovata al seguendo il link.

  • Target MCU, Nordic Semiconductor nRF52833 (Cortex-M4F a 64 MHz, Flash da 512 kB, RAM da 128 kB)
  • Interfaccia MCU: NXP KL27, 256 kB Flash (128 kB riservati per miglioramenti futuri), 32 kB RAM
  • Sensore di movimento: ST LSM303
  • Microfono MEMS: Knowles SPU0410LR5H-QB-7 MEMS
  • Consumo di corrente 300mA (fino a 190mA per l’elettronica collegata)

Comparazione caratteristiche tra la V1 e la V2

Fronte

Retro

Universal Editors & Universal Hex Files

Nella nuova versione del micro:bit gli utenti, in fase di programmazione con MakeCode o l’Editor Python, non dovranno in alcun modo selezionare la versione del micro:bit che dispongono, pertanto la procedura di programmazione e trasferimento resta la medesima della versione V1.
Gli ambienti di programmazione supporteranno il nuovo formato di file chiamato “universal hex” (esadecimale universale) che può essere eseguito su tutte versioni di micro:bit.
L’evidenza che state lavorando nel formato “universal hex” è dato dal fatto che un file .hex compilato avrà una dimensione di circa 1,8 Mb invece che di circa 700 KB.
Maggiori informazioni sul sul formato “universal hex” potete trovarle seguendo il link.

IMPORTANTE

Ma cosa accadrà ai vostri vecchi file .hex creati per la versione V1 se trasferiti sulla nuova versione V2?
I programmi così trasferiti non funzioneranno, il micro:bit visualizzerà un errore di compatibilità, ad es. 029. Dovrete aggiornare i file trascinandoli e rilasciandoli nell’editor del software in cui sono stati creati. Quindi prendete il vostro file .hex importatelo nell’editor e scaricatelo nuovamente, trasferitelo sul microbit V2 e tutto funzionerà, lo stesso file convertito funzionerà anche sulla versione V1.

Come utilizzare le nuove funzionalità?

L’altoparlante funziona nello stesso modo in cui ci si aspetterebbe quando si collegano le cuffie o un altoparlante esterno al micro:bit. Per impostazione predefinita, l’uscita audio sarà sia sull’altoparlante che sul connettore Edge.

Per quanto riguarda il microfono troverete un set di blocchi aggiuntivi in MakeCode e nuove funzioni in MicroPython da utilizzare.
La funzionalità touch sul logo funziona allo stesso modo della versione V1.

Il microfono avrà un set aggiuntivo di blocchi in MakeCode e oggetti in MicroPython, in modo da poter monitorare e rispondere al suono. Il tocco del logo è implementato nello stesso modo in cui si tocca un pin sul connettore Edge, ritroverete ad esempio in MakeCode nella sezione input la sottosezione: micro:bit (V2) in cui sarà disponibile anche l’istruzione “on logo”, ciò accade anche in MicroPython con funzioni specifiche.

Si noti che il logo è un sensore capacitivo, mentre per impostazione predefinita i pin 1, 2 e 3 sul connettore Edge sono di tipo resistivo.
Per accedere solo alle funzionalità della versione V2 (ad es. Per emettere il suono solo sull’altoparlante e non sul connettore Edge), sarà necessario aggiungere del codice specifico ai programmi.

Le funzioni Microfono e Logo touch si trovano nel menu Input, mentre le funzioni dell’altoparlante si trovano nel menu music.

Nuove istruzioni MakeCode

IDE di programmazione: Editor MakeCode

Microfono

Suono/altoparlante

Logo touch e pin mode

Nuove istruzioni – Python

IDE di programmazione: Editor Python

Buon Coding a tutti 🙂

Pubblicato in micro:bit | Contrassegnato , , | Lascia un commento

BBC micro:bit – funzioni

Sto svolgendo in questi giorni il corso sulla didattica laboratoriale e nelle giornata di ieri ho svolto un approfondimento sull’uso delle funzioni con il MakeCode editor di micro:bit che rendo pubblico su questo sito.

NOTA. Gli esempi in questo post hanno il solo scopo di mostrare l’utilizzo delle funzioni (chiamata di una funzione, passaggio per valore, restituzione di un valore da una funzione, ecc…) e non quello di risolvere un specifico problema, pertanto gli esempi potrebbero essere realizzati in modalità sicuramente più efficiente.

Le funzioni con BBC micro:bit

Una funzione consente di creare una porzione di codice che possiamo riutilizzare più volte nel nostro programma, quindi invece di copiare lo stesso codice in molte sezioni del programma, possiamo semplicemente utilizzare un unico blocco funzione da utilizzare all’interno del nostro codice tutte le volte che ci necessita.

Una funzione è definita dal suo nome e dal corpo della funzione che ospita tutte le istruzioni.

La funzione ha un nome univoco e non può essere costituita da parole staccate tra loro. E’ utile assegnare alle funzioni nomi che specificano cosa fa la funzione, ad esempio “calcoloVolume”, “calcoloArea”, “distanzaOstacolo”, “impostaLed”, “displayOn”. Si consiglia inoltre di adottare una notazione camel case (testo a cammello), ovvero scrivere parole composte o frasi, come il nome di funzioni, unendo tutte le parole tra loro, ma lasciando le loro iniziali con lettera maiuscola, in questo modo viene meglio decodificato da un essere umano il significato del nome composto. E’ buona regola adottare una strategia di questo genere anche per il nome delle variabili.
La prima lettera della frase può essere maiuscola o minuscola, tendenzialmente si preferisce usare la lettera minuscola.

Il corpo della funzione è il codice all’interno del blocco funzione, quello che viene chiamato body.

Esempio: calcolo dell’area di un quadrato.

Definiamo le due variabili: quadrato e lato che conterranno l’area del quadrato e la lunghezza del lato.

Realizziamo ora un programma che permette, con la pressione dei pulsanti A e B di impostare la lunghezza del lato del quadrato e successivamente, con un tilt a sinistra verrà  visualizzato il calcolo dell’area del quadrato sul display del micro:bit:

Realizziamo un programma che alla pressione del pulsante A identifica lo stato di felicità della persona con una sequenza di icone, mentre alla pressione di B viene indicato lo stato di tristezza della persona, (ovviamente questo stesso programma potrà essere ottenuto in altre modalità diverse con una quantità di istruzioni inferiore, l’esempio è costruito per spiegare l’uso delle funzioni).

Parametri di una funzione

Se si desidera inviare alla funzione dei dati è possibile farlo utilizzando uno o più parametri. I parametri sono variabili utilizzate all’interno della funzione, vediamo a titolo di esempio una funzione che effettua il calcolo dell’area di un quadrato.

Oppure il passaggio può avvenire mediante l’uso di una variabile esterna passata alla funzione:

Esempio di una funzione che effettua il calcolo di un volume di un parallelepipedo:

I parametri di una funzione possono essere di tipi diversi, ad esempio possono essere delle stringhe (una sequenza di caratteri con un ordine prestabilito), dei booleani (vero/falso), valori interi ecc…

Nell’esempio che segue abbiamo la funzione “aggiungiStringhe” che in funzione del valore di “stato” (vero o falso) unirà stringa1 e stringa2 oppure stringa1 e stringa3.

Una funzione può utilizzare un parametro che viene utilizzato in una sottosezione della funzione.

In questo caso il parametro “messaggio” non viene utilizzato ed il codice unisce per tre volte “Ciao” e “,”. Nella variabile “ripetizione” si avrà la stringa: Ciao, Ciao, Ciao,

pertanto, nel caso in cui si volesse ripetere per 3 volte “messaggio” il programma deve essere modificato in questo modo:

Chiamare una funzione

La funzione quindi viene utilizzata come un blocco simile alle istruzioni standard di micro:bit, che possono essere utilizzate in altre parti del nostro programma. Per usare la funzione facciamo una chiamata di funzione, è come chiamare un amico per chiedere aiuto 🙂 , quindi la funzione ha un codice al suo interno che farà qualcosa per “aiutare” un’altra parte del vostro programma.

Nell’esempio che segue, la funzione “volumeCubo” viene chiamata due volte per calcolare due volumi di cubi con dimensioni diverse. Il codice nella funzione rimane in un posto. Non è necessario che venga copiato nel programma ovunque si voglia calcolare il volume di un cubo. In questo modo rendiamo il codice leggibile e riutilizzabile.

Vediamo un’altro esempio di chiamata di funzione. Alla pressione del pulsante A viene calcolata e visualizzata la media di una serie di 8 valori inseriti all’interno di un array:

Valore restituito da una funzione

Una funzione può restituire un valore al programma chiamante, quindi la restituzione di un calcolo o di uno stato specifico, ad esempio vero o falso, 0 oppure 1, ecc…

l’istruzione “return” restituisce il valore calcolato dalla funzione al programma che ha chiamato la funzione.

Nell’esempio che segue, alla pressione del pulsante A viene chiamata la funzione “randomZeroDieci” che genererà un numero casuale che verrà restituito alla funzione chiamante, “on button A pressed” ed in funzione del risultato mostrerà cose diverse sul display:

Solitamente l’istruzione “return” è posizionata nella parte finale della funzione, ovvero prima vengono fatti tutti i calcoli e poi restituito il valore, però potete inserire tutte le istruzioni di return che vi interessano all’interno della funzione, fate attenzione però che l’esecuzione del codice termina quando viene incontrata l’istruzione “return”. E’ quindi una buona regola posizionare il return alla fine del codice della funzione.

Nell’esempio che segue, all’avvio del micro:bit la funzione “cubo” è chiamata due volte per calcolare i due volumi. Il codice nella funzione rimane in un unico posto, non deve essere copiato nel programma in tutte le posizioni in cui volete calcolare i volumi, in  questo modo rendiamo il codice leggibile e riutilizzabile.

Buon Coding a tutti 🙂

Pubblicato in micro:bit, programmazione | Contrassegnato , , , , | Lascia un commento

Prove tecniche per la realizzazione di un sismografo con Arduino

Recentemente ho realizzato una breve lezione sull’uso del sensore piezoelettrico con Arduino e durante le prossime lezioni di sistemi elettronici, per le classi 3′, vedremo come sfruttare questo sensore per la realizzazione di un semplice sismografo per la rilevazione delle oscillazioni del pavimento dei corridoi della scuola, durante l’attività aggiungeremo la regolazione della sensibilità e la visualizzazione del grafico delle oscillazioni su un display oled, il passo successivo sarà quello di realizzare un sismografo con un pendolo.

Anteprima dell’attività di laboratorio:

Buon Making a tutti 🙂

Pubblicato in arduino, i miei allievi | Contrassegnato , , | Lascia un commento

Convegno: Metodologie didattiche innovative Making Robotica e Dobotica Educative

Nella giornata di domani, 30 Marzo, dalle 9.30 alle 17.00 parteciperò alla: Giornata di studio per la scuola sui temi del Making, della Domotica e della Robotica Educative.
Rappresenterò il mio istituto, l’ITIS G.B. Pininfarina di Moncalieri e il FutureLabs di Moncalieri. Il mio intervento previsto dalle 10,30 alle 11,00, avrà come titolo: “Didattica e IOT: l’intelligenza delle cose”, parlerò di making a scuola e “del futuro prossimo venturo” della didattica laboratoriale dal mio punto di vista. L’evento, in diretta streaming su YouTube vuole essere anche il momento per l’inaugurazione della rete nazionale: Robot School che ha tra i suoi obiettivi:

…creare, promuovere e sostenere, tramite l’attuazione delle misure previste dal PNSD, un sistema sinergico tra scuola, agenzie educative, enti, associazioni e tutti gli attori della comunità educante, diretto a favorire la più ampia diffusione dei processi di innovazione digitale e di didattica innovativa condividendo i principi e gli obiettivi dell’innovazione metodologico-didattica e digitale e ricercando costantemente l’incontro e la collaborazione con altre istituzioni scolastiche presenti su tutto il territorio nazionale, al fine di creare sempre maggiori sinergie e moltiplicare l’impatto della sperimentazione…

Rete capofila della rete: Liceo Scientifico “Leonardo da Vinci” Floridia (SR).

Programma della giornata:

    • 9.30 – 10.00  Saluti istituzionali – relatori on. Lucia Azzolina (ex Ministro Pubblica Istruzione), dott. S. Suraniti  (Direttore – USR Sicilia) , dott. N. Neri Serneri (Dirigente AT Siracusa)
    • 10.00 – 10-30 Presentazione del progetto – relatori prof. M. Pisani (Dirigente Scolastico Liceo L. Da Vinci ), prof.ssa V. Martorino (referente Progetto Robot School)
    • 10.30- 11.00  Didattica e IOT : l’intelligenza delle cose –relatore prof. Maffucci (Future Lab Pininfarina di Torino)
    • 11.00 -11.30  “ Innovazioni tra Making ed IoT  ” – relatore prof.  F. Piana (vincitore Premio Scuola Digitale)
    • 11.30-12.00  “La tecnologia nello spazio : prospettive e scenari futuri – relatore ing.  Farina (Microgravity Research Center – Brussels)
    • 12.00-12.30 – Saluti del dirigente del Future Lab di Gallarate – prof. G. Martino
    • STEM : Tinkering, IoT e Robotica Educativa” – Proposte formative e buone pratiche dal FutureLab – relatori prof. M. Sabella, V. Belloni (Future Lab di Gallarate)
    • 12.30-13.00 -“Spazio Domande e Contributi”
    • 13:00 – 14:30 Pausa
    • 14.30 – 15.00 Strategie e processi di ragionamento durante la programmazione robotica: riflessioni teoriche ed empiriche”relatori Edoardo Datteri e Gilda Bozzi – (Università Milano Bicocca- coordinatore del Laboratorio di Robotica per le Scienze Cognitive e Sociali)
    • 15.00- 15.30 Pepper recita Dante – Buone pratiche nella robotica umanoide  – relatore prof R. Delle Monache (Future Lab Volta – Pescara)
    • 15:30 -16.30 Workshop Immersivo: “Umanoidi e Disabilità”, relatori dott. G. Pioggia , dott.ssa Flavia Marino (CNR Messina, Istituto Marino)
    • 16.30-17.00 -“Spazio Domande e Contributi”

Pubblicato in news | Contrassegnato , , , , , | Lascia un commento

Arduino: Sensore Piezoelettrico

Per effettuare una misura dinamica di pressione o allungamento o vibrazione di superfici è possibile utilizzare sensori che si basano su quello che viene comunemente chiamato “effetto piezoelettrico”, la parola “piezoelettrico” deriva dalla parola greca “piezein” che significa premere. La piezoelettricità è la proprietà di alcuni cristalli, che se sottoposti all’azione di una forza esterna esterna, provoca in essi una migrazione di cariche elettriche. Con l’utilizzo di un apposito circuito elettronico, la migrazione di cariche elettriche può essere tradotta una differenza di potenziale.

L’effetto piezoelettrico è un effetto reversibile, ciò vuol dire che una volta che abbiamo applicato una variazione meccanica sul cristallo si ottiene una variazione di cariche e in maniera analoga quando viene fornita una carica elettrica al sensore, questo si allungherà o si comprimerà.

Quando applichiamo al cristallo una forza meccanica le cariche elettriche si spostano accumulandosi sulle facce opposte del cristallo:

I materiali piezoelettrici utilizzati possono essere naturali o di sintesi dopo polarizzazione:

Materiali naturali

  • Quarzo cristallino (SiO2)
  • sale di Rochelle o sale di Seignette (tartrato di Sodio e Potassio)
  • Tormalina

Materiali di sintesi

  • Piezoceramici
    • Titanio Zirconato di Piombo (PZT)
    • Titanio di Bario (BaTiO3)

L’effetto piezoelettrico può essere sfruttato per:

  • generare energia elettrica
  • in campo medicale: ecografi
  • sensori di vibrazione per allarmi
  • sensori di impatto
  • sonar (in campo militare)
  • viene utilizzato negli accendini
  • per gli orologi
  • per rilevare variazioni meccaniche
  • produrre suoni, come nelle chitarre elettriche
  • messa a fuoco di strumenti ottici
  • sensori in capo ambientale per il radio tracking
  • ecc…

Esempio tipico è quello dei cicalini piezoelettrici, conosciuti anche come buzzer, che vengono utilizzate in molte delle sperimentazioni con Arduino, infatti sottoponendo a tensione elettrica e ad una determinata frequenza il materiale piezoelettrico all’interno del buzzer, viene posta in oscillazione e questo muovendo l’aria, dall’apposita apertura collocata sul buzzer, permette di percepire il suono.

Nelle sperimentazioni con Arduino è tipico usare sensori piezoelettrici economici che generalmente hanno forma circolare. Questi sensori non hanno gradi di precisioni elevati e sono utilizzati prevalentemente per rilevare vibrazioni. Per capire come sono realizzati questi sensori immaginate ad un sandwich in in cui l’elemento piezoelettrico, costituito da piombo-zirconato è inserito tra due piastre metalliche. Il loro utilizzo in circuito con microcontrollori è particolarmente semplice anche perché funzionano con le tensioni e le correnti che si hanno direttamente dai pin di uscita di questi circuiti elettronici.

Nel caso abbiate necessità di consultare i dati tecnici di diverse tipologie di dispositivi piezoelettrici vi rimando al questi due datasheet:

Realizziamo ora un circuito che ci permette, mediante il sensore piezoelettrico e Arduino, la rilevazione di vibrazioni e urti. Colleghiamo il sensore sulla breadboard e dalla breadboard ad Arduino, in questo modo eviteremo di far vibrare il sensore quando tocchiamo Arduino per effettuare i collegamenti.

Colleghiamo il filo rosso del sensore ad un ingresso analogico di Arduino, ad esempio A0 mentre il filo nero lo colleghiamo. In parallelo al sensore bisognerà inserire una resistore con resistenza da 1MOhm, ciò è necessario perché un piezo è un componente con caratteristiche capacitive e la resistenza in parallelo permette di assorbire le cariche che vengono accumulate sulla capacità.

Il circuito proposto è estremamente semplice ed è riportato di seguito:

Esempio 1

/*
 * Prof. Maffucci Michele
 * data: 22.01.2021
 * Lettura sensore piezoelettrico
 * 
 * Esempio 1: stampa dei valori sulla serial monitor
 * e visualizzazione del grafico sulla serial Plot
 * 
 * Si ricorda che la Serial Plotter e la Serial Monitor
 * non possono essere usati contemporaneamente
 * 
 */


void setup(){
   // Inizializzazione della serial monitor
  Serial.begin(9600);
}

void loop(){
  // val contiene il valore letto dal sensore  
  int val = analogRead(A0);
  Serial.println(val);
  delay(20);
}

Se si selezione Serial Plotter dal menù Tools:

si avrà la visualizzazione del grafico degli urti provocati sul sensore:

Come si può notare i valori sull’asse delle ordinate è compreso tra 0 e 1023.

Esempio 2

Arduino, come già spiegato nelle mie slide: Alfabeto di Arduino – Lezione 4, non è in grado di leggere direttamente valori di tensione, bisognerà utilizzare il convertitore analogico/digitale (ADC) integrato in esso per convertire una tensione elettrica in un valore numerico. L’ADC di Arduino è a 10 bit, quindi potrà mappare valori compresi tra 0V e 5V in valori numerici compresi tra 0 e 1023. (1024 valori), pertanto si avrà una risoluzione di 5/1024 = 4,88 mV.

Per ottenere la tensione elettrica partendo dai valori restituiti dall’ADC, sarà sufficiente prendere il valore restituito dall’analogRead() e moltiplicarlo per la tensione unitaria corrispondente ad una unità 5/1024 = 4,88 mV. Traduciamo questo in codice per visualizzare la tensione elettrica sulla Serial Plotter.

/*
 * Prof. Maffucci Michele
 * data: 22.01.2021
 * Lettura sensore piezoelettrico
 * 
 * Esempio 2: stampa dei valori della tensione elettrica
 * sulla Serial Monitor e Serial Plotter
 * resitituita dal sensore nell'intervallo 0V - 5V
 * 
 * Si ricorda che la Serial Plotter e la Serial Monitor
 * non possono essere usati contemporaneamente
 * 
 */

void setup(){
   // Inizializzazione della serial monitor
  Serial.begin(9600);
}

void loop(){
  // val contiene il valore letto dal sensore  
  int val = analogRead(A0);
  // tensione contiene il valore di tensione elettrica
  float tensione = val *(5.0/1024);
  Serial.println(tensione);
  delay(20);
}

Esercizio 1

Realizziamo un interruttore on/off, possiamo utilizzare gli esempi già disponibili all’interno dell’IDE di Arduino e che in altre occasioni ho utilizzato su questo sito.  L’idea è quella di realizzare un sistema antirimbalzo software (debounce) e attivare l’on o l’off su un LED se l’intensità della forza meccanica impressa è superiore ad un valore di soglia che impostiamo nel codice.

Esercizio 2

Collegare 10 LED ad Arduino ed utilizzare un sensore piezoelettrico per accendere una quantità di LED proporzionale alla forza impressa sul sensore.

Esercizio 3

Realizziamo un dimmer, un sistema in grado di regolare l’intensità luminosa di un LED. La regolazione dell’intensità luminosa sarà fatto toccando il sensore piezoelettrico. Il doppio tocco veloce (in un intervallo di tempo prestabilito da voi) inverte la modalità di variazione dell’intensità luminosa (aumentare/diminuire), nel caso non si riesca a realizzare lo sketch con il doppio tocco veloce, utilizzare un pulsante esterno per invertire la modalità intensità luminosa prodotta.

Esercizio 4

Utilizzando la stessa logica di funzionamento dell’esercizio 2, utilizzare ora una striscia LED per misurare l’intensità della forza meccanica con cui sollecitiamo il sensore piezoelettrico.

Buon Coding a tutti 🙂

Pubblicato in arduino, i miei allievi | Contrassegnato , , , , | Lascia un commento

Metodologia Double Diamond per progettare attività didattiche di laboratorio

Durante le attività di laboratorio molto spesso i ragazzi si trovano nelle condizioni di dover sviluppare per intero un progetto in cui devono realizzare artefatti fisici complessi, in cui vengono fornite da me o altri colleghi le specifiche del progetto mediante una lezione in cui si espone il problema da risolvere, questa è ad esempio un’attività tipica durante un progetto di PCTO. Molto spesso la difficoltà maggiore da parte dei ragazzi è proprio quella di definire con chiarezza il problema nell’attività di progetto.
Come sempre insisto sulla parte di organizzazione del lavoro e progettazione collaborativa e non sempre tutto ciò viene recepito.

A tal proposito qualche giorno fa, durante un confronto con amici su una progettualità sviluppata da studenti del Politecnico di Milano insieme ad Hackability, si faceva proprio riferimento alla Metodologia Double Diamond, che avevo illustrato tempo fa durante alcuni miei corsi di formazione e che credo possano tornare utile ai miei studenti e sicuramente mostrerò durante il mio prossimo corso sulla Didattica Laboratoriale presso il FutureLabs dell’ITIS Pininfarina.

Al fondo di questo post trovate risorse utili per lo studio e la progettazione da cui sono tratte alcune cose riportate in questo post e che utilizzo attualmente per lo sviluppo di qualsiasi progetto mio, anche di carattere didattico.

Il British Design Council nel 2005 sviluppò il concetto di Double Diamond, proponendo un modello di processo di progettazione costituito da 4 fasi, nelle quali si alterna pensiero divergente e poi pensiero convergente. Il primo diamante (rombo) rappresenta l’area della ricerca o di esplorazione, il secondo diamante l’area del design cioè la fase in cui viene progettata la soluzione.

Fase divergente

La fase divergente consiste nell’esplorazione, la fase che ci consente di ampliare il punto di vista, quindi: nostre idee o idee che potrebbero giungere da una ricerca, quindi informazioni e dati. Nella fase divergente apriamo il nostro punto di vista, assumiamo il comportamento dell’esploratore, è una fase creativa in cui non bisogna applicare filtri alla nostra creatività e ricerca, non bisogna preoccuparsi se un’informazione è realmente utile e fattibili per la realizzazione del progetto.

Fase convergente

La fase convergente è quella logica, analitica in cui si analizza in modo critico la fase precedente e quindi si procede ad una selezione delle informazioni raccolte nella prima fase e che corrispondono alle specifiche del progetto.

Unendo le due fasi otteniamo il diamante.

La metodologia si sviluppa secondo lo schema seguente, in cui abbiamo due fasi:

  • la fase di RICERCA in cui si effettua un’esplorazione del problema
  • la fase di DESIGN in cui si progetta la soluzione

Nel primo diamante abbiamo la fase di esplorazione/scoperta seguita da una fase analitica di definizione, in cui i dati raccolti nella precedente fase vengono analizzati in modo da essere in grado di definire le priorità che porteranno alla definizione del problema.

Nel secondo diamante si parte con con lo sviluppo, però assumendo nuovamente un atteggiamento creativo e divergente in cui si analizzando la maggior parte di soluzioni possibili senza tener conto della fattibilità delle stesse, dopo di che si entra nella zona convergente in cui si selezionano le soluzioni più adatte per risolvere il problema, che verranno raffinate al fine di realizzare un prototipo.

La fase terminale del processo, la consegna, nell’attività laboratoriale può essere considerata l’unione di: prototipazione dell’oggetto e di test. Ovviamente, come esposto nella prima immagine di questo post, sarà possibile tornare alla fase di sviluppo nel caso in cui si abbia bisogno di migliorare o correggere la soluzione proposta con il prototipo.

Per approfondire l’argomento vi rimando ai seguenti articoli tratti principalmente dal sito del design council che ho utilizzato spesso per sviluppare sperimentazioni didattiche:

Consigli di lettura:
per applicazioni in campo didattico: CPS = Creative Problem Solving

Buona progettazione a tutti 🙂

Pubblicato in corsi, produttività | Contrassegnato , , , | Lascia un commento

Lezione 4 – Arduino GamePad – Disegnare caratteri speciali su LCD1602 Keypad Shield della Keyestudio

In riferimento a quanto esposto a lezione questa mattina durante la lezione a distanza, aggiungo alcune indicazioni per disegnare icone personalizzate sul display: pacman, alieno, fantasmi, ecc… La modalità di realizzazione icone è la medesima di quella spiegata nella lezione svolta alcuni mesi fa: Disegnare caratteri personalizzati con Arduino per un LCD 16×2 in cui veniva utilizzato un display I2C.

Le modifiche per l’utilizzo dell’LCD1602 Keypad Shield della Keyestudio sono minime e di seguito indico alcuni esempi.

E’ importante, per inserire nuove icone sul display, studiare la lezione precedente in cui descrivo come realizzare le icone.

Di seguito tre esempi utili per sviluppare il vostro progetto di PCTO.

Esempio 1

In questo esempio mostro come visualizzare sulla prima riga del display una stringa di presentazione e sulla seconda riga 8 icone

/* 
 *  Prof. Michele Maffucci
 *  Crezione di caratteri personali
 *  Utilizzo di un display LCD1602 Keypad Shield della Keyestudio
 *  Data: 19.03.2021
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// caratteri personalizzati

byte lucchettoChiuso[8] = {
  0b01110,
  0b10001,
  0b10001,
  0b10001,
  0b11111,
  0b11011,
  0b11011,
  0b11111
};

byte lucchettoAperto[8] = {
  0b01110,
  0b10000,
  0b10000,
  0b10000,
  0b11111,
  0b11011,
  0b11011,
  0b11111
};

byte Altoparlante[8] = {
  0b00001,
  0b00011,
  0b01111,
  0b01111,
  0b01111,
  0b00011,
  0b00001,
  0b00000
};

byte batteriaMezza[8] = {
  0b01110,
  0b11011,
  0b10001,
  0b10001,
  0b10001,
  0b11111,
  0b11111,
  0b11111
};

byte alieno[8] = {
  0b10001,
  0b01010,
  0b11111,
  0b10101,
  0b11111,
  0b11111,
  0b01010,
  0b11011
};


byte pacmanBoccaChiusa[8] = {
  0b01110,
  0b11101,
  0b11111,
  0b11111,
  0b11000,
  0b11111,
  0b11111,
  0b01110
};

byte pacmanBoccaAperta[8] = {
  0b01110,
  0b11101,
  0b11111,
  0b11100,
  0b11000,
  0b11000,
  0b11111,
  0b01110
};

byte fantasmino[8] = {
  0b01110,
  0b11111,
  0b10101,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b10101
};

void setup()
{
 // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // creazione nuovi caratteri
  lcd.createChar(0, lucchettoChiuso);
  lcd.createChar(1, lucchettoAperto);
  lcd.createChar(2, Altoparlante);
  lcd.createChar(3, batteriaMezza);
  lcd.createChar(4, alieno);
  lcd.createChar(5, pacmanBoccaChiusa);
  lcd.createChar(6, pacmanBoccaAperta);
  lcd.createChar(7, fantasmino);
  
  // Cancella il display
  lcd.clear();

  // Stampa la stringa
  lcd.print("PCTO a.s. 20/21");

}

void loop()
{
  lcd.setCursor(0, 1);
  lcd.write(byte(0));

  lcd.setCursor(2, 1);
  lcd.write(byte(1));

  lcd.setCursor(4, 1);
  lcd.write(byte(2));

  lcd.setCursor(6, 1);
  lcd.write(byte(3));

  lcd.setCursor(8, 1);
  lcd.write(byte(4));

  lcd.setCursor(10, 1);
  lcd.write(byte(5));

  lcd.setCursor(12, 1);
  lcd.write(byte(6));

  lcd.setCursor(14, 1);
  lcd.write(byte(7));
}

Esempio 2

In questo secondo esempio mostriamo come visualizzare l’icona del Pacman che va avanti e indietro sulla prima riga del display

/* 
 *  Prof. Michele Maffucci
 *  Crezione di caratteri personali
 *  Utilizzo di un display LCD1602 Keypad Shield della Keyestudio
 *  Data: 19.03.2021
 *  
 *  Movimento verso destra e sinistra di una icona (alieno)
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Velocità con cui viene stampato il l'icona  
int velocita = 300;

// caratteri personalizzati

byte alieno[8] = {
  0b10001,
  0b01010,
  0b11111,
  0b10101,
  0b11111,
  0b11111,
  0b01010,
  0b11011
};

void setup()
{
 // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // creazione nuovi caratteri
  lcd.createChar(4, alieno);

  // visualizzazione sul display del nome
  // dell'attività
  
  // Cancella il display
  lcd.clear();

  // Stampa la stringa
  lcd.print("PCTO a.s. 20/21");
  delay(1000);

  // Cancella il display
  lcd.clear();
}

void loop()
{
   // Movimento verso destra del carattere
  for (int contatorePosizioneColonna = 0; contatorePosizioneColonna < 16; contatorePosizioneColonna++) {
    // Cancella il display
    lcd.clear();
    // Spostamento di una posizione verso destra del cursore
    lcd.setCursor(contatorePosizioneColonna, 0);
    // Stampa del icona: alieno
    lcd.write(byte(4));
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Movimento verso sinistra del carattere
  for (int contatorePosizioneColonna = 16; contatorePosizioneColonna > 0; contatorePosizioneColonna--) {
    // Cancella il display
    lcd.clear();
    // Spostamento di una posizione verso sinistra del cursore
    lcd.setCursor(contatorePosizioneColonna, 0);
    // Stampa del icona: alieno
    lcd.write(byte(4));
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }
}

Esempio 3

Realizzare le medesime funzionalità dell’esercizio precedente in cui l’icona del Pacman nell’avanzamento apre e chiude la bocca.
In questo esempio il Pacman quando torna indietro non si gira.


/*
    Prof. Michele Maffucci
    Crezione di caratteri personali
    Utilizzo di un display LCD1602 Keypad Shield della Keyestudio
    Data: 19.03.2021

    Movimento verso destra e sinistra di una icona (Pacman)
    Durante il movimento il Pacman apre e chiude la bocca
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Velocità con cui viene stampato il l'icona
int velocita = 300;

// caratteri personalizzati

byte pacmanBoccaChiusa[8] = {
  0b01110,
  0b11101,
  0b11111,
  0b11111,
  0b11000,
  0b11111,
  0b11111,
  0b01110
};

byte pacmanBoccaAperta[8] = {
  0b01110,
  0b11101,
  0b11111,
  0b11100,
  0b11000,
  0b11000,
  0b11111,
  0b01110
};

void setup()
{
  // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // creazione nuovi caratteri
  lcd.createChar(0, pacmanBoccaChiusa);
  lcd.createChar(1, pacmanBoccaAperta);

  // Cancella il display
  lcd.clear();

  // Stampa la stringa
  lcd.print("PCTO a.s. 20/21");
}

void loop()
{

  // Movimento verso destra del carattere
  for (int contatorePosizioneColonna = 0; contatorePosizioneColonna < 16; contatorePosizioneColonna++) {
    // Cancella il display
    lcd.clear();
    // Spostamento di una posizione verso destra del cursore
    lcd.setCursor(contatorePosizioneColonna, 0);
    if (contatorePosizioneColonna % 2 == 0) {
      // Stampa del icona: Pacman bocca chiusa
      lcd.write(byte(0));
    }
    else
    {
      // Stampa del icona: Pacman bocca aperta
      lcd.write(byte(1));
    }
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Movimento verso sinistra del carattere
  for (int contatorePosizioneColonna = 16; contatorePosizioneColonna > 0; contatorePosizioneColonna--) {
    // Cancella il display
    lcd.clear();
    // Spostamento di una posizione verso sinistra del cursore
    lcd.setCursor(contatorePosizioneColonna, 0);
    if (contatorePosizioneColonna % 2 == 0) {
      // Stampa del icona: Pacman bocca chiusa
      lcd.write(byte(0));
    }
    else
    {
      // Stampa del icona: Pacman bocca aperta
      lcd.write(byte(1));
    }
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }
}

Esercizio 1

Eseguire le stesse funzionalità dell’esempio 3 in cui però il Pacman rivolga il viso nella stessa direzione del movimento.

Esercizio 2

Movimentare il Pacman con i pulsanti RIGHT e LEFT, rivolgendo sempre il viso nella giusta posizione di movimento.

Buon Coding a tutti 🙂

Pubblicato in arduino, i miei allievi | Contrassegnato , , , , , | Lascia un commento

Lezione 3 – Arduino GamePad – LCD1602 Keypad Shield della Keyestudio

Terza lezione in cui aggiungo alcuni esempi che suggeriscono alcune azioni di gioco che gli allievi del gruppo di lavoro dell’attività di PCTO: Arduino GamePad potranno sfruttare per la realizzazione del loro.

Esempio 1

Controllo dello spostamento del carattere:

  • destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
  • su/giù mediante i pulsanti UP/DOWN

Per realizzare queste azioni riprendiamo quanto realizzato nella lezione precedente aggiungendo all’ultimo sketch il controllo della pressione del pulsante UP o DOWN in cui viene controllato se l’analogRead sul A0 restituisce un valore comprese tra:

Controllo UP
(val >= 50 && val <= 150)

Controllo DOWN
(val >= 150 && val <= 300)

Lo spostamento del carattere dalla prima alla seconda riga deve essere fatta cancellando prima l’intero schermo, poi posizionando il carattere con il metodo setCursor() a cui si passa la variabile globale “contatorePosizioneColonna” che viene modificata di volta in volta alla pressione dei pulsanti RIGHT e LEFT. La selezione della riga avviene passando il valore 0 che identifica la prima riga e il valore 1 per la seconda riga.

/*
   Prof. Michele Maffucci
   Utilizzo dell'LCD Keypad Shield della Keystudio
   Data: 14.03.2021

   Controllo dello spostamento del carattere:
   - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
   - su/giù mediante i pulsanti UP/DOWN
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Colonna in cui si trova il carattere
int contatorePosizioneColonna = 0;

// Valore restituito dall'analogRead su A0
int val;

// Velocità con cui viene stampato il carattere  
int velocita = 200;

void setup() {
  // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // Carattere stampato nella prima colonna e prima riga (0,0)
  lcd.print("*");
}

void loop() {

  // Memorizza in val il valore presente su A
  int val = analogRead(A0);

  // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga
   if (val >= 50 && val <= 150) {
    // Cancella il display
    lcd.clear();
    // Spostamento sulla prima riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 0);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga
  if (val >= 150 && val <= 300) {
    // Cancella il display
    lcd.clear();
    // Spostamento sulla seconda riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 1);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione
  // a destra fino a quando non si raggiunge l'ultima colonna a destra.
  // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere.
  if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) {
    lcd.scrollDisplayRight();
    delay(velocita);
    contatorePosizioneColonna++;
  }

  // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione
  // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra.
  // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere.
  if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) {
    lcd.scrollDisplayLeft();
    delay(velocita);
    contatorePosizioneColonna--;
  }
}

Esempio 2

In questo secondo esempio viene aggiunta una semplice matrice di cinque “X” che identificano degli ostacoli che devono essere superati. Nell’esempio esposto però gli ostacoli possono essere superati, lascio quindi a voi la realizzazione dello sketch che consente il blocco dell’avanzamento nel caso in cui ci si scontra con l’ostacolo.

/*
   Prof. Michele Maffucci
   Utilizzo dell'LCD Keypad Shield della Keystudio
   Data: 14.03.2021

   Controllo dello spostamento del carattere *:
   - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
   - su/giù mediante i pulsanti UP/DOWN

   Stampa di una serie di X che rappresentano gli ostacoli
   
*/

// inclusione della libreria LiquidCrystal.h
#include <LiquidCrystal.h>

// inizializza la libreria con i numeri dei pin dell'interfaccia
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// Colonna in cui si trova il carattere
int contatorePosizioneColonna = 0;

// Valore restituito dall'analogRead su A0
int val;

// Velocità con cui viene stampato il carattere
int velocita = 200;

// Riga in cui si trova il carattere *
int riga = 0;

void setup() {
  // impostazione del numero di colonne e righe del display
  lcd.begin(16, 2);

  // Carattere stampato nella prima colonna e prima riga (0,0)
  lcd.print("*");
}

void loop() {

  // Memorizza in val il valore presente su A
  int val = analogRead(A0);

  stampaOstacoli();

  // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga
  if (val >= 50 && val <= 150) {
    // Cancella il display
    lcd.clear();
    stampaOstacoli();
    // Spostamento sulla prima riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 0);
    riga = 0;
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga
  if (val >= 150 && val <= 300) {
    // Cancella il display
    lcd.clear();
    stampaOstacoli();
    // Spostamento sulla seconda riga nella colonna corrente
    lcd.setCursor(contatorePosizioneColonna, 1);
    riga = 1;
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione
  // a destra fino a quando non si raggiunge l'ultima colonna a destra.
  // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere.
  if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) {
    // Cancella il display
    lcd.clear();
    contatorePosizioneColonna++;
    // Spostamento di una posizione verso destra del cursore
    lcd.setCursor(contatorePosizioneColonna, riga);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }

  // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione
  // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra.
  // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere.
  if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) {
    // Cancella il display
    lcd.clear();
    contatorePosizioneColonna--;
    lcd.setCursor(contatorePosizioneColonna, riga);
    // Stampa del carattere: *
    lcd.print("*");
    // Attesa di un'istante per percepire il movimento del carattere
    delay(velocita);
  }
}

void stampaOstacoli() {
  lcd.setCursor(2, 0);
  lcd.print("X");
  lcd.setCursor(5, 1);
  lcd.print("X");
  lcd.setCursor(7, 1);
  lcd.print("X");
  lcd.setCursor(9, 0);
  lcd.print("X");
  lcd.setCursor(12, 0);
  lcd.print("X");
}

Esercizio 1

Utilizzando l’esempio 2 esposto sopra, aggiungere la funzionalità che blocca l’avanzamento del carattere “*” nel caso in cui ci si scontra con l’ostacolo.

Esercizio 2

Definire tre matrici di ostacoli diversi e fare in modo che ad ogni avvio di Arduino la scelta della matrice venga fatta in modo casuale.

Esercizio 3

Aggiungere la funzionalità che permette di modificare la matrice degli ostacoli se si raggiunge l’ultima colonna a destra.

Esercizio 4

Definire tre scenari diversi costituiti da tre matrici ostacoli diversi. La navigazione può avvenire solamente all’interno di questi tre scenari. La partenza del carattere “*” avviene dalla colonna 0 del secondo scenario, il movimento dovrà essere il seguente:

  • partendo dalla colonna 0 del secondo scenario, la pressione del pulsante LEFT porta allo scenario 1 e il carattere “*” viene posizionato nella colonna 15 del display;
  • se si è nel secondo scenario in colonna 15, la pressione del pulsante RIGHT conduce alla colonna 0 del  3′ scenario;
  • la pressione del pulsante LEFT in colonna 0 del primo scenario non permette nessun cambiamento di scenario
  • la pressione del pulsante RIGHT in colonna 15 del terzo scenario non permette nessun cambiamento di scenario

Buon Coding a tutti 🙂

Pubblicato in arduino, i miei allievi | Contrassegnato , , , , | Lascia un commento