Sei sulla pagina 1di 193

Wireless

Dotiamo
Arduino di un
modulo per
comunicazioni
long-range
basato sulla
tecnologia
Semtech.
Prima puntata.

LoRa
SHIELD
del
dell’ing DANIELE DENARO

bbiamo avuto modo di parlarvi (nel numero a lungo raggio ma a basso consumo:
A 191) delle due tecnologie che si contendono
il mercato della comunicazione wireless a lungo
• realizzare soluzioni IoT (Internet of Things),
ovvero collegare via radio sensori ed attuatori
raggio (alcuni chilometri) e basso consumo: la distribuiti in quantità, ma senza ricorrere a Wi-Fi
tecnologia SigFox e la LoRa; su quest’ultima si basa o WiMax, non adatte alla tipologia minimale
la demoboard che abbiamo realizzato (e proposto dei sensori/attuatori e dispendiose in termini di
nel fascicolo numero 194), che fa uso di un modulo energia, nonché soggette a saturazione;
LoRa realizzato dall’Aurel. Ora è venuto il momen- • avere bassi costi per sensore/attuatore wireless.
to di trasportare la tecnologia long-range wireless
sulla piattaforma Arduino e per questo vi propo- Le due tecnologie sono differenti in termini di tec-
niamo uno shield che utilizza un modulo RTX LoRa QLFDGLWUDVPLVVLRQHHGLŎORVRŎDPHQWUH6LJ)R[XWL-
ed è corredato dalla relativa libreria software per lizza la tecnica della banda strettissima (UNB=Ultra
un utilizzo immediato. Prossimamente lavoreremo Narrow Band), LoRa utilizza il concetto opposto
anche con la tecnologia SigFox, per la quale Atmel dello spettro di emissione distribuito (Spread
(casa produttrice dei microcontrollori di Arduino) Spectrum); inoltre SigFox contempla una struttura
ha preparato uno shield per Arduino, che presente- DVWHOODGRYHXQDVWD]LRQHULFHYHQWHSLºVRŎVWLFDWD
remo appena disponibile. dei singoli terminali, concentra la ricezione e la
Prima di introdurre la scheda, è necessario ripren- instrada su normale rete Internet.
dere brevemente i concetti base di queste due In questa architettura i terminali sono, in genere,
tecnologie. Innanzitutto chiariamo le motivazioni solo trasmittenti. Al contrario, LoRa ha una archi-
che hanno spinto alla ricerca di una comunicazione tettura orientata al punto-punto, e, con adeguato

Elettronica In ~ Ottobre 2015 53


[schema ELETTRICO]

quindi l’ideale per le applicazioni


alimentate con batterie, elementi
fotovoltaici o con con soluzio-
ni di “energy harvesting”. La
comunicazione può avvenire su
distanze di chilometri o decine
di chilometri. Ma come fanno,
i dispositivi, a comunicare a
queste distanze con una potenza
così bassa? Ebbene, malgrado le
diverse tipologie di modulazione
adottate, LoRa e SigFox sono ac-
comunati da un’altissima immu-
nità ai disturbi ed alle interferen-
ze, tali da ammettere sensibilità
dell’ordine di -126 dBm (10÷13
mW). Ma, ovviamente nulla è
gratis, e il prezzo da pagare è una
bassissima velocità di comuni-
cazione: alcune decine di bit al
secondo (bps). Ma ciò non ha
importanza nel tipo di utilizzo di
questi sistemi, visto che è orienta-
to a sensori/attuatori che devono
scambiare brevissimi messaggi
in maniera episodica (tipicamen-
te qualche centinaio di volte al
giorno).

MODULAZIONE
Lungi da pretendere una tratta-
zione esaustiva di una proble-
matica molto vasta e complessa
software potrebbe realizzare e di molti altri parametri; pos- come la trasmissione di segnali,
una rete distribuita come Inter- sono realizzare, quindi, sistemi facciamo il punto solo sui concet-
net. Anche in questo caso si può adattativi. In particolare l’imple- ti base e sulla terminologia.
pensare ad un instradamento mentazione LoRa della Semtech I segnali digitali possono modu-
su Internet realizzato da uno o ©PROWRŏHVVLELOHFRPHYHGUHPR lare la frequenza portante sostan-
più nodi di questa struttura, ma più avanti. Dal punto di vista zialmente in modalità:
ciò non è determinante come in della comunicazione, ambedue • AM (modulazione di ampiez-
SigFox; insomma, LoRa è una i sistemi irradiano su frequenze za) detta anche ASK (Amplitu-
VWUXWWXUDSLºŏHVVLELOHGL6LJ)R[ minori di 1 GHz: SigFox, tipica- de Shift Keying) di cui la più
In ogni caso le implementazio- mente sugli 868 MHz (in Europa) semplice implementazione è
ni di ambedue i sistemi fanno mentre LoRa sugli 868 MHz o la OOK (On/Off Keying) nella
ampio uso della tecnica SDR sui 433 MHz (bande libere senza quale allo zero corrisponde
6RIWZDUH'HŎQHG5DGLR FKH licenza). La potenza di emissione assenza di portante e ad uno la
consiste nella gestione software è decisamente bassa: dell’ordine presenza di portante;
delle componenti dei ricetra- di 10÷100 mW (corrispondenti a • FM (modulazione di frequen-
smettitori. I circuiti integrati sono 10÷20 dBm). za) detta anche FSK (Fre-
SHUFL³HVWUHPDPHQWHŏHVVLELOLH Altra particolarità è che i dispo- quency Shift Keying); spesso
FRQŎJXUDELOL DQFKHGLQDPLFD- sitivi SigFox e LoRa, quando usata nella forma GFSK (Gaus-
mente) sia in termini di frequen- non trasmettono, praticamente sian FSK) dove viene applicato
za fondamentale che di potenza non consumano elettricità; sono XQŎOWURJDXVVLDQRDOVHJQDOH

54 Ottobre 2015 ~ Elettronica In


SDRODUDGLRGHÀQLWDGDVRIWZDUH
che con accorgimenti di modula-
/DWHFQRORJLD´6RIWZDUH'HÀ- XQDSSDUDWRUDGLRFRPSRVWRGD ]LRQHHŎOWUL
QHG5DGLR´LQWURGXFHODSUR- PRGXOLFRQÀJXUDELOLVLDQHOOD In SigFox la frequenza della
JUDPPDELOLWjLQFLzFKHÀQRUD ORURIXQ]LRQDOLWjFKHQHOORUR
portante in Europa è a 868 MHz,
HUDXQYHURWHPSLRGHOO·KDUGZD- FROOHJDPHQWR(FFRDOORUDL
UHO·HOHWWURQLFDGHJOLDSSDUDWLGL VLVWHPL6'5FKHSRVVRQRGLUVL la modulazione è GFSK e il data-
UDGLRFRPXQLFD]LRQH&RPSOLFH VLVWHPLUDGLRJHQHULFLDGDWWDEL- rate di 100 bps, con una larghez-
LOSDVVDJJLRRUPDLSUHVVRFKp OLGLYROWDLQYROWDDIUHTXHQ]H za dello slot di comunicazione
WRWDOHGHLVHJQDOLPRGXODQWL PRGXOD]LRQLVHQVLELOLWjHSR- di appena 100 Hz; quindi più
GDOO·DQDORJLFRDOGLJLWDOHHO·D- WHQ]HYDULHPHGLDQWHFRQÀJXUD- terminali possono trasmettere
YDQ]DUHGHOOHWHFQRORJLHGLJLWDOL ]LRQHVRIWZDUH contemporaneamente allocando
QHOODVLQWHVLGLIUHTXHQ]DQHL /DIDPLJOLD6;[[GHOOD lo slot disponibile. Poiché lo spet-
ÀOWULHQHOODFRQYHUVLRQHGHOVH- 6HPWHFKUDSSUHVHQWDXQHVHP- tro è strettissimo, tutta l’energia è
JQDOHqLQHYLWDELOHLPPDJLQDUH SLRGLTXHVWRDSSURFFLR
concentrata e di conseguenza ne
basta poca perché il segnale sia
d’ampiezza superiore al rumore.
per ammorbidire gli impulsi ULTRA NARROW BAND
squadrati e ridurre così lo Una possibile soluzione è re- SPREAD SPECTRUM
spettro; in questo modo la FSK stringere moltissimo lo spettro di Un’alternativa è distribuire un
modula quasi in modo ana- modulazione ad alcune decine di segnale (ancora una volta con un
logico; la FM ha uno spettro hertz, sia riducendo il data-rate, basso rateo) su una banda molto
maggiore rispetto alla AM ma
è meno soggetta ai disturbi;
• PM (modulazione di fase)
detta anche PSK (Phase Shift
.H\LQJ ©ODSLºHIŎFLHQWHPD
anche la più complicata.

Esiste poi la modalità QAM che


coniuga AM e PM (a diversi
angoli di sfasamento) consen-
tendo la trasmissione di più bit
contemporaneamente e quindi
aumentando il rateo dati.
Il segnale digitale modulante, poi,
SX³DYHUHGLYHUVHFRGLŎFKH15=
1RQ5HWXUQWR=HURLOSLºVHP-
SOLFH 5=H$5= $OZDLV5HWXUQ
WR=HURLQSUDWLFDLO3:0 0DQ-
FKHVWHUFRGLŎFKHELSRODULHFF
/DVFHOWDGHOODFRGLŎFDLQŏXLVFH
sullo spettro e su altre caratteri-
Fig. 1 - Schema del sistema SigFox.
stiche come la presenza o meno
di una componente continua o la
possibilità di perdere il sincroni-
smo a causa di lunghe sequenze
GL]HUL FRPHSHU15= 
Ma, in ogni caso, qualunque mo-
dulazione disperde la frequenza
portante in una banda centrata
sulla frequenza base. Ne conse-
gue una dispersione di energia
e una maggiore sensibilità al
rumore o alle interferenze. Fig. 2 - Schema del sistema LoRa.

Elettronica In ~ Ottobre 2015 55


LO SHIELD PER ARDUINO
Lo shield che abbiamo preparato
utilizza la tecnologia LoRa e si
basa su un modulo DRF1278F
della Dorji, il quale a sua vol-
ta monta il chip SX1278 della
Semtech, che è il cuore del siste-
ma. L’SX1278 è un componente
PROWRVRŎVWLFDWRHYHUVDWLOHFKH
fa ampio uso dell’SDR, per cui è
Fig. 3 - Le modulazioni di ampiezza, frequenza e fase. FRPSOHWDPHQWHFRQŎJXUDELOH
La prima cosa da mettere in risal-
to è che lo SX1278 non è dedicato
al solo sistema LoRa, ma può
trasmettere e ricevere anche nelle
classiche modalità FSK o OOK.
In questi casi la comunicazione
può avvenire con un protocollo
DSDFFKHWWRFRQFRGLŎFD15=
RSSXUHSHUŎQRFRQXQDFRGLŎFD
qualunque, inserendo (o rice-
vendo) gli impulsi direttamente
attraverso un pin di I/O. In
quest’ultimo caso il chip funzio-
na come semplice transceiver.
L’SX1278 fa parte della famiglia
SX12xx, e si distingue dagli altri
Fig. 4 - Codifiche del segnale modulante.
membri per il range di frequenza
della portante, che può andare da
superiore a quella necessaria, UHDOL]]DXQDVRUWDGLĮFDPRXŏD- 123 a 525 MHz; gli altri possono
utilizzando una qualche funzione ge” via etere. Nel LoRa, la banda arrivare anche a 1.020 MHz.
di dispersione. La ricostruzione GLGLVSHUVLRQHSX³HVVHUHŎVVDWD In questa prima parte descrive-
avviene tramite una funzione da 7,8 kHz a 500 kHz. remo la struttura dello shield e
inversa. Inoltre ogni byte del segnale è l’utilizzo di esso nella modalità
Quella di dispersione è in genere modulato su più frammenti OOK o FSK, mentre nella secon-
una funzione pseudo-randomica, radio (Spreading Factor). Questo da parte affronteremo la comuni-
oppure una funzione che pro- QXPHURSX³HVVHUHGHŎQLWRGD cazione in modalità LoRa.
voca un continuo salto di fre- a 4.096. La struttura della scheda è abba-
quenza (Frequency Hopping) o, Per cui il rateo effettivo può stanza semplice perché, oltre a
LQŎQHXQDFRPELQD]LRQHGHOOH andare da circa 18 bps (mini- contenere la schedina DRF1278F,
due tecniche. Il risultato è una ma banda, massimo spreading ha un alimentatore riduttore da 5
dispersione del segnale a livello factor) a 78 kbps (massima banda, a 3,3V, alcuni adattatori di livello
GHOUXPRUHLOFKHUHQGHGLIŎFLOH minimo spreading factor). (perché SX1278 lavora a 3,3V)
l’intercettazione e l’interferenza. Ma anche la sensibilità ed il e una combinazione in logica
Anche in questo caso l’energia è valore SNR (segnale/rumore) ne OR per una eventuale gestione
molto bassa, sebbene lo spettro VRQRLQŏXHQ]DWLLQSDUWLFRODUH degli interrupt che l’SX1278 può
sia molto ampio, perché non un aumento dello spreading fac- produrre sui suoi piedini di I/O.
importa se il segnale si trova tor aumenta il valore SNR e della Inoltre, alcuni ponticelli permet-
allo stesso livello del rumore, sensibilità, mentre un aumento tono la scelta e l’abilitazione dei
dato che il segnale può essere della banda diminuisce la sensi- segnali con i pin di Arduino. Per
ricostruito dall’elaborazione. ELOLW¡1HOORVSHFLŎFRVLYDGD esempio il chip select (negato)
Questa tecnica è stata mutuata dB a -20 dB per l’SNR e da -124 può essere collegato al pin D8 o
dal settore militare ed infatti dBm a -134 dBm per la sensibilità. D10 di Arduino, mentre il reset

56 Ottobre 2015 ~ Elettronica In


>SLDQRGLMONTAGGIO]

Elenco Componenti:
RST: Microswitch - Strip maschio 3 vie (4 pz.)
R1÷R10: 10 kohm (0805) Q1÷Q6: BSS138 (SOT23) - Jumper (5 pz.)
R11: 4,7 kohm (0805) T1: BC817 (SOT23) - Strip Maschio/Femmina 3 vie (2 pz.)
R12, R13: 10 kohm (0805) D1÷D5: MMSD4148T1G - Strip Maschio/Femmina 6 vie
C1, C3: 47 μF 6,3 VL elettrolitico (Ø4mm) - Strip Maschio/Femmina 8 vie (2 pz.)
C2, C4: 100 nF ceramico (0805) Varie: - Strip Maschio/Femmina 10 vie (1 pz.)
U1: DRF1278F - Connettore SMA da CS - Antenna stilo cod. ANTSMAGSM
U2: TC1262-3.3VDB - Strip maschio 2 vie (1 pz.) - Circuito stampato S1190

di SX1278 può essere collegato al SMA. Ne consegue che per avere comportamento, o, più precisa-
pin D5 o D7. L’OR degli inter- segnale in antenna è necessario mente hanno più copie, a secon-
rupt può essere collegato al pin abilitare questa uscita (che per da della modalità: LoRa o FSK/
D3, che è uno dei due possibili LPSRVWD]LRQHSUHGHŎQLWDQRQ© OOK. Nel caso di dati pacchet-
interrupt esterni di Arduino. Ma DELOLWDWD WUDPLWHODFRQŎJXUD- tizzati, questi vengono inseriti in
il DIO2 di SX1278 può anche zione di un registro dell’SX1278 una coda FIFO (First In First Out)
essere usato come input/output (registro 0x09). tramite il bus SPI e poi estratti e
di impulsi (come vedremo più /DFRQŎJXUD]LRQHGHOOĬ6; serializzati dal chip nel momento
avanti), e può essere collegato comporta l’aggiornamento dei della trasmissione. Viceversa, nel
D'R',QŎQHLOEXV63,SHU suoi registri interni tramite il bus caso della ricezione, vengono
comunicare con lo SX1278 è 63,,UHJLVWULGLFRQŎJXUD]LRQH accumulati dal chip nella coda da
collegato al connettore ICSP di sono ben 112, di cui la maggior cui possono essere estratti trami-
Arduino. parte gestisce più funzionalità te il bus SPI.
È stato necessario inserire un mediante raggruppamenti di bit. /DFRGD©GLYHUVDPHQWHFRQŎ-
alimentatore riduttore da 5 a 3,2 Inoltre alcuni hanno un diverso gurata e gestita nel caso della
V perché l’assorbimento in fase
di trasmissione (alla massima
potenza) può arrivare a 120 mA e
il convertitore a 3,3V di Arduino
QRQ©VXIŎFLHQWHDJDUDQWLUHOĬDV-
sorbimento.
È opportuno tener presente
che, mentre l’SX1278 ha due
uscite per l’antenna, la schedina
DRF1278F ne riporta all’esterno
solo una: quella dedicata al range
maggiore di potenza (uscita “bo-
ost”). Questa risulta collegata al
connettore d’antenna in formato Fig. 5 - Modalità di funzionamento dell’SX1278.

Elettronica In ~ Ottobre 2015 57


- 111 (7) CAD (solo in LoRa
mode), rilevazione attività
nel canale.

Altri importanti registri sono


[[[FKHGHŎQLVFR-
no insieme la frequenza della
portante in Hz. In Fig. 7 sono
raggruppati i registri comuni alle
due modalità.
Per un esame dettagliato si
rimanda al Datasheet della serie
SX12xx http://www.semtech.com/
Fig. 6 - Registri
di configurazione
images/datasheet/sx1276.pdf .
e coda FIFO. I registri 0x40 e 0x41 sono
GHVWLQDWLDFRQŎJXUDUHLSLQGL
I/O che sono 6 (DIO0-DIO5);
SXUWURSSRTXHVWHFRQŎJXUD]LRQL
KDQQRXQGLYHUVRVLJQLŎFDWRD
seconda della modalità. In ogni
caso sono pin di output, eccetto
DIO2, che può essere bidirezio-
QDOHTXDQGR©FRQŎJXUDWRSHUOD
modalità continuous.
Gli altri pin sono soprattutto utili
per veicolare all’esterno dei se-
modalità LoRa rispetto alla mo- in FSK/OOK mode o riceve gnali di interrupt che comunque
dalità non LoRa (FSK/OOK). La in modo continuo in LoRa sono visualizzabili sui registri di
porta di comunicazione rimane, mode); ŏDJ[([) SHU22.)6.
comunque, lo speciale registro di - 110 (6) RX SINGLE (solo in mode) o 0x12 (per LoRa mode).
indirizzo 0. LoRa mode), riceve singolo L’uso del interrupt permette una
Oltre alla porta per la coda FIFO pacchetto; programmazione ad eventi, ma
(registro 0), uno degli altri registri
comuni alle due modalità LoRa/
1RQ/R5D©LOUHJLVWURFKHGHŎ-
nisce le seguenti modalità:
• bit 7; 0 = FSK/OOK 1=LoRa
SUHGHŎQLWR QRQ/R5D 
• bit 6,5; 00=FSK 01=OOK (pre-
GHŎQLWR 
• bit 4,3 ; riservato o non appli-
cabile al modello 78;
• bit 2,1,0; modalità operativa
del chip:
- 000 (0) Sleep mode;
- 001 (1) Standby mode (pre-
GHŎQLWR 
- 010 (2) FSTX mode (pronto a
trasmettere);
- 011 (3) TX (trasmette);
- 100 (4) FSRX (pronto a rice-
vere);
- 101 (5) RX (riceve pacchetto Fig. 7 - Registri base e comuni.

58 Ottobre 2015 ~ Elettronica In


con l’interrogazione dei registri
GLŏDJVLSX³FRPXQTXHWHQHUH
sotto controllo la comunicazione,
anche perché lo SX1278 gestisce
molti passi in automatico.

COMUNICAZIONE
IN MODALITÀ OOK O FSK
Come si è detto, la comunicazio-
ne in modalità OOK o FSK può
avvenire sotto forma di pacchetti
o in forma libera con l’intervento
di Arduino che avrà il compito
di serializzare/deserializzare i
dati attraverso il pin D6/D9 che
può essere collegato al DIO2
dell’SX1278.
0D©PROWRSLºFRPRGRHGHIŎ-
ciente far gestire la comunicazio-
ne completamente all’SX1278 uti- Fig. 8 - Composizione dei pacchetti.
lizzando la modalità a pacchetto
e caricando/scaricando i dati opzionale); è un ulteriore protocollo proprietario ha altri
dalla coda tramite SPI. I pacchetti indirizzo. parametri.
SRVVRQRHVVHUHGLOXQJKH]]DŎVVD - messaggio; Come vedete, lo SX1278 è estre-
o variabile. - CRC opzionale di 2 byte PDPHQWHFRQŎJXUDELOHLQWHUPLQL
,OSDFFKHWWRDOXQJKH]]DŎVVD© calcolato automaticamente di tipo di modulazione, frequen-
composto da: dal chip. za portante, baud-rate e insieme
• un preambolo (da 0 a 65.535 ad altri moltissimi parametri
byte) composto da una se- Per quanto riguarda l’indirizzo consente un preciso “tuning”
quenza di byte uguali (la lun- XWHQWHYLHQHYHULŎFDWRVHLOUHJL- della comunicazione, anche se
JKH]]D©GHŎQLWDGDLUHJLVWUL VWUR[©FRQŎJXUDWRSHUĮ$G- PROWLSDUDPHWULVRQRGHŎQLWLFRQ
0x25,0x26); il tipo di byte può dressFiltering”; in questo caso il YDORULSUHGHŎQLWLPHGLDPHQWH
essere 0xAA (10101010) o 0x55 pacchetto viene scartato se il byte soddisfacenti. È quasi un modu-
(01010101) (registro 0x27); di indirizzo non corrisponde a lo radio universale, nella logica
• campo di indirizzo (Sync), la TXHOORFRQŎJXUDWRQHOUHJLVWUR GHOODŎORVRŎD6'5
cui lunghezza (da 0 a 8 byte) 0x33. L’AddressFiltering può 3RLFKªODFRQŎJXUD]LRQH©
©GHŎQLWDQHOUHJLVWUR[HL avvenire anche con un ulteriore notevolmente variabile, non
VLQJROLE\WHVRQRGHŎQLWLQHL controllo, prendendo in consi- possiamo esaurire l’argomento in
registri da 0x28 a 0x2F (ma derazione anche il registro 0x34 questa sede; chi vorrà potrà con-
non possono avere valore 0); il dove è stato inserito il “Broadca- sultare il data-sheet dell’SX1278.
FDPSRSX³GHŎQLUHXQLQGL- stAddress”.
rizzo (di rete o del terminale) Il pacchetto di lunghezza varia- UTILIZZIAMO LA SCHEDA
perché quando è presente fa bile si differenzia per avere il pri- PER COMANDARE LE PRESE
scartare automaticamente in mo byte del payload che indica la RADIO-CONTROLLATE
ricezione il pacchetto se non lunghezza e quindi consente un Nel numero 196 di Elettronica In
corrisponde; messaggio di 255 byte massimo. abbiamo descritto, in un apposito
ij 3D\ORDG OXQJKH]]DGHŎQLWD Nel caso di comunicazione in articolo, i protocolli di comunica-
LQ[ ©OĬXQLFRFKHŎQLVFH modalità FSK/OOK, un settag- zione delle prese di alimentazio-
nella coda FIFO e può avere gio fondamentale è quello della ne a 220V radio-controllate (come
lunghezza minima di 1 byte coppia di registri 0x02,0x03 i i sistemi Avidsen o Velleman) e
e massima di 2048 byte ed è TXDOLGHŎQLVFRQRLQPDQLHUD una realizzazione per controllare
composto da: SUHFLVDLOEDXGUDWHGHOODFRGLŎFD queste ultime tramite Arduino
- indirizzo utente (1 byte 15=,QIDWWLLQPRGDOLW¡/R5DLO collegato a dei moduli radio a

Elettronica In ~ Ottobre 2015 59


dal protocollo di comunicazione.
Ma possiamo fare molto meglio:
se vi ricordate le caratteristiche
del protocollo utilizzato da questi
sistemi, potete notare che, in
HIIHWWLODFRGLŎFDGHLYDORULWKUHH
state (0,1,Float) può essere imma-
ginata come una sequenza di 8
bit, il cui baud-rate corrisponde
alla frequenza dell’impulso base
(vedi Fig. 9).
A questo punto teniamo presen-
Fig. 9 - Codifica degli impulsi dei sistemi radio-controllati. WHFKHODFRGLŎFDXWLOL]]DWDQHL
SDFFKHWWL©GLWLSR15=HQRQ
essendo una trasmissione RS232,
non ha i bit di start/stop, né la
parità. Allora possiamo imma-
ginare di trasformare il singolo
Fig. 10 - Pacchetto per sistemi radio-controllati. frame del protocollo del radio-
controllo in una sequenza di byte,
basso costo. Nulla ci vieta di nella modalità “continuous” e ovvero un pacchetto. Basta porre
tentare la stessa strada con que- quindi come un normale modu- a zero il preambolo e il campo
sta scheda, che contiene un così lo radio utilizzando la libreria Sync (indirizzo) e disabilitare il
SHUIRUPDQWHHŏHVVLELOHVLVWHPD software, descritta nell’articolo, CRC. In realtà il pacchetto sarà
radio. La prima tentazione sareb- per far costruire ad Arduino la composto da 4 ripetizioni di que-
be quella di utilizzare la scheda sequenza degli impulsi previsti sto frame, come esige il proto-

Tabella 1 - Libreria per Arduino: Classe SX1278 (funzioni generali e per la modalità FSK/OOK).
YRLGEHJLQ 
,QL]LDOL]]DHUHVHW
YRLGUHVWDUW 
$WWLYDODPRGDOLWj/R5D YRLGVWDUW0RGH/25$ 
$WWLYDODPRGDOLWj)6.22. YRLGVWDUW0RGH)6.22. 
YRLGVHW0RGXODWLRQ XQVLJQHGFKDUPRG 
'HFLGHVH)6.  R22. 
LQWUHDG0RGXODWLRQ 
$WWLYDLOSDUWLFRODUHPRGRRSHUDWLYR
6/((3 
67%< 
)67;  SURQWRDWUDVPHWWHUH
YRLGVHW6WDW E\WHV 
7;  WUDVPHWWH 
LQWUHDG6WDW 
)65;  SURQWRDULFHYHUH
5;  VH)6.22. 5;&217 VH/R5D  ULFHYH
5;6,1*  VROR/R5D
&$'  VROR/R5D
YRLGVHW)UHT ÁRDWIUHT 
)UHTXHQ]DSRUWDQWH LQ0K]
ÁRDWUHDG)UHT 
YRLGVHW%36 LQWESV 
%LW5DWH VHLQPRGDOLWj)66.22.
XQVLJQHGLQWUHDG%36 
3RWHQ]DGLWUDVPLVVLRQHSSXzHVVHUH
 G%P P:  G%P P:  G%P P: YRLGVHW3RZHU E\WHS 
 G%P P: GHI  G%P P:
$ELOLWD  GLVDELOLWD  ODPRGDOLWjDSDFFKHWWR GHI 6HGLVDELOLWDWDYDLQPRGDOLWjµFRQWLQXRXVµ YRLGVHW3DFN1R3DFN E\WHSN 
'HÀQLVFHODIXQ]LRQDOLWjGLRJQXQRGHLSLQGL,2 SHULOFRGLFHYDOYHGHUHWDEHOODFRUULVSRQGHQWHVXOGDWDVKHHW YRLGVHW,2 E\WHQLRE\WHYDO 
/XQJKH]]DHWLSRGHOSUHDPERORGHOSDFFKHWWR YRLGVHW3UHDPEOH XQVLJQHGLQWOHQE\WHSRO 
,QGLUL]]R UHWH VHSUHVHQWHOXQJKH]]DDUUD\GLYDORUL YRLGVHW6\QF E\WHRQE\WHOHQE\WHYDO>@ 
&DULFDODFRGD),)2FRQLGDWLGDVSHGLUH YRLGGDWD7R6HQG E\WHGDWD>@LQWOHQ 
/HJJHGDOODODFRGD),)2LGDWLULFHYXWL YRLGGDWD5HFHLYHG E\WHGDWD>@LQWOHQ 
/HJJHLOSULPRRLOVHFRQGRUHJLVWURGLÁDJ E\WHJHW)ODJV E\WHQUHJ 
/HJJHLOÁDJQGDOSULPRRGDOVHFRQGRUHJLVWURGHLÁDJ E\WHJHW)ODJ E\WHQÁDJE\WHQUHJ 

60 Ottobre 2015 ~ Elettronica In


Tabella 2 - Libreria per Arduino: Classe REMOTEC.
,QL]LDOL]]D WXWWR YRLGEHJLQ 
6ZLWFKRQRIISUHVH$YLGVHQ YRLGDYLGVHQ6HW E\WHDGGUHVV>@E\WHVRFNHWE\WHRQRII 
collo del radio-controllo, per un 6ZLWFKRQRIISUHVH9DOHPDQ YRLGYHOOHPDQ6HW E\WHDGGUHVV>@E\WHVRFNHWE\WHRQRII 
totale di 64 byte. Il baud rate sarà
GHŎQLWRLQEDVHDOOĬLQYHUVRGHOOD 0x06,0x07,0x08). scheda ha un costo abbastanza
lunghezza dell’impulso base.  'HŎQLUHLOEDXGUDWH SHU contenuto; ed inoltre scarica com-
Vediamo di riassumere i passi esempio 3.800 per Advidsen) pletamente Arduino dal compito
necessari per realizzare questo (reg. 0x02,0x03). gravoso di serializzare il treno di
“remote-controller”.  'HŎQLUHLOSDFFKHWWRGLOXQ- impulsi. Ne risulta un sistema af-
1. Abilitare l’uscita boost col- JKH]]DŎVVDGLE\WHVHQ]D ŎGDELOHHGLEXRQDSRUWDWDUDGLR
legata all’antenna, che per preambolo, senza indirizzo Tenete presente che quella propo-
LPSRVWD]LRQHSUHGHŎQLWDQRQ e senza CRC (reg. 0x25, 0x26, sta è solo una delle applicazioni
è abilitata (reg. 0x09); con lo 0x27, 0x30, 0x32). possibili dell’SX1278.
stesso registro si può regolare 7. Caricare i dati nel FIFO.
la potenza di trasmissione 8. Portare il chip allo stato FSTX LA LIBRERIA PER ARDUINO
TXHOODSUHGHŎQLWD©SDULD (pronto a trasmettere, reg. Come avete potuto notare, la
17 dBm, ossia 50 mW) che si 0x01) ed attendere alcune gestione del componente SX1278
può ridurre a 2 dBm(1,5 mW) decine di microsecondi. non è affatto semplice a causa
in step di 1 dBm, oppure si 9. Portare il chip allo stato TX dei numerosi registri e delle
può abilitare la extra potenza (trasmette, reg. 0x01). moltissime funzionalità; abbiamo,
massima di 20 dBm (100 mW). 10. Portare eventualmente il perciò, scritto una libreria per
2. Porre il chip in modalità chip allo stato “Sleep” (non VHPSOLŎFDUQHOĬXVRFRQ$UGXLQR
operativa “Sleep” (reg. 0x01) e necessario perché l’SX1278 si 6RQRVWDWHGHŎQLWHLQQDQ]LWXWWR
attivare la modalità non LoRa porta automaticamente allo le funzioni base per leggere e
(reg. 0x01); infatti questa fon- VWDWRĮ6WDQGE\įDSSHQDŎQLWD scrivere nei registri appoggian-
damentale commutazione può la trasmissione del pacchetto). dosi alla classica libreria SPI per
essere effettuata solo quando Arduino. Successivamente sono
il chip è in condizione “Sleep”. /DTXDOLW¡HOĬHIŎFLHQ]DGHOOR state implementate le funzioni
3. Settare la modalità OOK (reg. SX1278 è decisamente maggiore per i principali settaggi del-
0x01). dei moduli radio a basso co- l’SX1278. La libreria è comunque
 'HŎQLUHODIUHTXHQ]DSRU- sto presi in considerazione nel un cantiere aperto per l’imple-
tante a 433,92 MHz (reg. precedente articolo, anche se la mentazione delle funzionalità più

Listato 1
/********************************************************************************************************
* Commandi (seriale a 9600):
* ? : risponde con il nome dello sketch (utile per RandA)
* onx : switch on; dove x=1,2,3,4,5 (1,2,3 per Velleman) (reply “ON”)
* ofx : switch off; dove x=1,3,3,4,5 (1,2,3 per Velleman) (reply “OF”)
* av : predispone lo sketch per il sistema r Avidsen (default) (reply “OK”)
* ve : predispone lo sketch per il sistema Velleman (reply “OK”)
DG[[[[[[[GH¿QLVFHO¶LQGLUL]]R WKUHHVWDWHHVDG  VRORFKDUSHU$YLGVHQ 
SZ[UHJRODODSRWHQ]DGLWUDVPLVVLRQH
* dove x=1(5mW), 2(10mW), 3(20mW), 4(50mW)(default), 5(100mW)
**********************************************************************************************************/

LQFOXGH³6;K´
LQFOXGH³5(027(&K´
LQFOXGH63,K!

GH¿QHOQ

REMOTEC RC;

 YDORULGLGHIDXOW LQL]LDOPHQWHVX$GYLVHQFRQLQGLUL]]R  
byte addAv[5]={2,0,2,0,0};int alenAv=5;
byte addVl[7]={2,0,2,0,2,2,2};int alenVl=7;
byte* add=addAv;
int alen=alenAv;

int mode=1; //modo Advidsen

(continua)

Elettronica In ~ Ottobre 2015 61


Listato 1 (segue)
char buff[32];
VRŎVWLFDWH1HOODTabella 1 potete
byte sock;
byte onoff; vedere elencate le principali fun-
zioni. Sulla base di questa libreria
void setup()
{ (classe SX1278 ) è stata creata una
6HULDOEHJLQ   ulteriore libreria (classe REMO-
5&EHJLQ 
setmodeavidsen();
7(& ŎQDOL]]DWDDOFRQWUROOR
} remoto delle prese 220V.
Nella Tabella 2 sono descritte le
void loop()
{ funzioni di questa libreria.
LQWF 6HULDODYDLODEOH  Ne consegue che lo sketch del
LI F! 
{ Listato 1 è molto semplice. Lo
6HULDOUHDG%\WHV8QWLO OQEXII  sketch legge dalla seriale il
LI EXII>@ ¶"¶ LWV0H 
if (strncasecmp(buff,”on”,2)==0) commandSend(1);
comando e lo esegue risponden-
if (strncasecmp(buff,”of”,2)==0) commandSend(0); do sulla seriale con una stringa
if (strncasecmp(buff,”av”,2)==0) setmodeavidsen(); “ON”,”OF” o “OK”. Lo sketch
if (strncasecmp(buff,”vl”,2)==0) setmodevelleman();
if (strncasecmp(buff,”ad”,2)==0) setaddress(); ©VWDWRSHQVDWR HYHULŎFDWR 
if (strncasecmp(buff,”pw”,2)==0) setpower(); anche per un utilizzo con RandA.
}
} Potete immaginare la quantità di
utilizzi che si possono facilmente
 )XQ]LRQHGLULFRQRVFLPHQWRSHUPHWWHGLVDSHUHTXDOHVNHWFKqFDULFDWRVX$UGXLQR 
void itsMe()
implementare: dall’accensione/
{ spegnimento programmato agli
char name[]=__FILE__; allarmi o alla gestione intelligen-
FKDU F VWUFKU QDPH¶¶ 
LI F 18//  F ¶?¶ te di carichi. Bene, con questa
6HULDOSULQWOQ QDPH  puntata abbiamo concluso;
}
nella prossima analizzeremo le
void setmodeavidsen() modalità di ricezione FSK/OOK
{
mode=1;
e soprattutto affronteremo la mo-
add=addAv; dalità LoRa che permette a due
alen=alenAv; schede di comunicare su lunghe
6HULDOSULQWOQ ³2.´ 
} distanze. J

void setmodevelleman()
{
mode=2;
add=addVl;
alen=alenVl;
per il MATERIALE
6HULDOSULQWOQ ³2.´ 
}
La shield Long Range (cod.
void commandSend(byte onoff) FT1190M) comprensiva di modulo
{
byte sock=atoi(&buff[2]); radio e tutti i componenti necessari
LI PRGH  5&DYLGVHQ6HW DGGVRFNRQRII  al suo funzionamento, è disponibile
LI PRGH  5&YHOOHPDQ6HW DGGVRFNRQRII 
LI RQRII  6HULDOSULQWOQ ³21´ HOVH6HULDOSULQWOQ ³2)´  a 39,50 Euro. Il modulo DRF1278F
} è disponibile anche separatamene
void setaddress()
a 19,00 Euro. Arduino UNO (cod.
{ ARDUINOUNOREV3) viene ven-
int i; duto a 24,50 Euro. Tutti i prezzi si
LI PRGH  ^IRU L LL DGG$Y>L@ EXII>L@¶¶`
LI PRGH  ^IRU L LL DGG9O>L@ EXII>L@¶¶` intendono IVA compresa.
6HULDOSULQWOQ ³2.´ 
}

void setpower()
{
Il materiale va richiesto a:
byte power=atoi(&buff[2]); Futura Elettronica, Via Adige 11,
LI SRZHU _ SRZHU! ^6HULDOSULQWOQ ³1.´ UHWXUQ` 21013 Gallarate (VA)
6;VHW3RZHU SRZHU 
6HULDOSULQWOQ ³2.´  Tel: 0331-799775 • Fax: 0331-792287
} http://www.futurashop.it

62 Ottobre 2015 ~ Elettronica In


Wireless

Dotiamo
Arduino di un
modulo per
comunicazioni
long-range
basato su
tecnologia
LoRa. Seconda
puntata.

LoRa
SHIELD
dell’ing DANIELE DENARO

vete avuto modo di conoscere, il mese scorso, delle caratteristiche di SX1278 e dei suoi registri
A un nuovo shield per Arduino basato sul chip
SX1278 della Semtech, il quale, a fronte di un costo
rimandiamo al datasheet scaricabile all’indirizzo:
www.semtech.com/images/datasheet/sx1276.pdf.
molto contenuto, permette di implementare una Nella prima parte del progetto abbiamo illustrato
comunicazione radio in una vasta gamma di ap- gli aspetti principali dell’SX1278 e della libreria cor-
plicazioni: dalla trasmissione dei segnali digitali in rispondente nell’utilizzo dello shield in modalità
modalità OOK o FSK, alla comunicazione su lunga trasmittente OOK; abbiamo anche visto una pratica
distanza in modalità LoRa. Il chip, infatti, è stato e comoda implementazione di un controllore remo-
FRQFHSLWRFRQXQUHDOHDSSURFFLRDOODŎORVRŎD6'5 to dei sistemi Velleman o Avidsen per la gestione
5LFRUGLDPRFKHODŎORVRŎD6'5FRQVLVWHQHOUHQGH- di prese di alimentazione a 220V. In questa puntata
re l’apparato di trasmissione completamente con- affronteremo la ricezione nei sistemi OOK o FSK e
ŎJXUDELOHHDGDWWDELOHIDFHQGRODUJRXVRGHOOHWHF- soprattutto la modalità di comunicazione LoRa.
niche digitali in sostituzione di quelle analogiche;
FL³UHQGHOĬ6;WDQWRŏHVVLELOHHSURJUDPPDELOH LA RICEZIONE IN MODALITÀ OOK O FSK
La sua programmabilità è basata su un centinaio di Ricordiamo che l’SX1278 Semtech consente due
UHJLVWULGLFRQŎJXUD]LRQHSHUVXSHUDUHODFRPSOHV- modalità di trasmissione non a standard LoRa (lun-
sità che questo comporta, abbiamo sviluppato una go raggio), di seguito descritte.
OLEUHULDFKHSHUPHWWHXQDYHORFHFRQŎJXUD]LRQH 1. Modalità elementare in cui l’SX1278 funziona
dei principali parametri. Per un approfondimento come semplice modulo radio e i dati vengono

Elettronica In ~ Novembre 2015 67


Avidsen, siamo stati costretti ad
utilizzare la modalità elementare.
Fig. 1 Questa volta, quindi, Arduino
Modalità ULFHYHJOLLPSXOVLVXOSLQ'H
elementare
SURYDDGHFRGLŎFDUOL
(“continuous”)
ed a pacchetto.
La ricezione degli impulsi è com-
pito del modulo radio, quindi è
comune alla modalità a pacchet-
to e a quella “continuous”. Nel
caso di modulazione OOK, si
basa su tre possibili alternative:
1. gestione adattativa della so-
glia di rilevazione dell’impul-
VR©ODPRGDOLW¡SUHGHŎQLWDH
consiste nell’adattare la soglia
del comparatore al valore
(continuamente campionato)
serializzati/deserializzati da to se non corrisponde a quello del segnale radio (RSSI) dimi-
Arduino tramite il pin I/O impostato sulla scheda ricevente. nuito di 6 dBm;
',2GHOOĬLQWHJUDWR6HPWHFK Per questi motivi non possiamo  VRJOLDŎVVDWDPDQXDOPHQWH
FROOHJDWRDOSLQ'GL$UGXLQR utilizzare la modalità a pacchetto mediante il registro 0x15;
2. Modalità a pacchetto, dove i per provare a ricevere e decodi- VRJOLDFRQWLQXDPHQWHDJJLRU-
dati vengono inseriti/recupe- ŎFDUHLUDGLRFRPDQGLGHLVLVWHPL nata come media di RSSI (è la
rati byte per byte in/da una di prese radiocontrollate. Se per modalità più complessa).
coda di trasmissione/ricezio- la trasmissione, l’eliminazione
ne e in cui l’SX1278 può agire del preambolo, dell’indirizzo Nel caso di soglia adattativa è
con una notevole autonomia (Sync) e del CRC non ha avuto possibile regolare il tempo di
nella gestione del collegamen- alcun effetto, in ricezione tali riassestamento della stessa dopo
to radio. elementi sono necessari per la ODŎQHGHOOĬLPSXOVRSHURWWLPL]-
sincronizzazione e la validazione zare il comportamento in casi
La modalità a pacchetto pre- e non possono essere rimossi. particolari.
vede una serie di dati aggiunti Per questo motivo, volendo rea- In verità anche la frequenza del
dall’SX1278 per sincronizzare la lizzare una funzione di scanner campionamento del valore RSSI
ricezione e un indirizzo di rete SHUULOHYDUHODFRGLŎFDGHLWHOH- può essere cambiata tramite il
che può far scartare il pacchet- comandi dei sistemi Velleman o registro 0x0E, anche se il valore
SUHGHŎQLWR©LQJHQHUHDGHJXDWR
Nel caso di modulazione FSK,
SX³HVVHUHDSSOLFDWRXQŎOWUR
Gaussiano con tre diversi valori,
oppure può essere aggiustata
la velocità di salita o discesa
dell’impulso.

SCANNER PER LA DECODIFICA


DEI TELECOMANDI
Ulteriori funzioni sono state
inserite nella classe REMOTEC
per realizzare questa ricezione
VHPSOLŎFDWDOHWURYDWHQHOOD
Tabella 1. Lo sketch che in que-
sta puntata vi proponiamo per
realizzare tale funzione è cor-
Fig. 2 - Soglia adattativa nella demodulazione OOK. tissimo, come si può vedere dal

68 Novembre 2015 ~ Elettronica In


Tabella 1 - Classe REMOTEC funzioni di ricezione.
boolean setScannerMode(); Per passare alla modalità di ricezione.
void setTransmitMode(); Per tornare alla modalità trasmissione.
int scanImpulses();
Riceve gli impulsi trasmessi dal radiocomando, glio ancora, con modulazione
GHWHUPLQDO·LPSXOVREDVHHSURYDDGHFRGLÀFDUOL
FSK. Però, se non sono richieste
buone velocità, ovvero alti bps,
Listato 1, e permette la scansione LOSUHFHGHQWHŏDJQRQVHJQDODLO è molto più conveniente passare
dei radiocomandi. completamento. alla modalità principale dello
A questo punto l’SX1278 può SX1278, ovvero la modalità
TRASMISSIONE essere posto in standby oppure LoRa, che aumenta di molto la
E RICEZIONE DEI PACCHETTI si può ricominciare la procedura SRUWDWDHOĬDIŎGDELOLW¡
La trasmissione e la ricezione in attesa di altri pacchetti. Come detto nella prima pun-
di pacchetti normali richiede In realtà la ricezione può essere tata, la modalità LoRa utilizza
l’impostazione di alcune con- automatizzata mediante l’utiliz- un protocollo di modulazione
ŎJXUD]LRQLPDPHQWUHSHUOD zo di un registro di condizioni di proprietario che è basato su una
trasmissione i passi sono limitati, “AutoRestartRxMode”. funzione di dispersione di ogni
per la ricezione le cose sono un ,QŎQH©SRVVLELOHDQFKHDELOLWDUH bit su più elementi di modu-
po’ più complicate. un “Sequencer” ovvero un vero lazione e su un ampio spettro
Come abbiamo visto nella programma di auto-gestione del- centrato sulla frequenza della
precedente puntata, l’SX1278 la trasmissione-ricezione. Que- portante. In pratica ogni byte (o
si preoccupa di aggiungere ai VWRVRŎVWLFDWRĮDXWRPDDVWDWL simbolo di informazione) è rap-
dati (payload) il preambolo, un ŎQLWLįSHUPHWWHGLDXWRPDWL]]DUH presentato da più elementi di
indirizzo di rete ed un CRC, se- l’intero processo di comunica- modulazione (chip), e si parla
guendo le indicazioni fornite dai zione. Lasciamo a voi la lettura allora di “Spreading Factor” che
UHJLVWULGLFRQŎJXUD]LRQH‰SHU³ del data-sheet dell’SX1278 per è il numero di chip utilizzati
opportuno sottolineare che in l’approfondimento di questa per ogni simbolo. Maggiore è lo
modalità non LoRa la coda FIFO complessa modalità. “Spreading Factor” e migliore
è limitata a 64 byte, perciò se si è la ricezione; ovvero migliora
vogliono spedire pacchetti più MODALITÀ LORA il rapporto segnale/rumore
lunghi bisogna alimentare conti- Con la modalità a pacchetto (SNR). Lo “Spreading Factor”
nuamente la coda. Lo stesso vale, è possibile far comunicare le può variare da 64 a 4.096. Il
al contrario, per la ricezione. schede con SX1278 in modo so- YDORUHSUHGHŎQLWR©HSX³
Per questo motivo sono stati ŎVWLFDWRDIŎGDELOHHFRQSRFKLV- HVVHUHPRGLŎFDWRXVDQGRLO
predisposti degli interrupt (e simo intervento di Arduino, sia registro 0x1E (ricordiamo che i
ŏDJ FROOHJDWLDOODFRGD),)2SHU con modulazione OOK che, me- registri hanno copie differenti
esempio coda vuota, coda piena,
coda piena oltre un certo livello
UHJLVWUR[  Listato 1
Per la ricezione, l’integrato /**************************************************************************/
/*
SX1278 deve essere posto nello * Sketch per analizzare la trasmissione dei radiocomandi Avidsen o Velleman
stato FSRX (stato 4) e, dopo qual- 'HWHUPLQDODOXQJKH]]DGHOO¶LPSXVREDVHHSURYDDGHFRGL¿FDUHLOFRPDQGR
*
che centinaio di microsecondi, in */
modalità RX (stato 5). A questo
SXQWRVLWUDWWDGLYHULŎFDUHWUD- LQFOXGH63,K!
LQFOXGH³5(027(&K´
PLWHLQWHUUXSWRŏDJOĬDUULYRGHL
GDWL3HUHVHPSLRVLSX³YHULŎ- REMOTEC RC;
FDUHLOŏDJĮ3UHDPEOH'HWHFWįR void setup()
PHJOLRDQFRUDLOŏDJĮ6\QF$G- {
6HULDOEHJLQ  
dressMatch” che segnala che il 5&EHJLQ 
pacchetto è indirizzato proprio LI 5&VHW6FDQQHU0RGH 6HULDOSULQWOQ ³5HFHLYLQJ´ 
al ricevente. HOVH6HULDOSULQWOQ ³3UREOHP1RUHDG\WRUHFHLYH´ 
}
Poi si può scaricare in una volta
sola il pacchetto se questo è void loop()
{
PLQRUHGLE\WHYHULŎFDQGRLO 5&VFDQ,PSXOVHV 
ŏDJĮ3D\ORDG5HDG\įRSSXUHVL }
SX³VFDULFDUHOD),)2ŎQRDFKH

Elettronica In ~ Novembre 2015 69


Hz di banda. Per il “Symbol
Rate” basta dividere per 8: in
pratica si va da un migliaio di
byte al secondo a qualche de-
cina di byte al secondo , senza
voler contare casi estremi.

PACCHETTO LORA
Tabella 2 - Spreading factor e sensibilità. Anche la modulazione LoRa co-
munica in modalità a pacchetto.
Il pacchetto standard è detto
“con header esplicito” ed ha
OXQJKH]]DYDULDELOH‰IRUPDWR
dalle seguenti parti (Fig. 3).
1. Un preambolo di sincroniz-
zazione di lunghezza mo-
GLŎFDELOHHIRUPDWRFRQXQ
VLPEROR E\WH SUHGHŎQLWR
Tabella 3 - Bit di correzione ed overhead conseguente.
e proprietario; la lunghezza
SUHGHŎQLWD©VLPEROL
per la modalità LoRa/OOK-FSK PRGLŎFDUHORVSHWWURGLHPLV- 2. Un header con il suo CRC;
anche se condividono lo stesso sione, che per impostazione l’header contiene informa-
indirizzo). SUHGHŎQLWD©GLN+]4XHVWR zioni sul payload come la
Lo “Spreading Factor” è codi- GDWR©GHŎQLWRDQFKĬHVVRQHOUH- sua lunghezza, il “code rate”
ŎFDWRQHOUHJLVWUR[(FRQL JLVWUR['HSX³DYHUHLYDORUL adottato nel payload e la pre-
numeri da 6 a 12 come si può da 7,8kHz a 500kHz (codici da senza o meno del CRC alla
vedere nella Tabella 2. Il valore 0 a 9). Aumentando lo spettro ŎQHGHOSD\ORDG/ĬKHDGHU
SUHGHŎQLWR© aumenta anche il rate di emis- stesso, però, è sempre tra-
Inoltre per aumentare la ro- sione, ma diminuisce l’intensità smesso con il massimo della
bustezza del protocollo viene del segnale e soprattutto biso- ridondanza (code-rate=4/8)
aggiunto un “Cyclic Error Cor- gna tener conto delle normative ed ha un suo CRC.
rection”, vale a dire alcuni bit di legge riguardo alle regole di 3D\ORDGGLOXQJKH]]DYDULD-
aggiuntivi per correggere even- emissioni radio. bile (255 byte massimo).
tuali errori; ciò aumenta ulte- ,QRJQLFDVRFRQLYDORULSUHGHŎ- 4. Eventuale CRC riferito al
riormente la lunghezza dell’in- niti per lo “Spreading Factor”, il payload (abilitato tramite il
formazione spedita. Il numero “Cycling Coding Rate” e la ban- bit 2 del registro 0x1E).
di questi bit di ridondanza può da di emissione si ha un rate di
HVVHUHPRGLŎFDWRQHOUHJLVWUR circa 8 kbps nominali, mentre Esiste anche una modalità “im-
['FKHSHUGHIDXOW©UHJROD- con uno spread di 4.096 (codice plicita” in cui l’header è elimi-
to su 5 bit su 4 (codice 1); allo 12) e una ridondanza 4/8 (codi- nato, per ridurre la lunghezza.
scopo riferitevi alla Tabella 3 (il ce 4) si hanno circa 150 bps. Per In questo caso la lunghezza
YDORUHSUHGHŎQLWR©  il calcolo basta considerare un GHOSD\ORDGGHYHHVVHUHŎVVDWD
A questo punto si può anche chip di modulazione per ogni insieme alle sue altre caratteri-
stiche e deve corrispondere tra
il trasmettitore ed il ricevitore.
4XHVWDPRGDOLW¡©GHŎQLWDGDO
bit 0 del registro 0x10.
Nel caso di trasmissioni lunghe
e lente è possibile abilitare un
ŏDJFKHFRVWULQJHOĬ6;DG
una maggiore stabilità in fre-
TXHQ]D4XHVWRŏDJĮ/RZ'DWD-
Fig. 3 - Pacchetto in modalità LoRa. RateOptimize” corrisponde al

70 Novembre 2015 ~ Elettronica In


Fig. 4 - Suddivisione del buffer FIFO. Fig. 5 - Caricamento dei dati da trasmettere.

ELWGHOUHJLVWUR[PDQHO re la frequenza sul canale 1 … e aumentare l’area destinata alla


FDVRGHYHHVVHUHFRQŎJXUDWR così via. La libreria non prende ricezione a discapito di quella
sia per la funzione trasmittente in considerazione questa modali- per la trasmissione o viceversa.
che per la ricevente. tà, ossia la frequency hopping. Infatti la coda, questa volta, è
Come vedete, questa volta, non gestita completamente con la
è presente un indirizzo di rete LA CODA FIFO tecnica dei puntatori. Un pun-
controllato automaticamente IN MODALITÀ LORA tatore (registro 0x0F) punta alla
dall’SX1278; ne consegue che un Questa volta la coda FIFO è di base del settore dati ricevuti ed
eventuale indirizzamento può 256 byte, ma, soprattutto ha una uno (registro 0x0E) alla base dei
essere solo a carico del payload gestione completamente adatta- dati pronti per essere trasmessi.
HYHULŎFDWRGD$UGXLQR bile, nel senso che è composta da Un puntatore di accesso (registro
due settori separati ma variabili: [' VHUYHDGLQGLUL]]DUHLGDWL
OPZIONE SALTO DI FREQUENZA uno per i pacchetti da trasmette- da scrivere o da leggere, che
Nel caso non si voglia impegnare re ed uno per quelli da ricevere. sono, comunque acceduti trami-
per lungo tempo un canale della Per cui è possibile utilizzarla te la porta della FIFO (registro
banda di frequenze portanti contemporaneamente per la tra- 0x00).
disponibili, è possibile ricorrere smissione e la ricezione, contra- &RPHFRQŎJXUD]LRQHRULJLQDULD
al salto di frequenza “Frequency riamente a quanto succedeva per la FIFO è suddivisa equamente
Hopping Spread Spectrum” la coda FIFO in modalità OOK/ tra area RX e area TX, per cui
(FHSS). Questa modalità potreb- FSK. l’area RX parte all’indirizzo 0x00,
be essere necessaria nel caso di Inoltre le grandezze dei due set- mentre quella TX all’indirizzo
pacchetti lenti e lunghi in aree WRULVRQRFRQŎJXUDELOLHVLSX³ 0x80. La Fig. 4 chiarisce la com-
dove la legislazione in materia
è più vincolante (per esempio
in USA si tratta della banda
902÷928 MHz), quindi nel nostro
caso è solo facoltativa.
Adottando questa modalità (con-
ŎJXUDQGRLOUHJLVWUR[FRQ
un valore maggiore di zero), è
richiesto un maggiore intervento
di Arduino; infatti si tratta di sta-
bilire una tabella delle frequenze
comuni al trasmettitore ed al ri-
cevitore. A questo punto, parten-
do dal canale di indice 0, dopo il
tempo stabilito nel registro 0x24,
viene generato un interrupt ed
Arduino ha il compito di cambia- Fig. 6 - Lettura dei dati ricevuti.

Elettronica In ~ Novembre 2015 71


Tabella 4 - Flags (bit del registro 0x12).
7 RxTimeout Timeout nell'attesa di ricezione (vedi più avanti per l'impostazione del valore)
6 RxDone È stata completata la ricezione di un pacchetto
5 PayloadCrcError (UURUHVXOODULFH]LRQHGHOSD\ORDGRSD\ORDGQRQDIÀGDELOH ricezione ed è stato aggiunto un
4 ValidHeader L'header del pacchetto risulta valido (si può procedere) ulteriore stato. Per comodità rias-
3 TxDone Il pacchetto è stato trasmesso sumiamo tutti gli stati operativi
2 CadDone La modalità CAD è stata attivata SX1278 è in ascolto di attività (preamboli) nella Tabella 5.
1 FhssChangeChannel È ora di cambiare canale (solo con il salto di frequenza abilitato)
0 CadDetected È stata rilevato l'arrivo di un preambolo.
TRASMISSIONE
'RSRDYHUGHŎQLWROHFDUDWWH-
posizione della FIFO. I dati da 0x40 e 0x41 come riportato nella ristiche dei pacchetti e della
trasmettere (il payload) vengono prima parte dell’articolo. comunicazione (“una tantum”),
inseriti scrivendo sulla porta del- Inoltre gli interrupt possono i passi necessari per trasmettere
la FIFO (registro 0x00) dopo aver essere disabilitati utilizzando il un pacchetto a partire dallo stato
caricato sul registro puntatore il UHJLVWURĮPDVFKHUDį[,ŏDJ standby sono:
valore dell’indirizzo di partenza interrupt possono essere “reset- 1. inizializzare il puntatore FIFO
GHOOĬDUHD7;HLQVHUHQGRDOODŎQH tati” manualmente, ma alcuni lo [' DOODEDVHGHOOĬDUHD7;
LOWRWDOHQHOUHJLVWUR[ Fig. 5). sono in modo automatico. LOYDORUHSUHGHŎQLWR©[ 
I dati ricevuti, invece, vengono Esiste un timeout per l’attesa di 2. inserire i byte del payload tra-
prelevati caricando sul registro ricezione impostabile mediante il mite la porta FIFO (reg. 0x00);
puntatore il valore contenuto nel registro 0x1F e i primi due bit del il puntatore si incrementerà
registro di partenza dell’ultimo registro 0x1E per un valore mas- da sè;
pacchetto ricevuto. Poiché il pac- VLPRGL4XHVWRWLPHRXW DOODŎQHLQVHULUHLOQXPHURGHL
chetto ha lunghezza variabile, un però, non è espresso in unità di byte da spedire (lunghezza
XOWHULRUHUHJLVWUR [ FRQWLHQH tempo ma in unità di simboli del payload) nel registro 0x22;
il numero dei byte arrivati e (byte), quindi corrisponde al 4. passare allo stato FSTX ed
quindi da scaricare. tempo necessario per trasmettere attendere un centinaio di mi-
n simboli, il che rende il timeout crosecondi;
INTERRUPT E TIMEOUT variabile in funzione delle carat- 5. dare il via alla trasmissione
*OLLQWHUUXSWŏDJVLWURYDQR teristiche della comunicazione. (stato TX);
in un registro (0x12) differente In pratica in termini di unità di 6. dopo l’ultimo byte trasmesso
da quello usato nella modalità tempo vale la formula di Fig. 9. l’SX1278 si porterà automati-
OOK/FSK e corrispondono alle camente allo stato di Standby;
segnalazioni riepilogate nella OPERATIVITÀ
Tabella 4. L’attività dello SX1278 è scandita 6LSX³YHULŎFDUHOĬDYYHQXWD
$RJQXQRGLTXHVWLŏDJFRUUL- dall’aggiornamento del registro WUDVPLVVLRQHPHGLDQWHLOŏDJLQ-
sponde un interrupt rilevabile su del Modo Operativo (registro WHUUXSW7['RQH1RWDWHFKHLOSDV-
XQGHWHUPLQDWRSLQ',2VHFRQGR 0x01). Né più né meno che in saggio allo stato Sleep cancella il
XQDFRQŎJXUD]LRQHLPSRVWDELOH modalità OOK/FSK. C’è, però contenuto della memoria FIFO,
tramite i registri di “mapping” TXDOFKHPRGLŎFDULJXDUGDQWHOD mentre rimanendo in Standby, la
FIFO può essere riutilizzata per
rimandare lo stesso messaggio:
basta non aggiornare il puntatore.
Fig. 9

Codice Modo Descrizione RICEZIONE


Modalità a bassissimo consumo (<<1uA). Registri accessibili ma non FIFO. La ricezione può avvenire per
0 Sleep
6RORPRGRSHUGHÀQLUHODPRGDOLWjGLEDVH/R5DR)6.22. GHIDXOW singolo pacchetto o in modo con-
1 Standby Stato base durante l'operatività (consumo circa 1,5 uA) tinuo pacchetto dopo pacchetto,
2 FSTX Pronto a trasmettere (circa 6mA) nel senso che è possibile dare
3 FSRX Pronto a ricevere (circa 6mA) il via alla ricezione continua veri-
Dà il via alla trasmissione
4 TX
HGDOODÀQHVLULSRUWDDXWRPDWLFDPHQWHLQVWDQGE\ P$ ŎFDQGROĬDUULYRGLXQSDFFKHWWRH
5 RXcontinuous Ricezione continua dei pacchetti (vedere più avanti; assorbimento di circa 12 mA) scaricandolo senza che lo SX1278
6 RXsingle
Ricezione del singolo pacchetto cambi stato operativo. Per quan-
HGDOODÀQHVLULSRUWDDXWRPDWLFDPHQWHLQVWDQGE\ P$ to riguarda la ricezione singola si
7 CAD In ascolto per rilevare l'arrivo di un preambolo.
compie con questa sequenza:
Tabella 5 - Modi Operativi in modalità LoRa (registro 0x01). 1. inizializzare il puntatore FIFO

72 Novembre 2015 ~ Elettronica In


Mente geniale,
IDVFLQRFLQHPDWRJUDÀFR
Se pensate che la tecnica del lywood la reclamò, sia per motivi
[' DOODEDVHGHOOĬDUHD5; salto di frequenza con algoritmo politico-razziali, volle partecipare
LOYDORUHSUHGHŎQLWR©[  “randomico” sincronizzato sia allo sforzo bellico come molte
2. passare allo stato FSRX e opera di qualche camice bianco altre sue colleghe. Ma invece di
attendere un centinaio di mi- con molte penne nel taschino e limitarsi alle campagne per la
crosecondi; l’aspetto trascurato, vi sbagliate di ULFHUFDGLÀQDQ]LDPHQWLSUHVHQWz
GDUHLOYLDDOODULFH]LRQH VWDWR grosso. Il brevetto, ormai scaduto, alla marina militare un progetto
RXsingle); la ricezione termina appartiene alla bellissima attrice di trasmissione radio innovativo e
hollywoodiana Hedy Lamarr. Sì, non facilmente intercettabile. Pur-
automaticamente riportando
Esatto! La tecnica usata anche troppo il progetto venne scartato,
lo SX1278 allo stato Stand- dalla moderna telefonia mobile, perché la tecnologia radio di allora
by quando si è superato il nonché dai militari è stata inventa- (a valvole) non era facilmente
7LPHRXWFRQŎJXUDWR ŏDJ ta da un’attrice. adattabile al sistema, ma pro-
interrupt Timeout) oppure è Hedy Lamarr (nome d’arte) di babilmente anche per una certa
DUULYDWRXQSDFFKHWWR ŏDJ origine austriaca e di discendenza VXIÀFLHQ]DGHJOLDOWLFRPDQGL,O
LQWHUUXSW5['RQH  ebrea, si era iscritta alla facoltà sistema, ed Hedy Lamarr, si ripre-
4. nel caso sia arrivato un pac- di ingegneria negli anni trenta, sero la rivincita (solo morale) negli
chetto, questo verrà estratto ma fu notata da un registra che la anni sessanta , quando la marina
convinse a intraprendere la car- militare lo cominciò ad utilizzare
dalla FIFO leggendo la porta
riera di attrice di teatro e cinema. estesamente. Senza contare che
0x00 per tante volte quanto è Cosicché abbandonò l’università. è anche alla base della telefonia
il valore del registro Nume- Si sposò giovanissima con un mobile.
UR%\WH5LFHYXWL [  imprenditore del settore arma- L’idea le venne insieme ad un
menti. In questo ambiente recepì suo amico compositore George
Quanto alla ricezione continua, la problematica della sicurezza e Antheil; e , guarda caso, il brevetto
la sequenza di esecuzione è: dell’interferenza sulle trasmissioni riportava l’algoritmo per il salto di
1. inizializzare il puntatore FIFO radio militari soprattutto nell’u- frequenza basato su 88 portanti:
[' DOODEDVHGHOOĬDUHD5; so con i radiocomandi. Quando tante quanti sono i tasti di un
emigrò negli USA, sia perché Hol- pianoforte.
LOYDORUHSUHGHŎQLWR©[ 
2. passare allo stato FSRX e
attendere un centinaio di mi-
crosecondi;
dare il via alla ricezione conti-
nua (stato Rxcontinuous); l’at-
tività può essere bloccata solo
manualmente cambiando stato;
4. se è arrivato un pacchetto il
ŏDJ5['RQHYLHQHDJJLRUQDWR
e la ricezione continua;
VHLOŏDJ5['RQH©DWWLYDWRVL
carica il registro puntatore con
il valore del registro Start Pack
(RxCurrentAddress 0x10) che
punta all’inizio dell’ultimo
pacchetto completo arrivato;
6. si legge la coda FIFO per un
numero di volte corrisponden-
te alla lunghezza dell’ultimo
SDFFKHWWRDUULYDWR UHJ[  CHANNEL ACTIVITY stata predisposta una modalità
 VLD]]HUDLOŏDJ5['RQHSHU DETECTION (CAD) per la quale l’SX1278 si pone in
segnalare un nuovo pacchetto; Poichè in modalità LoRa il se- ascolto soltanto del preambolo.
8. se si vuole interrompere la ri- gnale si confonde con il rumo- ,QTXHVWRPRGRVLSX³YHULŎ-
cezione continua basta portare re, se si volesse monitorare la care l’occupazione del canale o
l’SX1278 nello stato Standby, presenza di comunicazione, non eventualmente passare allo stato
altrimenti si lascia attivo e la sarebbe accettabile utilizzare il di ricezione. In questo stato, la
ricezione procede. valore RSSI; per ovviare a ciò è ricezione del preambolo viene

Elettronica In ~ Novembre 2015 73


Listato 2 - Sketch trasmittente per test con eco
LQFOXGH/25$K!
LQFOXGH63,K!
HYLGHQ]LDWDGDOŏDJLQWHUUXSW
GH¿QHSVRXQGSLQSHUEX]]HU &DG'HWHFWHGHOR6;ULWRUQD
GH¿QHSLQJRSLQSHUSXVKEXWWRQ
GH¿QHSLQISLQSHULOOHGGLVHJQDOD]LRQH allo stato Standby. La rilevazio-
ne del preambolo è fatta molto
GH¿QH0(66³6LPSOHHFKRWHVW´PHVVDJJLRGDVSHGLUHHULFHYHUHFRPHHFR velocemente (qualche byte) me-
GH¿QH5;7,0(287GHFLQHGLPLOOLVHFRQGL    VHFRQGL  diante algoritmi di correlazione
e consuma, perciò, poco.
LORA LR; // Istanza della classe LORA

GH¿QHLQSOHQOXQJKH]]DGHOEXIIHUGLVSHGL]LRQH LA LIBRERIA IN MODALITÀ LORA


GH¿QHUHFOHQOXQJKH]]DGHOEXIIHUGLULFH]LRQH La libreria per la modalità LoRa
char inpbuff[inplen]; // buffer di spedizione ©GHŎQLWDGDOODFODVVH/25$FKH
char recbuff[reclen]; // buffer di ricezione è composta da poche istruzioni
FKDUGDWD>@EXIIHUSHULYDORUL566,DQG615
principali, che elenchiamo nella
GH¿QHIRUPDW³_5VVLG5VVL3NG6QU3NG_³ Tabella 6. Sono, poi, disponibili
SRFKHDOWUHIXQ]LRQLSHUPRGLŎ-
LQW6) &RGLFH6SUHDGLQJIDFWRU VHVLYXROHFDPELDUHSHUWHVW
LQW%: &RGLFH%DQGZLGWK VHVLYXROHFDPELDUHSHUWHVW
care i parametri della trasmissio-
ne: spreading factor, larghezza
LQW3:5 SRWHQ]DLQWUDVPLVVLRQH FRGLFH di banda ecc.
ERROHDQ6+,(/' WUXH /DFRQŎJXUD]LRQHGLEDVHKD
SRUWDQWHFRQIUHTXHQ]D
void setup()
{
MHz, spreading factor codice
SLQ0RGH SLQJR,1387B38//83 3XOOXSSHULOSXVKEXWWRQ 9, larghezza di banda codice
GLJLWDO:ULWH SLQI LQL]LDOL]]DOHG 6 e ridondanza codice 4. Per
SLQ0RGH SLQI287387 
SLQ0RGH SVRXQG287387 LQL]LDOL]]DFLFDOLQR cambiare altre caratteristiche si
6HULDOEHJLQ   possono sempre utilizzare anche
LI /5EHJLQ VHODVFKHGDQRQF¶qHVFH le funzioni della classe SX che
^6HULDOSULQWOQ ³1R/R5DVKLHOGGHWHFWHG6WRS´ 6+,(/' IDOVHUHWXUQ`
6HULDOSULQWOQ ³/R5DHFKRWUDQVPLWWHU´  permettono di agire su tutti i
6;VHW3RZHU 3:5  registri. La classe SX è importata
/5VHW&RQ¿J 6)%: VHVLYXROHFDPELDUHSHUWHVW GHI
VKRZ&RQ¿J VWDPSDODFRQ¿JXUD]LRQH
automaticamente dalla classe
VWUOFS\ LQSEXII0(66LQSOHQ FDULFDLOPHVVDJJLRQHOEXIIHU LORA.Vediamo ora un esempio
6HULDOSULQW ³&ORVHSLQ³  di comunicazione LoRa che è
6HULDOSULQW SLQJR 6HULDOSULQWOQ ³WRJURXQGWRVHQGPHVVDJH´ 
} composto da due skhetch: uno
che trasmette una breve frase ed
void loop() uno che la riceve e la ritrasmette
{
GHOD\   come eco. Questi sketch sono
LI 6+,(/' UHWXUQ VWDWLYHULŎFDWLLQFLWW¡HGKDQQR
LI JHW,QSXW ^VHQG%XII JHW5HSOD\ `
 VHSXVKEXWWRQSUHPXWRVSHGLVFHHULFHYHHFR
mostrato un range operativo di
} circa 200 m in presenza di osta-
coli (mura e palazzi) mentre in
boolean getInput()
{ campo aperto hanno consentito
LI GLJLWDO5HDG SLQJR ! UHWXUQIDOVHWHVWSXVKEXWWRQ un range di circa 1 km.
return true;
}
SKETCH TRASMITTENTE
void sendBuff() Lo sketch (Listato 2 YHULŎFDHG
{
VRXQG   DYYLVDFKHVWDVSHGHQGR
inizializza la scheda, quindi si
EOLQNSLQI   pone in attesa di un pulsante che
digitalWrite(pinf,LOW); chiude a massa il pin 8. Quando
6HULDOSULQW ³!³ 6HULDOSULQWOQ LQSEXII  il pulsante viene premuto, viene
LQWI /5VHQG0HVV LQSEXII VSHGLVFHLOPHVVDJJLR inviato il messaggio preordi-
LI I 6HULDOSULQWOQ ³(UURULQWUDQVPLVVLRQ´ 
nato. Quindi lo sketch si pone
6;VHW6WDWH 67'%<  in ricezione per un certo tem-
} po, aspettando l’eco. Quando
(continua) questo arriva, lo confronta con

74 Novembre 2015 ~ Elettronica In


Listato 2 (segue)
YRLGJHW5HSOD\
{
il messaggio di partenza e se /5UHFHLYH0HVV0RGH  VLPHWWHLQULFH]LRQH
corrisponde avvisa della corretta ERROHDQ2. IDOVH
ricezione e stampa sulla console int i;
IRU L L5;7,0(287L
una stima dei valori RSSI e SNR.    YHUL¿FDVHDUULYDXQDULVSRVWDHQWUR5;7,0(287
Le segnalazioni sono fatte su ^LI /5GDWD5HDG UHFEXIIUHFOHQ ! ^2. WUXHEUHDN`GHOD\  `
LI 2. ^6HULDOSULQWOQ ³1RUHSOD\´ EOLQNSLQI  VRXQG  UHWXUQ`
FRQVROHPDDQFKHFRQXQ/('  VHVLVWDPSDYDORUL566,HYHUL¿FDFRUUHWWH]]D
sul pin 7 ed un cicalino sul pin 9. VQSULQWI GDWDIRUPDW6;JHW/RUD5VVL 6;ODVW/RUD3DFNHW5VVL 
6;ODVW/RUD3DFNHW6QU 
6HULDOSULQWOQ GDWD 
SKETCH DI RICEZIONE ED ECO 6HULDOSULQW ³³ 6HULDOSULQWOQ UHFEXII 
'RSRODIDVHGLLQL]LDOL]]D]LRQH LQWLQF VWUOHQ LQSEXII 
lo sketch si mette in modalità LI VWUQFPS UHFEXIILQSEXIILQF  ^GLJLWDO:ULWH SLQI+,*+ VRXQG  `
HOVH^EOLQNSLQI  VRXQG  `
ricezione ed aspetta messaggi; }
appena ne riceve uno, esce dalla
void blinkpinf(int time,int n)
modalità ricezione, visualizza {
i dati di stima RSSI e SNR e lo int i;
rispedisce, quindi ritorna in mo- E\WHS 
IRU L LQL ^GLJLWDO:ULWH SLQIS GHOD\ WLPH S SA`
dalità ricezione (Listato 3). GLJLWDO:ULWH SLQI 
}
CONCLUSIONI
void sound(int time,int n)
&RPHDEELDPRSRWXWRYHULŎFD- {
UHODVFKHGD©PROWRŏHVVLELOH UHWXUQXQFRPPHQWLI\RXOLNHVRXQG
int i;
ed adattabile a diversi tipi di IRU L LQL
trasmissioni. Anche se la moda- ^GLJLWDO:ULWH SVRXQG GHOD\ WLPH GLJLWDO:ULWH SVRXQG GHOD\  `
OLW¡SLºLQQRYDWLYDHGHIŎFLHQWH GLJLWDO:ULWH SVRXQG 
}
è quella LoRa. Con un paio
di schede si possono coprire YRLGVKRZ&RQ¿J
{
distanze notevoli: 200m al 6HULDOSULQW ³5HSOD\WLPHRXW PLOOLVHF ³ 6HULDOSULQWOQ 5;7,0(287  
FKLXVRHWUDHGLŎFLHFLUFDNP 6HULDOSULQW ³)UHTXHQFH³ 6HULDOSULQWOQ 6;UHDG)UHT 
in campo aperto. Già con una 6HULDOSULQW ³7UDQVPLWSRZHU P: ³ 6HULDOSULQWOQ 6;JHW3RZHU  
6HULDOSULQW ³3UHDPEOHE\WHV³ 
potenza di 10mW si raggiun- 6HULDOSULQW 6;JHW/RUD3UHDPEOH/HQ 6HULDOSULQWOQ ³´ 
gono una ottantina di metri tra VQSULQWI GDWD´6S)DFWRUG%DQG:G&UG´
JOLHGLŎFL0DFRQXQVRIWZDUH 6;JHW/RUD6SU)DFWRU 6;JHW/RUD%Z 6;JHW/RUD&U 
6HULDOSULQWOQ GDWD 
GLLGHQWLŎFD]LRQHGLLQGLUL]]R© 6HULDOSULQW ³5DWH E\WHVHF ³ 6HULDOSULQWOQ 6;JHW65DWH 
possibile comunicare con molte }
schede e ricevere valori dei
sensori o attivare azionatori. Se
poi pensassimo di utilizzare
la scheda con RandA (ovvero
con l’accoppiata Raspberry Pi
e Arduino), potremmo avere
un instradamento dei dati su
Internet. La libreria “LoRa.zip” è
scaricabile dal sito e comprende
anche la classe per il controllo
remoto Avidsen o Velleman.
La libreria fornisce le funzioni
VHPSOLŎFDWHSHUXWLOL]]DUHDO
meglio la scheda. Lasciamo a
voi la possibilità di manipolare
LQPRGRSLºUDIŎQDWROĬ6;
mediante la gestione diretta dei
suoi numerosi registri.
Le funzioni di libreria illustrate Fig. 10 - Rete di sensori/attuatori.

Elettronica In ~ Novembre 2015 75


Nome Formato Descrizione
begin boolean begin() Inizializza la scheda direttamente in modalità LoRa. Se la scheda non è presente ritorna falso.
setModeLora void setModeLora() La seconda funzione invece cambia in modalità LoRa se era stata già inizializzata in altra modalità.

int sendMess(char mess[]) Spedisce un messaggio (in formato caratteri o byte).


sendMess
int sendMess(byte mess[],byte mlen) POHQqODOXQJKH]]DGHOPHVVDJJLR PDVVLPR 5LWRUQDRLQFDVRGLHUURUH
void receiveMessMode()
receiveMessMode Si mette in ricezione continua. Se viene inserita in un ciclo la funzione dataRead(),
int dataRead(byte buff[],byte blen)
dataRead questa restituisce il buffer riempito oppure 0 se non è arrivato alcun pacchetto.
int dataRead(char mess[],byte maxlen)

Tabella 6 - Funzioni della classe LORA.

Listato 3 - Sketch ricevente per test con eco in questo articolo, permettono
LQFOXGH/25$K! una trasmissione punto-punto.
LQFOXGH63,K!
LORA LR; // Istanza della classe LORA Ma, se vogliamo realizzare una
GH¿QHUHFOHQOXQJKH]]DGHLEXIIHU rete con diversi nodi (come in
char recbuff[reclen]; // buffer di spedizione
char sendbuff[reclen]; // buffer di ricezione
Fig. 10), dobbiamo inserire degli
FKDUGDWD>@EXIIHUSHULYDORUL566,DQG615 indirizzi e gestirli. Per que-
GH¿QHIRUPDW³_5VVLG5VVL3NG6QU3NG_³ sto, nel prossimo e conclusivo
LQW6) &RGLFH6SUHDGLQJIDFWRU VHVLYXROHFDPELDUHSHUWHVW
LQW%: &RGLFH%DQGZLGWK VHVLYXROHFDPELDUHSHUWHVW articolo, affronteremo la pro-
LQW3:5 SRWHQ]DLQWUDVPLVVLRQH FRGLFH blematica dell’indirizzamento e
ERROHDQ6+,(/' WUXH
void setup() GHOODFULWWRJUDŎD,QIDWWLDFDXVD
{ del range operativo non limi-
6HULDOEHJLQ  
LI /5EHJLQ 
tato a pochi metri, è necessario
^6HULDOSULQWOQ ³1R/R5DVKLHOGGHWHFWHG,WFDQ¶WSHUIRUPHFKR´ 6+,(/' IDOVHUHWXUQ` proteggere le trasmissioni da
6HULDOSULQWOQ ³/R5DHFKRUHFHLYHU´  intercettazioni e sovrapposizioni.
6;VHW3RZHU 3:5 
/5VHW&RQ¿J 6)%: VHVLYXROHFDPELDUHSHUWHVW GHI Per questo motivo la libreria è
VKRZ&RQ¿J  VWDWDPRGLŎFDWDFRQOĬLQWURGX-
6HULDOSULQWOQ ³:DLWLQJIRUPHVVDJH´ 
/5UHFHLYH0HVV0RGH VLPHWWHLQPRGDOLWjULFH]LRQH zione di indirizzi e di funzioni
} GLFULWWRJUDŎD$(6FKHSHU³
void loop()
appesantiscono poco Arduino
{ sia in termini di prestazioni che
LI 6+,(/' ^GHOD\  UHWXUQ` di occupazione di memoria.
LI JHW0HVV ^VHQG(FKR /5UHFHLYH0HVV0RGH `VHF¶qPHVV6SHGLVFHHFR
// e si rimette in ricezione Vedremo, quindi, come, con
} semplici funzioni di libreria sarà
boolean getMess() possibile realizzare una rete
{ HIŎFLHQWHHSURWHWWD J
LI /5GDWD5HDG UHFEXIIUHFOHQ   ^GHOD\  UHWXUQIDOVH`
6HULDOSULQW ³³ 6HULDOSULQWOQ UHFEXII 
VQSULQWI GDWDIRUPDW6;JHW/RUD5VVL 6;ODVW/RUD3DFNHW5VVL 
 6;ODVW/RUD3DFNHW6QU 
6HULDOSULQWOQ GDWD 
return true; per il MATERIALE
}

void sendEcho()
{ FT1190M) comprensiva di modulo
6;VHW6WDWH 67'%< HVFHGDOODPRGDOLWjULFH]LRQH
GHOD\   radio e tutti i componenti necessari
VWUQFS\ VHQGEXIIUHFEXIIUHFOHQ  al suo funzionamento, è disponibile
//copia ciò che ha ricevuto nel buffer di spedizione
LQWEXIÀHQ VWUOHQ VHQGEXII 
a 39,50 Euro. Il modulo DRF1278F
6HULDOSULQW ³!³ 6HULDOSULQWOQ VHQGEXII VSHGLVFH è disponibile anche separatamene
LI /5VHQG0HVV VHQGEXIIEXIÀHQ   a 19,00 Euro. Arduino UNO (cod.
6HULDOSULQWOQ ³6HQGLQJHUURU´ 
} ARDUINOUNOREV3) viene ven-
duto a 24,50 Euro. Tutti i prezzi si
YRLGVKRZ&RQ¿J
{ intendono IVA compresa.
6HULDOSULQW ³)UHTXHQFH³ 6HULDOSULQWOQ 6;UHDG)UHT 
6HULDOSULQW ³7UDQVPLWSRZHU P: ³ 6HULDOSULQWOQ 6;JHW3RZHU   Il materiale va richiesto a:
6HULDOSULQW ³3UHDPEOHE\WHV 6HULDOSULQW 6;JHW/RUD3UHDPEOH/HQ 6HULDOSULQWOQ ³´ 
VQSULQWI GDWD´6S)DFWRUG%DQG:G&UG´6;JHW/RUD6SU)DFWRU  Futura Elettronica, Via Adige 11,
 6;JHW/RUD%Z 6;JHW/RUD&U  21013 Gallarate (VA)
6HULDOSULQWOQ GDWD 
6HULDOSULQW ³5DWH E\WHVHF ³ 6HULDOSULQWOQ 6;JHW65DWH 
Tel: 0331-799775 • Fax: 0331-792287
} http://www.futurashop.it

76 Novembre 2015 ~ Elettronica In


Wireless

Fornisce ad
Arduino la
comunicazione
long-range
basata su
tecnologia
LoRa. Terza ed
ultima puntata.

LoRa
SHIELD
d
dell’ing
ll’i DANIELE DENARO
n quest’ultimo articolo vedremo come utilizza-
I re la scheda proposta nel fascicolo n° 199 per
realizzare una rete composta da nodi indirizzabili e
VWDWDSRVWDHVFOXVLYDPHQWHVXOODYHULŎFDGHOOHFRQ-
dizioni di comunicazione e della portata raggiungi-
bile. Infatti l’applicazione era basata su un trasmet-
sicuri. Come abbiamo visto nel precedente articolo, titore che lanciava un messaggio ed un ricevitore
l’integrato SX1278 della Semtech, su cui è basato che ne faceva l’eco; non era presente alcuna forma
ORVKLHOGSHUPHWWHXQDVRŎVWLFDWDHGHIŎFLHQWH di indirizzamento delle comunicazioni e volendo
comunicazione in tecnologia LoRa (Long Range utilizzare più sistemi insieme l’unica discriminante
transmission). Questa comunicazione è bidirezio- delle trasmissioni delle singole unità poteva essere
nale ed ha un consistente raggio di copertura: un la frequenza portante.
FHQWLQDLRGLPHWULDOOĬLQWHUQRGLHGLŎFLRFLUFDXQ È evidente che per realizzare qualunque struttura
chilometro in campo aperto. La scheda opera nella di rete è necessario un sistema di indirizzamento
banda dei 433 MHz ed è a basso costo; è quindi delle singole comunicazioni. Ma non basta: a causa
orientata ad applicazioni che vanno dalla “home della portata, che non è limitata a pochi metri, la
DXWRPDWLRQįDOODVLFXUH]]DŎQRDOPRQLWRUDJJLRH trasmissione è facilmente intercettabile e quindi
all’automazione in agricoltura. necessita di un sistema di protezione.
Poiché la comunicazione è bidirezionale, la board La Semtech ed altri soggetti della cosiddetta “LoRa
si presta ad architetture di rete a “stella” o anche a Alliance” hanno progettato un protocollo di rete
“reticolo”: nel primo caso c’è un nodo privilegiato chiamato LoRaWAN; è abbastanza complesso e in
cui gli altri fanno riferimento, comunicando esclu- esso le periferiche con sensori e attuatori (“End-de-
sivamente con esso, mentre nel secondo ogni nodo vice”) sono collegate a dei Gateway che instradano
può decidere di comunicare con qualunque altro. LOWUDIŎFRVXOODUHWH,QWHUQHWŎQRDOVHUYHUGHGLFDWR
Nella puntata precedente abbiamo visto come alla loro gestione. Il protocollo è complesso a causa
programmare la scheda per una comunicazione delle molte variabili che sono gestite; prima fra tut-
punto-punto; in tale applicazione l’attenzione è te la gestione dell’alimentazione delle periferiche,

Elettronica In ~ Dicembre 2015 / Gennaio 2016 59


verse tipologie di “End-device”:
classe A, classe B e classe C. La
classe A è quella di base e pre-
vede l’iniziativa da parte della
periferica che, dopo la trasmis-
VLRQHDSUHGXHSLFFROHŎQHVWUH
temporali per la risposta da parte
del server e poi si spegne. La
classe B ha la possibilità di avere
delle temporizzazioni di ascolto,
mentre la C può stare sempre in
Fig. 1 ascolto, perché evidentemente
Struttura non ha problemi di alimentazio-
di una rete QH/HVSHFLŎFKHGHOSURWRFROOR
LoRaWAN. LoRaWAN possono essere scari-
cate dal sito della Semtech.
Il protocollo LoRaWAN è troppo
che si tende a ridurre al massimo. il data-rate. Il protocollo prevede complesso per una struttura più
Inoltre sono gestiti in modo adat- DQFKHODFULWWRJUDŎD$(6FRQ limitata come può essere una
tativo sia il salto di frequenza che chiave di 128 bit e prevede tre di- piccola rete privata per utilizzo

Come proteggere le informazioni


/DFULWWRJUDÀDRYYHURO·DWWLYLWjGL FDUDWWHUHGLFDPXIIDPHQWR EUXWD,QSUDWLFDO·LQIRUPD]LRQHGLWXWWRLO
FDPXIIDUHOHLQIRUPD]LRQLYHUVRRFFKL 0DFRVDVXFFHGHVHLOPHWRGRGLVRVWL- PHVVDJJLRULVXOWDVSDUSDJOLDWDFRPHXQ
HGRUHFFKLHLQGLVFUHWHqDQWLFDSUDWL- WX]LRQHFDPELDFRQWLQXDPHQWHVHFRQGR UXPRUH6RORO·DSSOLFD]LRQHGHOODFKLDYH
FDPHQWHFRPHO·XRPR6HQ]DFRQWDUHL XQDPHWDFKLDYH"(·TXHVWRLOPHWRGR LQVLHPHDOSURFHGLPHQWRLQYHUVRSXz
VLVWHPLÀVLFLGLRFFXOWDPHQWRFRPHJOL XWLOL]]DWRGDOODPDFFKLQDDURWRUL(QLJ- ULFRVWUXLUHLOPHVVDJJLR
LQFKLRVWULVLPSDWLFLGLLQIDQWLOHPHPRULD PDXWLOL]]DWDGDLWHGHVFKLQHOODVHFRQGD 4XHVWRWLSRGLFULWWRJUDÀDqGHWWD
JLj*LXOLR&HVDUHXWLOL]]DYDUHJRODUPHQWH JXHUUDPRQGLDOHHGDOODFXLGHFULSWD]LR- VLPPHWULFDSHUFKpODVWHVVDFKLDYHq
ODFULWWRJUDÀDDVRVWLWX]LRQHGLFDUDWWHUL QHKDODYRUDWRLOIDPRVRPDWHPDWLFRH XWLOL]]DWDSHUODFRGLÀFDHODGHFRGLÀFD
QHLVXRPHVVDJJL SUHFXUVRUHGHOO·LQIRUPDWLFD$ODQ7XULQJ 1HFRQVHJXHFKHODFKLDYHGHYHHVVHUH
6LSXzGLUHFKHODFULWWRJUDÀDQDVFHSUR- 4XHVWDYROWDODGLVWULEX]LRQHGHLFDUDWWHUL FRPXQLFDWDWUDJOLXWHQWLLQPRGRVLFXUR
SULRFRQLOPHWRGRGHOODVRVWLWX]LRQHGL QHOWHVWRFLIUDWRqXQLIRUPHHQRQIRU- $WWXDOPHQWHLOPLJOLRUHVLVWHPDDFKLDYH
RJQLFDUDWWHUHFRQXQDOWURVHFRQGRXQR QLVFHDOFXQDLQGLFD]LRQHËQHFHVVDULR VLPPHWULFDqLOVLVWHPD$(6FRQFKLDYH
VFKHPDFKHSUHQGHLOQRPHGL´FKLDYHµ ULFRUUHUHDGDOWULWUXFFKLFRPHO·LQWXL- GLELW6LVWLPDFKHFRQLFRPSXWHU
1RQqLOPHWRGRDGHVVHUHVHJUHWRPD ]LRQHGLSDUWHGHOFRQWHQXWRRODULFHUFD DWWXDOLLWHPSLGLGHFLIUD]LRQHFRQOD
ODFKLDYHVHQ]DODTXDOHQRQqSRVVL- HVDXVWLYD ´IRU]DEUXWDµ  IRU]DEUXWDVLDQRGLPLOLRQLGLDQQL
ELOHUHQGHUHLQWHOOHJLELOHLOWHVWR0DOD /·DYYHQWRGHLFRPSXWHUVHGDXQODWR 0DFRPHVLIDVHODFKLDYHQRQSXz
FULWWRJUDÀDDVRVWLWX]LRQHGLFDUDWWHUHKD KDDXPHQWDWRDGLVPLVXUDOHHVLJHQ]H HVVHUHFRPXQLFDWDLQPRGRVLFXUR"
XQIRQGDPHQWDOHSXQWRGHEROHODVFLD GLSURWH]LRQHVHQRQDOWURDFDXVD 4XHVWDSHUHVHPSLRqODFRPXQHUHDOWj
LQDOWHUDWDO·LQIRUPD]LRQHHOHPHQWDUH GHOO·HVSORVLRQHGLFRPXQLFD]LRQHG·DOWUR GHOO·HFRPPHUFHGRYHQRQqSHQVDELOH
FLRqLOFDUDWWHUH3HUFXLQRQRVWDQWHOD FDQWRKDIRUQLWRGHLPHFFDQLVPLIRUPLGD- FKHSHUDFTXLVWDUHXQSURGRWWRVLGHEED
QRWHYROHFRPSOLFD]LRQHGHOORVFKHPD ELOLGLSURWH]LRQHLQYHFHGLWUDVIRUPDUHL FKLHGHUH´SHUOHWWHUDDVVLFXUDWDµXQD
GLVSRVWDPHQWRDYYHQXWRQHOFRUVRGHL FDUDWWHULYHQJRQRPRGLÀFDWLLVLQJROLELW FKLDYHGDXWLOL]]DUH3HUIRUWXQDQHJOL
VHFROLO·DQDOLVLVWDWLVWLFDGHOODIUHTXHQ]D *LjTXHVWRJDUDQWLUHEEHXQDQRWHYROH XOWLPLGHFHQQLqVWDWDVYLOXSSDWDOD
GHLFDUDWWHULQHOPHVVDJJLRFRGLÀFDWR DVVHQ]DGLVFKHPDQHOWHVWRFULWWDWR FULWWRJUDÀDDVLPPHWULFDDQFKHGHWWD
SHUPHWWHGLULFRVWUXLUHODFKLDYH,QIDWWL PDVHSRLFLDJJLXQJLDPRULSHWXWH DFKLDYHSXEEOLFD4XHVWDqSDUWLFRODU-
SRLFKpRJQLOLQJXDKDXQDSDUWLFRODUH D]LRQLQRQOLQHDULFRQO·DXVLOLRGLFKLDYL PHQWHLPSHJQDWLYDDOLYHOORFRPSXWD]LR-
GLVWULEX]LRQHPHGLDGHLVLQJROLFDUDWWHUL SDUWLFRODUPHQWHOXQJKHLOWHVWRÀQDOHq QDOHHYLHQHXWLOL]]DWDVRSUDWWXWWRFRPH
VHLPHVVDJJLVRQRPROWLRPROWROXQJKL SUDWLFDPHQWHQRQGHFRGLÀFDELOHLQWHPSL FDQDOHVLFXURSHUODFRPXQLFD]LRQHGHOOD
qSRVVLELOHDVVRFLDUHLOFDUDWWHUHYHURDO XPDQLULFRUUHQGRDOVLVWHPDGHOODIRU]D FKLDYHVLPPHWULFDXWLOL]]DWDSHUO·HIIHWWL-

60 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


LIBRERIA LORA: INDIRIZZAMENTO
1HOSURWRFROORGDQRLGHŎQLWR©
stato inserito un indirizzo del
destinatario ed uno del mittente.
L’indirizzo è a 16 bit (word) che
permettono 65.534 possibilità (lo
0 non è contemplato).
Per rendere più pratico il suo
Fig. 2 - Esempio di costruzione dell’ indirizzo. utilizzo, l’indirizzo è stato suddi-
viso in un indirizzo di rete ed un
Tabella 1 - Indirizzamento.
sub-indirizzo di “device”; però
'HÀQLVFHXQDUHWHGLLQGLUL]]RHFRQSRVVLELOLVXELQGLUL]]L ODVXGGLYLVLRQHQRQ©ŎVVDHSX³
VHW1HW$GGUHVV 
QRQqFRQWHPSODWR  ULWRUQHUHEEHIDOVHVHDOSRVWRGLFLIRVVH 
6SHGLVFHLOPHVVDJJLR´7HVWµDOVXELQGLUL]]R OXLq 
essere decisa dall’utente, nel sen-
VHQG1HW0HVV µ7HVWµ
O
LQGLUL]]RGLUHWHqVWDWRGHÀQLWRGDOODSUHFHGHQWHIXQ]LRQH so che la porzione dell’indirizzo
UHFHLYH1HW0HVV EXII
$WWHQGHPHVVDJJLRGDSHUOXL LQGLUL]]R  riservata alla rete e di conse-
6HDOSRVWRGLFLIRVVHULFHYHUHEEHGDWXWWL guenza quella delle periferiche,
è variabile. In pratica si tratta di
locale. Per questo motivo ab- mentazione di una struttura di GHŎQLUHLOPDVVLPRQXPHURGHOOH
biamo pensato di completare indirizzi ed una protezione con periferiche indirizzabili (che sia
la libreria LORA con l’imple- FULWWRJUDŎD$(6 una potenza di 2) e un indirizzo

Fig. A - Crittografia a chiave pubblica e firma elettronica

YRWUDVIHULPHQWRGHOPHVVDJJLR2SSXUH GHOODGLYLVLRQHRDULWPHWLFDGHOO·RURORJLR  4XHVWRqXQHYHQWRFDUDWWHULVWLFRGHL


YLHQHXWLOL]]DWDSHUJDUDQWLUHO·RULJLQDOLWj ODVRVWDQ]DSXzHVVHUHULDVVXQWDFRVu UDGLRFRPDQGLXQLGLUH]LRQDOLFKHLQYLDQR
GHOPLWWHQWH ÀUPDGLJLWDOHFig. A R ‡OHFKLDYLVRQRGXHHXQLGLUH]LRQDOL VHPSUHORVWHVVRPHVVDJJLRSHUD]LRQDUH
O·LQWHJULWjGHOPHVVDJJLR,QIDWWLXQDOWUR XQDFRGLÀFDO·DOWUDGHFRGLÀFD  XQDSSDUDWRDGHVHPSLRSHUDSULUHOH
DVSHWWRGHOODVLFXUH]]DqVDSHUHVHLO ‡OHGXHFKLDYLVRQRLQTXDOFKHPRGR SRUWLHUHGLXQDXWR3RLFKpLOPHVVDJJLRq
PHVVDJJLRqVWDWRVSHGLWRGDOVRJJHWWR FROOHJDWHDQFKHVHQRQLQPRGR VHPSUHXJXDOHHGRWWLHQHVHPSUHORVWHV-
LQGLFDWRRGDTXDOFXQRFKHVLqVRVWLWXLWR GHFRGLÀFDELOH VRHIIHWWRQRQF·qFULWWRJUDÀDFKHWHQJD
DOXLRSSXUHKDPRGLÀFDWRLOPHVVDJJLR ‡OHGXHFKLDYLVRQRLQWHUFDPELDELOL VH HEDVWDULSHWHUORFRVuFRP·q3HUULVROYHUH
RULJLQDOH4XHVWRqLOFRVLGGHWWRSUREOH- ODVHFRQGDFRGLÀFDODSULPDGHFRGLÀ- LOSUREOHPDqVXIÀFLHQWHUHQGHUHLOPHV-
PDGHO´PDQLQWKHPLGGOHµ FDHYLFHYHUVD  VDJJLRVHPSUHGLYHUVRVLQFURQL]]DQGROR
/DFULWWRJUDÀDDFKLDYHSXEEOLFDqSLXW- &·qLQÀQHXQXOWHULRUHWLSRGLSURWH]LRQH FRQLOULFHYLWRUHqFLzFKHYLHQHUHDOL]]DWR
WRVWRFRPSOHVVDHGXWLOL]]DLQVRVWDQ]D TXHOORQHFHVVDULRSHUHYLWDUHFKHXQ FRQLO´UROOLQJFRGHµ8Q·DOWHUQDWLYDSL
O·DULWPHWLFDGHLQXPHULSULPLRGHOOH VRJJHWWRHVWHUQRFRSLEUXWDOPHQWHLO FRPSOHVVDqTXHOODGLUHQGHUHLOUDGLRFR-
IXQ]LRQL´HOOLWWLFKHµHVRSUDWWXWWRIDDP- PHVVDJJLRFULWWDWRHORLQYLLLQVHFRQGR PDQGRELGLUH]LRQDOHHIDUJOLLQWUDSUHQGH-
SLRXVRGHOO·DULWPHWLFD´PRGXODUHµ UHVWR WHPSRVHQ]DHVLJHQ]DGLFRPSUHQVLRQH UHXQGLDORJRGL´KDQGVKDNLQJµ

Elettronica In ~ Dicembre 2015 / Gennaio 2016 61


Fig. 4 - Payload LoRa.

Per fortuna in rete è possibile sca- pesantisce pochissimo Arduino


ULFDUHXQVRIWZDUHGLFULWWRJUDŎD in termini sia di elaborazione che
AES adattato per Arduino. di occupazione di memoria.
Questo software, che utilizza la 2OWUHDOODFULWWRJUDŎD$(6©VWDWR
PHPRULDŏDVKGLSURJUDPPDSHU aggiunto un byte al messaggio;
alcune strutture di base, è stato tale byte ha un valore casuale
GDQRLOHJJHUPHQWHPRGLŎFDWR ed ha lo scopo di rendere unici
nella gestione della chiave. messaggi identici che si ripetono.
/DFULWWRJUDŎD$(6XWLOL]]DWD© Più che altro è stato pensato per
Fig. 3 - Crittografia AES 256 su chiave di 256 bit, ma invece consentire un’eventuale imple-
per LORA. di fornire un array di 32 byte, la mentazione di una sicurezza ag-
chiave è generata in maniera giuntiva tipo rolling-code. Tenete
di rete che sia compreso nello pseudo-random a partire da presente che a causa del tipo di
spazio che rimane nella “word” un valore-seme del generatore FULWWRJUDŎDXWLOL]]DWRLOYDORUHGL
di indirizzo effettivo. Se l’indi- random di Arduino. Questa mo- un byte si sparpaglia su tutto il
rizzo di rete eccede, la funzione dalità riduce l’occupazione della PHVVDJJLRFRGLŎFDWR
ritornerà “false”. Ovviamente RAM ad un solo numero (inte- /DFKLDYHFULWWRJUDŎFD©GHŎQLWD
tutti i nodi faranno riferimento ger), ma ha la controindicazione direttamente nella funzione di
a questa struttura con lo stesso di essere utilizzabile solo per attivazione della libreria LORA.
numero di rete e diverso indiriz- Arduino. Infatti se si utilizzano /DGHŎQL]LRQHGHOODFKLDYH©
zo di nodo. librerie matematiche differenti, la
Chiave
Nella Tabella 1 è mostrato un produzione di chiavi pseudo-ca-
esempio di utilizzo di funzioni di suali a partire dallo stesso seme ,QL]LDOL]]DODOLEUHULDFRQOD
FKLDYH/DIXQ]LRQH
spedizione e ricevimento. fornirebbe chiavi non coincidenti begin(33333) YHULÀFDODSUHVHQ]DGHOOD
tra le varie schede della stessa VFKHGDHULWRUQDIDOVHVH
QRQqDJLELOH
LIBRERIA LORA: CRITTOGRAFIA rete.
Anche se l’applicazione che /DFULWWRJUDŎD$(6DELW©
potreste avere in mente non ha considerata molto sicura, infat- PACCHETTO
veri vincoli di sicurezza, non è ti l’algoritmo compie un certo Il pacchetto inviato e ricevuto in
opportuno far viaggiare in chiaro numero di spostamenti e permu- modalità LoRa (ovvero il paylo-
pacchetti radio alle distanze tazioni con funzioni non lineari, ad) è quindi composto come si
raggiungibili dalle trasmissioni producendo una sequenza di può vedere in Fig. 4.
LoRa. Per questo motivo abbia- byte completamente masche- La funzione di spedizione lo co-
mo pensato a una soluzione che rata e paragonabile a rumore struisce aggiungendo al messag-
fosse ragionevolmente sicura ma puro. Solo l’utilizzo della chiave gio i due indirizzi (previa rico-
anche praticabile su un hardware permette il procedimento inverso. struzione in formato word) ed un
limitato come Arduino. Tuttavia la libreria utilizzata ap- byte di valore casuale. Quindi lo

Tabella 2 - Funzioni LORA basilari.


bool begin XQVLJQHGLQWNH\YDO  ,QL]LDOL]]DHGHÀQLVFHODFKLDYHSHUODFULWWRJUDÀD
bool setNetAddress XQVLJQHGLQWQHW$GGXQVLJQHGLQWGHY5DQJH  'HÀQLVFHODVWUXWWXUDGLUHWH
int sendNetMess XQVLJQHGLQWGHY6XE$GGXQVLJQHGLQW
6SHGLVFHXQPHVVDJJLR
VHQG6XE$GGE\WH PHVVLQWOPHVV 
YRLGreceiveMessMode  6LSRQHLQFRQWLQXRXVUHFHLYLQJPRGH
9HULÀFDVHqDUULYDWRXQPHVVDJJLRDOXLLQGLUL]]DWR5LWRUQDVHQRQqDUULYDWRQXOOD
int receiveNetMess XQVLJQHGLQWGHY6XE$GGXQVLJQHG
6HVHQG6XE$GGqDFFHWWDPHVVDJJLGDWXWWLDOWULPHQWLUHVWLWXLVFHVHLOPLWWHQWHQRQFRUULVSRQGH
LQWVHQG6XE$GGE\WH EXIIE\WHPD[OHQ 
4XHVWDIXQ]LRQHYDHVHJXLWDULSHWXWDPHQWHGRSRDYHUXWLOL]]DWRODSUHFHGHQWHIXQ]LRQH
XQVLJQHGLQWgetSubNetSender  5HVWLWXLVFHLOPLWWHQWH
E\WHgetMarker  5HVWLWXLVFHLOPDUNHU

62 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


(può anche accettare messaggi
GDTXDOXQTXHPLWWHQWH $OODŎQH
restituisce il numero di byte del
messaggio contenuto nel buffer
predisposto. Restituisce 0 se non è
in arrivo alcun messaggio, oppure
se il messaggio non è di sua com-
petenza. Nel caso di messaggio ar-
rivato si può chiedere il mittente o
il marker casuale.

Fig. 5 FUNZIONI DI LIBRERIA LORA


Le funzioni basilari per utilizzare
la scheda in modalità LoRa all’in-
FRGLŎFD FRQOĬHFFH]LRQHGHOOĬLQ- zione per prima cosa controlla terno di una struttura di rete così
dirizzo destinatario) e lo spedisce. il destinatario: se coincide con il GHŎQLWDVRQRYHUDPHQWHSRFKH/D
,OGHVWLQDWDULRQRQ©FRGLŎFDWR suo indirizzo procede, altrimenti Tabella 2 ne propone il riassunto.
per velocizzare il riconoscimento lo scarta. Se è di sua competen- Ora vi mostriamo un semplice
all’arrivo. Appena un pacchetto ]DORGHFRGLŎFDHYHULŎFDVHOR esempio che evidenzia la sem-
è arrivato, la funzione di rice- aspettava dal mittente indicato plicità d’uso: è contenuto nella

Listato 1 - Sketch del nodo centrale


#include <LORA.h>
#include <SPI.h>

GH¿QH/25$1(7LQGLUL]]RGLUHWH
GH¿QH'(95$1*(UDQJHGLLQGLUL]]LGLQRGR
GH¿QH7+,6$''LQGLUL]]RGLTXHVWRQRGR
GH¿QH.(<9$/YDORUHSHUODJHQHUD]LRQHGHOODFKLDYH$(6

GH¿QH5;7,0(287WLPHRXWGLUHSOD\

GH¿QHLQSOHQEXIIHUSHUODVSHGL]LRQH
GH¿QHUHFOHQEXIIHUSHUODULFH]LRQH

/25$/5&ODVV/25$LQVWDQFH
ERROHDQ6+,(/' WUXH
:
:
YRLGVHWXS 
{
6HULDOEHJLQ  
LI /5EHJLQ .(<9$/ 
^6HULDOSULQWOQ ³1R/R5DVKLHOGGHWHFWHG6WRS´ 6+,(/' IDOVHUHWXUQ`
/5VHW1HW$GGUHVV /25$1(7'(95$1*( 
6HULDOSULQW ³1HWDGGUHVV³ 6HULDOSULQWOQ /25$1(7 
6HULDOSULQW ³'HYLFHVUDQJH³ 6HULDOSULQWOQ '(95$1*( 
6HULDOSULQW ³0\DGGUHVV³ 6HULDOSULQWOQ 7+,6$'' 
6HULDOSULQWOQ ³/R5DWUDQVPLWWHUUHDG\´ 
6;VHW3RZHU 3:5 
VKRZ&RQ¿J 
/5UHFHLYH0HVV0RGH VHWVKLHOGLQFRQWLQXRXVUHFHLYLQJPRGH
`

YRLGORRS 
{
GHOD\  
LI 6+,(/' UHWXUQ VHODVFKHGDQRQqRSHUDWLYDQRQSXzIDUHQXOOD
LQWQE
LI QE JHW,QSXW ! 6HqVWDWRLQVHULWRXQFRPDQGR
^LI VHQG%XII QE JHW5HSOD\ `
LI QE JHW0HVV ! ^`6HqDUULYDWRXQPHVVDJJLRVSRQWDQHRORVWDPSD
`

Elettronica In ~ Dicembre 2015 / Gennaio 2016 63


Listato 2 - Sketch per i nodi periferici
LQFOXGH³/25$K´
#include <SPI.h>
 6LPXOD]LRQHGLVHQVRULHGDWWXDWRUL 
GH¿QHSVRXQGSLQIRUEX]]HU
GH¿QHSLQJRSLQIRUSXVKEXWWRQ
GH¿QHSLQISLQIRUVLJQDOLQJOHG
GH¿QH/25$1(7LQGLUL]]RGLUHWH
GH¿QH'(95$1*(UDQJHGLLQGLUL]]LGLQRGR
GH¿QH7+,6$''LQGLUL]]RGLTXHVWRQRGR JOLDOWULQRGLORDYUDQQRGLYHUVR
GH¿QH.(<9$/YDORUHSHUODJHQHUD]LRQHGHOODFKLDYH$(6
GH¿QH0$67(5LQGLUL]]RGHOQRGRFHQWUDOH
/25$/5&ODVV/25$LQVWDQFH
ERROHDQ6+,(/' WUXH
FKDUUHFEXII>UHFOHQ@UHFHLYLQJEXIIHU
FKDUVHQGEXII>UHFOHQ@WUDQVPLWWLQJEXIIHU
:
:

YRLGVHWXS 
{
SLQ0RGH SLQJR,1387B38//83 
GLJLWDO:ULWH SLQI 
SLQ0RGH SLQI287387 
SLQ0RGH SVRXQG287387 
6HULDOEHJLQ  
LI /5EHJLQ .(<9$/ 
^6HULDOSULQWOQ ³1R/R5DVKLHOGGHWHFWHG,WFDQ¶WSHUIRUPHFKR´ 6+,(/' IDOVHUHWXUQ`
6HULDOSULQWOQ ³/R5DUHFHLYHU´ 
/5VHW1HW$GGUHVV /25$1(7'(95$1*( 
6HULDOSULQW ³1HWDGGUHVV³ 6HULDOSULQWOQ /25$1(7 
6HULDOSULQW ³'HYLFHVUDQJH³ 6HULDOSULQWOQ '(95$1*( 
6HULDOSULQW ³0\DGGUHVV³ 6HULDOSULQWOQ 7+,6$'' 
6;VHW3RZHU 3:5 
VKRZ&RQ¿J 
6HULDOSULQWOQ ³:DLWLQJIRUPHVVDJH´ 
/5UHFHLYH0HVV0RGH VHWVKLHOGLQFRQWLQXRXVUHFHLYLQJPRGH
`
YRLGORRS 
{
LQWQE
LI 6+,(/' ^GHOD\  UHWXUQ`VHODVFKHGDQRQqRSHUDWLYDQRQSXzIDUHQXOOD
LI QE JHW0HVV ! 6HULFHYHXQFRPDQGRORHVHJXHHULVSRQGH
^GHFRGH QE /5UHFHLYH0HVV0RGH `SRLVLULPHWWHLQULFH]LRQH
LI JHW,QSXW 6HLOSXOVDQWHLQWHUUXWWRUHqSUHPXWRPDQGDXQDYYLVR
^VHQG:DUQ /5UHFHLYH0HVV0RGH `SRLVLULPHWWHLQULFH]LRQH
`

libreria e in questa sede ne vedremo le caratteristiche gli altri, ma può ricevere anche degli avvisi sponta-
principali, lasciando ai lettori l’analisi del listato com- nei nel caso che sulla periferica si realizzi un certo
pleto. L’esempio è formato da due sketch e rappre- evento. Nella nostra simulazione l’evento è l’azione
senta una struttura a stella in cui un nodo interroga su un pulsante (Fig. 5). Il primo sketch rappresenta
il nodo centrale ed ha indirizzo 1 (indirizzo di nodo
all’interno di una rete con 15 possibili nodi). Lo
D7 D6
6+,(/'5(6(7 sketch inizializza la libreria e la scheda e poi si mette
in attesa di un input da console o di un messaggio
D10 D8 da una periferica. In caso di input da console (ovve-
&+,36(/(&7
ro un comando) invia il corrispondente messaggio
D9 D6 ed attende la risposta che visualizzerà sulla console.
,128738/6(6 Nel caso di messaggio spontaneo, lo visualizzerà
sulla console. Trovate il codice corrispondente nel
IO2 DATA
,172538/6(6 Listato 1. I comandi inseribili sono relativi alla richie-
sta di un eco, ad accendere/spegnere un LED, a far
D3
,17(5583721' VXRQDUHXQFLFDOLQRRDYHULŎFDUHOĬD]LRQHVXXQSXO-
sante o un interruttore. Lo sketch del nodo periferico
(Listato 2), invece, non fa altro che attendere l’arrivo
GLXQPHVVDJJLRHYHULŎFDUHOĬD]LRQHVXXQSXOVDQWH
Fig. 6 - Impostazione della libreria. o un interruttore. Nel caso arrivi un messaggio (co-

64 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


PDQGR ORHVHJXHHULVSRQGH1HOFDVRYHULŎFKLLO
cambiamento di stato di un pulsante o interrut-
tore, spedisce autonomamente un messaggio di
attenzione.

CONCLUSIONI
In queste tre puntate abbiamo analizzato un
FRPSRQHQWHPROWRVRŎVWLFDWRHŏHVVLELOHFRPH
l’SX1278, sul quale abbiamo realizzato una
shield di basso costo. Lungi dal pensare di aver
esaurito le caratteristiche e le potenzialità di
questa innovativa tecnologia, speriamo di aver
UHDOL]]DWRXQDSUDWLFDHGHIŎFLHQWHEDVHGLODYR-
ro per sviluppare interessanti applicazioni.
Sul sito di GitHub (github.com/open-electro-
nics/LoRa) è stata aperta una pagina relativa a
questo progetto, dove oltre alla libreria potrete
trovare applicazioni che sia noi ma soprattutto
voi, vorrete condividere. Le applicazioni, lo ab-
ELDPRGHWWRVRQRSUHVVRFKªLQŎQLWHGDOVLVWHPD
di allarme casalingo alla gestione dei sensori/
attuatori di una piccola impresa. Noi, per conto
nostro, stiamo già pensando ad una miniatu-
rizzazione del transceiver che appoggiandosi
sempre su Arduino (in formato miniaturizzato),
possa risolvere situazioni dove lo spazio e/o
l’alimentazione sono critiche. Per esempio un
radiocomando bidirezionale tascabile. Poiché
pensiamo che questa tecnologia sia valida in ter-
mini di rapporto prestazioni/prezzo, vi invitia-
mo a scatenare la vostra fantasia e a suggerirci o
a sottoporci progetti in tema. Vi ricordiamo che
con l’utilizzo di RandA su Raspberry la scheda
LoRa può diventare un completo gateway per
controllare periferiche WorldWide. J

per il MATERIALE
La shield Long Range (cod. FT1190M) com-
prensiva di modulo radio e tutti i componenti
necessari al suo funzionamento, è disponibile
a 39,50 Euro. Il modulo DRF1278F è disponi-
bile anche separatamene a 19,00 Euro. Ardu-
ino UNO (cod. ARDUINOUNOREV3) viene
venduto a 24,50 Euro. Tutti i prezzi si intendo-
no IVA compresa.

Il materiale va richiesto a:
Futura Elettronica, Via Adige 11,
21013 Gallarate (VA)
Tel: 0331-799775 • Fax: 0331-792287
http://www.futurashop.it
PRESEPINO:
IL PRESEPE
CON ARDUINO
di BORIS LANDONI

82 Dicembre
Dicemb
bbrre 220
2015
015
15 / GGennaio
enn
en naaio 00116 ~ E
io 22016 El
Elettronica
leet
tttr
roon
niic
ca IIn
n
Gadget

ome ogni anno, sepe automatizzato pic-


sep
C
d
delle
all’approssimarsi
ll Feste Natalizie
col o grande che sia,
colo
risulta semplicissimo.
ris
pensiamo a un pro- Oltre
Ol alle luci, il nostro
getto a tema che possa Presepino
P
Pr e permette di
renderle originali e più gestire
ge anche l’audio,
calorose. Dato che da grazie
gra a un innovativo
tanti anni non propo- modulo riproduttore
mo
nevamo più quello che di
di MP3 montato sulla
è poi uno dei classici scheda, capace di farvi
sch
dell’elettronica -il ascoltare in altoparlan-
asc
controllo delle luci te (seppure in mono) i
del presepe- abbiamo brani contenuti in una
br
deciso di optare per SD-Card che potrete
SD
una centralina del ge- scegliere secondo le
sce
nere, ma ci è sembrato vostre
vo preferenze.
giusto farlo in chiave
moderna ed attuale; e IL PROGETTO
per attuale intendia- Ma andiamo con
mo con un hardware ordine
ord e vediamo
conosciuto e apprez- innanzitutto
inn le fun-
zato come quello che zioni
zio disponibili, che
migliaia di sperimen- differenziano
dif la nostra
tatori hanno trovato in ccentralina
en da quelle
Arduino. Ecco nascere, per
p e il semplice control-
così, Presepino, ossia lo delle due luci che re-
una centralina di con- aalizzano
al i la simulazione
trollo luci e sonoro per di
di alba e tramonto: con
presepe, il cui circuito Presepino
P re è possibile
Centralina capace di simulare ciclicamente è basato su un ATmega rrealizzare
ea un controllo
l’avvicendarsi del giorno e della notte, 328 (quindi l’hardware cche h va oltre il piccolo
di Arduino UNO) e o grande
g presepe di
pilotando opportunamente fino a sei nasce per comandare cas
casa, per arrivare ai
uscite (con cui alimentare LED o piccoli direttamente dei LED, pr
presepi allestiti nelle
con tutti i vantaggi del cchiese,
h negli oratori,
motori) corrispondenti alla luce del caso, primo fra tutti il n e locali delle comu-
nei
giorno, al bagliore delle stelle, al fuoco o fatto che lavora a bassa n it e nei luoghi aperti.
nità
tensione e può quindi P
Per e questo motivo
delle case, all’accensione della stella essere collocata anche ab
abbiamo realizzato un
cometa e a due dispositivi mobili. Può, a portata dei bambini, cir
circuito decisamente
senza che ne derivi pe- p r
prestante, in grado di
inoltre, controllare strip NeoPixel e, ricolo per la loro salute. p il
pilotare quattro carichi
per rendere l’atmosfera più natalizia, Poi oggi, con la grande lluminosi
luum a LED fun-
disponibilità di strip a zio
zionanti a 12 volt e che
riproduce musiche a vostra scelta. LED, realizzare un pre- aassorbano
ss una corrente

Elettronica In ~ Dicembre 22015 / Gennaio 2016 83


individuale di 6 ampere; questa è notte, ma anche per le due fasi del proprio MOSFET attraverso
anche la massima corrente che la di transizione (tramonto e alba). un resistore da 1 kohm e ciascu-
scheda può gestire e può essere Queste ultime due sono le fasi na di esse e massa è applicato un
aumentata stagnando abbondan- più suggestive: durante il tra- LED (con rispettiva resistenza
temente le piste che portano dalla monto, la luminosità del giorno di limitazione della corrente)
morsettiera di alimentazione ai (realizzata con i LED collegati che accendendosi permette di
MOSFET e da questi alle relative all’uscita SOLE) diminuisce a monitorare lo stato del rispettivo
morsettiere di uscita. Per cor- poco a poco, mentre nel cielo transistor; ciascuna delle uscite
rente individuale si intende che iniziano a illuminarsi le stelle (si fornisce impulsi rettangolari
ciascun canale può commutare 6 attiva l’uscita omonima); a un TTL-compatibili di frequenza
ampere, ma per come è costruito certo punto, prima che il ciclo si costante e modulati in larghez-
lo stampato non è possibile assor- concluda, si accendono i fuochi za, secondo la tecnica PWM: ciò
bire 6 ampere costantemente da delle case e della capanna (uscita consente di variare il valore me-
tutte le uscite insieme. Questi FUOCO). Tra l’altro, il nostro dio della tensione applicata dai
valori, considerato che il circuito circuito è in grado di simulare MOSFET ai carichi loro collegati
nasce per pilotare strip a LED o il tremolio della legna che arde, e di conseguenza la potenza e la
comunque composizioni di LED, pilotando con un’opportuna luminosità, con un’elevatissima
sono più che accettabili e per un sequenza di impulsi l’uscita HIŎFLHQ]DLQTXDQWRODUHVLVWHQ]D
presepe da casa sono sovrabbon- FUOCO. Quando tutte le stelle in stato di ON (piena conduzio-
danti, pur bastando anche per in cielo sono completamente ne) dei MOSFET è bassissima
una struttura all’aperto, grazie illuminate, appare anche la (appena 40 milliohm) e quindi
DOOĬHIŎFLHQ]DOXPLQRVDGHL/(' stella cometa (accesa dall’uscita la potenza dissipata, a parità di
Le uscite della centralina sono COMETA). Ovviamente, salvo potenza trasferita, è limitatissi-
VHLPDLOŎUPZDUHFKHIRUQLDPR piccoli dettagli, durante l’alba si ma se confrontata a quella che
contempla la gestione delle pri- spengono gradatamente tutte le comporterebbe un pilotaggio
me quattro per implementare la luci luminosi, mentre aumenta serie a tensione continua, dove il
simulazione della luce del giorno, lentamente sino a raggiungere la transistor dovrebbe sobbarcarsi
di quella delle stelle, dei fuochi massima luminosità la luce del la differenza tra la tensione di
della capanna/grotta (di Betlem- giorno. alimentazione e quella applicata
me) e delle case dei pastori, ed in- al carico.
ŎQHGLLOOXPLQDUHODVWHOODFRPHWD SCHEMA ELETTRICO I segnali PWM vengono gene-
Le luci si accendono e spengono Scendiamo ora negli aspetti più rati dai moduli PWM interni al
gradatamente seguendo un ciclo tecnici, analizzando il circuito, microcontrollore, opportuna-
che simula un’intera giornata. che è basato sul microcontrol- PHQWHLPSRVWDWLGDOŎUPZDUHSHU
A queste uscite di base potete lore Atmega 328 nel quale gira ciascuna uscita.
aggiungere, intervenendo sullo l’apposito sketch che implemen- /ĬDWWXDOHFRQŎJXUD]LRQHFLUFXLWD-
sketch per l’ATmega 328, le ta il controllo delle uscite e del le prevede di alimentare le strip
altre due, cui potete assegnare modulo che realizza il sonoro di LED collegandone positivo
il controllo di vari accessori del del presepe; il micro, siglato e negativo rispettivamente a +
presepe come una ruota a pale, il U1, all’inizializzazione imposta e – della relativa uscita, tuttavia
movimento di personaggi anima- PB0 come uscita per l’invio dei siccome i MOSFET possono “reg-
ti o animali, ecc. comandi seriali a un’eventuale gere” tensioni drain-source in in-
Per quanto riguarda le uscite strip Neopixel, e PB1, PB2, PB3, terdizione pari a 60 volt, è anche
di base, abbiamo suddiviso la PD3, PD5, PD6 come output pensabile partire da un’alimenta-
sequenza completa in quattro per il controllo delle uscite a zione esterna anche a 24÷36 volt
fasi denominate giorno, tramon- MOSFET a canale N (i transistor c.c. in modo da ridurre l’assor-
to, notte e alba. La durata delle sono dei robusti STP36N06, da bimento a parità di potenza elet-
fasi può essere regolata mediante 36 ampere di Id e 60V di Vdso) trica gestita. Se l’alimentazione
trimmer, e l’escursione corri- che materialmente commutano non viene presa dal circuito, la
spondente si può reimpostare l’alimentazione sui LED o strip striscia di LED va connessa con
intervenendo sullo sketch (ma a LED corrispondenti. Le linee il + al positivo dell’alimentatore
in maniera uguale per tutte); ciò del micro utilizzate per gestire le scelto e il – all’uscita della nostra
vale dunque per il giorno e la uscite pilotano ciascuna il gate centralina, fermo restando che la

84 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


[schema ELETTRICO]
massa dell’alimentatore e della
scheda vanno unite.
Abbiamo detto in precedenza che
la sequenza completa generata
dal nostro circuito è composta
da quattro fasi (giorno, tramonto,
notte e alba) la cui durata può es-
sere regolata indipendentemente
tramite gli appositi trimmer
alimentati a 5 volt e la cui tensio-
ne del cursore viene letta da un
,2GHOPLFURFRQWUROORUHFRQŎ-
gurato come input e acquisito
tramite l’A/D converter interno
all’ATmega; nel nostro progetto,
l’ADC viene assegnato alle linee
PC0÷PC5, con le quali si acquisi-
scono in scansione le tensioni dei
sei trimmer presenti, vale a dire
R1, R2, R3, R4 per le funzioni an-
zidette ed R5 e R6 disponibili per
funzioni assegnabili a piacimento
programmando opportunamente
il microcontrollore.
3HUFRPH©VWUXWWXUDWRLOŎUPZD-
re, la durata dei rispettivi cicli è
direttamente proporzionale alla
tensione applicata dal relativo
trimmer, quindi portando il
cursore di R1 verso massa, per
esempio, si accorcia la durata del
giorno, la quale invece aumenta
portandolo verso il positivo dei
5 V.
Attenzione ad un particolare:
i trimmer R1, R2, R3, R4 non
controllano direttamente il PWM
delle uscite per le fasi, ma ne
determinano i tempi di esecu-
zione; il duty-cycle dei segnali
PWM alle uscite SOLE, STELLE,
COMETA e FUOCO viene gesti-
to secondo la periodicità previ-
sta da apposite subroutine del
ŎUPZDUH4XHVWRIXQ]LRQDPHQWR
è logico in quanto le fasi descritte
coinvolgono più di un’uscita e,
nel caso della transizione giorno/
notte (TRAMONTO), per esem-
pio, coinvolgono l’uscita SOLE
e quella STELLE, che vanno in
dissolvenza, come è, anche nel
passaggio notte/giorno (ALBA),

Elettronica In ~ Dicembre 2015 / Gennaio 2016 85


Listato 1
if(runtime>time_trim+200){
for (int i=0;i<6;i++){
trimvalue[i]=(ReadTrimmer(i)); piccola potenza, ma anche singoli dola nello sketch; la comunica-
trimvalue[i]=trimvalue[i]*100; LED, motori elettrici per azionare zione è unidirezionale e gestisce
delay (1);
}
ruote e altri meccanismi, come un gruppo di LED.
time_trim=millis(); anche pompe per far muovere NeoPixel è una particolare solu-
} OĬDFTXDLQXQODJKHWWRRXQŎXPH zione a LED RGB “intelligenti”
e tutto quello che la fantasia sug- per il controllo, ad esempio, tra-
int ReadTrimmer (int id){ gerisce per realizzare un presepe mite Arduino; ogni LED NeoPi-
return(analogRead(trimmer[id]));
} più “vivo”. xel dispone di controller a bordo,
Restando in tema uscite, è il caso interfacciabile con una sola linea
di parlare di quella dedicata al dati. La libreria proprietaria che
seppure al contrario. controllo di LED NeoPixel, che l’Adafruit (www.adafruit.com)
I trimmer da R1 a R4 servono permette di aggiungere ulteriori rende disponibile liberamente fa-
dunque per gestire la durata del animazioni luminose, come ad cilita l’integrazione nell’ambiente
GIORNO (R1), della NOTTE (R2), esempio la coda pulsante di una Arduino.
dell’ALBA (R3) e del TRAMON- cometa. Le strip NeoPixel ven- Ogni LED RGB può essere gesti-
TO (R4). Il led LD8, pilotato dalla gono gestite in parallelo con una to individualmente tramite un
linea PB4, si accende brevemente sola linea del microcontrollore apposito comando inserito nella
quando la centralina passa da (più in generale, di Arduino), che stringa seriale e può produrre
una fase all’altra. nel nostro caso è facilmente asse- ŎQRDWRQDOLW¡GHOSURSULR
La durata di ogni singola fase JQDELOHDSLDFLPHQWRVSHFLŎFDQ- colore, determinando un totale di
viene impostata tramite l’apposi-
to trimmer e la durata massima
di ogni fase è di circa 100 secon- Listato 2
di; per l’esattezza, la durata è ot- void gestAudio(int track){
tenuta dalla lettura dell’ADC su digitalWrite (LEDPLAY,LOW);
10 bit (tra 0 e 1.023) considerata if (playing==true){
in millisecondi, moltiplicata per digitalWrite (LEDPLAY,HIGH);
track++;
GDOŎUPZDUH6HYROHWHWHPSL if (track==5) track=1;
differenti potete editare lo sketch if (stopVol==false){
if(runtime>time_volume_running+200){
nella porzione che si occupa di if(startVol==false){
determinare la temporizzazione, if (volume>3) {
volume=volume-3;
che per praticità riportiamo nel Serial.print(“dec “);
Listato 1. Si tratta sostanzialmen- Serial.println(volume);
te della riga: }
else
{
trimvalue[i]=trimvalue[i]*100; playtrack(track);
startVol=true;
}
4XLSRWHWHPRGLŎFDUHLOYDORUH }
else
100 sostituendolo con ciò che vi {
aggrada: ad esempio, inserendo if (volume<(trimvalue[TRIMMER_VOL]/3500)) {
200 ottenete il raddoppio dei volume=volume+3;
Serial.print(“inc “);
tempi, mentre con 50 li dimez- Serial.println(volume);
zate. }
else
Quanto agli altri due trimmer, {
VRQRSHUVRQDOL]]DELOLGDŎUPZD- startVol=false;
stopVol=true;
re, così come le uscite OUTEX1 6HULDOSULQWOQ ³¿QLWRFLFOR´ 
e OUTEX2; con lo sketch da noi }
fornito, R5 è libero mentre R6 è }
time_volume_running=millis();
stato utilizzato per gestire il vo- setvolume(volume);
lume di riproduzione dell’audio. }
}
Alle uscite a MOSFET possono }
essere collegate sia delle strip a }
LED, sia lampadine a 12 volt di

86 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


Il modulo DFR0299
Il componente che utilizziamo per la
riproduzione dell’audio permette di far
riprodurre brani musicali MP3 senza Piedinatura
dover utilizzare hardware costoso e impe- del modulo
16.777.216 combinazioni di colore. gnativo sul fronte dell’elaborazione: infatti DFR0299.
Una particolarità dei LED NeoPi- il DFR0299 è un completo decoder che
xel è che possono essere collegati attinge a un supporto SD-Card, decifra
in cascata in modo che la linea O·DXGLRHSRLORDPSOLÀFDRQERDUGSURQWR
per inviarlo a un altoparlante (da 8 ohm di assorbita in standby è pari a 20 mA). Le
dati da uno passi al successivo, principali caratteristiche del modulo sono:
impedenza) con quasi 3 watt di potenza.
però il prezzo da pagare è che È quindi l’ideale quando si desiderano ri- ‡ GHFRGLÀFD03H,62
oltre un certo numero di LED, la SURGXUUHÀOHDXGLRVWDQGDUGFRPHJOL03 layer3 audio decoding;
velocità di gestione deve ridursi ma non si dispone delle risorse di calcolo • possibilità di equalizzazione Pop, Rock,
sensibilmente; a causa di ciò, se (CODEC compreso) che la loro elaborazio- Jazz, Classica;
ne diretta richiederebbe. • frequenze di campionamento in ripro-
si devono realizzare matrici per
Il modulo nasce per essere gestito da Ar- GX]LRQH N+] 
PRVWUDUHGHOODJUDŎFDYHORFHRF- duino, il quale di fatto si limita a inviargli 
corre impiegare molte linee con comandi seriali per gestire la riproduzio- • DAC a 24 -bit, che supporta una gam-
pochi LED ciascuna. Ma questa ne; tutto il resto lo fa il DFR0299. ma dinamica di 90 dB e un rapporto
limitazione non interessa il no- Questo dispositivo può essere utilizzato segnale/rumore di 85dB;
in stand-alone, alimentandolo a 5 volt (la ‡ VXSSRUWRÀOHV\VWHP)$7H)$7
stro progetto, nel quale peraltro corrente richiesta per erogare 3 watt su • massima capacità di memoria indiriz-
non è stata prevista una funziona 8 ohm, che si ottengono a 5 volt, è 0,45 zabile pari a 32 GB, 32G di USB disk,
SUHGHŎQLWDSHUOĬXVFLWD1HR3L[HO ampere), collegandogli un altoparlante e blocchi di 64 MB Flash NOR;
che potrete invece aggiungere dei pulsanti. Oppure può essere usato in ‡ GLPHQVLRQL PP [[
editando lo sketch. combinazione con un Arduino UNO o qual-
siasi altro dispositivo dotato di porta se- Per quanto nel nostro progetto lo utilizzia-
Il canale dati usato per la comu- riale TTL. Dispone di controllo tramite pin mo in mono, il modulo dispone di un deco-
nicazione con i LED NeoPixel di I/O, tramite seriale o tramite ingresso der MP3 stereo le cui uscite sono disponibi-
e quindi con le strip, è simile al DQDORJLFR6XSSRUWDÀQRDFDUWHOOH li a basso livello e impedenza relativamente
tipo oneWire; la comunicazione RJQLFDUWHOODSXzFRQWHQHUHÀQRD DOWDSHUSLORWDUHDPSOLÀFDWRULLQJUHVVLGL
avviene a un massimo di 800 brani MP3. La regolazione del volume, sia PL[HUFXIÀHDRKPHFF/·DPSOLÀFDWRUH
essa ottenuta per via seriale o localmente GLSRWHQ]DLQFRUSRUDWRqPRQRHDPSOLÀFD
kbps. tramite pulsanti, prevede 30 livelli (± dalla la miscelazione dei canali destro e sinistro.
Per ogni strip di LED è possi- posizione centrale). L’alimentazione previ- La tabella in questo riquadro riporta la
bile impostare a piacimento la sta è da 3,2V a 5V in continua (la corrente piedinatura del modulo.
frequenza di refresh, in modo da
rendere impercettibili determina-
ti giochi di luce, fermo restando Il modulo può essere
il limite dettato dalla quantità di utilizzato autonomamente
strip collegate. con soli quattro pulsanti:
S1 e S2 hanno la duplice
Il protocollo di comando del funzione di controllo volume
sistema NeoPixel prevede l’invio (premuti a lungo) o di skip
di gruppi di tre byte in una strin- tra brani (pressione breve).
ga di 24 bit, ognuna delle quali
contiene lo stato di illuminazione
di ciascun colore base (prima gli N° Pin Description Note
otto bit del verde, poi quelli del  VCC Input Voltage DC3.2~5.0V;Type: DC4.2V
URVVRHLQŎQHTXHOOLGHOEOX  2 RX UART serial input

L’alimentazione prevista per i 3 TX UART serial output


4 DAC_R Audio output right channel
LED NeoPixel è a 5 volt, preleva- 'ULYHHDUSKRQHDQGDPSOLÀHU
5 DAC_L Audio output left channel 'ULYHHDUSKRQHDQGDPSOLÀHU
bili dal contatto 5V del connetto-
6 SPK2 Speaker- Drive speaker less than 3W
re della scheda Presepino, dato
7 GND Ground Power GND
che l’assorbimento di ciascuna
8 63. Speaker+ Drive speaker less than 3W
strip normalmente non è elevato
9 ,2 7ULJJHUSRUW Short press to play previous (long press to decrease volume)
e che i LED tricolore NeoPixel  GND Ground Power GND
vengono accesi alternativamen-  IO2 Trigger port 2 Short press to play next (long press to increase volume)
te. La massa di riferimento di  $'.(< $'3RUW 7ULJJHUSOD\ÀUVWVHJPHQW
alimentazione e dati (è unica e  ADKEY2 AD Port 2 7ULJJHUSOD\ÀIWKVHJPHQW
fa capo al contatto G della strip)  USB+ USB+ DP USB Port
è sempre quella del microcon-  USB- USB- DM USB Port
trollore e va quindi connessa a

Elettronica In ~ Dicembre 2015 / Gennaio 2016 87


[piano di MONTAGGIO]
Elenco Componenti:

R1÷R6: Trimmer 10 kohm MO


R7÷R18: 1 kohm
R19: -
R20, R22: 470 ohm
R21: 4,7 kohm
R23, R24: 1 kohm
C1, C3: 100 nF ceramico
C2, C4: 220 μF 25 VL
elettrolitico
C5: 15 pF ceramico
C6: 15 pF ceramico
C7÷C9: 100 nF ceramico
D1: 1N4007
U1: ATMEGA328P (MF1230)
U2: 7805
U3: Modulo DFPlayer Mini
(DFR0299)
U4: Convertitore USB-TTL

GND. Per gestire eventualmente sketch le utilizza per gestire il ai dati contenuti nella SD-Card:
strip molto lunghe e quindi con modulo. Il DFR0299 nello schema man mano che lo stream di dati
un assorbimento più elevato, sul lo trovate siglato U3; è in grado viene letto, il decoder lo tra-
connettore siglato NEOPIXEL GLULSURGXUUHGLUHWWDPHQWHLŎOH sforma in audio non compresso,
abbiamo portato anche i 12 volt, MP3 e WAV memorizzati su una FKHSRLYLHQHDPSOLŎFDWRGDXQ
prelevati direttamente a monte SD-Card della capacità massima SLFFRORŎQDOHLQWHJUDWRPRQR
del diodo D1. A questa uscita è di 32 GB purché formattata con FRQXVFLWDDSRQWHGDZDWW
possibile ad esempio collegare FAT16 o FAT32, inserita nell’ap- che sono una potenza più che
XQUHJRODWRUHVZLWFKLQJLQJUDGR posito slot. VXIŎFLHQWHDSLORWDUHXQDOWRSDU-
di fornire la corrente necessaria La particolarità di questo mo- lante in grado di farsi sentire
DOOĬLQWHUDŎODGLOHG1(23,;(/ dulo è che è stato progettato e nell’ambiente. Se serve mag-
Passiamo adesso all’audio del realizzato per il mondo Arduino: gior potenza, utilizzate l’uscita
presepe, che viene ottenuto gra- anche nella scelta del modulo, audio (+ e – SPK) per pilotare
zie a un valido modulo siglato vedete, è evidente il vantaggio XQDPSOLŎFDWRUHGLSRWHQ]DFXL
DFR0299 (lo trovate su www.fu- di avere a bordo della nostra applicare una cassa acustica; in
turashop.it/mini-riproduttore-mp3- scheda un’architettura Ardui- alternativa potete prendere l’au-
montato-9145-dfr0299) controlla- no. Per la gestione del modulo dio dai contatti 4 e 5, che sono le
bile tramite interfaccia seriale a è chiaramente stata sviluppata uscite audio a basso livello dei
livello TTL; nel nostro circuito XQDOLEUHULDVSHFLŎFD VFDULFDELOH canali, rispettivamente, LEFT e
XWLOL]]DODVHULDOHKDUGZDUHGHO anche dal nostro sito www.elet- RIGHT. In questo caso potete
microcontrollore, la stessa tronicain.itLQVLHPHDJOLDOWULŎOH contare su un audio stereo.
impiegata in fase di program- del progetto) che il nostro sketch Tutte le funzioni del modulo
mazione per caricare lo sketch include, la quale permette di U3 si governano da seriale con
sul microcontrollore, ma ciò non GHFLGHUHTXDOHŎOHULSURGXUUH VSHFLŎFKHLVWUX]LRQLFKHLOPL-
costituisce un problema in quan- regolare il volume ecc. crocontrollore impartisce; quelle
to le linee RX e TX dell’ATmega Il modulo contiene un decoder riguardanti il volume vengo-
vengono usate per una funzione in grado di decomprimere l’au- no generate leggendo l’ADC
alla volta, ovvero una volta che dio in formato MP3 e un control- dell’ATmega quando campiona
è stato programmato il micro, lo ler in grado di accedere via SPI la tensione sul cursore del trim-

88 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


(FTDI5V)
LD1÷LD6: LED rosso 5 mm
LD7: LED verde 5 mm
LD8: LED giallo 5 mm
X1: Quarzo 16 MHz
Q1÷Q6: STP36NF06
P1÷P3: Microswitch

Varie:
- Morsetto 2 poli passo
5,08mm (8 pz)
- Strip femmina 8 vie (2 pz.)
- Strip maschio 3 vie (2 pz.)
- Strip maschio 4 vie
- Strip maschio 6 vie 90°
- Zoccolo 14+14
- Dissipatore (6 pz.)
- Vite 10 mm 3 MA (6 pz.)
- Dado 3 MA (6 pz.)
- Circuito stampato S1230

mer R6. Abbiamo anche previsto mazione, ovvero quando alla ŎQRUDWUDODVFLDWHRVVLDOĬDOLPHQ-
di utilizzare, tra i comandi di ge- scheda si applica il convertitore tazione, l’oscillatore dell’ATme-
stione della riproduzione (Play, Seriale/USB, vi siano interferen- ga 328P e la programmazione
Stop, Pause, FWD ecc.) solo ze tra le tensioni dei due moduli. in-circuit; per quanto riguarda
quello di Play/Stop, che viene ,ŎOHGHOOĬDXGLRFKHYROHWHVLD la sezione di alimentazione, il
implementato con i tre pulsanti riprodotto devono essere scritti circuito va alimentato con 12÷14
collegati al microcontrollore sulla SD-Card con nome nel Vcc (la corrente richiesta dipen-
tramite le linee PD2, PD4 e PD7 formato 001.mp3, 002.mp3, 003. de da quanti utilizzatori collega-
(tutte inizializzate come input mp3 e 004.mp3, perché il primo te alle uscite) tramite la morset-
dotati di pull-up interno) che ŎOHYLHQHULFKLDPDWRGXUDQWH tiera +/- PWR, la cui tensione
hanno tutti la stessa funzione, la fase GIORNO, il secondo giunge direttamente alle uscite
ovvero quella di abilitare/disa- durante il TRAMONTO, il terzo a MOSFET e al connettore per
bilitare l’audio (Listato 2). Più quando viene acceso il FUOCO NeoPixel. La tensione di alimen-
esattamente, la pressione di uno IXRFRWUHPRODQWH HLOŎOH tazione principale giunge anche
dei pulsanti P1, P2, P3 quando è mp3 viene richiamato quando all’anodo del diodo D1, inserito
in riproduzione un brano causa arriva l’ALBA. per proteggere il resto del circu-
l’arresto del medesimo e la suc- Durante il passaggio tra una fase ito dall’inversione di polarità, e
cessiva pressione fa ricominciare e l’altra, il volume di riprodu- viene applicata all’ingresso del
la riproduzione dall’inizio del zione viene abbassato gradual- regolatore di tensione U2, com-
brano arrestato in precedenza. PHQWHŎQRDOWHUPLQHGHOEUDQR pito del quale è ricavare i 5 volt
Quando l’audio è in riproduzio- e viene avviata, con volume in stabilizzati con cui funzionano
ne, il LED LD7 viene acceso dal- graduale aumento, la riprodu- il microcontrollore, i compo-
la linea PB5 del microcontrollore, zione del brano successivo (tipo nenti di contorno e il modulo
la quale nel normale funziona- ciò che avviene alla radio o negli audio U3. L’eventuale converter
mento è utilizzata come output; album musicali); questo vale nel Seriale/USB si alimenterà con la
le linee PD0 e PD1, facenti capo passaggio dal brano da una fase tensione dell’USB del computer
all’UART, vengono accoppiate alla seguente. cui verrà interfacciato. I conden-
al modulo U3 mediante resisten- Detto ciò completiamo la descri- satori posti sull’alimentazione
ze per evitare che in program- zione del circuito con le parti GĬLQJUHVVRVHUYRQRDŎOWUDUHJOL

Elettronica In ~ Dicembre 2015 / Gennaio 2016 89


Funzionamento delle uscite
La sequenza di accensione delle luci A questo punto ci troviamo in piena notte
controllate dal nostro circuito. Di giorno con le stelle in cielo che brillano, la cometa
l’unica lampada (o serie di lampade) completamente illuminata ed i fuochi nelle
dovrà prima caricare il bootloa-
accesa è quella che simula il sole e che case accesi col loro tipico tremolìo. La
illumina, appunto, “a giorno” il presepe. durata di questa fase (compresa, come der per poter trasferire lo sketch
Questa lampada resta accesa per un SHULOJLRUQRWUDHVHFRQGLFLUFD  dall’IDE di Arduino.
WHPSRFRPSUHVRWUDHVHFRQGLD che è la NOTTE, viene impostata mediante Il connettore preposto è quello
seconda di come viene settato il trimmer il trimmer R2. Allo scadere del tempo im- siglato ICSP e ad esso fanno
56FDGXWRLOWHPSRKDLQL]LRXQDQXRYD postato, ha inizio la quarta ed ultima fase: capo le linee di reset (RST),
fase: il tramonto, la cui durata dipende l’alba. Gradatamente l’intensità luminosa
dal trimmer R4. Agendo su detto trimmer delle stelle si abbassa mentre aumenta
MISO (ingresso dati del pro-
è possibile impostare un valore compre- la luminosità del giorno sino al completo grammatore e uscita del micro
VRWUDHVHFRQGLFLUFD$SRFRD spegnimento delle stelle ed alla completa U1), MOSI (uscita dati del pro-
poco la luce del giorno si attenua mentre accensione delle lampade che simulano grammatore e ingresso dati del
aumenta la luminosità delle lampade la luce del giorno. All’inizio di questa fase micro), SCK (clock della comuni-
che simulano le stelle, sino al completo anche la cometa si spegne gradatamente
cazione seriale sull’SPI formato
spegnimento del sole che coincide con ma molto più velocemente tanto che, tra-
la massima illuminazione delle stelle. VFRUVRXQSHULRGRSDULDGGHOWHPSR da MISO e MOSI), oltre che la
Esattamente a metà di questa fase di impostato per l’alba, la cometa risulta massa e la Vcc, che durante la
transizione iniziano ad accendersi i fuochi completamente spenta. Sempre all’inizio programmazione viene fornita
delle case che raggiungono la massima di questa fase di transizione, anche la lu- dal programmatore per alimen-
luminosità al termine del ciclo. Da notare minosità dei fuochi inizia a calare sino allo tare il circuito.
che questa uscita genera una luce tre- spegnimento. In questo caso il passaggio
Ricordiamo che quando si pro-
molante che simula il bagliore del fuoco. dalla massima luminosità allo spegni-
,QÀQHDOWHUPLQHGHOFLFORVLLOOXPLQD mento completo avviene in un tempo pari gramma il bootloader il circuito
gradatamente anche la luce che simula la DGGLTXHOORLPSRVWDWRSHUO·$/%$ deve essere alimentato attra-
stella cometa. Il passaggio dalla minima mediante il trimmer R3. A questo punto verso la morsettiera +/- PWR.
alla massima luminosità avviene in tempo abbiamo simulato un ciclo di 24 ore ed il Concludiamo con l’oscillatore
SDULDGGLTXHOORLPSRVWDWRSHULO VLVWHPDVLDSSUHVWDDULSHWHUHDOO·LQÀQLWROD del microcontrollore, che è im-
TRAMONTO. sequenza programmata.
postato come clock ricavato dal
quarzo X1, in parallelo al quale
GIORNO TRAMONTO NOTTE ALBA GIORNO TRAMONTO NOTTE ALBA troviamo la resistenza R19; i
condensatori C5 e C6 comple-
SOLE
tano l’oscillatore, che funziona
a 16 MHz, frequenza più che
VXIŎFLHQWHDJHVWLUHOĬLQWHURFLFOR
STELLE di lavoro della centralina.

COMETA
REALIZZAZIONE PRATICA
Passiamo adesso alla costruzio-
ne della scheda, che richiede la
FUOCO preparazione (o l’acquisto, visto
che il materiale è tutto dispo-
nibile presso Futura Elettro-
nica) di un circuito stampato
a doppia faccia le cui tracce
impulsi creatisi sulle piste per controllore. Analoga è la funzio- sono scaricabili dal nostro
effetto dell’assorbimento dei ne dei condensatori C3 e C4. VLWRZHELQVLHPHDJOLDOWULŎOH
LED e in generale dei carichi Veniamo ora all’interfaccia per del progetto; incisa e forata la
collegati alle uscite a MOSFET; la programmazione in-circuit, da basetta, realizzate le vie (ossia
ciò è necessario in quanto la utilizzare solo se volete caricare le interconnessioni tra piaz-
pulsazione dell’alimentazione il bootloader in un microcon- zole comuni alle due facce) si
dei diodi è a frequenza elevata trollore vergine; a riguardo va possono montare i componenti
e altrimenti i disturbi (che poi detto che il microcontrollore iniziando da quelli a più basso
sono abbassamenti di tensio- fornito dalla Futura Elettronica SURŎOR UHVLVWHQ]HHGLRGR' H
ne pur lievi concomitanti con (www.futurashop.it) con il kit è proseguendo con lo zoccolo del
l’accensione dei singoli LED) già programmato con bootloa- microcontrollore, il pin-strip a
potrebbero interferire con il cor- der e sketch, ma chi preferisce 6 poli con terminali a 90° per il
retto funzionamento del micro- procurarsi da sè l’ATmega 328P convertitore Seriale/USB (facol-

90 Dicembre 2015 / Gennaio 2016 ~ Elettronica In


Guarda Presepino
in funzione su YouTube!
(orientandolo in modo che il Elettronica, www.futurashop.it,
porta-SD sia rivolto all’esterno basato sull’integrato FT232RL
del circuito) e il microcontrol- della FTDI) si collega la presa
lore, la cui tacca di riferimento USB di quest’ultimo a quella di
deve essere rivolta al regolato- un PC nel quale sia installato
re integrato U2. Nel DFR0299 l’IDE di Arduino e si carica lo
bisogna inserire una microSD sketch (l’IDE vede la nostra
della capacità desiderata, con scheda come una Arduino UNO,
già caricati (fatelo su un compu- perché il bootloader caricato
Vuoi vedere
WHU LŎOHDXGLRGHVLGHUDWLSHU nell’ATmega 328P è quello).
il nostro
essi vale quanto detto qualche Tutto ciò non è richiesto se si
presepe 3D
paragrafo indietro, rammentan- acquista il kit di montaggio,
realizzato con
do che per ovvi motivi sarebbe dove il microcontrollore viene
la stampante
meglio che la durata di ciascuno fornito programmato con le fun-
3Drag e
non ecceda quella impostata zionalità base (4 uscite gestibili
illuminato
per la fase che deve accompa- da 4 trimmer). Comunque per
da Presepino? Nulla di più
gnare, quindi, ad esempio, il rendere il progetto facilmente
semplice: collegati alla pagina
motivo suonato per il giorno adattabile alle vostre esigenze
https://youtu.be/X0Ivpg3FLGg.
deve durare non più di quanto diamo lo sketch, che potete
Dal nostro canale YouTube
LPSRVWDWRSHULOJLRUQR6HLOŎOH scaricare dal nostro sito, insie-
https://www.youtube.com/user/
dura meno in ogni caso non è PHDLŎOHGHOSURJHWWR$QFKH
ElettronicaIN/videos potrai anche
un problema, in quanto il brano se avete acquistato il kit ma non
vedere i video di moltissimi altri
viene riprodotto ciclicamente YLDFFRQWHQWDWHGHOODFRQŎJX-
nostri progetti proposti in passato.
ŎQRDOODŎQHGHOWHPSRLPSRVWD- razione base e volete provare
to per la relativa fase e quindi DGDSSRUWDUHTXDOFKHPRGLŎFD
tativo), i trimmer, i pulsanti da sfumato per tempo. dovete procurarvi e montare il
c.s. e i LED, da orientare come Ricordate che i brani vanno pre- convertitore Seriale/USB.
indicato nel piano di montag- feribilmente inseriti nella root Bene, a questo punto non ci
gio, rammentando che il catodo della microSD, ma il modulo è resta che augurarvi buon di-
è l’elettrodo situato dal lato comunque in grado di cercare vertimento e soprattutto Buone
J
smussato del contenitore. Ora nelle cartelle, fermo restando Feste!
inserite e saldate i due pin-strip che l’ordine di riproduzione, se
femmina a 8 poli ciascuno per QHOODVFKHGDHVLVWRQRDOWULŎOH
montare il modulo audio, il pin- audio, non sarebbe più garan-
strip per l’ICSP (4 poli), le otto tito.
morsettiere e il regolatore 7805, A questo punto la centrali- per il MATERIALE
che va tenuto in piedi con il lato na può o meno richiedere la
delle scritte rivolto allo zocco- programmazione in base a Tutto il materiale di questo proget-
lo del microcontrollore. Ora come l’avete realizzata: se avete to può essere acquistato presso
bisogna montare i sei MOSFET, acquistato un microcontrollore Futura Elettronica. La scheda pre-
ognuno dei quali va inserito nei vergine dovete, con il program- sepe con Arduino (cod. FT1230K)
rispettivi fori dello stampato matore ATMEL o una sche- viene venduta già programma-
dopo averne piegato ad ango- da Arduino impostata come ta a Euro 39,00; il convertitore
lo retto i terminali ed averlo programmatore (tecnica di USB/TTL (cod. FTDI5V) è dispo-
appoggiato (con il lato scritte programmazione stand-alone), nibile a Euro 19,00, mentre il mini
verso l’alto) a un dissipatore caricare il bootloader utilizzan- riproduttore MP3 (cod. DFR0299)
di calore ad “U” tipo ML26 (22° do, allo scopo, la connessione costa Euro 12,00. Tutti i prezzi si
C/W di resistenza termica). ICSP. Fatto ciò, rimuovendo il intendono IVA compresa.
Completate le saldature e programmatore e montando Il materiale va richiesto a:
YHULŎFDWRFKHRJQLFRPSRQHQWH il modulo d’interfaccia Seria- Futura Elettronica, Via Adige 11,
sia montato correttamente e nel le/USB nel connettore U4 (si 21013 Gallarate (VA)
verso previsto, inserite il modu- tratta dell’FTDI5V, un modulo Tel: 0331-799775 • Fax: 0331-792287
lo DFR0299 nei propri pin-strip commercializzato dalla Futura http://www.futurashop.it

Elettronica In ~ Dicembre 2015 / Gennaio 2016 91


Sfoglia on-line ®

i l catalogo generale 2018

O DIRETTAMENTE
DAL TUO TABLET
O SMARTPHONE

APP SCARICABILE
GRATUITAMENTE DA:

Futura Group srl Maggiori dettagli e acquisti on-line su


Via Adige, 11 • 21013 Gallarate (VA)
Tel. 0331/799775 www.futurashop.it
Arduino
Nel firmamento Arduino brilla una nuova “scheda”
simile alla UNO ma dotata di connettività WiFi
e lettore pper SD. Prima ppuntata.

FISHINO,
L’ARDUINO DIVENTA
WIRELESS
di MASSIMO DEL FEDELE

l nome della scheda descritta in queste pagine UN ALTRO CLONE DI ARDUINO?


I è nato da un “pesce d’aprile” fatto dall’autore
su un forum dove si presentava una fantomatica
Si e no: con questa scheda abbiamo voluto realiz-
zare un prodotto nuovo in grado di abbinare la
scheda denominata “Fishino Zero” dotata di ca- semplicità d’uso e la sterminata quantità di librerie
ratteristiche mirabolanti, tra le quali un processore e shield di Arduino con la connettività Internet, una
“Horata” di ultima generazione, tecnologia WiFi dotazione praticamente illimitata di memoria grazie
“Poisson”, connessione avanzata WiFi “Fishnet” ed alla scheda microSD e, ultimo ma non per impor-
altre improbabili meraviglie. Il simbolo, piazzato tanza, un orologio interno con backup a batteria, il
WUDPLWHXQSURJUDPPDGLJUDŎFDVXOODIRWRGLXQD tutto ad una frazione del costo d’acquisto di una
scheda esistente, era appunto il pesciolino che, Arduino e degli shield relativi alle funzioni imple-
ŎQLWRORVFKHU]R©GLYHQWDWRLOORJRGHOODVFKHGDFKH mentate, senza occupare prezioso spazio aggiun-
proponiamo in queste pagine. tivo; la scheda ha infatti un ingombro identico a
'DVFKHU]ROĬLGHDKDLQL]LDWRDSUHQGHUIRUPDŎQR quello dell’Arduino Uno, salvo la piccola sporgenza
DOODUHDOL]]D]LRQHGHOODERDUGGHŎQLWLYD dell’antenna WiFi, di soli 7 mm.
Il termine UNO è poi stato aggiunto sia per indicare L’integrazione delle periferiche descritte, a nostro
la prima di una possibile serie di schede Arduino- avviso indispensabili nell’era dell’IoT, permette di
compatibili, che per indicare la completa compati- realizzare tutta una serie di apparecchi sia control-
bilità con Arduino Uno, sia come connettività che labili via Internet che in grado di connettersi ad essa
come dimensioni. a richiesta e trasmettere dati rilevati in precedenza.

Elettronica In ~ Settembre 2015 97


CARATTERISTICHE
TECNICHE SCHEMA ELETTRICO stituito dalle resistenze R1 ed R2,
Il Fishino Uno, allo stesso modo supera quella di riferimento di
J Alimentazione: 12 Vcc o USB di Arduino Uno, può essere 3,3 volt all’ingresso invertente e
J Completamente compatibile con
alimentato tramite sia la porta l’uscita commuta a livello positi-
Arduino Uno
J Scheda WiFi a bordo, con possibi- USB che il connettore per l’ali- vo, provocando l’interdizione del
lità di funzionamento in modalità mentazione esterna. L’alimen- MOSFET a canale P siglato T1.
stazione, access point o entrambe tazione viene automaticamente Guardando da vicino quest’ulti-
contemporaneamente commutata su quella proveniente mo, il collegamento è apparen-
J Interfaccia per schede di memoria dal connettore esterno quando temente strano: l’alimentazione
MicroSD a bordo ai capi del medesimo (oppure entra dal Drain ed esce dal
J RTC (Real Time Clock) a bordo con all’ingresso Vin) viene appli- Source, passando in contempo-
batteria al litio di mantenimento FDWDXQDWHQVLRQHVXIŎFLHQWHDO ranea attraverso il diodo interno
J Sezione di alimentazione a 3,3 V
funzionamento del regolatore GLFODPSLQJFL³VLJQLŎFDFKHOD
potenziata
J Connettore aggiuntivo sfalsato
lineare U5. tensione proveniente dall’ingres-
in modo da risolvere il problema La tensione giunge dal connet- so USB passa comunque attra-
dell’incompatibilità di Arduino con tore di alimentazione al regola- verso il diodo e va ad alimentare
le schede millefori. tore attraverso il diodo Schottky il circuito anche se il MOSFET è
D2, utilizzato come protezione interdetto.
contro l’inversione della pola- A che serve quindi il MOSFET?
rità; è stato scelto uno Schottky Apparentemente con il solo
Tra le realizzazioni possibili ci al posto di un più tradizionale diodo la commutazione sarebbe
sono, per esempio: diodo in silicio per la più bassa assicurata, perché se la tensione
• sistemi di home automation caduta di tensione che presenta: al catodo è superiore a quella
gestibili via Internet tramite un 0,3÷0,4 volt contro gli 0,7 circa dell’anodo (USBVCC) il diodo
Web Browser; dei diodi in silicio; questo, e viene interdetto scollegando
• data logger portatili in grado l’aver utilizzato un regolatore quindi l’alimentazione USB.
di connettersi e scaricare i dati lineare “low dropout” (a bassa Il motivo della presenza del
sulla rete quando si entra nel caduta di tensione) permette di MOSFET (e circuiteria annessa) è
campo di copertura di una rete alimentare la scheda già con 6,6 da cercarsi sempre nella caduta
WiFi; volt (5 necessari ai circuiti + 0,4 di tensione provocata dal diodo,
• robot controllabili via rete e in di caduta sul diodo + 1,2 di ca- che farebbe diminuire l’alimenta-
grado di trasmettere tramite duta massima sul regolatore). La zione dai 5 volt della linea USB a
essa i dati rilevati da sensori. massima tensione di alimentazio- 4,2÷4,6 volt circa, caduta evitata
ne ammissibile dipende invece dal MOSFET stesso una volta
L’utilizzo di un modulo WiFi dalla dissipazione del regolatore entrato in conduzione.
DEDVVRFRVWRPDFRQŎUPZDUH lineare utilizzato; si sconsiglia A completare l’alimentazione
da noi “hackerato” per ottenere di superare i 12 V e, se possibi- è presente l’integrato U3, che
prestazioni elevate e capace di le, di restare intorno ai 9 volt. Il fornisce in uscita la tensione a
funzionare anche come access regolatore dispone comunque di 3,3 V necessaria, tra l’altro, per la
point, ovvero senza la necessità protezioni interne che lo disat- scheda SD ed il modulo WiFi.
di una struttura di rete WiFi esi- tivano quando la dissipazione A differenza dell’Arduino origi-
stente, permette il controllo via risulta eccessiva. nale, che fornisce poche decine
cellulare in qualsiasi momento, La tensione in ingresso Vin (dopo di mA sulla linea a 3,3 volt, nel
anche in assenza di copertura di il diodo di protezione) viene Fishino sono utilizzabili circa
rete, rendendo il dispositivo sem- inoltre inviata all’operazionale 7÷800 mA a seconda del consu-
pre interattivo. La possibilità di U1A utilizzato per la commuta- mo sulla linea a 5 Volt.
eseguire l’aggiornamento degli zione dell’alimentazione tramite L’interfaccia USB di Fishino è
sketch via Internet, già prevista porta USB. stata realizzata, diversamente
a livello hardware, permetterà Quando la tensione Vin supera dall’Arduino originale, tramite
inoltre di avere dispositivi sem- i 6,6 volt la tensione all’ingresso un chip CH340G (siglato U2) in
pre aggiornati senza la necessità non invertente dell’operazionale, sostituzione al più noto FT232
GLGRYHUOLFROOHJDUHŎVLFDPHQWH utilizzato qui come comparatore, o altre soluzioni più o meno
ad un computer. dimezzata tramite il partitore co- complicate.

98 Settembre 2015 ~ Elettronica In


[schema ELETTRICO]

Elettronica In ~ Settembre 2015 99


[piano di MONTAGGIO]
Elenco Componenti:

R1: 10 kohm (0805) C5: 100 nF ceramico (0805)


R2: 10 kohm (0805) C6: 1 μF ceramico (0805)
R3: 1 kohm (0805) C7: 1 μF ceramico (0805)
R4: 1 kohm (0805) C8: 22 pF ceramico (0805)
R5: 10 kohm (0805) C9: 22 pF ceramico (0805)
R6: 1 kohm (0805) C10: 100 nF ceramico (0805)
R7: 1 kohm (0805) C11: 47 μF 16VL elettrolitico
R8: 2,4 kohm (0805) (Ø 6mm)
R9: 1 kohm (0805) C12: 100 nF ceramico (0805)
R10: 470 ohm (0805) C13: 47 μF 16VL elettrolitico
R11: 10 kohm (0805) (Ø 6mm)
R12: 1 kohm (0805) C14: 100 nF ceramico (0805)
R13: 1 kohm (0805) D1: RB521S
R14: 1 kohm (0805) D2: M7
R15: 10 kohm (0805) D3: RB521S
R16: 10 kohm (0805) D4: RB521S
R17: 3,3 kohm (0805) D5: CD1206-S01575
R18: 10 kohm (0805) D6: RB521S
R19: 3,3 kohm (0805) BATT: Porta batterie
R20: 10 kohm (0805) CH291-1220LF
R21: 3,3 kohm (0805) U1: LMV358L
R22: 10 kohm (0805) U2: CH340G
R23: 10 kohm (0805) U3: NCP1117ST33T3G
C1: 100 nF ceramico (0805) U4: ATMEGA328P-AU
C2: 22 pF ceramico (0805) U5: NCP1117ST50T3G
C3: 22 pF ceramico (0805) U6: DS1307
C4: 1 μF ceramico (0805) U37: ESP12

La scelta è stata dettata princi- RS232, ovvero i due segnali di per i LED TX ed RX (che segna-
palmente da motivi di costo e trasmissione/ricezione dati (Rx lano le attività di trasmissione
GLVHPSOLŎFD]LRQHFLUFXLWDOHD e Tx) ed i segnali di controllo e/o ricezione) questi ultimi sono
parità di prestazioni. L’integra- (CTS, DSR, DXD, DTR e RTS); nel stati inseriti direttamente sulle
to per funzionare necessita di nostro circuito vengono utilizzati due rispettive linee dati, con una
pochissimi componenti esterni: solo i segnali dati (RX e TX) e il scelta accurata dei valori di resi-
un quarzo a 12 MHz (Q1), due DTR per generare l’impulso di stenza in modo da non provocare
condensatori per garantire la sta- reset ogniqualvolta viene aper- un’attenuazione eccessiva.
bilità dell’oscillatore (C2 e C3) ed ta la porta seriale, in modo da La scelta dei valori è stata inoltre
un condensatore di disaccoppia- rendere possibile il caricamento calibrata per permettere alla
mento per il regolatore interno a degli sketch senza dover resetta- stessa interfaccia USB/Seriale di
3,3V (C4). re manualmente il dispositivo. ULSURJUDPPDUHLOŎUPZDUHGHO
Il circuito può infatti essere ali- Torneremo in seguito sulla modulo WiFi senza dover ricor-
mentato indifferentemente a 3,3 circuiteria di reset per spiegare rere ad adattatori esterni.
volt (collegando il pin V3 al Vcc) che rispetto all’originale è stata Per quanto riguarda l’ATme-
oppure a 5 volt, inserendo un PRGLŎFDWDLQPRGRGDSHUPHWWH- ga328P, lo schema di Fishino non
condensatore di disaccoppiamen- re in futuro la riprogrammazione si discosta da quello di Arduino
to tra il pin V3 e la massa. dell’Atmega via WiFi. Uno: il controller è il medesimo,
Il componente fornisce in uscita Non disponendo, l’integrato solo in formato SMD per esigen-
tutti i segnali di un’interfaccia utilizzato, di due uscite separate ze di spazio sulla board, correda-

100 Settembre 2015 ~ Elettronica In


to, non sono 5V-tolerant; questo
VLJQLŎFDFKHIRUQHQGRJOLVHJQDOL
TTL a 5 volt si corre il rischio di
bruciarli.
Per quanto riguarda il modulo
T1: FDN340P
L1: MF-MSMF050-2 WiFi, da prove effettuate non ab-
500mA (1812) biamo riscontrato alcun proble-
POWER: LED verde (0805) ma fornendogli dati TTL a 5 volt,
RX: LED giallo (0805) ma, per evitare possibili guasti a
TX: LED blu (0805) medio/lungo termine, abbiamo
SCL: LED bianco (0805) SUHIHULWRULVSHWWDUHOHVSHFLŎFKH
Q1: Quarzo 12 MHz tecniche ed inserire un circuito di
Q2: Quarzo 16 MHz adattamento dei livelli.
Q3: Quarzo 32.768 KHz
Questo è realizzato molto sempli-
RESET: Microswitch TS42
SD1: Connettore micro-SD cemente tramite partitori resistivi,
per quanto riguarda la direzione
Varie: Atmega --> SD e WiFi, mentre in
- Plug alimentazione direzione opposta si sfrutta il fat-
- Connettore micro-USB to che il valore H dei circuiti a 3,3
- Strip femmina 6 vie volt (da 2,95 volt circa in su) è al
(1 pz.) limite ma dentro il range compa-
- Strip femmina 8 vie tibile con il livello alto a 5 volt.
(2 pz.)
Si sono quindi risparmiate com-
- Strip femmina 10 vie
(2 pz.) plesse circuiterie con transistor
- Strip maschio 3 vie e/o traslatori integrati.
(2 pz.) L’unico “difetto”, se così si può
- Strip maschio 6 vie dire, dell’approccio utilizzato, è
(2 pz.) che i partitori resistivi devono sia
- Circuito stampato S1225 DYHUHXQĬLPSHGHQ]DVXIŎFLHQWH-
mente alta per non sovraccaricare
le uscite dell’Atmega328P e per
non aumentare inutilmente il
consumo di corrente, sia avere
to dall’usuale quarzo a 16 MHz, per questo è necessario applicare XQĬLPSHGHQ]DVXIŎFLHQWHPHQWH
dai due condensatori sul circuito in prossimità dei pin di alimenta- bassa da non causare perdite di
oscillante e da un certo numero ]LRQHGHLFRQGHQVDWRULFKHŎOWUL- segnali in alta frequenza.
di condensatori di disaccoppia- no i disturbi prima che si pro- I valori scelti sono un compromes-
mento sulle linee di alimenta- paghino al resto del circuito. Un so tra i due requisiti e permettono
zione. Una piccola parentesi su condensatore solo non servirebbe. il buon funzionamento dell’in-
questi ultimi: spesso negli schemi Ora una nota sui connettori di terfaccia anche alla massima
si vedono alcuni (a volte molti) I/O: a Fishino è stato aggiunto velocità. I partitori sono costituiti
condensatori in parallelo all’ali- un piccolo connettore a 10 pin dalle coppie R13-R21, R12-R19 e
mentazione; qualcuno si chiederà DIŎDQFDWRDTXHOORVWDQGDUGPD R14-R17. Un valore in ingresso a
perché al posto dei tanti con- leggermente sfalsato in modo 5 Volt viene convertito a:
densatori non ne abbiamo usato da poter utilizzare una scheda
uno solo di capacità equivalente. preforata standard per gli shield, Vo = 5 Volt • 3.3K / (1K + 3.3K) = 3,83 Volt
Ebbene, il motivo è che i moderni risolvendo quindi l’annoso pro-
circuiti integrati digitali lavorano blema del passo incompatibile valore leggermente superiore
a frequenze elevate e con segnali dei connettori laterali di Arduino. ai 3,3 volt teorici ma accettabile
impulsivi, che causano grosse Tutta la circuiteria di Fishino VHFRQGROHVSHFLŎFKHHVVHQGR
variazioni di assorbimento di opera a 5 volt, mentre sia le sche- DPPHVVLVROLWDPHQWHYDORULŎQRD
corrente sui pin di alimentazione de MicroSD che il modulo WiFi 0,6 Volt superiori all’alimentazio-
dovute alla resistenza delle piste; funzionano a 3,3 volt e, soprattut- ne, quindi 3,3 + 0,6 = 3,9 V.

Elettronica In ~ Settembre 2015 101


necessaria al loro funzionamento,
ŎQRDOOĬDQWHQQDLQWHJUDWDVXO3&%
A prima vista, una potenza di
calcolo di questo livello (de-
cisamente superiore a quella
dello stesso Atmega utilizzato da
Arduino), suggerirebbe l’utilizzo
del solo modulo programman-
dolo direttamente, vuoi con il
SDK (Software Development Kit)
fornito dal produttore (piuttosto
complesso da utilizzare), oppure
tramite una serie di strumenti
che ne permetta la program-
mazione con l’IDE di Arduino,
quasi fosse un nuovo modello del
medesimo. Dove sta il problema,
allora? Ebbene, per prima cosa le
architetture sono molto diverse,
to, come si vedrà negli esempi Anche se l’IDE di Arduino è stata
Interfaccia scheda MicroSD presentati in seguito. adattata per compilare e caricare
L’interfaccia è semplicissima e ri- codice direttamente sull’ ESP,
specchia lo shield SD (o analoghi Modulo WiFi la compatibilità è ancora trop-
combinati); funziona attraverso Se l’Atmega può essere conside- po limitata. Inoltre si perde la
le linee SPI tra cui MOSI (dati rato il cervello del Fishino, il mo- possibilità di utilizzare l’enorme
dall’Atmega verso la SD, Master dulo WiFi è sicuramente la sua quantità di librerie e shield di cui
Out Slave In), MISO (dati dalla porta d’accesso al mondo esterno, $UGXLQR©GRWDWR,QŎQHOĬ(63KD
SD all’Atmega, Master In Slave ed è il principale motivo a monte un numero ridottissimo di pin
Out) e SCK (clock). I valori verso dello sviluppo della scheda. di I/O digitale ed un solo input
la scheda SD sono ovviamente L’idea di creare Fishino è nata analogico, cosa che ne limita for-
ridotti dagli adattatori di livello infatti dall’esigenza di sviluppare temente le possibilità d’impiego.
di cui al paragrafo precedente. un sistema di Home Automation Si è scelto quindi di integrare
La selezione della scheda avvie- con possibilità di controllo via in una board compatibile con
ne tramite la linea SDCS, attiva Internet. In precedenza per poter- Arduino UNO il modulo WiFi,
a livello basso. In questo caso la realizzare era necessario usare cercando di renderlo il più simile
l’adattamento di livello viene Arduino con annesso modulo possibile nell’uso agli analoghi
effettuato tramite una resisten- WiFi o ethernet, con costi ed shield WiFi ed Ethernet, grazie
za (R18) verso il positivo ed un ingombri decisamente più elevati ad un’apposita libreria di cui
diodo (D4) che permette il solo e, nel caso dell’ethernet, la neces- parleremo in seguito.
passaggio dei valori negativi. sità di una connessione cablata L’utilizzo del modulo ESP è
Lo schema scelto consente di ave- alla rete. VWDWRLQL]LDOPHQWHGLIŎFROWRVRH
re la scheda in stand-by quando L’inserimento della connettività fonte di vari tentativi più o meno
il segnale SDCS (connesso al pin WiFi direttamente nel Fishino a fallimentari, a causa principal-
digitale 4 del Fishino) non è uti- costi ragionevoli è stato reso pos- PHQWHGHOŎUPZDUHIRUQLWRGDO
lizzato; col pin in modalità three- sibile dall’immissione sul merca- costruttore.
state (ovvero ad alta impedenza) to dei moduli WiFi ESP8266. Questo infatti è realizzato per
il diodo non conduce e sull’in- Questi moduli contengono un comunicare attraverso la porta
gresso SDCS è presente un valore processore a 32 bit, una Flash di seriale e non, come negli shield
alto che disattiva la scheda. programma molto capiente (da 1 originali, attraverso la porta SPI.
L’interfaccia è totalmente com- a 4 MBit), circa 90 kByte di RAM I vantaggi della porta seriale
patibile con gli shield di Arduino, di cui 32 disponibili per l’utente, sono ovviamente la semplicità
quindi utilizza le stesse librerie un completo stack WiFi e tutta d’uso (basta collegare un ter-
esistenti per il suo funzionamen- la componentistica di contorno minale seriale al modulino per

102 Settembre 2015 ~ Elettronica In


dialogare con esso) e la necessità trasferimento dati dal modulo WLDGRWWHQHUHYHORFLW¡DIŎGDELOL
di due sole linee di dati per la verso l’Atmega. sopra i 57 kbaud.
comunicazione. Dopo svariati tentativi infrut-
A fronte di suddetti vantaggi, Riguardo a questo secondo pro- tuosi di realizzare una libreria
però, si hanno i seguenti proble- blema, immaginiamo di aprire Arduino che permettesse l’uso
mi: una pagina web contenente da GHOPRGXOR(63FRQLOŎUPZDUH
• velocità limitata; la porta qualche decina a qualche cen- standard, si è deciso di risolvere
seriale può viaggiare ad un tinaio di kilobyte di dati (cosa il problema a monte riscrivendo
massimo di 2-300 kbit/secon- usuale per una pagina web), che XQŎUPZDUHDGKRFFKHSHU-
do, nei casi migliori (velocità vengono inviati dal modulo al mettesse l’utilizzo della ben più
più elevate sono possibili ma Fishino, il quale dispone di soli veloce interfaccia SPI.
richiedono connessioni molto 2 kB di RAM, senza possibilità A fronte del lungo tempo di
corte ed una velocità notevole di comunicare al modulo stesso sviluppo software del medesimo
del controller connesso); di attendere l’elaborazione dei (la documentazione reperibile
• mancanza di handshake o dati; ecco, appare evidente cosa è decisamente scarsa) vantaggi
FRQWUROORGLŏXVVRGHLGDWLSXU accade se non si può controllare sono stati subito evidenti:
prevedendo alcuni moduli ESP il trasferimento dei dati. • velocità; il bus SPI può viag-
OLQHHGLFRQWUROORGLŏXVVR La porta seriale hardware dal giare a 8 MHz, con un clock
KDUGZDUHLOŎUPZDUHSUH- lato Fishino è necessaria per dell’Atmega di 16 MHz.
caricato non le utilizza, ed è ottenere velocità decenti. Con la Anche considerando che il
quindi impossibile bloccare un seriale software non siamo riusci- protocollo richiede dei dati di

verona 28/29 novembre 2015


53^ fiera dell’elettronica
dell’informatica e del radioamatore

Elettronica In ~ Settembre 2015 103


d’avvio al boot del modulo.
Quest’ultimo può infatti essere
Fig. 1 DYYLDWRGDŏDVKLQWHUQD IXQ-
zionamento normale, GPIO15
a 0 e GPIO0 a 1), da interfaccia
seriale, utilizzato per la ripro-
JUDPPD]LRQHGHOŎUPZDUH
(GPIO15 a 0, GPIO0 a 0) e
boot da scheda SD esterna
(non l’abbiamo mai utilizzato,
*3,2D*3,2LQLQŏXHQ-
te). A complicare le cose, il pin
GPIO15 è anche utilizzato per
selezionare il modulo nella
modalità SPI slave, con valore
attivo basso. Il modulo deve
controllo (cosa peraltro neces- software ha comunque ulteriori quindi partire con GPIO15 a
saria anche con l’interfaccia margini di ottimizzazione che 0 e, brevemente dopo l’avvio,
seriale) la velocità ottenibile è verranno sfruttati in seguito. questo dev’essere portato a 1
di almeno un ordine di gran- Futuri aggiornamenti del per liberare la porta SPI neces-
dezza superiore a quella della ŎUPZDUHDJJLXQJHUDQQRXOWHULR- saria anche, ad esempio, per la
porta seriale, ovvero circa 10 ri funzionalità, tra cui l’utilizzo scheda SD.
volte tanto; della porta seriale del modulino • GPIO12 (MISO),
ij FRQWUROORGLŏXVVRLOSURWRFRO- come seriale hardware aggiunti- GPIO13(MOSI) e
lo SPI è totalmente gestito dal va, la possibilità di programmare GPIO14(SCK), oltre ad essere
master (in questo caso l’Atme- l’Atmega direttamente via WiFi degli I/O generici, insieme al
ga). Il controller richiede i dati ed altri. suddetto GPIO15 sono utiliz-
quando è in grado di elaborarli Passiamo ora alla descrizione zati dall’interfaccia SPI.
e non è costretto a “rincorrere” dello schema elettrico della • GPIO16, I/O generico ma
il modulo WiFi; sezione WiFi, che contiene alcune utilizzato per il “risveglio”
• possibilità di spostare buo- particolarità degne di nota dovu- del modulo dalla funzione di
na parte dell’impegno sia te principalmente alle problema- deep sleep. Non lo utilizziamo
in termini di elaborazione tiche hardware del modulo ESP. come tale ma solo come pin
che di memoria necessari Come si nota dal simbolo sullo di handshake verso l’Atmel.
sull’ESP (basti pensare ai 32 K schema, il modulo contiene varie Su questo pin all’avvio del
di RAM disponibili contro i 2 connessioni denominate GPIO modulo sono presenti degli
dell’Atmega e gli 80/160 MHz (General Purpose Input Output) impulsi di “risveglio” da scar-
di clock contro i 16); utilizzabili per vari compiti a tare prima che acquisti la sua
• possibilità di incapsulare tutte seconda della programmazione IXQ]LRQDOLW¡GHŎQLWLYD
le funzionalità del modulo in e/o dello stato del modulo stesso. • GPIO2, GPIO4 e GPIO5 sono
una libreria dall’uso pratica- I pin sono infatti utilizzabili disponibili per l’uso come pins
mente identico alle varie WiFi/ come gli I/O digitali (e un input digitali, e saranno sfruttabili
ethernet standard. analogico) di Arduino, salvo che in una prossima versione
,OŎUPZDUHUHDOL]]DWRHOĬDQQHVVD quasi tutti hanno funzionalità GHOŎUPZDUHFRPHIRVVHUR
libreria Arduino permettono di aggiuntive, alcune delle quali estensioni dei pins digitali di
ottenere velocità di trasferimento utilizzate all’avvio dell’ ESP che Arduino.
dati (misurata da browser a SD QHUHQGRQRGLIŎFROWRVROĬXWLOL]]R • Rx e Tx costituiscono la porta
card) di 60÷70 kB/s, quindi leg- Di seguito una breve descrizione seriale hardware del modulo e
germente superiore alla velocità di tali pin. sono utilizzati anche in fase di
ottenibile con la scheda ethernet • GPIO0 e GPIO15 : oltre ad SURJUDPPD]LRQHGHOŎUPZD-
originale via cavo e decisamente essere utilizzabili come input/ re. Anche qui, una prossima
superiori (2÷4 volte tanto) rispet- output digitale, servono HVWHQVLRQHGHOŎUPZDUHQH
to allo shield WiFi originale; il per selezionare la modalità permetterà l’uso come porta

104 Settembre 2015 ~ Elettronica In


seriale aggiuntiva che consen- • PIN 1-2: chiudendoli, il modu- corrisponde anche al GPIO0,
tirà a Fishino di raddoppiare la lo ESP viene disattivato com- utilizzabile come linea di I/O
sua connettività seriale. pletamente (utile nel caso non digitale.
• CH_PD è il pin di abilitazio- sia necessario oppure si voglia • PIN 11-12: chiudendoli con un
ne del modulo. Portandolo a montare uno shield che va in jumper si abilita la riprogram-
livello alto il modulo risulta FRQŏLWWRFRQJOL,2XWLOL]]DWL  mazione dell’Atmega tramite
abilitato (default), mentre un È anche possibile connettere il WiFi. Al momento non è stato
livello basso mette in stand-by pin 2 ad un’uscita digitale di LPSOHPHQWDWRLOŎUPZDUH
l’ESP riducendone i consumi Fishino e controllare così via necessario, ma sarà fatto nelle
praticamente a zero. software se e quando accende- future versioni scaricabili
• RESET è il reset hardware re il modulo WiFi. dal nostro sito web. Il PIN12
dell’ESP, attivo a livello basso • PIN 3: RESET. Un livello corrisponde anche al GPIO2,
• ADC è l’ingresso analogico zero su questo pin provoca il utilizzabile anche come linea
dell’ESP, diretto verso un con- reset sia del modulo WiFi che di I/O digitale.
vertitore A/D da 10 bit (1024 dell’Atmega 328.
valori possibili). • PIN 4: ADC. Input del conver- Circuiteria di RESET
titore A/D a 10 bit dell’ESP. La sezione del RESET risulta più
Volendo utilizzare questi pin • PIN 5 e 6: ESP-RX ed ESP-TX, complicata rispetto a quella di
bisogna ricordare che non gli rispettivamente (interfaccia Arduino originale per i seguenti
vanno applicati più di 3,3 V per- seriale hardware del modulo motivi:
ché non sono 5V-tolerant. WiFi). Utilizzati anche per • occorre resettare sia l’Atmega
Dello schema elettrico notiamo ULSURJUDPPDUHLOŎUPZDUH che l’ESP alla pressione del
alcuni particolari, come il diodo • PIN 7-8: GPIO5 e GPIO4. tasto di reset, all’avvio e alla
D5, che serve quando Fishino Utilizzabili come pin di I/O richiesta di programmazione
(e quindi anche il modulo ESP, digitale. da parte dell’ IDE;
vedere di seguito la circuiteria di • PIN 9-10: chiudendoli con un • per poter eseguire la program-
RESET) viene resettato, a portare jumper e premendo RESET, mazione dell’Atmega tramite
a livello 0 il pin GPIO15 forzando il modulo entra in modalità WiFi, il modulo ESP dev’esse-
quindi l’avvio dalla Flash interna; ŏDVKSHUOĬDJJLRUQDPHQWR re in grado di resettare l’Atme-
senza questo accorgimento un GHOŎUPZDUH YHGUHPRL ga stesso senza a sua volta
valore casuale alto sul GPIO15 dettagli più avanti). Il PIN 10 auto-resettarsi.
impedirebbe l’avvio del modulo.
La resistenza R23 a massa sul
GPIO16 serve ad indicare che il
modulo è impegnato nell’avvio
(e quindi il GPIO16 non è ancora
stato impostato come handsha-
ke); la libreria sfrutta questo
segnale per rilevare se il modulo
è pronto ad operare dopo il boot.
Notate che sono state utilizzate le
stesse linee digitali dell’Atmega
sfruttate dagli shield WiFi ed
ethernet, garantendo quindi la
totale compatibilità con eventuali
shield aggiuntivi.

Connettore ESP
Su questo connettore vengono ri-
portati alcuni GPIO liberi del mo-
dulo ESP (per l’uso come porte)
ed è presente lo spazio per alcuni Fig. 2
SRQWLFHOOLGLFRQŎJXUD]LRQH

Elettronica In ~ Settembre 2015 105


Listato 1
///////////////////////////////////////////////////////////////////////////
// CONFIGURATION DATA -- ADAPT TO YOUR NETWORK !!! DOPHQRSHU:LQGRZVŎQRDOOD
// DATI DI CONFIGURAZIONE -- ADATTARE ALLA PROPRIA RETE WiFi !!!
versione 7 (si scaricano dal sito
// here pur SSID of your network
// inserire qui lo SSID della rete WiFi ZZZŎVKLQRLW o ZZZŎVKLQRFRP,
GH¿QH66,' ³´ nella sezione Download); pare
KHUHSXW3$66:25'RI\RXUQHWZRUN8VH³´LIQRQH che dalla 8 in poi i driver siano
// LQVHULUHTXLOD3$66:25'GHOODUHWH:L)L8VDUH³´VHODUHWHQRQqSURWHWWD
GH¿QH3$66 ³´ inclusi. Per l’ambiente Linux, per
// here put required IP address of your Fishino contro, i driver non sono necessa-
// comment out this line if you want AUTO IP (dhcp)
127(LI\RXXVHDXWR,3\RXPXVW¿QGLWVRPHKRZ
ri, essendo già presenti nel kernel.
LQVHULUHTXLO¶,3GHVLGHUDWRSHULO¿VKLQR
// commentare la linea sotto se si vuole l’IP automatico
// nota : se si utilizza l’IP automatico, occorre un metodo per trovarlo ! AGGIORNAMENTO FIRMWARE
GH¿QH,3$''5  DEL MODULO WIFI
// NOTE : for prototype green version owners, set SD_CS to 3 !!! Fishino viene fornito con la ver-
// NOTA : per i possessori del prototipo verde di Fishino, impostare SD_CS a 3 !!!
const int SD_CS = 4; VLRQHGHOŎUPZDUHGLVSRQLELOH
// END OF CONFIGURATION DATA al momento dell’assemblaggio.
// FINE DATI DI CONFIGURAZIONE
///////////////////////////////////////////////////////////////////////////
Essendo in fase di continuo
sviluppo, conviene aggiornare
SHULRGLFDPHQWHLOŎUPZDUH/H
librerie di Arduino disponibili
Iniziamo dal segnale DTR che giunge attraverso D3 la linea di sono infatti aggiornate continua-
esce dall’interfaccia USB/Seriale reset dell’Atmega ma, a causa di mente in base alle nuove possibi-
(U2, CH340G): esso, come antici- D6, non può propagarsi all’ESP OLW¡RIIHUWHGDOŎUPZDUH
pato, viene posto a livello basso stesso. Tramite questo sistema La procedura di aggiornamento
quando la porta seriale viene abbiamo quindi dato la possibili- ©VHPSOLŎFDWDGDXQSURJUDPPD
aperta. Attraverso il condensa- tà al modulo WiFi di controllare apposito, disponibile sia per
tore C6 (scelto da 1 μF ceramico, la linea di reset dell’Atmega che, Windows che per Linux, che
contro i 100 nF dell’originale, unitamente all’interfaccia SPI, ne esegue l’operazione in modo
per allungare l’impulso di reset) permette la riprogrammazione completamente automatico e a
viene generato un breve impulso senza nemmeno la necessità di prova di errore. I passi per l’ag-
che, passato attraverso il jumper un bootloader precaricato. giornamento sono i seguenti.
SMD SJ1 (tagliando il quale è In pratica, una volta completato 1. Caricare uno sketch che non
possibile disattivare l’auto-reset), ORVYLOXSSRQHOŎUPZDUHVDU¡ utilizzi la porta seriale, come
raggiunge la linea di “reset possibile non solo riprogramma- ad esempio BLINK (quello
esterno”, alla quale sono connessi re via WiFi l’Atmega ma farlo che fa lampeggiare il LED
anche il pulsante di reset ed il utilizzando anche lo spazio nor- sulla scheda); ciò serve ad
pin 5 sul connettore di program- malmente riservato al bootloader. evitare interferenze tra lo
mazione (ICSP). A differenza del sketch caricato ed il collega-
circuito originale, nel Fishino è Modulo RTC mento seriale tramite l’Atme-
presente un diodo (D6) tra la li- Concludiamo lo schema elettrico ga e l’ESP. Se il programma di
nea di RESET ed il pin dell’Atme- con il modulo RTC (Real Time Flash non rileva il Fishino, al
ga. Lo scopo di questo diodo (e Clock), costituito da un classico 99% il problema è che avete
del diodo D3 che vedremo in DS1307 della Maxim, un quarzo caricato uno sketch sbagliato.
seguito) è di poter resettare solo a 32 kHz, una batteria di backup 2. Connettere il TX di Fishino
l’Atmega senza peraltro veicolare ed un paio di resistenze sulla con la porta ESP-TX sul con-
il segnale anche all’ESP. linea I²C. Lo schema è quanto nettore ESP, e l’RX di Fishino
Premendo il pulsante RESET, o di più classico esista ed è com- con la porta ESP-RX sul con-
connettendo la seriale, l’impulso pletamente compatibile con le nettore ESP (vedere Fig. 1).
di reset raggiunge sia l’Atmega librerie di Arduino esistenti; tutte 3. Connettere GPIO0 a massa
(attraverso D6) che l’ESP (diretta- le funzioni sono gestite tramite tramite un cavetto o un pon-
mente), resettandoli entrambi. linea I²C (SDA/SCL). ticello sempre sul connettore
Un segnale sulla linea ATRES- ESP (Fig. 1). Collegare Fishi-
ESP, generato dall’ ESP (nel caso Driver USB no al PC (o premere il pulsan-
si sia abilitata la riprogramma- Per il converter USB/seriale te di RESET se già connesso);
zione attraverso il WiFi) rag- )LVKLQRULFKLHGHGULYHUVSHFLŎFL 4. Lanciare il programma Fishi-

106 Settembre 2015 ~ Elettronica In


Fig. 3 - Schermata della demo.

noFlasher, assicurandosi che


il PC sia connesso ad Internet.

Se i collegamenti sono stati


eseguiti correttamente, il pro-
gramma rileverà la porta a cui
è connesso Fishino, determine-
rà il modello e la versione del
ŎUPZDUHDWWXDOPHQWHLQVWDOOD-
ta, si collegherà ad un server
remoto e scaricherà la lista dei
ŎUPZDUHGLVSRQLELOLPRVWUDQGR
l’ultimo e permettendo comun-
que la selezione delle versioni
precedenti nel caso si voglia fare
un downgrade, come in Fig. 2.
Premendo il pulsante “Flash”
verrà avviata la procedura di
DJJLRUQDPHQWRDOODŎQHGHOOD
quale apparirà un messaggio comunque reperibile in rete, ma
di conferma. Per terminare il l’abbiamo allegata per comodità
programma occorre premere il d’uso. Le rimanenti librerie ne-
pulsante “Esci”. cessarie sono già disponibili nei
Nel caso Fishino non venga rile- vari download dell’IDE di Ardu-
vato automaticamente, è possibi- di Arduino), e le rispettive classi ino; sono in particolare necessa-
le provare a selezionare la porta FishinoClient (l’analogo della rie la SD (per la gestione delle
manualmente. È comunque pro- EthernetClient e WiFiClient) e schede MicroSD) e la RTClib
babile che siano stati commessi FishinoServer (EthernetServer e per la gestione del modulo RTC
degli errori nei collegamenti. WiFiServer). con il DS1307, ed altre librerie di
La selezione manuale risulta in- Queste classi sono utilizzate in sistema. Le librerie sono in con-
dispensabile nel raro caso in cui modo pressochè identico alle tinuo sviluppo e presto verranno
più di un Fishino sia connesso originali, quindi negli sketch corredate di funzionalità aggiun-
contemporaneamente al PC, nel esistenti che utilizzano l’Ethernet tive, in particolar modo per la
qual caso il primo viene rilevato o il WiFi basta cambiare il tipo gestione dei PIN di I/O e della
automaticamente ma resta la delle varie variabili per ottener- porta seriale aggiuntiva disponi-
possibilità di sceglierne un altro. ne il funzionamento con il WiFi bili sul modulo WiFi ed altro.
Una volta terminata la procedura di Fishino. Le uniche (leggere)
©VXIŎFLHQWHHOLPLQDUHLWUHFRO- differenze sono sull’inizializza- DEMO HOME AUTO
legamenti e Fishino sarà pronto zione, essendo il modulo WiFi di Per concludere questo articolo
SHUOĬXVRFRQLOQXRYRŎUPZDUH Fishino dotato di caratteristiche presentiamo la demo FishinoHo-
aggiuntive rispetto al WiFi origi- meAuto che mostra alcune delle
LIBRERIE DISPONIBILI nale. La libreria FishinoWebSer- caratteristiche più interessanti di
Attualmente sono disponibili ver è il porting su Fishino della Fishino all’opera. Si tratta di un
due librerie per la gestione del nota TinyWebServer; consente la piccolo server web che consente
Fishino: la )LVKLQRe la)LVKLQR creazione di un completo server tramite browser la gestione dei
WebServer. web sulla scheda. pin di I/O digitali sulla board.
La libreria Fishino è l’esatto equi- È stata inoltre inserita la libreria Ci limiteremo a descriverne bre-
valente della libreria Ethernet o Flash nel pacchetto di downlo- vemente il funzionamento e l’u-
WiFi di Arduino. ad visto che è utilizzata dalla WLOL]]RDIŎQFKªSRVVLDWHSURYDUQH
In questa libreria vengono FishinoWebServer per spostare la funzionalità immediatamente.
GHŎQLWHOHFODVVL)LVKLQR&ODVV le costanti nella memoria Flash Premettiamo che la demo non
(gestione a basso livello, analoga liberando così la poca RAM a vuol essere un applicativo com-
alla EthernetClass o WiFiClass disposizione. Questa libreria è pleto di home automation ma la

Elettronica In ~ Settembre 2015 107


zi l’IP impostato nello sketch.
Se avrete optato per l’IP di-
namico le cose si complicano,
visto che occorre determinare
quale IP è stato assegnato a
Fishino. Suggeriamo l’impo-
stazione di un IP statico per le
prime prove.

6HWXWWR©DQGDWRDEXRQŎQHVXO
browser verrà visualizzata la
pagina con la Fig. 3. La pagina è
WRWDOPHQWHFRQŎJXUDELOHWUDPLWH
LŎOHSUHVHQWLQHOODFDUWHOOD67$-
TIC e poi copiati sulla SD card.
Cliccando su una delle lampa-
dine spente (nere) l’immagine
cambierà in una lampadina
Fig. 4 accesa (gialla) e contemporane-
amente l’eventuale led connesso
al Fishino si illuminerà. Cliccan-
re anche una SD prelevata, per do nuovamente sulla lampadina
esempio, da un telefonino. accesa, questa tornerà nera ed il
Adesso lanciate l’IDE ed aprite LED si spegnerà (Fig. 4).
base per scriverne uno; in parti- lo sketch FishinoHomeAuto. Pur essendo una demo, il
colare, sono gestiti solo output All’inizio di questo è presente SURJUDPPD©VXIŎFLHQWHPHQWH
digitali (rappresentati dalle lam- XQDSDUWHGLFRQŎJXUD]LRQHGD FRQŎJXUDELOH©SRVVLELOHSHU
SDGLQHDOOHŎJXUHVHJXHQWL ,O PRGLŎFDUHSHUDGDWWDUODDOOD esempio cambiare l’immagine
software è stato comunque pen- propria rete WiFi (Listato 1). della “casa”, la posizione e le im-
sato con l’estensibilità in mente, /HJJHUHLFRPPHQWLHPRGLŎFDUH magini delle lampadine, eccetera.
quindi successivamente verran- le impostazioni come indicato. Stiamo preparando una versione
no implementate le funzioni di Salvare lo sketch e caricarlo sul che preveda la lettura/scrittura
input e quelle analogiche. Fishino. di valori analogici, per esempio
Per prima cosa dovete decompri- A questo punto: di temperatura o per regolare un
PHUHLOŎOH)LVKLQR/LEV]LS nella ij LQVHULUHOD0LFUR6'QHOŎVKL- termostato. J
cartella “libraries”. Una volta no;
eseguito avrete tre nuove libre- • se si desidera vedere cosa suc-
rie: Fishino, FishinoWebServer e cede, aprire il monitor seriale
)ODVK2UDGHFRPSULPHWHLOŎOH sull’ IDE;
FishinoHomeAuto nella cartella • volendo vedere i LED accen- per il MATERIALE
“sketches”: apparirà una cartella dersi e spegnersi seguendo
chiamata FishinoHomeAuto i comandi da web, collegare
HGHQWURTXHVWDDOFXQLŎOHHOD uno o più LED (con le relative viene fornita montata e collaudata.
sottocartella STATIC. Copiate resistenze in serie) ai pin di Può essere acquistata presso Fu-
tutto il contenuto della cartella Fishino 2, 5, 6, 8, 9, 14 e 15 tura Elettronica al prezzo di Euro
STATIC (non la cartella, ma solo (queste sono le uscite digitali 36,00. Il prezzo si intende IVA com-
LŎOHVLQHVVDFRQWHQXWL QHOOD previste dalla demo, ognuna presa.
directory radice di una scheda delle quali è associata ad una
MicroSD. Non occorre cancellare “stanza” nell’immagine che Il materiale va richiesto a:
quel che c’è dentro; basta copia- apparirà sul browser); Futura Elettronica, Via Adige 11,
UHLŎOHQHOODFDUWHOODSULQFLSDOH • premere il pulsante RESET; 21013 Gallarate (VA)
Lo sketch non altera i dati nella • dal PC lanciare il browser e in- Tel: 0331-799775 • Fax: 0331-792287
scheda, quindi potrete utilizza- serire nella barra degli indiriz- http://www.futurashop.it

108 Settembre 2015 ~ Elettronica In


Arduino
Continuamo la presentazione della board Fishino,
mostrando le principali funzioni delle librerie
e degli
g esempi
p d’uso. Seconda ppuntata.

FISHINO,
L’ARDUINO DIVENTA
WIRELESS
di MASSIMO DEL FEDELE

el numero scorso abbia- LE LIBRERIE Le librerie fornite e liberamente


N mo presentato la scheda
Fishino UNO, una board compa-
Per poter sfruttare tutte le carat-
teristiche di Fishino occorre ov-
scaricabili dal sito sono:
• Libreria ‘Fishino’
tibile con la diffusissima Arduino viamente disporre di una serie di • Libreria ‘FishinoWebServer’
UNO dotata però di connettività librerie software che ne gestisca- • Libreria ‘Flash’
WiFi, slot per microSD ed RTC no tutti i componenti aggiuntivi.
incorporati. Se per la scheda SD card e il Real quest’ultima libreria, che abbia-
In questo secondo articolo inizia- Time Clock (RTC) esistono già mo inserito per comodità nel
mo la descrizione delle librerie nella suite di Arduino le corri- download pur essendo reperibile
software disponibili, mostrando spondenti librerie, questo non in rete, è necessaria per il funzio-
le principali funzioni con alcuni vale per il modulo WiFi ESP12, namento delle due precedenti.
semplici esempi d’uso. per il quale ne abbiamo sviluppa-
&RPHDQWLFLSDWRVLDLOŎUPZD- te di apposite. LIBRERIA ‘FISHINO’
re della scheda che le librerie Inizieremo quindi da queste Partiamo con la descrizione della
software sono in continua fase di ultime, fornendo comunque libreria (che potete scaricare dal
sviluppo, quindi consigliamo di successivamente anche qualche sito della rivista www.elettronicain.
eseguire spesso l’aggiornamento dettaglio su quelle già disponibili it) che contiene tutta la gestione a
di entrambi. nell’IDE. basso e medio livello del modulo

Elettronica In ~ Ottobre 2015 33


WiFi di Fishino.
4XHVWDGHŎQLVFHFODVVL
• FishinoClass e la relativa variabile globale Fishi-
no
• FishinoClient
• FishinoServer

Il progetto è in continua evoluzione e ben supporta-


to da una comunità molto attiva anche su FaceBook
(KWWSVZZZIDFHERRNFRPJURXSVŎVKLQR); anche gra-
zie a questa in seguito verranno aggiunte la Fishi-
noUdp, FishinoAnalog, FishinoDigital e Fishino- retta inizializzazio-
Serial per gestire rispettivamente le comunicazioni ne nella Setup. A parte
internet tramite socket Udp, l’ingresso analogico, la solita inizializzazione
gli I/O digitali e la porta seriale hardware aggiunti- della porta seriale (da fare ad
va presenti sul modulo WiFi. inizio setup), si notano:
Iniziamo la descrizione della classe FishinoClass • l’inizializzazione dell’interfaccia SPI
(istanza singola nella variabile globale Fishino), con • il Fishino.reset() dell’inizializzazione del modulo
degli esempi pratici di utilizzo delle varie funzioni.
Con bool Fishino.reset() si inizializza il modulo La prima è stata lasciata volutamente manuale per
WiFi inviandogli un reset software. Obbligatorio poter cambiare la velocità di comunicazione, nel
ad inizio sketch per garantire un avvio corretto del caso siano presenti altri shields che utilizzano la
modulo. Ritorna TRUE se il modulo è stato corretta- stessa interfaccia. In questo caso si è impostata la
mente inizializzato, FALSE altrimenti. massima velocità disponibile.
La funzione di reset esegue inoltre un controllo La sezione contenente la chiamata Fishino.reset()
VXOODYHUVLRQHGHOŎUPZDUHLQVWDOODWD,QFDVRGL inizializza il modulo e visualizza un messaggio di
versione troppo datata viene inviato un messaggio corretta inizializzazione sulla seriale o, in caso di
di errore alla porta seriale ed il programma viene problemi, visualizza l’errore e blocca lo sketch.
bloccato. Nel Listato 1 vediamo un esempio di cor- Attenzione, il modulo WiFi NON parte senza que-

Listato 1 Listato 2
void setup()
{ ...<parte precedente dello sketch>...
// apre la porta seriale e ne attende l’apertura
// consigliabile da eseguire come primo comando per poter visualizzare Fishino.setMode(STATION_MODE);
// eventuali messaggi di errore sul monitor seriale
Serial.begin(115200); ...<resto dello sketch>...

// attende l’apertura della porta seriale.


// Necessario solo per le boards Leonardo
while (!Serial)
;

// inizializza il modulo SPI


SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV2); Listato 3
// resetta e testa il modulo WiFi
if(Fishino.reset()) ...<parte precedente dello sketch>...
Serial.println(“Fishino WiFi RESET OK”); while(true)
else {
{ if(Fishino.begin(“MIO_SSID”,“MIA_PASSWORD”)) {
Serial.println(“Fishino RESET FAILED”); Serial.println(“Connected to MIO_SSID”);
break;
// attende per sempre }
while(true) else {
; Serial.println(“Failed connecting to MIO_SSID”);
} Serial.println(“Retrying.....”);
}
Serial.println(“Fishino WiFi web server”); }
...<resto dello sketch>...
.....<resto dello sketch>...

34 Ottobre 2015 ~ Elettronica In


Listato 4
uint32_t connecTime;
sto comando. void setup()
{
Le funzioni bool Fishino.setMode(uint8_t mode) .....<parte precedente dello sketch>....
connectTime = millis();
e uint8_t Fishino.getMode(void) impostano (o }
leggono) la modalità di funzionamento del modulo
void loop()
(Listato 2), che può essere una delle seguenti: {
// controlla la connessione ogni 10 secondi
• STATION_MODE if(millis() - connectTime > 10000) {
modalità stazione. Richiede la presenza di un // resetta il tempo
router WiFi a cui connettersi. È la modalità nor- connectTime = millis();
male. // controlla se connesso
uint8_t stat = Fishino.status();
• SOFTAP_MODE
Permette la creazione di un access point a cui // se non connesso, tenta la riconnessione
if(stat != STATION_GOT_IP) {
connettersi. Utile in mancanza di un’infrastruttu- if(Fishino.begin(“MIO_SSID”, “MIA_PASSWORD”))
stat = STATION_GOT_IP;
ra di rete esistente. }
• STATIONAP_MODE // se connesso, salva i dati sul server
Modalità doppia, il modulo funziona sia da if(stat == STATION_GOT_IP) {
  VDOYD'DWL6XO6HUYHU IXQ]LRQHGDGH¿QLUH
stazione, collegandosi ad un router esistente, che }
da access point. // qui legge i sensori e li memorizza sulla SD
 OHJJL6HQVRUL(0HPRUL]]D IXQ]LRQHGDGH¿QLUH
}
Per eseguire la connessione all’access point/router
si utilizza bool Fishino.begin(SSID, PASSWORD),
dove al posto di SSID va inserito il punto di accesso
e al posto di PASSWORD la chiave per accedervi Listato 5
(quest’ultima può essere una stringa g vuota se non è )LVKLQRFRQ¿J ,3$GGUHVV  
)LV
VKLQ
KLQRF
R RQ¿
Q¿J ,
J ,
,3$GGUH
UHVV
VV
V 
  
 
 
 
 

richiesta).
Per controllare se la board
rdd Fishino
Fish
Fi s inoo è correttamente
corrrettta
co tame
m ntte
me
connessa il comando è uin8_t
uin8_
i _t F Fishino.status().
ishi
is hino.statatus(s()). La
funzione ritorna TRUE se laa connessione
c nn
connesessi ne ha avuto
sion avu uto
successo, FALSE altrimenti.
entii. Nello
en Nell
Ne o spezzone
llo spezzo
sp zoone didi codi-
coodi
d-
ce presente nel Listato 3 viene
ienee tentata
vie tennta ta la
tata la connessio-
con
co nnesessisio
sio-

CARATTERISTICHE
CHE
TECNICHE
J Alimentazione: 12 Vcc
c o USUSB B
J Completamente compatibile
pattiib
bile
ile co
con
n
Arduino Uno
J Scheda WiFi a bordo, con possibi-
lità di funzionamento in modalità
stazione, access pointt o entrambe
contemporaneamente e
J Interfaccia per schede e di memoria ne in un
MicroSD a bordo
FLFORLQŎQLWR
J RTC (Real Time Clock) a bordo con
enimento
batteria al litio di mantenimento ŎQFK©QRQKDHVLWR
J Sezione di alimentazione one a 3,3 V positivo.
potenziata Questo tipo di connessione (eseguita nella Setup)
J Connettore aggiuntivo o sfalsato ©DGDWWRDGXQDSRVWD]LRQHŎVVDRYYLDPHQWH1HO
in modo da risolvere il problema caso si utilizzi il Fishino in mobilità, è consigliabile
dell’incompatibilità di Arduino con spostare la connessione nel loop() e tentarla ogni
le schede millefori. tanto mentre si fanno altre attività.
In questo modo è possibile, ad esempio, raccogliere

Elettronica In ~ Ottobre 2015 35


Listato 6
Serial.print(“Il mio IP è : “);
Serial.println(Fishino.localIP()); Qui di seguito, invece, alcune funzioni utilizza-
te per controllare i parametri della connessione,
in particolare per leggere il MAC del modu-
dei dati da un sensore, memorizzarli sulla scheda lo WiFi la funzione è const uint8_t* Fishino.
SD e, quando viene rilevata una connessione fun- macAddress(void)
zionante, inviarli ad un computer remoto (Listato Mentre per la lettura dell’IP acquisito dal modulo
4). In questo esempio (volutamente abbreviato), nel- WiFi (utile nel caso si sia impostato un IP dinami-
la setup() viene letto il tempo corrente e salvato nella co) il comando da richiamare è IPAddress Fishino.
variabile connectTime; successivamente nel loop() localIP() come mostrato ad esempio nel Listato 6.
viene controllato il tempo passato (millis() - connect- Per leggere la maschera della sottorete e dell’in-
Time) e quando questo supera i 10 secondi viene dirizzo IP del gateway potete richiamare queste
eseguito un test sulla connessione; se non connesso funzioni:
si tenta la connessione al server e, in caso di suc- IPAddress Fishino.subnetMask()
FHVVRYLHQHHVHJXLWDXQDIXQ]LRQH GDGHŎQLUH FKH IPAddress Fishino.gatewayIP()
salva in rete i dati letti in precedenza. Le funzioni indicate sopra sono state nominate in
Il loop continua successivamente tramite un’altra modo assolutamente simile a quelle delle analoghe
IXQ]LRQH DQFKĬHVVDGDGHŎQLUH FKHOHJJHTXDOFKH funzioni delle librerie Ethernet e WiFi di Arduino,
sensore e memorizza i dati localmente, ad esempio
su una scheda SD.
Con uno sketch simile è possibile quindi realiz- Listato 8
zare un semplice datalogger che non solo legge e Serial.print(“Sono connesso a : “);
memorizza su scheda SD i dati ma che, in presenza Serial.println(Fishino.SSID());
di una connessione di rete, è in grado di salvarli in
modo totalmente automatico ad intervalli di tempo
SUHGHŎQLWL SHUSRWHUVHPSOLŎFDUHLOSRUWLQJGHOFRGLFHHVLVWHQWH
3HUFRQŎJXUDUHXQ,3VWDWLFRHGHYHQWXDOPHQWHL Tuttavia le potenzialità superiori di Fishino, ed in
servers DNS, il gateway e la subnet della rete locale particolar modo la possibilità di funzionare anche
si utilizzano queste funzioni: in modalità Access Point senza bisogno di un’infra-
ERRO)LVKLQRFRQŎJ ,3$GGUHVVORFDOBLS struttura esistente, hanno reso necessario studiare
ERRO)LVKLQRFRQŎJ ,3$GGUHVVORFDOBLS,3$GGUHVV nuove funzioni per quanto riguarda la modalità
dns_server) Stazione tra cui:
ERRO)LVKLQRFRQŎJ ,3$GGUHVVORFDOBLS,3$GGUHVV bool Fishino.setStaIP(IPAddress ip)
dns_server, IPAddress gateway) bool Fishino.setStaMAC(uint8_t const *mac)
ERRO)LVKLQRFRQŎJ ,3$GGUHVVORFDOBLS,3$G- bool Fishino.setStaGateway(IPAddress gw)
dress dns_server, IPAddress gateway, IPAddress bool Fishino.setStaNetMask(IPAddress nm)
subnet) Mentre per la modalità Access Point sono state
In pratica, la prima è adoperata per impostare un IP create:
statico, se necessario. bool Fishino.setApIP(IPAddress ip)
Nel Listato 5 vediamo come è possibile impostare bool Fishino.setApMAC(uint8_t const *mac)
un IP statico su 192.168.1.251 bool Fishino.setApGateway(IPAddress gw)
Se non utilizzata l’IP sarà richiesto dinamicamente bool Fishino.setApNetMask(IPAddress nm)
al router. bool Fishino.setApIPInfo(IPAddress ip, IPAd-
E’ ovviamente possibile anche disconnettersi dalla dress gateway, IPAddress netmask)
rete WiFi. Il comando per eseguire questa operazio- In particolare, l’ultima permette di impostare tutti
ne è bool Fishino.disconnect(void). i parametri IP del Fishino utilizzato come router

Listato 7
Fishino.setApIPInfo(
  ,3$GGUHVV    ,3GHO)LVKLQR
  ,3$GGUHVV    *DWHZD\GHO)LVKLQRVROLWDPHQWHFRPHO¶,3
IPAddress(255, 255, 255, 0) // Netmask (maschera di sottorete) del Fishino

);

36 Ottobre 2015 ~ Elettronica In


Listato 9
uint8_t n = Fishino.scanNetworks();
if(n) { workItem) ritorna invece lo SSID, ovvero il nome
Serial.print(“Trovate “);
Serial.print(n); della rete richiesta come mostrato nel Listato 9.
  6HULDOSULQWOQ ³UHWLZL¿´ 
for(int i = 0; i < n; i++) {
Questo esempio stampa sulla seriale un’elenco delle
Serial.print(“Rete #”); reti wireless trovate.
Serial.print(i);
Serial.print(“ : “); Per sapere il tipo di protezione della rete il coman-
Serial.println(Fishino.SSID(i));
} do da usare è uint8_t Fishino.encryptionType(uint8_t
}
else
networkItem).
Serial.println(“Nessuna rete WiFi trovata”); E’ possibile anche sapere la potenza del segnale del-
la rete richiesta con int32_t Fishino.RSSI(uint8_t
networkItem).
WiFi in un comando singolo (Listato 7). Nella classe FishinoClass sono presenti altre fun-
9HGUHPRFRPHXVDUOHDŎQHDUWLFRORFRQXQHVHPSLR zioni meno utilizzate che tralasciamo per brevità.
completo. Per poter leggere i dati della connessione Il codice della libreria è comunque ben commentato
WiFi, quali lo SSID del router a cui ci si è connessi, e di facile interpretazione.
il MAC del medesimo (BSSID), la potenza in dBm
del segnale (RSSI) ed il tipo di protezione della rete, CLASSI FISHINOCLIENT E FISHINOSERVER
potete utilizzare queste funzioni: Queste due classi sono l’equivalente delle Ether-
const char* Fishino.SSID() netClient/WiFiClient ed EthernetServer/WiFiSer-
const uint8_t* Fishino.BSSID() ver delle shield ethernet e WiFi di Arduino, e l’uso
int32_t Fishino.RSSI() è praticamente identico.
uint8_t Fishino.encryptionType() Ad esempio, per inviare una richiesta ad una pagina
Come mostrato ad esempio nel Listato 8. web e stampare sulla seriale la risposta vediamo il
Esistono poi alcune funzioni utilizzate per esegui- Listato 10.
re una lista delle reti WiFi disponibili con le loro
caratteristiche:
Dettaglio del modulo WiFi
uint8_t Fishino.scanNetworks() ESP12 appositamente
Questa operazione esegue una scansione delle reti programmato per poter
WiFi disponibili e ritorna il numero di reti trovate. lavorare con Fishino.
Una volta eseguita la scanNetworks, è possibile
utilizzare le seguenti funzioni, che hanno come pa-
rametro il numero della rete da esaminare (numero
di reti ritornate da scanNetworks() - 1).
La funzione const char* Fishino.SSID(uint8_t net-

Listato 10
// tenta la connessione al server
FishinoClient client;
if (client.connect(“www.google.com”, 80)) {

Serial.println(“connected to server”);

// esegue un request Http


client.println(“GET /search?q=arduino HTTP/1.1”);
client.println(“Host: www.google.com”);
client.println(“Connection: close”);
client.println();

 OHJJHODULVSRVWD¿QFKqLOFOLHQWUHVWDFRQQHVVR
do {
  ¿QFKqFLVRQRE\WHVLQDUULYR
while (client.available()) {

// legge un carattere dal server


char c = client.read();

// .... e lo invia alla seriale


Serial.write(c);
}
}
while(client.connected());
Serial.println(“Client disconnected”);
}
}

Elettronica In ~ Ottobre 2015 37


Listato 11
#include <Flash.h> // imposta la modalitè SOFT AP (crea una rete autonoma)
#include <FishinoUdp.h> Fishino.setMode(SOFTAP_MODE);
#include <FishinoSockBuf.h>
#include <Fishino.h> // ferma il server DHCP, necessario per impostare l’IP della rete
#include <SPI.h> Fishino.softApStopDHCPServer();

//////////////////////////////////////////////////////////////////// // imposta i parametri IP dell’access point


// CONFIGURAZIONE SKETCH -- ADATTARE ALLA PROPRIA RETE WiFi //  LQTXHVWRFDVRODUHWHYLHQHFUHDWDVX
// WiFi SSID e PASSWORD  HGLO)LVKLQRDVVXPHO¶,3
// potete cambiarle entrambe, verranno utilizzate Fishino.setApIPInfo(
// per la creazione dell’infrastruttura WiFi   ,3$GGUHVV    ,3
GH¿QH0\B66,' ³),6+,12´   ,3$GGUHVV    JDWHZD\
GH¿QH0\B3$66 ³´ IPAddress(255, 255, 255, 0) // netmask
// FINE CONFIGURAZIONE // );
////////////////////////////////////////////////////////////////////

// crea un server in ascolto sulla porta 80 (HTTP standard) // imposta i parametri di connessione WiFi, ovvero nome della rete(SSID)
FishinoServer server(80); // HSDVVZRUG6HQRQDYHWHPRGL¿FDWRO¶HVHPSLRODUHWHVDUjFKLDPDWD),6+,12
 HVDUjXQDUHWHDSHUWDVHQ]DSDVVZRUG
void setup()  )LVKLQRVRIW$S&RQ¿J 0\B66,'0\B3$66IDOVH 
{
// apre la porta seriale // riavvia il server DHCP in modo da poter fornire gli indirizzi
Serial.begin(115200); // in automatico a tutte le stazioni che si connettono
Fishino.softApStartDHCPServer();
// attende l’apertura della porta seriale.
// Necessario solo per le boards Leonardo // inizia l’attesa delle connessioni
while (!Serial) server.begin();
; }

// inizializza il modulo SPI void loop()


SPI.begin(); {
SPI.setClockDivider(SPI_CLOCK_DIV2); // attende nuovi clienti
FishinoClient client = server.available();
// resetta e testa il modulo WiFi
if(Fishino.reset()) if (client)
Serial << F(“Fishino WiFi RESET OK\r\n”); {
else Serial.println(“new client”);
{
Serial << F(“Fishino RESET FAILED\r\n”); // ogni richiesta http termina con una linea vuota
boolean currentLineIsBlank = true;
// attende per sempre in caso di errore while (client.connected())
while(true) {
; if (client.available())
} {
char c = client.read();
Serial << F(“Fishino WiFi AP web server\r\n”); Serial.write(c);

A conclusione dell’articolo, presentiamo un esem- bisogno di un router esterno, alla quale connettersi
pio completo che mostra una delle caratteristiche in mobilità, per esempio con un cellulare.
più interessanti di Fishino, ovvero la possibiltà Un’applicazione simile potrebbe essere usata, ad
di creare una propria infrastruttura di rete senza esempio, per monitorare alcuni sensori all’aperto

Fig. 1 Fig. 2

38 Ottobre 2015 ~ Elettronica In


   VHVLqDUULYDWLD¿QHOLQHD FDUDWWHUHµQHZOLQH¶ULFHYXWR
// e la linea è vuota, la richiesa http è terminata
// quindi è possibile inviera una risposta
   LI F µ?Q¶ FXUUHQW/LQH,V%ODQN
{
// invia uno header standard http
client.println(“HTTP/1.1 200 OK”);
client.println(“Content-Type: text/html”);
client.println(“Connection: close”); ODFRQQHVVLRQHYHUUjFKLXVDDXWRPDWLFDPHQWHXQDYROWDLQYLDWDODULVSRVWD
client.println(“Refresh: 5”); // aggiorna la pagina automaticamente ogni 5 secondi
client.println();
client.println(“<!DOCTYPE HTML>”);
client.println(“<html>”);

// invia il valore di tutti i pins analogici


    IRU LQWDQDORJ&KDQQHO DQDORJ&KDQQHODQDORJ&KDQQHO
{
int sensorReading = analogRead(analogChannel);
client.print(“analog input “);
client.print(analogChannel);
client.print(“ is “);
client.print(sensorReading);
client.println(“<br />”);
}
client.println(“</html>”);
break;
}
   LI F µ?Q¶
{
// inizio di una nuova linea
currentLineIsBlank = true;
}
   HOVHLI F µ?U¶
{
// sono stati ricevuti dei caratteri nella linea corrente
currentLineIsBlank = false;
}
}
}
// lascia tempo al browser per ricevere i dati
delay(1);

// chiudi la connessione
client.stop();
Serial.println(“client disonnected”);
}
}

tramite un cellulare da una certa distanza, realiz- rare i ports usati basta non inserire alcuna scheda
zando così dispositivi completamente portatili. nel connettore. Il modulo RTC comunica via i2c
Un’altra interessante applicazione potrebbe esse- utilizzando i pins SCL e SDA, abbinati nell’UNO ai
re un comando remoto via WiFi sempre tramite ports analogici A4 ed A5.
browser web sul cellulare. Continueremo in un prossimo articolo con la descri-
L’esempio, nel Listato 11 crea una rete WiFi “volan- zione della libreria FishinoWebServer che permette
te”, con nome (SSID) ‘FISHINO’, senza password la realizzazione di un piccolo ma completo server
(rete open) ed avvia un piccolo server che su richie- web, che è la base dell’esempio di Home Automa-
sta fornisce una lettura dei sei ingressi analogici di tion mostrato in breve nel numero scorso. J
Fishino. Una volta lanciato lo sketch, occorre sele-
zionare la rete wireless FISHINO tra le reti dispo-
nibili (Fig. 1) e aprendo l’indirizzo 192.168.100.1 sul per il MATERIALE
browser si ottiene il risultato visualizzato in Fig. 2.
Gli esempi qui riportati sono comunque contenuti, La board Fishino (cod. FISHINOUNO) viene forni-
insieme ad altri, nella libreria Fishino. ta montata e collaudata. Può essere acquistata
Un’ultima nota sugli I/O occupati dalle estensioni, presso Futura Elettronica al prezzo di Euro 36,00.
e che non vanno utilizzati come I/O quando sono Il prezzo si intende IVA compresa.
attivi i componenti aggiuntivi. Il modulo WiFi uti-
lizza i seguenti pins: 7, 10, 11, 12 e 13. È disattivabile
completamente con un ponticello tra il pin CH_PH Il materiale va richiesto a:
del connettore ESP e la massa. La scheda microSD Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
utilizza i seguenti pins: 4, 11, 12 e 13 ed impone che Tel: 0331-799775 • Fax: 0331-792287
il pin 7 sia impostato ad output digitale. Per libe- http://www.futurashop.it

Elettronica In ~ Ottobre 2015 39


VUOI SVILUPPARE LE TUE
APPLICAZIONI CON ARDUINO?
Da noi trovi tutto quello
che ti serve!
Arduino e le tecniche
di programmazione
ARDUINO UNO
dei microcontrollori
Programmazione
Atmel
avanzata e librerie
di sistema
l’ABC di ARDUINO
Cod. ATPROMA Cod. ARDUADVANCED

€ 15,00 € 22,00
Cod. ABCARDU

€ 9, 90

Prezzi IVA inclusa


Arduino Uno Rev3 Arduino Mega Arduino Due

Cod. ARDUINOUNOREV3 Cod. ARDUINOMEGAREV3 ARDUINOdue

€ 24,50 € 43,00 € 44,00

kit V5 con Arduino Uno REV3 Starter kit per robot con Arduino Uno
Set contenente tutti i componenti Set contenente le parti necessarie per realizzare il Robot
necessari per realizzare gli esperimenti descritto nel libro incluso.
descritti nel libro
“L’ABC di Arduino”.
€ 155,00

Cod. ARDUKITV5

€ 59,00 Cod. ARDUKITV4

®
Futura Group srl • via Adige, 11 • 21013 Gallarate (VA) Caratteristiche tecniche di questi prodotti
www.futurashop.it Tel. 0331/799775 • Fax. 0331/792287 e acquisti on-line su www.futurashop.it
Applicazioni

RTC SHIELD
PER ARDUINO E
di MATTEO DESTRO RASPBERRY PI
Utilizziam
Utilizziamo
m un nuovo Real Time Clock
di Micro
Microchip rendendolo disponibile
su uno o shield per le due schede di
pro
prototipazione.
o Prima puntata.

e Raspberry Pi. Cominciamo


con il descrivere l’integrato
Microchip e la libreria sviluppata
per l’ecosistema Arduino. Nella
seconda puntata vedremo
l’impiego con la Raspberry Pi.

L’INTEGRATO MCP79410
L’RTCC appartiene a una
famiglia di integrati che
comprende anche MCP79411
e MCP79412; questi ultimi
radiosveglie, due hanno memorizzato un
i sistemi di MAC address univoco per
registrazione degli le applicazioni ethernet. Più
accessi del personale, quelli esattamente, l’MCP79411 ha un
di accensione/spegnimento a MAC address in formato EUI-
tempo ecc. La funzione orologio 48 mentre l’MCP79412 ce l’ha
può essere implementata in in formato EUI-64. La dicitura
olte applicazioni maniera semplice grazie a EUI sta per Extended Unique
M richiedono l’informazione
oraria, che viene ottenuta
circuiti integrati come il DS1307,
da noi utilizzato più volte, o
,GHQWLŎHU e può essere utilizzata
per assegnare un indirizzo
localmente mediante circuiti come il recente MCP79410 della hardware a 48 o 64 bit univoco
chiamati RTC (Real Time Microchip; con questo abbiamo nelle applicazioni di networking.
Clock) o RTCC (Real Time realizzato uno shield polivalente Solitamente si utilizzano i 24 bit
Clock Calendar); tra esse le applicabile alle schede Arduino SLºVLJQLŎFDWLYLSHULGHQWLŎFDUH

Elettronica
Elett
El ettr
troniica In ~ Aprile 201
tron 2016 75
[schema ELETTRICO]
ij FRQŎJXUD]LRQHGLRUHPLQXWLHVHFRQGLVLDQHO
formato 24h che nel 12h (AM/PM);
ij FRQŎJXUD]LRQHGLJLRUQRPHVHDQQRHJLRUQR
della settimana;
• gestione automatica degli anni bisestili;
• oscillatore a 32.768 Hz;
• calibrazione/regolazione interna digitale con
risoluzione di ±1ppm (range massimo ±129ppm);
• due allarmi programmabili;
• TimeStamp sia su power-up che su power-down;
• 64 Byte di memoria SRAM tamponata;
• 128 Byte di memoria EEPROM con possibilità di
scrittura paginata a 8 byte alla volta;
• 8 Byte di memoria EEPROM protetta, per
scrivere nella quale (si può un solo byte per
volta) bisogna eseguire una sequenza di sblocco;
• interfaccia di comunicazione I2&ŎQRDN+]

Inoltre l’integrato ha pin di uscita open-drain


multifunzione che descriveremo più avanti.
La Fig. 1 mostra lo schema a blocchi interno
dell’integrato MCP79410 dove sono ben visibili i
blocchi logici che vanno a formare il dispositivo.
L’interfaccia I2C prevede due indirizzi hardware,
uno per la gestione del RTCC e l’altro per la
gestione della memoria EEPROM. La Fig. 2 mostra
i due possibili control byte contenenti l’indirizzo
hardware per la sezione RTCC o EEPROM. Il primo
ha come valore 0b1101111x dove al posto della “x”
ci sarà “0” o “1” a seconda dell’operazione che
si vuole eseguire (“0” - scrittura; “1” - lettura). Il
secondo invece sarà 0b1010111x, dove “x” assume i
valori descritti sopra.

in modo univoco un fornitore, produttore o


organizzazione a livello globale: tale codice viene
detto OUI (2UJDQL]DWLRQDOO\8QLTXH,GHQWLŎHU).
L’acquirente di tale codice -di norma un costruttore
di dispositivi elettronici- dispone dei rimanenti 24
Bit per completare il codice da assegnare ai propri
prodotti (3 byte, per un totale di oltre 16 milioni
di codici univoci possibili). Per fare un esempio,
attualmente Microchip dispone di 3 codici OUI,
che sono rispettivamente 0xD88039, 0x001EC0 e
0x0004A3. Con questi, Microchip può dare origine
a ben 50 milioni di possibili indirizzi MAC univoci.
Quindi acquistando un RTCC della serie MCP79411
o MCP79412 troverete un indirizzo MAC univoco
utilizzabile senza dover pagare alcuna royalty.
Non dovendo sviluppare un’applicazione di Fig. 1
networking, abbiamo utilizzato l’MCP79410, che
mette a disposizione:

76 Aprile 2016 ~ Elettronica In


Fig. 3
Fig. 2

La mappatura dei registri e delle memorie è (a canale P) utilizzato come interruttore hardware.
riportata nella Fig. 3: gli indirizzi da 0x00 a 0x1F ,O4©LQLQWHUGL]LRQHŎQWDQWRFKªLOJDWHQRQYLHQH
FRQWHQJRQRLUHJLVWULGLFRQŎJXUD]LRQHGHOODGDWD cortocircuitato a massa, allorché la VGS supera il
HGHOOĬRUDQRQFKªLUHJLVWULSHUFRQŎJXUDUHJOL valore di soglia aprendo il canale del MOSFET e
allarmi 0 e 1. Concludono la sezione, i registri di quindi trasferendo l’alimentazione dal source al
gestione del TimeStamp al power-up e al power- drain. La “QXRYD” alimentazione viene chiamata
down. Dall’indirizzo 0x20 all’indirizzo 0x5F viene +5VRA. Per portare a massa il gate Q1 ci sono
mappata la memoria SRAM tamponata. I restanti due possibilità: l’MCP79410, attraverso l’uscita
LQGLUL]]LŎQRD0xFF non sono utilizzati. open-collector “MFP” agisce sui due transistor Q2
Quanto appena detto fa riferimento all’indirizzo e Q3; la linea di comando “ForceOn” polarizza il
hardware 0b1101111x. La EEPROM è invece transistor Q6 che porta a massa il gate di Q1.
mappata a partire dall’indirizzo 0x00 a 0x7F, ai Torniamo sulla linea di uscita MFP, di cui la
quali seguono una serie di indirizzi non utilizzati Fig. 4 mostra la logica interna all’MCP79410: essa
(Da 0x80 a 0xEF); dall’indirizzo 0xF0ŎQRD0xF7 SX³HVVHUHFRQŎJXUDWDSHUODYRUDUHFRPHXVFLWD
troviamo la memoria EEPROM protetta, la quale JHQHULFDSHUIRUQLUHXQRVWDWRORJLFRDOYHULŎFDUVL
può essere programmata solo un byte alla volta e GHLGXHDOODUPLFRQŎJXUDELOLQRQFKªFRPHULSRUWR
solo dopo avere eseguito una sequenza di sblocco. della frequenza di clock. Se si vuole che l’uscita
Per ultimo, all’indirizzo 0xFF trova posto il registro riporti la frequenza di clock dell’oscillatore o una
STATUS. Quanto appena detto fa riferimento delle frequenze derivate, si deve settare a “1” logico
all’indirizzo hardware 0b1010111x. il bit “SQWEN” del registro “CONTROL”. Per
decidere quale frequenza debba essere riportata
SCHEMA ELETTRICO VXOOĬXVFLWDVLGHYRQRFRQŎJXUDUHLELWĮSQWFS0”
Con l’integrato MCP79410 abbiamo realizzato uno e “SQWFS1” sempre del registro “CONTROL. Le
shield applicabile sia a una scheda Arduino Uno frequenze possibili sono 1, 4.096, 8.192 e 32.768 Hz
R3 che a una Raspberry Pi 2.0/3.0/B+. L’elettronica (consultate il data-sheet per i dettagli).
e un’opportuna programmazione dell’Arduino Volendo che MFP diventi un’uscita generica a
piuttosto che della Raspberry Pi, permettono di livello logico si deve settare il bit “SQWEN” a zero
FRQŎJXUDUHLQWRWROĬ0&3VRSUDWWXWWRQHOOH e disabilitare entrambi gli allarmi. Il nostro caso,
sue funzionalità di gestione allarmi necessarie invece, prevede che MFP sia pilotata dagli allarmi
all’accensione e allo spegnimento automatico 0 e 1, quindi “SQWEN” deve essere settato a zero
della scheda collegata allo shield. Tutte le funzioni e i bit “ALM0EN” e “ALM1EN” devono assumere
necessarie a gestire l’integrato sono state raccolte in entrambi, o almeno uno di essi, un valore logico
librerie sia per Arduino che per Raspberry Pi. alto. La MFP, essendo un’uscita open-collector, può
Iniziamo lo studio dello schema elettrico partendo essere intesa come linea di interrupt indicante che
dal connettore CN1 (microUSB) il quale porta uno o entrambi gli allarmi sono scattati in seguito
l’alimentazione stabilizzata +5Vcc, al MOSFET Q1 al raggiungimento delle condizioni impostate.

Elettronica In ~ Aprile 2016 77


Fig. 4

9HGUHPRSLºDYDQWLFRPHFRQŎJXUDUHHVIUXWWDUH richiedono una frequenza di clock di 32.768 Hz che


i due allarmi messi a disposizione. Per concludere, viene ricavata collegando un quarzo ai pin X1 e
la MFP può essere portata a un microcontrollore ;,QŎQHOĬLQWHUIDFFLDGLFRPXQLFD]LRQH,2C viene
per indicargli che si è attivato uno o entrambi gli portata sia ad Arduino che a Raspberry Pi tramite le
DOODUPLFRQŎJXUDWLHYLWDQGRGLVFULYHUHGHOFRGLFH rispettive connessioni; notate che il bus I2C richiede
di polling dello stato dei due allarmi. Della MFP si un traslatore di livello per l’interconnessione alla
SX³LQROWUHGHŎQLUHVH©DWWLYDDOLYHOORRDOOR Raspberry Pi, in quanto le sue linee di I/O lavorano
scopo si deve agire sul bit “ALMPOL” nei registri con un livello logico +3V3. Ciò viene ottenuto
“ALM0WKDAY” e “ALM1WKDAY”. Nella nostra sfruttando i MOSFET Q4 e Q5 che funzionano come
applicazione l’uscita dev’essere attiva a livello alto. in Fig. 5: il traslatore di livello bidirezionale siffatto
La Tabella 1 mostra il comportamento della MFP vale anche per SPI o qualsiasi linea bidirezionale
LQEDVHDOODFRQŎJXUD]LRQHGHOELW$/032/H e in esso ogni sezione è alimentata con un livello
GHOORVWDWRGHOŏDJGLLQWHUUXSWGHOOĬDOODUPHx: di tensione differente; nel nostro caso +3V3 per
quando ALMPOL è settato a “1” l’uscita MFP l’elettronica della scheda Raspberry Pi +5V per
VHJXHORVWDWRGHOŏDJGLLQWHUUXSWGHOOĬDOODUPH l’integrato MCP79410. La sezione a bassa tensione, a
n, nel caso di un solo allarme attivo; se entrambi sinistra, prevede due resistenze di pull-up collegate
JOLDOODUPLVRQRDWWLYLHFRQŎJXUDWLODOLQHD0)3į al source del MOSFET, per le linee SDA e SCL,
VHJXHOĬDQGDPHQWRGHOOĬ25ORJLFRGHLGXHŏDJ mentre il gate viene collegato direttamente alla
di interrupt degli allarmi 0 e 1. Se invece il bit tensione di alimentazione più bassa: nel nostro caso
$/032/©VHWWDWRDOD03)©LOQHJDWRGHOŏDJGL +3V3. La sezione ad alta tensione prevede anch’essa
interrupt dell’allarme n impostato (un solo allarme due resistenze di pull-up collegate al drain del
impostato) oppure segue l’andamento del NAND MOSFET. Il MOSFET utilizzato per entrambe
ORJLFRGHLGXHŏDJGLLQWHUUXSWGHJOLDOODUPLH le linee è uno a riempimento a canale N con il
L’integrato MCP79410 viene alimentato tramite la substrato internamente connesso al source (deve
tensione +5VAR, la quale viene anche portata alla avere integrato il diodo che connette il substrato
scheda Arduino Uno R3 e alla scheda Raspberry
Pi. L’MCP79410 ha anche un ingresso VBAT al quale
Tabella 1
si connette una batteria tampone che lo tiene
ALMPOL ALMXIF MFP ALMPOL ALM0IF ALM1IF MFP
alimentato in caso di mancanza di alimentazione.
0 0 1 0 0 0 1
Durante il funzionamento a batteria, solo una parte
0 1 0 0 0 1 1
dell’integrato rimane attiva: in particolare, il blocco
1 0 0 0 1 0 1
RTCC (gestione data e ora) e i 64 Byte della SRAM. 1 1 1 0 1 1 0
,QROWUHULPDQHDWWLYDODOLQHD0)3VHFRQŎJXUDWD 1 0 0 0
per lavorare in abbinamento agli allarmi 0 e 1, 1 0 1 1
altrimenti sarà disabilitata. 1 1 0 1
Le funzioni di gestione della data e dell’ora 1 1 1 1

78 Aprile 2016 ~ Elettronica In


con il drain creando una giunzione NP); quelli da alimentata dal connettore USB tipo B connesso al
noi usati sono BSS123. Vediamo in dettaglio i tre PC, per la programmazione tramite l’IDE Arduino.
stati di funzionamento, con la premessa che quanto
detto vale per entrambe le linee: I REGISTRI DELL’MCP79410
1) nessuna periferica impone un livello di tensione Prima di passare alla libreria per Arduino
basso sulla linea, quindi sul lato a 3,3V la Uno R3 conviene conoscere i registri mappati
resistenza di pull-up impone l’1 logico e di dell’MCP79410. La Fig. 6 evidenzia la mappatura
conseguenza la VGS non supera la soglia del LQPHPRULDGLRJQXQRHLOVLJQLŎFDWRGLRJQL
MOSFET, in quanto VG e Vs hanno la medesima singolo bit o gruppi di bit; è suddivisa in cinque
tensione, quindi il MOSFET non entra in sezioni, la prima delle quali contiene i registri per
conduzione; sul lato a 5V la linea si ritrova a FRQŎJXUDUHLO7LPH.HHSHURYYHURGDWDHRUDGHO
un livello logico alto imposto dalla rispettiva RTCC. In questi registri sono presenti anche i bit
resistenza di pull-up; GLFRQŎJXUD]LRQHSHUOĬDWWLYD]LRQHGHOOĬRVFLOODWRUH
2) la periferica a 3,3V impone sulla linea un livello e per il funzionamento a batteria dell’integrato.
di tensione basso, perciò il source del MOSFET Trovano posto anche i registri “CONTROL” per
va a livello logico basso; la VGS supera la soglia DWWLYDUHGLVDWWLYDUHJOLDOODUPLSHUFRQŎJXUDUH
e manda in conduzione il MOSFET; con il il pin MFP e il registro OSCTRIM per tarare la
MOSFET in conduzione, il livello logico basso frequenza del clock, oltre al registro “EEUNLOCK”
viene imposto anche nellla sezione a 5V; per sproteggere la memoria EEPROM per la
3) la periferica a 5V alta tensione impone sulla scrittura di un singolo byte alla volta (per
linea un livello di tensione basso; sulla linea a sproteggere la EEPROM occorre scrivere una serie
bassa tensione abbiamo la resistenza di pull-up GLE\WHEHQGHŎQLWLQHOUHJLVWUR 
che impone un livello logico alto e quindi manda La seconda sezione contiene i registri di
in conduzione il diodo presente nel MOSFET FRQŎJXUD]LRQHGHOOĬDOODUPH]HURPHQWUHODWHU]D
(la VS scende e di conseguenza la VGS supera FRQWLHQHLUHJLVWULGLFRQŎJXUD]LRQHGHOOĬDOODUPH
la soglia mandando in conduzione il MOSFET, uno. La quarta sezione contiene i registri per la
quindi a questo punto le due sezioni hanno il lettura del power-down timestamp. La quinta
medesimo livello di tensione sulla linea). contiene i registri per la lettura del power-up
timestamp. Notate che le informazioni di data e
La massima frequenza ammessa sull’I2C è 400 kHz. ora sono gestite sempre in formato BCD, quindi,
I pulsanti P1, P2 e P3 collegati sia ad Arduino ad esempio, il registro “RTCSEC” contiene
che a Raspberry Pi sono utilizzati durante le fase l’informazione dei secondi e sfrutta i bit da 0 a 3 per
GLFRQŎJXUD]LRQHGHO57&&HGHJOLDOODUPL3HU memorizzare le unità, mentre i bit da 4 a 6 vengono
agevolare le fasi di sviluppo sono stati predisposti XVDWLSHUOHGHFLQH,OELWSLºVLJQLŎFDWLYRVHUYHSHU
tre segnali di trigger portati al connettore CN2 attivare l’oscillatore.
per Arduino e due per la Raspberry Pi, anch’essi Quindi un ipotetico valore dei secondi di 39 viene
portati al connettore CN2. I segnali di trigger suddiviso in 9 unità e 3 decine.
sono in comune tra le due schede, in quanto non L’impostazione in formato BCD visibile nella
possono essere collegate contemporaneamente allo Tabella 2 viene usata in tutti i registri che
shield. Sempre dalle due schede, parte il segnale contengono un’informazione di data e ora sia che
“ForceOn” che serve a mantenere in stato di ON VLDQRGHO7LPH.HHSHUVLDGHJOLDOODUPLFKHGHL
l’interruttore elettronico Q1. Completano gli schemi timestamp.
elettrici i LED LD4 (collegato ad Arduino) e LD5
(collegato a Raspberry Pi) utilizzati durante la fase
GLFRQŎJXUD]LRQHGHOOĬ0&3,QŎQH/'LQGLFD Fig. 5
la presenza dell’alimentazione principale in arrivo
dal microUSB; LD2 indica invece che è presente
l’alimentazione secondaria +5VAR. LD3 indica la
presenza dell’alimentazione +3V3.
Un’ultima nota riguarda il jumper J1, che serve
DE\SDVVDUH4VHUYHGXUDQWHODFRQŎJXUD]LRQH
dell’MCP79410 soprattutto se si collega la
Raspberry Pi. Arduino in realtà è già auto-

Elettronica In ~ Aprile 2016 79


[piano di MONTAGGIO]

Elenco Componenti:

R1÷R3: 1,2 kohm 1% (0603) R18÷R20: 1 kohm 1% (0603) LD3÷LD5: LED verde U1: MCP79410-I/SN
R4: 22 kohm 1% (0603) C1, C2: 10 μF ceramico (0805) U2: Arduino UNO Rev3
R5÷R7: 2,2 kohm 1% (0603) (0603) P1÷P3: Microswitch U3: RaspberryPi 2/3/B+
R8, R16: 10 kohm 1% (0603) C3: 100 nF ceramico (0603) Q1: SPD50P03LG Y1: Quarzo 32768 Hz
R9: 4,7 kohm 1% (0603) C4, C5: 10 pF ceramico Q2, Q3: BC817
R10, R12, R14: 680 ohm 1% (0603) Q4, Q5: BSS123 Varie:
(0603) C6: - Q6: BC817 - Batteria CR2032
R11: 2,2 kohm 1% (0603) C7÷C10: 10 μF ceramico CN1: Connettore micro-USB - Strip M/F 6 vie
R13: 2,2 kohm 1% (0603) (0603) CN2: Strip maschio 4 vie - Strip M/F 8 vie (2 pz.)
R15: 3,3 kohm 1% (0603) LD1: LED rosso (0805) J1: Strip maschio 3 vie - Strip M/F 10 vie
R17: 4,7 kohm 1% (0603) LD2: LED giallo (0805) BT1: Porta batterie CR2032 - Circuito stampato S1254

LIBRERIA PER MCP79410 Arduino\libraries\MCP794102OWUHDLŎOHGL


/DOLEUHULDSHUPHWWHGLFRQŎJXUDUHHJHVWLUH libreria è consuetudine aggiungere una cartella con
OĬLQWHJUDWR0&3HG©GLYLVDLQWUHŎOHLOSULPR degli sketch di esempio: nel nostro caso abbiamo
contiene le funzioni sviluppate per l’occasione e ha creato la sotto-cartella Examples ‘ MCP79410_
estensione .cpp (lo abbiamo chiamato MCP79410. SAdvancedSettingsQHOODTXDOHWURYDQRSRVWRLŎOH
cpp). Il secondo ha estensione .h e contiene le GHOQRVWURVNHWFKFKHFLSHUPHWWRQRGLFRQŎJXUDUHL
dichiarazioni di funzione del precedente più tutte le registri di MCP79410.
variabili e le strutture dati necessarie (MCP79410.h). &RPLQFLDPRDGHVFULYHUHDJUDQGLOLQHHLOŎOH
Il terzo (keywords.txt ©XQŎOHGLWHVWRFRQWHQHQWH MCP79410.h che, come anzi detto, contiene le
le parole chiave delle funzioni pubbliche da GHŎQL]LRQLGLWXWWHOHIXQ]LRQLXWLOL]]DWHHOD
utilizzare negli sketch Arduino. Tutti questi devono dichiarazione delle variabili e delle strutture
essere raggruppati sotto una cartella comune, dati pubbliche e private. In testa c’è una serie
all’interno della cartella di installazione dell’IDE GLGLFKLDUD]LRQLGLFRVWDQWLFKHLGHQWLŎFDQRJOL
Arduino, nominata MCP79410. Così facendo, indirizzi hardware dell’integrato, per quanto
comparirà la libreria nello IDE Arduino sotto la riguarda sia la parte RTCC che la parte EEPROM,
voce di menu Sketch>Include Library.
Quindi supponendo che lo IDE Arduino sia
Tabella 2
stato installato sotto C:\Program Files (x86)\
Arduino la nostra libreria dovrà essere salvata OSC START SECTEN SECONE
X 3 9
nel seguente percorso: C:\Program Files (x86)\

80 Aprile 2016 ~ Elettronica In


più tutti gli indirizzi dei registri presenti. Seguono la funzione di libreria “WriteSingleReg” alla
una serie di costanti utili per settare o resettare i bit quale vanno passati una serie di parametri, tra cui
GLFRQŎJXUD]LRQHSUHVHQWLQHLYDULUHJLVWUL3HURJQL l’indirizzo e il valore del registro di cui si vuole
costante è stato pensato un commento che spiega PRGLŎFDUHLOYDORUH/DVLQWDVVLFRPSOHWDVDU¡
come sfruttare la costante presentata. Ad esempio
mcp79410.WriteSingleReg(RTCC_HW_ADD, CONTROL_ADD,
per attivare l’oscillatore del RTCC si deve agire mcp79410.ControlReg.ControlByte);
sul registro “RTCSEC” e in particolare sul bit più
VLJQLŎFDWLYRHVHJXHQGRXQĬRSHUD]LRQHERROHDQDGL Oltre alla struttura dati appena illustrata, ne
tipo OR (RTCSEC|OSCILLATOR_BIT_ON). seguono altre, più articolate, che permettono
Invece per resettare tale bit si userà un’operazione ODFRQŎJXUD]LRQHGHLUHJLVWUL7LPH.HHSHUJOL
booleana di tipo AND (RTCSEC & OSCILLATOR_ allarmi e la lettura dei TimeStamp al PowerUp e
BIT_OFF). Per eseguire una delle precedenti PowerDown. Come esempio vediamo -nel Listato
operazioni è necessario prima leggere il registro di 2- la struttura dati per la gestione dei registri
interesse, eseguire l’operazione booleana desiderata 7LPH.HHSHU&RPHVLSX³QRWDUHVL©GHŎQLWD
HLQŎQHVFULYHUHLOQXRYRYDORUHQHOUHJLVWUR SHURJQLUHJLVWURGLFRQŎJXUD]LRQHGHO57&&
6HJXRQRXQDVHULHGLFRVWDQWLGLFRQŎJXUD]LRQHFRQ 7LPH.HHSHU XQDVWUXWWXUDGLWLSRĮunion” che
la descrizione di ogni singolo bit che li compone. permette di agire su ogni singolo bit del registro da
Questa sezione, associata alla lettura attenta del FRQŎJXUDUH2JQLĮunion” è stata raggruppata in
data-sheet, aiuta a comprendere appieno come e una struttura dati “struct” nominata “TimeKeeper”.
FRVDIDUHSHUFRQŎJXUDUHOĬLQWHJUDWR/HFRVWDQWL Con questo approccio si ha un unico “FRQWHQLWRUH”
SRVVRQRHVVHUHPRGLŎFDWHDSLDFHUHGDOOĬXWHQWH DOTXDOH©SRVVLELOHDFFHGHUHSHUODFRQŎJXUD]LRQH
a seconda delle proprie esigenze; nulla vieta di di ogni singolo bit o gruppi di bit di ogni registro.
crearne di nuove. L’ultima sezione riguarda la )DFFLDPRXQHVHPSLRFKLDULŎFDWRUHVXSSRQLDPR
gestione della EEPROM; ricordiamo che l’indirizzo di dover settare il bit “StartOsc” del registro
hardware da utilizzare per accedere ad essa è “RTCSEC”. Questo bit è presente nella “union”
diverso da quello del RTCC. “TimeKeeperSeconds” quindi per settarlo si deve
Dopo le dichiarazioni di costanti appena usare la seguente sintassi:
spiegate seguono le dichiarazioni di tutte le
IXQ]LRQLSXEEOLFKHGLVSRQLELOLDOOĬXWHQWHŎQDOH Fig. 6
per la realizzazione del proprio sketch, nonché
la dichiarazione di tutte le variabili necessarie
alla gestione della libreria. In particolare vale
la pena soffermarci sulle strutture dati che ci
danno la possibilità di agire a livello di bit per la
FRQŎJXUD]LRQHGHLUHJLVWUL Vedremo tra poco che
©SRVVLELOHFRQŎJXUDUHLUHJLVWULLQGXHPRGLXQR
prevede l’utilizzo di apposite funzioni dedicate e
OĬDOWURSDVVDGDOODFRQŎJXUD]LRQHGHOOHVWUXWWXUH
dati e successiva programmazione dei registri.
Ad esempio, la struttura dati nel Listato 1 permette
GLFRQŎJXUDUHRJQLVLQJRORELWGHOUHJLVWUR
“CONTROL”. Supponendo di volere abilitare
l’allarme 0 si dovrà settare il bit “Alarm0_Enable”
con la seguente sintassi:

mcp79410.ControlReg.Bit.Alarm0_Enable = 1;

Così facendo abbiamo solo settato un valore in


SRAM del microcontrollore ATmega 328P presente
sulla scheda Arduino Uno R3. Il passo successivo
sarà richiamare un’apposita funzione per andare a
scrivere il dato nell’apposita locazione di memoria
dell’integrato MCP79410, ad esempio utilizzando

Elettronica In ~ Aprile 2016 81


Listato 1
union ControlReg {
uint8_t ControlByte;
struct {
dall’indirizzo su cui scrivere o da cui leggere
uint8_t SquareWaveFreqOutput :2; “RegAdd” e, per quanto riguarda la sola scrittura
uint8_t CoarseTrimEnable :1; il valore che si vuole scrivere ovvero “RegData”.
uint8_t ExtOscInput :1;
uint8_t Alarm0_Enable :1; La funzione (6) “ClearReg” azzera un registro e
uint8_t Alarm1_Enable :1; necessita degli stessi parametri della funzione (7).
uint8_t SquareWaveOutputEnable :1;
uint8_t LogicLevelOutput :1;
,QŎQHFLVRQRGXHIXQ]LRQLGLVFULWWXUD  HOHWWXUD
} Bit; (8) di n valori consecutivi le quali vogliono come
} ControlReg;
parametri il “ControlByte”, l’indirizzo di partenza
“StartAddįHLQŎQHLOQXPHURGLE\WHĮLenght”.
Le funzioni (5) e (8) si appoggiano su un array
mcp79410.TimeKeeper.Second.SecBit.StartOsc = 1; di byte detto “DataArray” di lunghezza 16, più
FKHVXIŎFLHQWHSHUOHQRVWUHHVLJHQ]H/HIXQ]LRQL
Fatto ciò, si può richiamare la funzione di libreria che fanno utilizzo dell’array di dati vengono utili
“WriteSingleReg” per la scrittura di un singolo per leggere o scrivere nella EEPROM o SRAM
UHJLVWURRSSXUHVHVLSUHIHULVFHFRQŎJXUDUH dell’integrato. Quando si deve scrivere nella
prima tutti i registri di cui sopra e poi chiamare la EEPROM si può al massimo inviare otto byte alla
funzione di libreria “WriteTimeKeeping” alla quale volta, perché il buffer del device ha tale dimensione
dobbiamo passare un solo parametro ad indicare massima.
se il formato di gestione dell’ora debba essere nel Passiamo ora a descrivere le funzioni più
formato 12h o 24h. Quindi la sintassi sarà: specializzate create apposta per gestire al meglio
l’integrato MCP79410:
mcp79410.WriteTimeKeeping(0);
1) GeneralPurposeOutputBit(uint8_t SetReset)
Passiamo ora alle funzioni messe a disposizione 2) SquareWaveOutputBit(uint8_t EnableDisable)
3) Alarm1Bit(uint8_t EnableDisable)
GDOODOLEUHULD6RQRVWDWHGHŎQLWHRWWRIXQ]LRQL 4) Alarm0Bit(uint8_t EnableDisable)
di uso generale, di cui tre servono a manipolare 5) ExternalOscillatorBit(uint8_t EnableDisable)
6) CoarseTrimModeBit(uint8_t EnableDisable)
i singoli bit di un registro e le restanti lavorano 7) SetOutputFrequencyBit(uint8_t OutputFreq)
direttamente sui singoli byte o gruppi di essi:
La funzione (1) serve per impostare a “1” logico
1) ToggleSingleBit(uint8_t ControlByte, uint8_t RegAdd, uint8_t Bit)
2) SetSingleBit(uint8_t ControlByte, uint8_t RegAdd, uint8_t Bit) o a “0” logico l’uscita MFP; ciò può avvenire nel
3) ResetSingleBit(uint8_t ControlByte, uint8_t RegAdd, uint8_t Bit) solo caso che entrambi gli allarmi siano disabilitati
4) WriteSingleReg(uint8_t ControlByte, uint8_t RegAdd, uint8_t RegData)
5) WriteArray(uint8_t ControlByte, uint8_t StartAdd, uint8_t Lenght)
e che l’uscita non sia impostata per riportare la
6) ClearReg(uint8_t ControlByte, uint8_t RegAdd) frequenza di clock dell’oscillatore. Il parametro
7) ReadSingleReg(uint8_t ControlByte, uint8_t RegAdd) “SetReset”, come suggerisce il nome, determina se
8) ReadArray(uint8_t ControlByte, uint8_t StartAdd, uint8_t Lenght)
l’uscita debba essere settata o resettata (“1” setta
La funzione (1) esegue la funzione “Toggle” sul l’uscita, “0” viceversa). La funzione (2) abilita/
bit desiderato del rispettivo registro. Quindi se disabilita la possibilità di riportare sulla linea MFP
il bit indicato è “0” diventa “1” e viceversa. I la frequenza di clock. Il parametro “EnableDisable”
parametri da passare sono il “ControlByte” che abilita o disabilita questa funzione (“1” abilita il
LGHQWLŎFDOĬLQGLUL]]RKDUGZDUHGHOQRVWUR57&& riporto sull’uscita del clock, “0” viceversa). Le
FRQVXOWDUHLOŎOHMCP79410.h per gli indirizzi funzioni (3) e (4) servono per abilitare gli allarmi
hardware assegnati al device), il “RegAdd” che è e, come per la precedente, l’unico parametro da
OĬLQGLUL]]RGHOUHJLVWURVXFXLVLYXROHDJLUHHLQŎQH passare è “EnableDisable”. La funzione (5) serve
il parametro “BitįFKHLGHQWLŎFDLOELWFKHVLYXROH SHUFRQŎJXUDUHOĬLQWHJUDWRDULFHYHUHXQVHJQDOH
PRGLŎFDUH GDD ,OFRQFHWWRDSSHQDHVSRVWRVL di clock sul pin X1. Questo è utile se non si vuole
può estendere alle successive due funzioni, (2) e (3), usare il quarzo da 32.768Hz sui pin X1 e X2. Il solo
che eseguono rispettivamente un “Set” o un “Reset” parametro da passare è “EnableDisable” con il
del bit desiderato: i parametri da passare sono gli FRQVXHWRVLJQLŎFDWR
stessi. Le successive funzioni agiscono invece sui La funzione (6) serve per attivare/disattivare il
rispettivi byte sia in scrittura che in lettura. Per “Coarse Trim mode”, il quale abbinato al registro
quanto riguarda le funzioni di scrittura (4) e lettura “OSCTRIM” permette una regolazione grossolana
(7) di un singolo byte i parametri da passare alla della base dei tempi per la gestione del RTCC. La
funzione prevedono il solito “ControlByte”, seguito regolazione viene applicata con una cadenza di 128

82 Aprile 2016 ~ Elettronica In


Listato 2
typedef union TimeKeeperSecond {
+]DSSRUWDQGRXQDQRWHYROHLQŏXHQ]DVXOODEDVH uint8_t SecByte;
struct {
dei tempi. È quindi preferibile lasciare disabilitata uint8_t SecOne :4;
questa funzione e, se necessario, regolare la base uint8_t SecTen :3;
uint8_t StartOsc :1;
dei tempi sfruttando il solo registro OSCTRIM, } SecBit;
ovviamente seguendo una apposita procedura } TimeKeeperSeconds;
typedef union TimeKeeperMinute {
(vedi riquadro 'LJLWDO7ULPPLQJ). uint8_t MinByte;
/HIXQ]LRQLŎQRUDHVSRVWHPRGLŎFDQRXQVRORELW struct {
uint8_t MinOne :4;
per volta del registro “CONTROL” e per fare ciò uint8_t MinTen :3;
sfruttano le funzioni generiche “SetSingleBit” e uint8_t Free :1;
} MinBit;
“ResetSingleBit” descritte precedentemente. } TimeKeeperMinute;
La funzione (7) serve per selezionare la frequenza typedef union TimeKeeperHour12 {
uint8_t Hour_12Byte;
da riportare sul pin MFP; la selezione perde di struct {
VLJQLŎFDWRVHOĬXVFLWD©FRQŎJXUDWDSHUODJHVWLRQH uint8_t HrOne :4;
uint8_t HrTen :1;
degli allarmi o come uscita digitale generica. uint8_t AmPm :1;
uint8_t _12_24 :1;
Seguono ora un’altra serie di funzioni specializzate uint8_t Free :1;
SHUODFRQŎJXUD]LRQHGLDOFXQHLPSRUWDQWL } Hour_12Bit;
} TimeKeeperHour12;
caratteristiche di funzionamento messe a typedef union TimeKeeperHour24 {
disposizione dell’integrato MCP79410. Queste uint8_t Hour_24Byte;
struct {
LPSRVWD]LRQLULJXDUGDQRLO7LPH.HHSHUJOLDOODUPL uint8_t HrOne :4;
e le funzioni di Timestamp: uint8_t HrTen :2;
uint8_t _12_24 :1;
1) StartOscillatorBit(uint8_t EnableDisable) uint8_t Free :1;
2) Hour12or24TimeFormatBit(uint8_t SetHourType) } Hour_24Bit;
} TimeKeeperHour24;
3) AmPmBit(uint8_t SetAmPm)
typedef union TimeKeeperWeekDay {
4) VbatEnBit(uint8_t EnableDisable) uint8_t WkDayByte;
5) AlarmHour12or24TimeFormatBit(uint8_t SetHourType, uint8_t Alarm0_1) struct {
6) AlarmAmPmBit(uint8_t SetAmPm, uint8_t Alarm0_1) uint8_t WkDay :3;
7) AlarmIntOutputPolarityBit(uint8_t SetReset, uint8_t Alarm0_1) uint8_t VbatEn :1;
8) AlarmMaskBit(uint8_t Alarm0_1, uint8_t Mask) uint8_t PwrFail :1;
9) ResetAlarmIntFlagBit(uint8_t Alarm0_1) uint8_t OSCrun :1;
10) PowerHour12or24TimeFormatBit(uint8_t SetHourType, uint8_t PowerDownUp) uint8_t Free :2;
11) PowerAmPmBit(uint8_t SetAmPm, uint8_t PowerDownUp) } WkDayBit;
12) ResetPwFailBit(void) } TimeKeeperWeekDay;
typedef union TimeKeeperDate {
uint8_t DateByte;
La funzione (1) è fondamentale in quanto serve per struct {
uint8_t DateOne :4;
attivare o disattivare l’oscillatore. Se l’oscillatore è uint8_t DateTen :2;
spento non si ha nessuna attività da parte del RTCC uint8_t Free :2;
} DateBit;
e quindi nessuna gestione di data, ora e relativi } TimeKeeperDate;
allarmi. Il parametro “EnableDisable” abilita o typedef union TimeKeeperMonth {
uint8_t MonthByte;
disabilita l’oscillatore (“1” abilita l’oscillatore, “0” struct {
disabilita). Le funzioni (2), (5) e (10) servono per uint8_t MonthOne :4;
uint8_t MonthTen :1;
impostare il formato dell’ora rispettivamente per il uint8_t LeapYear :1;
timekeeper, gli allarmi e il timestamp al power-up/ uint8_t Free :2;
} MonthBit;
power-down. La rappresentazione dell’ora può } TimeKeeperMonth;
essere del tipo 12h, accompagnato dalla dicitura typedef union TimeKeeperYear {
uint8_t YearByte;
AM/PM, oppure 24h; quindi a seconda del formato struct {
che si desidera utilizzare è conveniente allineare uint8_t YearOne :4;
uint8_t YearTen :4;
WXWWHHWUHOHSRVVLELOLFRQŎJXUD]LRQLLQPRGRGD } YearBit;
non essere spaiati. Non ha molto senso avere il } TimeKeeperYear;
timekeeper impostato per lavorare in formato 24h struct {
e gli allarmi nel formato 12h, a meno di particolari TimeKeeperSeconds Second;
TimeKeeperMinute Minute;
applicazioni. La funzione (2) necessita di un solo TimeKeeperHour12 Hour12;
parametro, “SetHourType”, per selezionare uno TimeKeeperHour24 Hour24;
TimeKeeperWeekDay WeekDay;
dei due formati a disposizione: “1” imposta il TimeKeeperDate Date;
formato 12h mentre “0” il formato 24h. Le funzioni TimeKeeperMonth Month;
TimeKeeperYear Year;
(5) e (10) richiedono un parametro aggiuntivo } TimeKeeper;
SHULGHQWLŎFDUHULVSHWWLYDPHQWHDTXDOHDOODUPH

Elettronica In ~ Aprile 2016 83


WLPHVWDPSDSSOLFDUHODPRGLŎFDGHOSDUDPHWUR/H REEOLJDWRULDPHQWHTXHVWRŏDJVHVLYXROHFKH
funzioni (3), (6) e (11) servono per impostare, in alla prossima mancanza/ritorno alimentazione
merito al formato 12h dell’ora, se l’ora impostata fa vengano nuovamente aggiornati i registri.
riferimento al mattino o al pomeriggio (AM per la Rimangono da descrivere le ultime funzioni le
mattina e PM per il pomeriggio). Il parametro da quali, abbinate alle strutture dati precedentemente
passare è “SetAmPm”, se “1” imposta PM invece se GHVFULWWHFLSHUPHWWRQRGLFRQŎJXUDUHDJHYROPHQWH
“0” imposta AM. Le funzioni (6) e (11) necessitano blocchi di registri associati alle varie funzioni messe
di un parametro aggiuntivo, come già spiegato a disposizione dal nostro RTCC:
per le funzioni (5) e (10). La funzione (4) serve per
attivare la gestione della alimentazione a batteria in 1) WriteTimeKeeping(uint8_t Hour12or24Format)
2) ReadTimeKeeping(void)
caso di mancanza di alimentazione primaria; quindi 3) WriteAlarmRegister(uint8_t Alarm0_1, uint8_t Hour12or24Format)
per alimentare a batteria l’RTCC si deve attivare 4) ReadAlarmRegister(uint8_t Alarm0_1)
il rispettivo bit e per fare ciò si utilizza la funzione 5) WritePowerDownUpRegister(uint8_t PowerDownUp, uint8_t Hour12or24Format)
6) ReadPowerDownUpRegister(uint8_t PowerDownUp)
appena introdotta: il parametro da passare è il
consueto “EnableDisable”. La funzione (1) serve per programmare la data e
La funzione (7) serve per impostare la polarità l’ora del RTCC, come già ampiamente detto sono
dell’uscita MFP (Tabella 1). I parametri da passare compresi anche i bit di attivazione dell’oscillatore e
sono due: il primo (“SetReset”) imposta la polarità, della gestione dell’alimentazione a batteria.
ovvero “1” polarità con logica ad alto livello e Quindi sfruttando la struttura dati apposita si
“0” polarità con logica a basso livello. Il secondo FRQŎJXUDQRLUHJLVWULFRQLYDORULFRUUHWWLHSRL
parametro (“Alarm0_1”) serve per selezionare su si programma l’integrato usando la funzione
TXDOHDOODUPHHVHJXLUHODPRGLŎFDGHOODSRODULW¡ (1). L’unico parametro che richiede è la selezione
La funzione (8) serve per impostare la maschera di del formato dell’ora (12h o 24h). La funzione (2)
FRQIURQWRSHUJOLDOODUPL4XDQGRVLFRQŎJXUDQRJOL VHUYHSHUOHJJHUHODFRQŎJXUD]LRQHDVVHJQDWD
allarmi, oltre a impostare la data e l’ora desiderate perDO7LPH.HHSHUODIXQ]LRQHOHJJHLUHJLVWUL
la generazione dell’interrupt, si deve anche impostare dell’integrato e li trasferisce nella struttura dati
la maschera di confronto la quale ci permette di apposita che può essere poi utilizzata per le proprie
decidere su cosa eseguire il test per scatenare l’evento applicazioni. Lo stesso discorso si applica alle
di allarme. Le opzioni disponibili sono: funzioni (3) e (4) che servono rispettivamente per
• confronto solo sui secondi; FRQŎJXUDUHLUHJLVWULGHJOLDOODUPLROHJJHUQHLOORUR
• confronto solo sui minuti; contenuto. Le due funzioni fanno riferimento alla
• confronto solo sull’ora (tiene conto del formato loro apposita struttura dati. Essendo due i possibili
impostato ovvero 12h o 24h); allarmi la struttura dati è un array di strutture.
• confronto solo sul giorno della settimana; Chiudono la rassegna le funzioni (5) e (6) per la
• confronto solo sulla data; FRQŎJXUD]LRQHHOHWWXUDGHLUHJLVWULLQHUHQWLLO
• confronto totale (vengono confrontati i secondi, i timestamp al power-up e power-down. Anche
minuti, le ore, il giorno della settimana, la data e in questo caso le funzioni sono associate ad una
il mese). apposita struttura dati più precisamente un array
di strutture. In realtà la libreria prevede altre due
Quando si genera l’interrupt dell’allarme n viene funzioni che riguardano la gestione della memoria
VHWWDWRLOULVSHWWLYRŏDJLOTXDOHGHYHHVVHUHD]]HUDWR EEPROM. Come già discusso l’integrato ha una
manualmente da codice. Non va mai lasciato memoria EEPROM interna da 128 Byte scrivibile
pendente. Per assolvere al compito si può sfruttare a blocchi di otto Byte alla volta. Questa memoria
la funzione (9) a cui si deve passare un unico è liberamente scrivibile dall’utente senza nessuna
SDUDPHWURFKHLGHQWLŎFDOĬDOODUPHR restrizione. Tuttavia si può decide di proteggere
Per ultima la funzione (12) la quale serve per GHOOHVH]LRQLGL((3520DOŎQHGLSUHVHUYDUQH
resettare il bit “PwFail” il quale indica che è il contenuto dalla sovrascrittura. Questo si può
mancata l’alimentazione principale e che quindi IDUHFRQŎJXUDQGRLELWĮBP1” e “BP0” del registro
sono stati memorizzati i timestamp al power- “STATUS” mappato all’indirizzo 0xFF. Si può
down e al power-up. In altre parole viene salvata quindi decidere di proteggere tutta la memoria,
la data e l’ora del momento in cui è mancata/ metà memoria (Da 0x40 a 0x7F) o un quarto di
ritornata l’alimentazione. Quindi dopo avere memoria (Da 0x60 a 0x7F). La funzione che si
letto i registri dei due timestamp si deve resettare RFFXSDGLFRQŎJXUDUHLOUHJLVWURĮSTATUS” è:

84 Aprile 2016 ~ Elettronica In


Set_EEPROM_WriteProtection(uint8_t Section) GLJHVWLRQHGL0&3 FL³LGHQWLŎFDODIXQ]LRQH
“setup()”). Seguono le funzioni di gestione, ovvero
alla quale si deve passare un solo parametro che la lettura e il debouncing degli ingressi digitali,
LGHQWLŎFDTXDOHVH]LRQHSURWHJJHUH/ĬXOWLPD le macchine a stati di sistema e la funzione di
funzione disponibile serve per sbloccare la memoria OHWWXUDGHOODFRQŎJXUD]LRQHDVVHJQDWDDLUHJLVWULGL
EEPROM protetta, per intenderci quella mappata 0&3 FL³LGHQWLŎFDODIXQ]LRQHĮloop()”).
dall’indirizzo 0xF0 a 0xF7, e scrivere un byte 3DUOLDPRRUDGLFRPHFRQŎJXUDUHLUHJLVWULGHO
all’indirizzo desiderato. La funzione prevede due nostro RTCC; prima di tutto è necessario collegare
parametri ovvero l’indirizzo in cui scrivere e il dato la scheda Arduino Uno R3 al PC tramite il
da scrivere. La funzione è: connettore USB, così si assicura un’alimentazione
stabile sia ad Arduino sia allo shield; in più si mette
WriteProtected_EEPROM(uint8_t RegAdd, uint8_t RegData) a disposizione la seriale e il relativo monitor per
inviare i comandi da PC ad Arduino.
SKETCH COMPLETO Attivato il monitor seriale si nota che il sistema
Per studiare le funzionalità messe a disposizione HVHJXHXQDOHWWXUDGHOODFRQŎJXUD]LRQHGHLUHJLVWUL
da MCP79410 abbiamo scritto uno sketch di ogni quindici secondi; la Fig. 8 ne mostra il risultato.
HVHPSLRQHOTXDOHPRVWULDPRFRPHFRQŎJXUDUH In testa, il sistema evidenzia che l’oscillatore del
ODVH]LRQH7LPH.HHSHUHJOLDOODUPLH/R RTCC è attivo e mostra data e ora correnti. Seguono
VNHWFK©VXGGLYLVRLQVHLŎOHGLFXLLOSULQFLSDOH© OHFRQŎJXUD]LRQLGHLGXHDOODUPL
“MCP79410_AdvancedSettings.ino”, quindi con un 1) stato dell’allarme = Abilitato/Disabilitato;
doppio clic su questo si apre lo IDE Arduino e tutti 2) polarità uscita = livello logico alto/basso;
LŎOHDGHVVRDVVRFLDWL,ŎOHGHOORVNHWFKVRQR 3) Flag interrupt = indica se è scattato l’allarme a
ij 0&3B$GYDQFHG6HWWLQJV ‘ File principale VHFRQGDGHOODVXDFRQŎJXUD]LRQH
contenente le funzioni “setup()” e “loop()”   RUDLPSRVWDWD PRVWUDOĬRUDFRQŎJXUDWDSHU
tipiche di uno sketch Arduino, nonché le l’allarme;
dichiarazioni di variabile, le costanti stringa, le 5) data impostata = mostra la data impostata per
costanti di tempo, le dichiarazioni delle macchine OĬDOODUPH OĬDQQRSHUGHGLVLJQLŎFDWRLQTXDQWR
a stati ecc; irrilevante per la gestione degli allarmi);
ij 'LJLWDO,QSXW ‘ File di gestione degli ingressi 6) maschera = mostra la maschera di confronto per
digitali, ovvero i pulsanti P1, P2 e P3; la generazione dell’interrupt a seconda della
ij 'LJLWDO2XWSXW ‘ File di gestione delle uscite FRQŎJXUD]LRQHVRSUDHVSRVWD
digitali (il LED D4 e l’uscita “ForceON”);
ij 57&&B0DQDJHPHQW ‘ File di gestione A questo punto possiamo decidere di fare due
dell’integrato MCP79410 e relativa FRVHFRQŎJXUDUHODGDWDHOĬRUDGHOOĬ57&&H
FRQŎJXUD]LRQH quindi, se è la prima programmazione, attivare
ij 57&&B6HWWLQJV ‘ŎOHSHUODSURJUDPPD]LRQH di conseguenza l’oscillatore e la gestione della
GHOOĬLQWHJUDWR0&37LPH.HHSHUHDOODUPL DOLPHQWD]LRQHGDEDWWHULDODVHFRQGD©FRQŎJXUDUH
ij 7LPHUV,QW ‘ File di gestione dell’interrupt per la gli allarmi 0 e 1.
gestione dei timer. &RPLQFLDPRFROGHVFULYHUHODFRQŎJXUD]LRQH
di data e ora del RTCC: prima di tutto si deve
Grazie al monitor seriale, attivabile dallo IDE PDQGDUHLOVLVWHPDLQFRQŎJXUD]LRQHGLGDWDHRUD
Arduino, è possibile impartire una serie di comandi e per fare ciò si deve premere il pulsante P1 per
VWULQJDSHUODFRQŎJXUD]LRQHGHO7LPHNHHSHUH più di due secondi; LD4 emetterà un lampeggio a
degli allarmi 0 e 1. Inoltre durante il funzionamento indicare l’avvenuto riconoscimento della pressione
“QRUPDOH”, ovvero quando non si stanno GHOWDVWR(QWUDWLQHOODFRQŎJXUD]LRQH/'
FRQŎJXUDQGRLUHJLVWULGHOOĬLQWHJUDWRLOVLVWHPD lampeggia e sul monitor seriale viene stampata
è programmato per stampare sul monitor seriale una stringa a indicare che il sistema è entrato in
DOFXQHLQIRUPD]LRQLVXOORVWDWRGHO7LPH.HHSHU FRQŎJXUD]LRQHGLGDWDHRUD3HUXVFLUHGDTXHVWD
HGHLGXHDOODUPL/RVFKHPDGLŏXVVRGHOQRVWUR modalità, premere nuovamente il pulsante P1
sketch è illustrato nella Fig. 7: c’è una sequenza di per più di due secondi; anche in questo caso una
inizializzazione che comprende sia gli ingressi che stringa indicherà quanto appena fatto (Fig. 9).
le uscite digitali, le macchine a stati, l’interrupt per ,OSULPRSDVVR©FRQŎJXUDUHODGDWDHLOJLRUQR
le basi dei tempi e l’inizializzazione della libreria della settimana: allo scopo bisogna scrivere la

Elettronica In ~ Aprile 2016 85


Digital Trimming
Per correggere l’imprecisione introdotta dall’oscillatore
esterno si può sfruttare il registro “OSCTRIM” il quale può
LQWURGXUUHXQIDWWRUHFRUUHWWLYRÀQRD“SSPSHUVIUXWWD- l’utente ad editare nuovamente il comando.
re questa funzione è obbligatorio resettare il bit “CRSTRIM” ,OVHFRQGRSDVVRSUHYHGHGLFRQŎJXUDUHOĬRUD
del registro “CONTROL”. Il registro “OSCTRIM” può anche
quindi digitare il seguente comando:
essere sfruttato per correggere gli errori dell’oscillatore
GRYXWLDOOHYDULD]LRQLGLWHPSHUDWXUD,OELWSLVLJQLÀFDWLYR TimeSet: 14:30:10
del registro indica il segno del valore correttivo mentre i re-
stanti bit (“TRIMVAL”) contengono il valore da aggiungere o
sottrarre. Ad ogni valore corrispondono due impulsi di clock
Dove “TimeSet:” è il comando da attuare e
che vengono aggiunti o sottratti ogni minuto. Se invece si “14:30:10” è l’orario (formato 24h) da impostare.
ha il bit “OSCTRIM” settato si ha che il valore indicato viene Se invece si vuole impostare lo stesso orario ma nel
DJJLXQWRRVRWWUDWWRYROWHDOVHFRQGR formato 12h, si deve scrivere la seguente:
Il valore da caricare in “TRIMVAL” deve essere calcolato e
per fare ciò ci sono due metodi. Il primo consiste nel misu- TimeSet: 02:30:10 - PM
rare la frequenza di clock riportata sul pin di uscita “MFP”
e calcolare di quanto è spostata rispetto al valore aspettato. ,OVLVWHPDULFRQRVFHLOIRUPDWRGHVLGHUDWRHFRQŎJXUD
,OVHFRQGRPHWRGRFRQVLVWHQHOYHULÀFDUHO·DPPRQWDUHGL
di conseguenza i registri del RTCC.
secondi guadagnati o persi durante un periodo di tempo.
&RQLOSULPRPHWRGRO·HTXD]LRQHSHUFDOFRODUHLOYDORUHGL
3DVVLDPRRUDDOODFRQŎJXUD]LRQHGHJOLDOODUPL
“TRIMVAL” è: HSHUDWWLYDUHODFRQŎJXUD]LRQHGHJOLDOODUPL
premere per più di due secondi il pulsante P2, anche
in questo caso LD4 lampeggerà e a monitor verrà
stampata una apposita stringa sia per l’attivazione
che disattivazione dell’impostazione degli allarmi
(Fig. 10 &RPHSULPRSDVVRGRYHWHFRQŎJXUDUH
la data, la maschera e la polarità dell’allarme 0 o 1.
Dove “FIDEAL” è la frequenza che ci si aspetta di misurare Supponiamo di lavorare con l’allarme 0:
mentre “FMEAS” è la frequenza realmente misurata. Per
quanto riguarda il secondo metodo si deve usare le seguenti DateSetAlarm(0): 12/12/2015 – SAT – SecondsMatch - LHL
formule:
dove “DateSetAlarm(0):” è il comando di
FRQŎJXUD]LRQHGHOODGDWDSHUOĬDOODUPH,OWHU]R
parametro è la maschera di confronto, che può
essere impostata per lavorare solo sui secondi,
solo sui minuti, solo sulle ore, solo sui giorni
della settimana, solo sulla data, oppure imporre il
confronto su tutti i parametri contemporaneamente.
Dove “ExpectedSec” sono i secondi che ci si aspetta di Nel nostro esempio scegliamo che il confronto
OHJJHUHLQXQGDWRSHULRGRSHUHVHJXLUHXQDFDOLEUD]LRQH
debba avvenire solo sui secondi; gli altri
accurata lavorare su lunghi periodi. Mentre “SecDeviation”
è il numero di secondi guadagnati o persi durante il periodo.
a disposizione sono “MinutesMatch”,
“HoursMatch”, “DayOfWeekMatch”,
“DateMatch” e “AllMatch”. Il quarto parametro
serve per selezionare la polarità dell’uscita dove
stringa di comando seguente, sfruttando l’apposita “LHL” indica polarità positiva mentre “LLL” polarità
textbox del monitor seriale e cliccare sul pulsante QHJDWLYD,OVHFRQGRSDVVRVHUYHSHUFRQŎJXUDUHOĬRUD
“Invia”:
TimeSetAlarm(0): 14:30:10

DateSet: 12/12/2015 – SAT


dove “TimeSetAlarm(0):” è il comando di
dove “DateSet:” è il comando da attuare e FRQŎJXUD]LRQHGHOOĬRUDSHUOĬDOODUPH,QTXHVWR
“12/12/2015 – SAT” sono la data e il giorno FDVRSHUFRQJUXHQ]DFRQODFRQŎJXUD]LRQHGHOOĬRUD
della settimana. Il giorno della settimana è in del RTCC il formato è 24h. Se si volesse impostare il
inglese (MON, TUE, WED, THU, FRI, SAT, formato 12h, la stringa diventerebbe:
SUN).
Nel caso in cui il comando contenga degli errori il TimeSetAlarm(0): 02:30:10 - PM

sistema ritornerà una stringa di avviso invitando &RPHSHUODFRQŎJXUD]LRQHGHO57&&LO

86 Aprile 2016 ~ Elettronica In


Fig. 7
sistema riconosce automaticamente il formato
desiderato. Va da sè che se si volesse impostare
l’allarme 1 i comandi sono identici ai precedenti
ma con riferimento all’allarme 1; ad esempio
DateSetAlarm(1):...... ecc. Volendo è anche
possibile resettare gli allarmi impostati, ovvero
cancellare completamente la loro programmazione,
disabilitandoli. Per fare ciò basta impartire il
comando:

ResetAlarm(0): oppure ResetAlarm(1):

Se invece si desidera semplicemente disabilitare un


allarme usare:

DisableAlarm(0): oppure DisableAlarm(1):

Per abilitarlo, il comando è:

EnableAlarm(0): oppure EnableAlarm(1):

Tutte le stringhe, sia di comando che di avviso,


sono memorizzate nella memoria Flash del
PLFURFRQWUROORUH$WPHODOŎQHGLULVSDUPLDUH
la memoria SRAM; infatti ricordate che tutte le
volte che si utilizza la funzione “println” con del
testo da stampare questo viene caricato in SRAM, Fig. 8
occupando spazio prezioso.
,FRPDQGLVRSUDLQGLFDWLVHUYRQRSHUFRQŎJXUDUH
le strutture dati di cui abbiamo parlato durante
la descrizione della libreria e successiva
programmazione dei registri; per questo le varie
programmazioni sono divise in due step, di cui è
sempre il secondo che congela i dati nei registri
GHOOĬ57&&$GHVHPSLRGXUDQWHODFRQŎJXUD]LRQH
GLGDWDHRUDGHOOĬ57&& 7LPH.HHSHU XQDYROWD
ricevuti i dati corretti il sistema richiama la
funzione di programmazione seguente:

mcp79410.WriteTimeKeeping(0);
si arriva ad avere una situazione di lavoro
Il parametro “0” indica che si è selezionato il dove l’allarme 0 forza l’accensione e l’allarme
IRUPDWRK,QYHFHGXUDQWHODFRQŎJXUD]LRQHGHJOL 1 lo spegnimento. Chiariamo meglio quanto
allarmi si useranno le seguenti: DSSHQDGHWWRXQDYROWDFRQŎJXUDWLLUHJLVWUL
dei due allarmi si deve scollegare il cavo
mcp79410.WriteAlarmRegister(AlarmIndex, 0); USB dal PC togliendo quindi alimentazione
mcp79410.Alarm0Bit(1);
a tutta l’elettronica compreso lo shield. Poi
si deve fornire alimentazione a quest’ultimo
La prima funzione salva i dati nei registri per tramite il connettore microUSB assicurandosi
l’allarme n, dipende dal valore della variabile che il jumper J1 sia in posizione 2-3. A questo
“AlarmIndex”, 0 per l’allarme 0 e 1 per l’allarme 1, punto l’elettronica a valle del MOSFET Q1
con formato 24h; la seconda attiva l’allarme 0. verrà alimentata solo se si attiverà l’interrupt
&RQŎJXUDQGRRSSRUWXQDPHQWHLGXHDOODUPL dell’allarme 0 intervenendo sull’uscita MFP; in tal

Elettronica In ~ Aprile 2016 87


Fig. 9

dei casi; dipende solo dalla fantasia dell’utente e


dal codice implementato. La nostra libreria e la
nostra elettronica servono solo per darvi il giusto
mezzo per realizzare le vostre più disparate
FDVRORVNHWFKVLDFFRUJHFKHLOŏDJGHOOĬLQWHUUXSW applicazioni.
dell’allarme 0 è andato a “1” logico e quindi forza
alto il segnale “ForceOn” mantenendo sempre REALIZZAZIONE PRATICA
accesa l’alimentazione indifferentemente dallo Spendiamo ora qualche parola sulla costruzione
stato dell’uscita MFP. Il sistema rimane quindi dello shield, che richiede un circuito stampato
in attesa che venga intercettato l’evento per a doppia ramatura le cui tracce sono disponibili
l’allarme 1, quando questo accade lo sketch se ne sul nostro sito ZZZHOHWWURQLFDLQLW. Lo shield è
accorge e quindi forza basso il segnale “ForceOn” composto praticamente tutto da componenti
spegnendo automaticamente tutta l’elettronica. SMD; fanno eccezione il portapile, gli strip
Tutte le volte che il sistema rileva che è scattato maschio e femmina e i pulsanti. Per il montaggio
un allarme dovrà lui stesso provvedere al reset dotatevi di un saldatore da 20W a punta molto
GHOŏDJFRUULVSRQGHQWHVHJXHQGRXQDDSSRVLWD ŎQHGLSDVWDŏXVVDQWHGLXQDSLQ]HWWDHXQDOHQWH
procedura. Per i dettagli vedere il codice dello d’ingrandimento per posizionare i componenti
sketch in particolare le due funzioni: HYHULŎFDUHOHVDOGDWXUH,SULPLFRPSRQHQWLGD
montare sono il MOSFET Q1 e l’U1, da posizionare
void ResetAlarmFlag_0(void) con i pin al centro delle rispettive piazzole e
void ResetAlarmFlag_1(void) stagnare un pin per lato; seguono tutti i passivi, il
fusibile e poi il quarzo e il connettore micro USB.
Per vedere questo andamento perpetuo Fatto ciò si passa al montaggio dei pulsanti e del
di accensione e spegnimento automatici portapila, quindi si inseriscono e si saldano i pin-
GHOOĬDOLPHQWD]LRQH©VXIŎFLHQWHFRQŎJXUDUHLGXH strip laterali per Arduino e quello per Raspberry
allarmi a fare il confronto solo sui secondi, come Pi. Per l’orientamento dei componenti polarizzati
evidenziato prima, e impostare i secondi dell’ora fate riferimento al piano di montaggio che trovate
in modo appropriato ad esempio: 12:10:10 per nelle pagine precedenti. Completate le saldature
l’allarme 0 (Accensione) e 12:10:40 per l’allarme 1 HYHULŎFDWHFRQODOHQWHFKHQRQVLDQRFRUWRFLUFXLWL
(Spegnimento). Così facendo l’elettronica rimane inserite la pila CR2032.
accesa per 30 secondi e spenta per altrettanti 30.
Ovviamente questo è solo uno sketch di esempio CONCLUSIONI
e nei casi reali si vorrebbe che la scheda si In queste pagine abbiamo presentato lo shield
accendesse a una determinata ora della giornata basato sull’MCP79410 e lo sketch di gestione per
per poi spegnersi ad un’altra. Quindi si potrebbe Arduino. Nella prossima puntata descriveremo
SHQVDUHGLFRQŎJXUDUHLOFRQIURQWRQRQVXLVHFRQGL GHJOLVNHWFKVSHFLŎFLSHUVLQJROHIXQ]LRQLH
ma sulle ore e impostare ad esempio l’ora come affronteremo l’applicazione e il software per
segue: 08:00:00 per l’allarme 0 (Accensione) e l’utilizzo dello shield con la Raspberry Pi. J
18:00:00 per l’allarme 1 (Spegnimento). Così per
tutti i i giorni dell’anno si avrebbe una accensione
e uno spegnimento alle ore desiderate. Le possibili
combinazioni a disposizione sono veramente
WDQWHHPRGLŎFDQGRLOFRGLFHGHOORVNHWFKLQPRGR per il MATERIALE
opportuno si può rendere tutto più dinamico. In
altre parole è il sistema a decidere quando avverrà Lo shield RTC Raspberry-Arduino (cod. FT1254M)
la prossima accensione o spegnimento a seconda viene venduto montato e collaudato ed è disponibile
presso Futura Elettronica al prezzo di Euro 20,00. Il
Fig. 10 prezzo si intende IVA compresa.

Il materiale va richiesto a:
Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
Tel: 0331-799775 • Fax: 0331-792287 - www.futurashop.it

88 Aprile 2016 ~ Elettronica In


Applicazioni

RTC SHIELD
PER ARDUINO E
di MATTEO DESTRO RASPBERRY PI
Concludiamo
il discorso su Arduino e vediamo come utilizzare
lo shield con Raspberry Pi mediante
un’apposita libreria. Secondaa
e ultima puntata.

i siamo lasciati dopo aver


C descritto un nuovo shield
57&&EDVDWRVXOOĬLQWHJUDWR
0LFURFKLS0&3HGDYHU
esaminato lo sketch per Arduino;
ora, come anticipato nella prima
puntata, completiamo il discorso
su Arduino e passiamo “a
ERPEDįDOOĬDSSOLFD]LRQHFRQOD
5DVSEHUU\3L
,QL]LDPRSUHVHQWDQGRYLTXDWWUR
mini sketch molto semplici e
PLQLPDOLSHUDFTXLVLUHIDPLOLDULW¡ microcontrollore
con la nostra libreria e imparare dii Arduino con del codice
ad usarla. Questi ulteriori non
on utilizzato.
sketch vi aiuteranno a studiare • MCP79410_SetTimeKeeper ‘
HFRPSUHQGHUHPHJOLRORVNHWFK SKETCH
KETCH PER TIMEKEEPR ŎOHSULQFLSDOHFRQWHQHQWHOH
ŎOH SULQFLSDOH FRQWHQHQWH OH
completo descritto il mese scorso Veniamo allo sketch per funzioni “setup()” e “loop()”
e li abbiamo preparati come FRQŎJXUDUHVRORLO7LPH.HHSHUGHO nonché tutte le dichiarazioni
alternativa per chi desidera QRVWUR57&&$QFKHLQTXHVWRFDVR GLYDULDELOLOHFRVWDQWLVWULQJD
JHVWLUHVRORDOFXQHIXQ]LRQL abbiamo suddiviso per semplicità le costanti di tempo, le
GHOOĬLQWHJUDWR0LFURFKLSHQRQ ORVNHWFKVXWUHŎOHGLVWLQWLLQ dichiarazioni delle macchine a
desidera riempire la memoria del particolare abbiamo: stati ecc.;

Elettronica
Elet
El ett
tron
tron
tr onic
ica
ic a In ~ M
Maggio
aggiio 20
aggi
ag 201
2016
1 59
• RTCC_Settings‘ŎOHSHUODFRQŎJXUD]LRQHGHO YDULDELOLOHFRVWDQWLVWULQJDOHFRVWDQWLGLWHPSROH
7LPH.HHSHU dichiarazioni delle macchine a stati ecc.;
• TimersInt ‘ŎOHGLJHVWLRQHGHOOĬLQWHUUXSWSHULO • RTCC_Settings ‘ŎOHSHUODFRQŎJXUD]LRQHGHJOL
controllo dei timer. allarmi;
• TimersInt‘ŎOHGLJHVWLRQHGHOOĬLQWHUUXSWSHUOD
&RQFHQWULDPRFLVXOŎOHĮRTCC_Settings” e JHVWLRQHGHLWLPHU
in particolare sulla funzione “void RTCC_
TimeKeeperSettings(void)”ODTXDOHFLSHUPHWWH &RQFHQWULDPRFLVXOŎOHĮRTCC_Settings” dove
GLFRQŎJXUDUHODGDWDHOĬRUDGHOQRVWUR57&&4XHVWD incontriamo nuovamente la funzione “void RTCC_
IXQ]LRQHYLHQHULFKLDPDWDVRORGXUDQWHOĬHVHFX]LRQH TimeKeeperSettings(void)”, vista nello sketch
del “setup()” e mai in altra occasione. La funzione SUHFHGHQWHSHUODFRQŎJXUD]LRQHGLGDWDHRUDHOD
ODYRUDVXOIRUPDWRKPDYROHQGRVLSX³PRGLŎFDUH funzione “void RTCC_AlarmSettings(void)”
SHUODYRUDUHVXOIRUPDWRKLQIDWWLFLVRQRGHOOH SHUODFRQŎJXUD]LRQHGHOOĬDOODUPHSHUVHPSOLFLW¡
parti di codice commentate che servono appunto per DEELDPRRPHVVRODFRQŎJXUD]LRQHGHOOĬDOODUPH
ODFRQŎJXUD]LRQHGHLUHJLVWULQHOVHFRQGRIRUPDWR /DIXQ]LRQHGLFRQŎJXUD]LRQHGHOOĬDOODUPHLQL]LD
/DIXQ]LRQH©LPSRVWDWDSHUFRQŎJXUDUHFRPHGDWD GLVDELOLWDQGRHQWUDPELJOLDOODUPLSHUSRLSDVVDUH
LO9HQHUG­GHOHSHUIDUHFL³FDULFDQHOOD DFRQŎJXUDUHODVWUXWWXUDGDWLDSSRVLWDTXHVWD©XQ
VWUXWWXUDGDWLGHO7LPH.HHSHULQXRYLYDORULGHOODGDWD array di strutture con dimensione 2, ossia allarme
HLOJLRUQRGHOODVHWWLPDQDWHQHQGREHQSUHVHQWHLO HDOODUPH3HUSULPDFRVDVLGHYHFRQŎJXUDUHOD
IRUPDWR%&'GRSRGLFKªFDULFDQHOODVWUXWWXUDGDWLL GDWDRPHWWHQGROĬDQQRFKHSHUGHGLVLJQLŎFDWRQHOOD
QXRYLYDORULSHUOĬRUDQHOIRUPDWRK/ĬRUDVFHOWDSHU FRQŎJXUD]LRQHGHJOLDOODUPL$OSDVVRVXFFHVVLYRVL
OĬHVHPSLR©,QŎQHVHPSUHGHOODVWUXWWXUDGDWL FRQŎJXUDODPDVFKHUDGLFRQIURQWRQRLVFHJOLDPR
VLDWWLYDOĬRVFLOODWRUHDJHQGRVXOOĬDSSRVLWRELWHVLDWWLYD GLHVHJXLUHLOFRQIURQWRVRORVXLVHFRQGL OHULJKH
ODPRGDOLW¡EDWWHULDQHOFDVRLQFXLYHQJDDPDQFDUH FRPPHQWDWHPRVWUDQRFKHYDORULDVVHJQDUHQHOFDVRLQ
OĬDOLPHQWD]LRQHSULQFLSDOH cui si decidesse di utilizzare una diversa maschera di
$TXHVWRSXQWRSHUUHQGHUHHIIHWWLYHOHPRGLŎFKHVL confronto).
GHYHULFKLDPDUHODIXQ]LRQHSHUSURJUDPPDUHLO57&& 6HJXHODFRQŎJXUD]LRQHGHOODSRODULW¡GHOOĬXVFLWD0)3
HLQSDUWLFRODUHLUHJLVWULGHO7LPH.HHSHU HSHUXOWLPRVLLPSRVWDOĬRUDRYYLDPHQWHQHOIRUPDWR
KFRQJUXHQWHFRQODGDWDHOĬRUDLPSRVWDWDSHULO
mcp79410.WriteTimeKeeping(0); 7LPH.HHSHU
3HUUHQGHUHHIIHWWLYHOHPRGLŎFKHDSSRUWDWHDOOD
,OSDUDPHWURLQGLFDFKHVLVWDODYRUDQGRLQIRUPDWR VWUXWWXUDGDWLULFKLDPDUHLQVHTXHQ]DOHIXQ]LRQL
K'XUDQWHOĬHVHFX]LRQHGHOĮloop()” viene
ULFKLDPDWDODVRODIXQ]LRQHGLOHWWXUDGHLUHJLVWUL mcp79410.WriteAlarmRegister(0, 0);

GHO7LPH.HHSHUXQDYROWDRJQLVHFRQGLLTXDOL mcp79410.Alarm0Bit(1);

YHQJRQRGHFRGLŎFDWLHVWDPSDWLVXOPRQLWRUVHULDOH
FRQODVWHVVDŎORVRŎDDGRWWDWDGDOSUHFHGHQWHVNHWFK6L GRYHODSULPDLQYLDLGDWLDSSHQDLQVHULWLDLUHJLVWULGL
SX³TXLQGLYHGHUHOĬDYDQ]DUHGHLVHFRQGLHGHLPLQXWL FRQŎJXUD]LRQHGHOOĬDOODUPHPHQWUHODVHFRQGDDELOLWD
7XWWHOHYROWHFKHORVNHWFKYHUU¡IDWWRULSDUWLUHVLDYU¡
U¡IDW
U¡ DWWR
WR ULS
LSDU
DUWL
DU WLUH
U VL
VLDYU¡ O DOODUPHVWHVVR
OĬDOODUPHVWHVVR
XQDULFRQŎJXUD]LRQHGLGDWDHRUDFRQLYDORULGHWWL
RUDFRQLYDORUL GHWWL
prima. SKET
SK ETCH
CH P
SKETCH E L
ER
PER EGGERE IL TTIMESTAMP
LEGGERE
6HYLLQ
LQ
QWHHUHVVDVHPSOLF
6HYLLQWHUHVVDVHPSOLFHPHQWHOHJJHUHLUHJLVWUL
SKETCH PER ALLARME 0 7 PH6W
7L 6WDPSSRZH
7LPH6WDPSSRZHUXSHSRZHUGRZQSHU
9HGLDPRRUDXQRVNHWFKFKHULJXDUGD
JXD
X UG UGD D
D VWWDDP
PSD
S UHD P
VWDPSDUHDPRQLWRUTXDQGR©YHQXWD
VHPSOLFHPHQWHFRPHFRQŎJXUDUHJOL
DUUHHJO
JOL
JOL DPDQF
DPDQFDUHOĬDOLPHQWD]LRQHH
DOODUPLGHOQRVWUR57&&$QFKHLQ
KHH LQ Q TX
TXDQGR©ULWRUQDWDXVDWH
TXHVWRFDVRDEELDPRVXGGLYLVRSHU
RSH
SHUHUU ORVNHWFKGHVFULWWRTXLGL
VHPSOLFLW¡ORVNHWFKVXWUHŎOH VHJXLWRFKH©VXGGLYLVR
distinti: LQGXHŎOH
• MCP79410_SetAlarm‘ŎOH • MCP79410_
principale contenente le t
timeStamp ‘ŎOH
funzioni “setup()” e “loop()”” p
principale contenente le
nonché tutte le dichiarazionii ddii fu
funzioni “setup()” e “loop()”

60 Maggio 2016 ~ Elettronica


a In
n
nonché tutte le dichiarazioni di variabili, le costanti VFULYHUHODQRVWUDVWULQJDQHOODPHPRULD((3520
VWULQJDOHFRVWDQWLGLWHPSROHGLFKLDUD]LRQL Quanto esposto è tutto raccolto in una funzione
GHOOHPDFFKLQHDVWDWLHOHIXQ]LRQLGLJHVWLRQHGHL nominata “void Set_EEPROM(void)” ODTXDOHYLHQH
7LPH6WDPS FKLDPDWDVRORGXUDQWHOĬHVHFX]LRQHGHOĮsetup()”.
• TimersInt ‘ŎOHGLJHVWLRQHGHOOĬLQWHUUXSWSHUOD 3HUYHULŎFDUHOĬDYYHQXWDVFULWWXUDDEELDPRVFULWWRXQD
JHVWLRQHGHLWLPHU piccola funzione “void Read_EEPROM(void)” per
ULOHJJHUHRJQLGLHFLVHFRQGLLOFRQWHQXWRGHOOHSULPH
,QTXHVWRVNHWFKQRQVLHVHJXRQRFRQŎJXUD]LRQL ORFD]LRQLGLPHPRULD((3520SHUSRLVWDPSDUQHLO
PDVHPSOLFHPHQWHVLYDDOHJJHUHLOFRQWHQXWRGHL ULVXOWDWRVXOPRQLWRUVHULDOH$QFKHLQTXHVWRFDVROD
UHJLVWULGHOWLPHVWDPS4XHVWR©XWLOHSHUVWDPSDUH IXQ]LRQH©FRPSRVWDGDSRFKHULJKHGLFRGLFHFRPSUHVR
DYLGHRGDWDHRUDGLTXDQGR©YHQXWDDPDQFDUH XQFLFORGRZKLOHSHUODVWDPSD/DIXQ]LRQHGLOLEUHULD
OĬDOLPHQWD]LRQHGHOODVFKHGDHGDWDHRUDGLTXDQGR XWLOL]]DWDSHUOHJJHUHOD((3520©
©ULWRUQDWD'XUDQWHLOĮsetup()” non ci sono
FRQŎJXUD]LRQLSDUWLFRODULFDULFKLDPRVROWDQWRXQ ReadArray(uint8_t ControlByte, uint8_t StartAdd, uint8_t Lenght)
WLPHUSHUULWDUGDUHODOHWWXUDGHLUHJLVWULLQPRGR
da dare tempo di attivare il monitor seriale dopo il 2OWUHDOODPHPRULD((3520FODVVLFDDEELDPR
FROOHJDPHQWRGHOFDYR86%DOODVFKHGD$UGXLQR812 WHVWDWRODVFULWWXUDHOHWWXUDGHOODPHPRULD((3520
5/DIXQ]LRQHFKHVLRFFXSDGLOHJJHUHLUHJLVWULYLHQH SURWHWWD %\WH SHUPHPRUL]]DUHXQLSRWHWLFR0$&
HVHJXLWDXQDYROWDRJQLGLHFLVHFRQGLDOORVFDGHUHGHO DGGUHVV$QFKHLQTXHVWRFDVRDEELDPRVFULWWRGXH
WLPHUYHQJRQROHWWLVLDLUHJLVWULGLGDWDHRUDFRUUHQWL SLFFROHIXQ]LRQLODSULPDSHUVFULYHUHLQ((3520
e, se il bit “PwFailį©DXQRORJLFRDQFKHLUHJLVWUL HODVHFRQGDSHUOHJJHUHOD((35204XLQGLFRQ
GHO7LPH6WDPSLQTXDQWRFĬ©VWDWDVLFXUDPHQWHXQD “void Set_Protected_EEPROM(void)” scriviamo
PDQFDQ]DGLDOLPHQWD]LRQH7XWWHTXHVWHLQIRUPD]LRQL ODPHPRULD((3520VRORGXUDQWHLOĮsetup()” e poi
YHQJRQRSRLVWDPSDWHVXOPRQLWRUVHULDOHFRQOD RJQLGLHFLVHFRQGLDQGLDPRDULOHJJHUQHLOFRQWHQXWR
FRQVXHWDIRUPDWWD]LRQH,QTXHVWRVNHWFKVLVIUXWWDQR con la funzione “void Read_Protected_
le funzioni di libreria: EEPROM(void)”.
3HUODVFULWWXUDVLXVDODIXQ]LRQHGLOLEUHULD
ReadTimeKeeping(void)
ReadSingleReg(uint8_t ControlByte, uint8_t RegAdd) WriteProtected_EEPROM(uint8_t RegAdd, uint8_t RegData)
ReadPowerDownUpRegister(uint8_t PowerDownUp)
ResetPwFailBit(void) 6LSX³VFULYHUHXQVRORE\WHDOODYROWDDQFKHLQTXHVWR
FDVRVLVIUXWWDOĬDUUD\GHOODQRVWUDOLEUHULDSLºXQ
SKETCH PER GESTIRE LA EEPROM SLFFRORFLFORGRZKLOH
9HGLDPRLQXOWLPRORVNHWFKSHUXWLOL]]DUHOD((3520 %HQHGHWWRFL³DEELDPRFRQFOXVRLOGLVFRUVRVXOOĬDSSOL
GHOQRVWUR57&&VLDTXHOODSURWHWWD %\WH FKHQRQ cazione con Arduino.
SURWHWWD %\WH /RVNHWFK©VXGGLYLVRLQGXHŎOH
• MCP79410_EEPROM ‘ŎOHSULQFLSDOHFRQWHQHQWH ED ORA...RASPBERRY PI
le funzioni “setup()” e “loop()” nonché tutte le /RVKLHOG57&&GLVSRQHGLXQD]RFFRODWXUDGRSSLD
GLFKLDUD]LRQLGLYDULDELOLOHFRVWDQWLVWULQJDOH FKHQHSHUPHWWHOĬLQVHU]LRQHGLYROWDLQYROWDVXOOD
costanti di tempo, le dichiarazioni delle macchine a VFKHGDGHVLGHUDWD'RSRDYHUYLGHVFULWWRLOŎUPZDUH
VWDWLHOHIXQ]LRQLGLJHVWLRQHGHOOD((3520 SHUDEELQDUODDG$UGXLQRLQTXHVWĬXOWLPDSXQWDWD
• TimersInt ‘ŎOHGLJHVWLRQHGHOOĬLQWHUUXSWSHUOD PRVWUHUHPRFRPHXWLOL]]DUHLOQRVWURVKLHOG57&&FRQ
JHVWLRQHGHLWLPHU 5DVSEHUU\3L%VIUXWWDQGRODOLEUHULDLQFRGLFH
3\WKRQVYLOXSSDWDSHUOĬHYHQLHQ]D3ULPDGLSURFHGHUH
3HUWHVWDUHODPHPRULD((3520GD%\WHSURYLDPR ULHSLORJKLDPRDOFXQLGHWWDJOLGHOORVKLHOGFKHVLEDVD
a scrivere in memoria la scritta “ElettronicaIn” VXOOĬLQWHJUDWR0LFURFKLS0&3QHOORVSHFLŎFR
SDUWHQGRGDOOĬLQGLUL]]R[VIUXWWDQGRODOLEUHULDHLQ GLDPRXQRVJXDUGRDOOHLQWHUFRQQHVVLRQLWUDHVVRHOD
particolare la funzione di scrittura: 5DVSEHUU\3L$WDOHVFKHGDYHQJRQRFROOHJDWHGLYHUVH
linee tra cui il bus di comunicazione I2&SHUODJHVWLRQH
WriteSingleReg(uint8_t ControlByte, uint8_t RegAdd, uint8_t RegData) GHOOĬLQWHJUDWR8 WUD5DVSEHUU\3LHOĬLQWHJUDWR8
©LQWHUSRVWRXQWUDVODWRUHGLOLYHOORPHJOLRGHVFULWWR
6IUXWWDQGROĬDUUD\SUHVHQWHQHOODQRVWUDOLEUHULDH QHOODSULPDSXQWDWDLQTXDQWR5DVSEHUU\3LODYRUD
VFULYHQGRXQSLFFRORFLFORGRZKLOHULXVFLDPRD FRQOLYHOORGLWHQVLRQH9PHQWUH8FRQOLYHOOR

Elettronica In ~ Maggio 2016 61


9 OHOLQHHGHLSXOVDQWL33H3OHOLQHHGL &RPLQFLDPRDGHVFULYHUHDJUDQGLOLQHHLOŎOH
WULJJHULO/('HODOLQHDGLIRU]DWXUD216HQHFHVVDULR “MCP79410_DefVar.pyįLOTXDOHFRPHGHWWRVRSUD
il bus I2&ROWUHDHVVHUHSRUWDWRDOOĬLQWHJUDWR8SX³ FRQWLHQHOHGHŎQL]LRQLGLWXWWHOHIXQ]LRQLXWLOL]]DWH
HVVHUHSUROXQJDWRYHUVRDOWUHVFKHGHFRQQHVVHD nonché la dichiarazione delle variabili e delle struttura
5DVSEHUU\3LWUDPLWHLOVROLWRFRQQHWWRUHGLHVSDQVLRQH GDWLSXEEOLFKHHSULYDWH'DXQDSULPDRFFKLDWDVLSX³
OĬLPSRUWDQWH©FKHQRQFLVLDQRGHOOHVRYUDSSRVL]LRQL YHGHUHFKH©XQDFRSLDTXDVLLGHQWLFDGHOUHODWLYRŎOH
FRQJOLLQGLUL]]LKDUGZDUHJL¡LPSHJQDWL4XLQGL realizzato per Arduino con alcune differenze dovute al
ULDVVXPHQGRLVHJXHQWLSLQGHOOD5DVSEHUU\3LKDQQR GLIIHUHQWHOLQJXDJJLRGLSURJUDPPD]LRQHXWLOL]]DWR
TXHVWRXWLOL]]R ,QWHVWDDOŎOHFLVRQROHGLFKLDUD]LRQLGHOOHFRVWDQWL
ij *3,2HVRQRXVDWLSHUFROOHJDUHLOEXV,2& FRPHDGHVHPSLRJOLLQGLUL]]LKDUGZDUHGHOOĬLQWHJUDWR
ij *3,2HVRQRXVDWLSHUFROOHJDUHLWUH ULFRUGLDPRFKH0&3SRVVLHGHGXHLQGLUL]]L
pulsanti utilizzati dallo sketch realizzato in KDUGZDUHGLVWLQWLRSSXUHJOLLQGLUL]]LGHLUHJLVWULDFXL
FRGLFH3\WKRQ SXQWDUHSHUODOHWWXUDSURJUDPPD]LRQHGHLSDUDPHWUL
ij *3,2HVRQRXVDWLSHUFROOHJDUHOHGXHOLQHHGL RSHUDWLYLGHOOĬLQWHJUDWR6HJXRQRXQDVHULHGLFRVWDQWL
WULJJHUXWLOLGXUDQWHOHIDVLGLGHEXJ SHUODSURJUDPPD]LRQHGHLUHJLVWULFRQGHLYDORUL
ij *3,2©XVDWRSHUJHVWLUHODOLQHDGLIRU]DWXUD21 VWDQGDUGTXHVWDVH]LRQHDVVRFLDWDDOODOHWWXUDDWWHQWD
GHOOĬHOHWWURQLFDWUDPLWHLOWUDQVLVWRU1314HLO GHOGDWDVKHHWDLXWDDFRPSUHQGHUHDSSLHQRFRPH
UHODWLYR026)(74XVDWRFRPHLQWHUUXWWRUH VLGHYHIDUHHFRVDVLGHYHFRQŎJXUDUHSHULOFRUUHWWR
ij *3,2VHUYHSHUSLORWDUHLO/('/' IXQ]LRQDPHQWRGHOOĬLQWHJUDWR7XWWHOHFRVWDQWLLQVHULWH
SRVVRQRHVVHUHPRGLŎFDWHDSLDFHUHGDOOĬXWHQWHD
&RQFOXGLDPRTXLODGHVFUL]LRQHGHOOĬKDUGZDUH VHFRQGDGHOOHSURSULHHVLJHQ]HSHURJQLFRVWDQWH
messo a disposizione della nostra scheda, se ritenete è presente un commento utile a comprenderne il
RSSRUWXQRDSSURIRQGLUHOĬDUJRPHQWRYLLQYLWLDPRD VLJQLŎFDWR
ULOHJJHUHODSUHFHGHQWDSXQWDWDSHULGHWWDJOL ,QŎQHWURYDQRSRVWROHFRVWDQWLSHUODJHVWLRQHGHOOD
((3520ULFRUGLDPRFKHSHUDFFHGHUHDGHVVD
LIBRERIA PER RASPBERRY PI OĬLQGLUL]]RKDUGZDUHGDXWLOL]]DUH©GLYHUVRGDTXHOOR
/DOLEUHULDVYLOXSSDWDSHUOĬRFFDVLRQHSHUPHWWHGL GHO57&&2OWUHDOOHFRVWDQWLDSSHQDGHVFULWWHWURYDQR
FRQŎJXUDUHHJHVWLUHOĬLQWHJUDWR0&3LQWXWWH SDUWHOHVWUXWWXUHGDWLIRQGDPHQWDOLSHUXQDJHVWLRQH
OHVXHIXQ]LRQLUHQGHQGRDJHYROHFRQŎJXUDUORSHU QLGLŎFDWDGHLGDWLSHUODSURJUDPPD]LRQHOHWWXUDGHL
OHSURSULHHVLJHQ]HFKHSRVVRQRHVVHUHGLYHUVHGD YDULUHJLVWULSUHVHQWL
TXHOOHVYLOXSSDWHQHOQRVWURVNHWFKGLHVHPSLRGLFXL Le strutture dati sono suddivise in sezioni distinte, in
GLVFXWHUHPRSLºDYDQWL SDUWLFRODUHDEELDPRODVH]LRQHSHULO7LPH.HHSUOD
'LYHUVDPHQWHGDOPRQGR$UGXLQRODOLEUHULD© VH]LRQHSHUJOLDOODUPLHODVH]LRQHSHUL7LPH6WDPS
VFULWWDLQ3\WKRQHG©FRPSRVWDGDVROLGXHŎOHFRQ &RPHSHULOPRQGR$UGXLQR©SRVVLELOHFRQŎJXUDUH
estensione “.py”. LUHJLVWULLQGXHPRGLGLVWLQWLXQPHWRGRSUHYHGH
Il primo si chiama “MCP79410.py” e contiene tutte le OĬXWLOL]]RGLDSSRVLWHIXQ]LRQLGHGLFDWHOĬDOWURWUDPLWH
funzioni di libreria mentre il secondo è “MCP79410_ ODFRQŎJXUD]LRQHGHOOHVWUXWWXUHGDWLHVXFFHVVLYD
DefVar.py” e contiene la dichiarazione di tutte le SURJUDPPD]LRQHGHLUHJLVWUL$GHVHPSLRODVWUXWWXUD
FRVWDQWLHOHVWUXWWXUHGDWL,GXHŎOHIDQQRTXLQGLSDUWH GDWLVHJXHQWHSHUPHWWHGLFRQŎJXUDUHRJQLVLQJRORELW
GLXQSDFFKHWWRFKHSX³HVVHUHLQVWDOODWRVXOODYRVWUD GHOUHJLVWURĮCONTROL”:
5DVSEHUU\3LHXWLOL]]DWRQHLYRVWULVNHWFK9HGUHPRLQ
VHJXLWRFRPHYLHQHJHQHUDWRLOSDFFKHWWRGDGLVWULEXLUH class CtrlBit(Structure):
e come si deve fare per installarlo nella propria B¿HOGVB > ³SquareWaveFreqOutput”, c_uint8,
2),
distribuzione.  ³CoarseTrimEnable”, c_uint8, 1),
2OWUHDLGXHŎOHGLOLEUHULDDEELDPRVFULWWRXQR  ³ExtOscInput”, c_uint8, 1),
c_uint8, 1),
sketch per mostrare come utilizzare le funzioni  ³Alarm0_Enable”,
 ³Alarm1_Enable”, c_uint8, 1),
LPSOHPHQWDWH/RVNHWFK©FRPSRVWRGDWUHŎOHGLVWLQWL  ³SquareWaveOutputEnable”, c_uint8, 1),
“MCP79410_Main.py” dove trova posto il main,  ³LogicLevelOutput”, c_uint8, 1)]

“MCP79410_PrintFunc.py” dove troviamo tutte le class CtrlByte(Structure):


IXQ]LRQLGLVWDPSDDYLGHRGHLGDWLOHWWLGDOOĬLQWHJUDWR B¿HOGVB > ³Byte0”, c_uint8)]
0&3HLQŎQHĮMCP79410_SetRegisters.py”, class CtrlReg(Union):
GRYHVRQRPHPRUL]]DWHOHIXQ]LRQLGLFRQŎJXUD]LRQH B¿HOGVB > ³ControlBit”, CtrlBit),
GHOOĬLQWHJUDWR0&3 ³ControlByte”, CtrlByte)]

62 Maggio 2016 ~ Elettronica In


Fig. 1

scrivere il dato nella locazione di memoria indicata.


Ad esempio utilizzando la funzione di libreria
“WriteSingleRegįDOODTXDOHYDQQRSDVVDWLXQDVHULHGL
SDUDPHWULWUDFXLOĬLQGLUL]]RHLOYDORUHGHOUHJLVWURGL
FXLVLYXROHPRGLŎFDUHLOYDORUH
La sintassi completa sarà:
6XSSRQHQGRGLYROHUHDELOLWDUHOĬDOODUPHVLGRYU¡
settare il bit “Alarm0_EnableįFRQODVHJXHQWHVLQWDVVL mcp79410.WriteSingleReg(RTCC_HW_ADD, CONTROL_ADD,
MCP79410._CtrlReg.ControlByte);
0&3B&WUO5HJ&RQWURO%LW$ODUPB(QDEOH 
2OWUHDOODVWUXWWXUDGDWLDSSHQDLOOXVWUDWDQH
dove “_CtrlRegį©ODGLFKLDUD]LRQHJOREDOHGHOOD VHJXRQRGHOOHDOWUHSLºDUWLFRODWHFKHSHUPHWWRQROD
struttura dati in esame visibile dallo sketch. FRQŎJXUD]LRQHGHLUHJLVWUL7LPH.HHSHUJOLDOODUPLHOD
2YYLDPHQWHFRV­IDFHQGRDEELDPRVRORVHWWDWR OHWWXUDGHL7LPH6WDPSDO3RZHU8SH3RZHU'RZQ
XQYDORUHLQ5$0,OSDVVRVXFFHVVLYRVDU¡TXHOOR $WLWRORGĬHVHPSLRYHGLDPRODVWUXWWXUDGDWLSHUOD
GLULFKLDPDUHXQĬDSSRVLWDIXQ]LRQHSHUDQGDUHD JHVWLRQHGHLUHJLVWUL7LPH.HHSHUFRPHJL¡YLVWRSHU

Elettronica In ~ Maggio 2016 63


Listato 1
1) ToggleSingleBit(ControlByte, RegAdd, Bit)
2) SetSingleBit(ControlByte, RegAdd, Bit) 6HLQYHFHVLYROHVVHVHWWDUHLOELWĮVbatEn”, per
3) ResetSingleBit(ControlByte, RegAdd, Bit) OĬDELOLWD]LRQHGHOODJHVWLRQHDEDWWHULDGHOOĬLQWHJUDWRVL
4) WriteSingleReg(ControlByte, RegAdd, RegData)
5) WriteArray(ControlByte, StartAdd, Lenght)
GRYU¡SURFHGHUHLQTXHVWRPRGR
6) ClearReg(ControlByte, RegAdd)
7) ReadSingleReg(ControlByte, RegAdd) 0&3B7LPH.HHSHU:HHN'D\:N'D\%LW9EDWHQ 
8) ReadArray(ControlByte, StartAdd, Lenght)
9) GeneralPurposeOutputBit(SetReset)
10) SquareWaveOutputBit(EnableDisable) 8QDYROWDFRQŎJXUDWLLUHJLVWULGHOODVWUXWWXUDGDWL
11) Alarm1Bit(EnableDisable)
12) Alarm0Bit(EnableDisable) VRSUDGHVFULWWDVLSX³SURFHGHUHDOODSURJUDPPD]LRQH
13) ExternalOscillatorBit(EnableDisable) HIIHWWLYDGLRJQLVLQJRORUHJLVWURGHOOĬLQWHJUDWR
14) CoarseTrimModeBit(EnableDisable)
15) SetOutputFrequencyBit(OutputFreq)
sfruttando la funzione di libreria “WriteSingleReg”,
16) StartOscillatorBit(EnableDisable) FXLELVRJQDSDVVDUHWUHSDUDPHWUL LQGLUL]]RKDUGZDUH
17) Hour12or24TimeFormatBit(SetHourType) LQGLUL]]RGHOUHJLVWURHYDORUHGDVFULYHUHQHOUHJLVWUR 
18) AmPmBit(SetAmPm)
19) VbatEnBit(EnableDisable) RSSXUHDOODSURJUDPPD]LRQHFRPSOHWDGLWXWWLL
20) AlarmHour12or24TimeFormatBit(SetHourType, Alarm0_1) UHJLVWULGHO7LPH.HHSHUVIUXWWDQGRODIXQ]LRQHGL
21) AlarmAmPmBit(SetAmPm, Alarm0_1)
22) AlarmIntOutputPolarityBit(SetReset, Alarm0_1) libreria “WriteTimeKeepingįDOODTXDOHGREELDPR
23) AlarmMaskBit(Alarm0_1, Mask) passare un solo parametro ad indicare se il formato di
24) ResetAlarmIntFlagBit(Alarm0_1)
25) PowerHour12or24TimeFormatBit(SetHourType, PowerDownUp)
JHVWLRQHGHOOĬRUDGHEEDHVVHUHQHOIRUPDWRKRK
26) PowerAmPmBit(SetAmPm, PowerDownUp) 4XLQGLODVLQWDVVLSHUSURJUDPPDUHLUHJLVWULLQXQ
27) ResetPwFailBit() FROSRVRORFRQIRUPDWRGHOOĬRUDLQKVDU¡
28) WriteTimeKeeping(SetHourType)
29) ReadTimeKeeping()
30) WriteAlarmRegister(Alarm0_1, SetHourType) MCP79410.WriteTimeKeeping(0)
31) ReadAlarmRegister(Alarm0_1)
32) WritePowerDownUpRegister(PowerDownUp, SetHourType)
33) ReadPowerDownUpRegister(PowerDownUp) Le funzioni messe a disposizione dalla libreria sono le
34) Set_EEPROM_WriteProtection(Section)
35) WriteProtected_EEPROM(RegAdd, RegData)
PHGHVLPHGLTXHOOHGHOODSUHFHGHQWHSHU$UGXLQR
4XLQGLHYLWHUHPRGLGHVFULYHUHRJQLVLQJRODIXQ]LRQH
ma ci limiteremo a farne un elenco per concentrarci
VXOFRGLFHHOHVXHIXQ]LRQDOLW¡/ĬHOHQFRFRPSOHWR©
$UGXLQR Fig. 1 6LQRWLODGLIIHUHQ]DGLLPSRVWD]LRQH illustrato nel Listato 1.
GHOFRGLFH3\WKRQ XVDWRSHU5DVSEHUU\3L ULVSHWWR Ricordiamo che la variabile “ControlByteįLGHQWLŎFD
DOFRGLFH&XVDWRSHU$UGXLQRSHURJQLUHJLVWURGHO OĬLQGLUL]]RKDUGZDUHGHOODSHULIHULFD,2&LQTXHVWRFDVR
7LPH.HHSHUVRQRVWDWHGHŎQLWHGXHVWUXWWXUHGDWL DEELDPRGXHLQGLUL]]LXQRSHULO57&&HOĬDOWURSHUOD
VHJXLWHGDXQDĮunionįSHUFRQVHQWLUHOĬDFFHVVRDO ((3520ODYDULDELOHĮRegAddįLGHQWLŎFDOĬLQGLUL]]R
VLQJRORUHJLVWURVLDDOLYHOORGLE\WHFKHGLVLQJRORELW GHOUHJLVWURFKHVLYXROHOHJJHUHRVFULYHUHODYDULDELOH
YHGHWHDULJXDUGRODSULPDVWUXWWXUDGDWLHYLGHQ]LDWD “BitįLQGLFDTXDOHELWGHOUHJLVWURGHVLGHUDWRVLYXROH
LQJLDOORHULJXDUGDQWHOĬLPSRVWD]LRQHGHLVHFRQGLSLº PRGLŎFDUHPHQWUHĮRegDataįLQGLFDLOYDORUHDELW
LOELWGLDWWLYD]LRQHGHOOĬRVFLOODWRUHVHJXRQROHDOWUH FKHVLYXROHVFULYHUHQHOUHJLVWUR
VWUXWWXUHGDWLHYLGHQ]LDWHLQJULJLR Le variabili “SetReset” e “EnableDisable” servono
'LTXHVWHVH]LRQLFHQHVRQRRWWRVRORSHUODJHVWLRQH rispettivamente per settare o resettare una funzione
GHLUHJLVWULGHO7LPH.HHSHU GHOOĬLQWHJUDWRRSSXUHSHUDELOLWDUHRGLVDELOLWDUHXQD
7XWWHHRWWROHVH]LRQLYHQJRQRSRLUDJJUXSSDWHDVVLHPH funzione.
LQXQĬXOWHULRUHVWUXWWXUDGDWLLQPRGRGDDYHUHXQXQLFR “SetHourTypeįVHUYHSHULPSRVWDUHLOIRUPDWRGHOOĬRUD
DFFHVVRVWUXWWXUDWRDLUHJLVWUL VH]LRQHHYLGHQ]LDWDLQ +RSSXUH+ ĮSetAmPm” serve per indicare se
YHUGH &RQTXHVWRDSSURFFLRVLKDXQXQLFRĮcontenitore” OĬRUDLQGLFDWD©SULPDGLPH]]RJLRUQRRSSXUHGRSR
GDOTXDOH©SRVVLELOHPRGLŎFDUHXQVLQJRORELWRXQLQWHUR “Alarm0_1įLQGLFDVXTXDOHDOODUPHVLYXROHODYRUDUH
E\WHGHLUHJLVWULUHODWLYLDO7LPH.HHSHU mentre “Mask” è la maschera di confronto per la
3HUFKLDULUHPHJOLRLOFRQFHWWRIDFFLDPRTXDOFKH JHQHUD]LRQHGLXQDFRQGL]LRQHGLDOODUPH
esempio, supponiamo di voler settare il bit “StartOsc” ,QŎQHĮPowerDownUpįLQGLFDVHVLYXROHOHJJHUH
GHOUHJLVWURĮRTCSEC”: VFULYHUHLUHJLVWULFRQLULIHULPHQWLGLGDWDHRUDULOHYDWH
GXUDQWHOHIDVLGL3RZHU8SR3RZHU'RZQ
0&3B7LPH.HHSHU6HFRQGV6HF%LW6WDUW2VF 
LA LIBRERIA DIVENTA UN PACCHETTO DATI
dove “_TimeKeeperį©ODGLFKLDUD]LRQHJOREDOHGHOOD 3HUDJHYRODUHOĬXWLOL]]RGHOODOLEUHULDDEELDPRFUHDWR
struttura dati in esame visibile dallo sketch. un pacchetto di distribuzione detto “packageį&RQ

64 Maggio 2016 ~ Elettronica In


TXHVWRDFFRUJLPHQWROĬXWHQWHLQVWDOODODOLEUHULD GLVWULEX]LRQHLOŎOHFUHDWR©ĮMCP79410-1,0.tar.gz”.
3\WKRQFUHDWDVXOSURSULR5DVSEHUU\3LTXHVWDYLHQH 4XLQGLOĬXWHQWHFKHYRUU¡LQVWDOODUHODOLEUHULDGRYU¡
posizionata in un apposito percorso sul disco, per poi SULPDVFRPSDWWDUHLOŎOHLQXQGLUHWWRULRDSLDFHUHH
essere richiamata nei propri sketch con la funzione SRLHVHJXLUHLOVHJXHQWHFRPDQGRSHUOĬLQVWDOOD]LRQH
“import”. della libreria:
3HUFUHDUHXQSDFFKHWWRVLGHYHRUJDQL]]DUHLOFRGLFH
QHOVHJXHQWHPRGR sudo python setup.py install
  FUHDUHXQDFDUWHOODEDVHFRQXQQRPHVLJQLŎFDWLYR
1HOQRVWURFDVRĮMCP79410”; 3HULPSRUWDUHHXVDUHODOLEUHULDQHLYRVWULVNHWFK
2) DOOĬLQWHUQRGHOODFDUWHOODGLFXLVRSUDFUHLDPRQH GRYUHWHLQVHULUHLQWHVWDDOŎOHOHVHJXHQWLULJKHGL
XQĬDOWUDVHPSUHFRQQRPHĮMCP79410” e codice:
DOOĬLQWHUQRGLHVVDFRSLDPRLQRVWULGXHŎOHGL
import sys
libreria “MCP79410.py” e “MCP79410_DefVar.py”.
sys.path.insert(0, ³XVUORFDOOLES\WKRQGLVWSDFNDJHV0&3´)
  FUHLDPRXQXOWHULRUHŎOH3\WKRQYXRWRFRQLO
import MCP79410
VHJXHQWHQRPHĮ__init__.pyįLQTXHVWRPRGR
OĬLQWHUSUHWH3\WKRQYHGU¡TXHVWDFDUWHOODFRPHXQ
SDFFKHWWRGLGLVWULEX]LRQH WHFQLFDPHQWHYLHQH UN ESEMPIO DI CODICE
chiamato “package”); Il codice che abbiamo realizzato ha due scopi distinti:
  QHOODFDUWHOODEDVH YHGHUHSXQWR FUHDUHLO il primo è mostrare come utilizzare la libreria
VHJXHQWHŎOHĮsetup.pyįLOTXDOHGHYHFRQWHQHUHLO messa a disposizione, nonché le procedure per la
VHJXHQWHFRGLFH3\WKRQ FRQŎJXUD]LRQHGHLUHJLVWULGLLQWHUHVVHLOVHFRQGR©
VSLHJDUYLFRPHLQWHUDJLUHFRQOĬKDUGZDUHGHOODQRVWUD
from distutils.core import setup
VFKHGDGHPRLQTXDQWROĬRELHWWLYR©OĬDFFHQVLRQH
VHWXS QDPH ³MCP79410”, HORVSHJQLPHQWRDXWRPDWL]]DWRGHO5DVSEHUU\3L
YHUVLRQ ³1.0”,
GHVFULSWLRQ ³MCP79410 Library”, in determinate condizioni dettate da come si sono
ORQJBGHVFULSWLRQ ³This package is usefull FRQŎJXUDWLLUHJLVWULGHJOLDOODUPL
to manage the Real Time clock
Calendar MCP79410 developed
,QL]LDPRODWUDWWD]LRQHGDOŎOHSULQFLSDOHRYYHUR
by Microchip”, TXHOORFKHFRQWLHQHODURXWLQHGLĮmain()”.
DXWKRU ³Matteo Destro”, )DFFLDPRQRWDUHFKHLQWHVWDDOŎOHFLVRQROHIDPRVH
DXWKRUBHPDLO ³info@open-electronics.org”,
XUO ³www.open-electronics.org”, ULJKHGLFRGLFHFRQOHLVWUX]LRQLGLĮimport” per
OLFHQVH ³GPL”, LQJOREDUHODOLEUHULDDSSHQDWUDWWDWDSLºDOWUHOLEUHULHGL
SODWIRUP ³RaspberryPi”,
SDFNDJHV >³0&3´]) sistema necessarie alla realizzazione dello sketch.
6XELWRGRSRVHJXRQROHGLFKLDUD]LRQLGHOOHYDULDELOL
6LFFRPHTXDQGRVLFUHDXQŎOHĮsetup.py” si deve JOREDOLODGLFKLDUD]LRQHGHOOHFRVWDQWLFKHLGHQWLŎFDQR
sempre importare, dalla libreria “distutils”, la voce LSLQ*3,2XWLOL]]DWLHODORURFRQŎJXUD]LRQHFRPH
“setup” e procedere successivamente alla compilazione LQJUHVVLRXVFLWH&RPHLQJUHVVLDEELDPRLVROLSXOVDQWL
di alcuni campi, nel nostro caso abbiamo dato un 33H3DFXLYLHQHLPSRVWRXQSXOOXSLQWHUQR
nome alla nostra distribuzione con la voce “name”, ne SLºXQHYHQWRVXOIURQWHGLGLVFHVDFRQWHPSRGL
abbiamo evidenziato la versione con la voce “version”, GHERXQFLQJGLPLOOLVHFRQGLSHULQWHUFHWWDUHOD
ne abbiamo dato una breve descrizione con la voce pressione del pulsante.
“descriptionįVHJXLWDGDXQDGHVFUL]LRQHSLºHVDXVWLYD 3HUDQGDUHDOHJJHUHFRQFDGHQ]DUHJRODUHL
con la voce “long_descriptionį6HJXHODYRFHĮauthor” UHJLVWULGLLQWHUHVVHGHOQRVWUR0&3DEELDPR
HUHODWLYRLQGLUL]]RHPDLOGLVXSSRUWRĮauthor_email”. predisposto due timer, uno con periodo di 5
6HJXHODYRFHĮurl” con il link dello sviluppatore VHFRQGL def ReadsAndPrintsRegisters():)
HUHODWLYDOLFHQ]DVRIWZDUHĮlicenseį,QŎQHODYRFH HOĬDOWURFRQSHULRGRSDULDVHFRQGR def
“platform” per cui è stato sviluppato il codice e la voce CheckAlarmsFlag():).
“packageįDGLGHQWLŎFDUHFKHTXHOORLQHVVHUH©XQ &RQFDGHQ]DSDULDVHFRQGLVLYDQQRDOHJJHUHL
SDFFKHWWRGLGLVWULEX]LRQH3HUFUHDUHLOSDFFKHWWRGL UHJLVWULGHO7LPH.HHSHUDOORVFRSRGLPRVWUDUHD
GLVWULEX]LRQHVLGHYHHVHJXLUHLOVHJXHQWHFRPDQGR YLGHRODGDWDHOĬRUDFRUUHQWLLUHJLVWULGLDOODUPHSHU
YLVXDOL]]DUQHODFRQŎJXUD]LRQHHVHQHFHVVDULRL
sudo python setup.py sdist
UHJLVWULGL7LPH6WDPS4XHVWLXOWLPLYHQJRQROHWWL
XQDVRODYROWDDOOĬDFFHQVLRQHGHOODQRVWUDVFKHGD
FKHFUHDXQŎOHFRPSUHVVRFRQWHQHQWHLOSDFFKHWWRGL 5DVSEHUU\3L

Elettronica In ~ Maggio 2016 65


&RQÀJXUDUHRaspberry Pi
6HqODSULPDYROWDFKHXWLOL]]DWH5DVSEHUU\3LRQRQDYHWH VXGRUDVSLFRQ¿J

PDLSURYDWRDVFULYHUHGHOFRGLFH3\WKRQFRQYLHQHHVHJXLUH
‡ FRPHLQ Fig. 3VHOH]LRQLDPRODYRFH´Advanced Optionsµ
XQDVHULHGLSDVVLSHUFRQÀJXUDUH5DVSEHUU\3LLQPRGRGD
‡ QHOODQXRYDVFKHUPDWDVHOH]LRQLDPRODYRFH“A7 I2C
XWLOL]]DUHOHOLEUHULHGLJHVWLRQHGHL*3,2HGHOEXV,2&9HGLDPR
Enable/Disable automatic loading”FRPHLQFig. 4
SDVVRSDVVRFRPHSURFHGHUH
‡ QHOOHVHJXHQWLVFKHUPDWHULVSRQGHUHLQVHTXHQ]D“Yes”
  3HUSULPDFRVDLQVWDOODUHODOLEUHULD3\WKRQSHUODJHVWLRQH
“Ok”“Yes”HLQÀQHDQFRUD“Ok”
GHJOL,2GL5DVSEHUU\3LHVHJLjLQVWDOODWDSURYYHGHUHDG
‡ XVFLLDPRTXLQGLGDOODÀQHVWUDGLFRQÀJXUD]LRQH
DJJLRUQDUODDOO·XOWLPDUHOHDVHGLVSRQLELOHFKHDWWXDOPHQWH
VHOH]LRQDQGRODYRFH“Finish”
qOD
‡ 3HUYHULÀFDUHO·DWWXDOHYHUVLRQHGHOODOLEUHULD*3,2
  3URFHGLDPRFRQXQUHERRWGHOVLVWHPDHVHJXHQGRLOFRPDQGR
HVHJXLUHLOVHJXHQWHFRPDQGR
sudo reboot
¿QGusr | grep -i gpio
‡ GRSRDYHUHULDYYLDWR5DVSEHUU\3LDSULUHFRQXQHGLWRUGL
 /DFig. 2HYLGHQ]LDLOIHHGEDFNGHOFRPDQGRLQYLDWRLQ WHVWRJHQHULFRLOÀOH“modules”
TXHVWRFDVRODOLEUHULDULVXOWDDJJLRUQDWDDOO·XOWLPDUHOHDVH
6HODUHOHDVHGHOODOLEUHULDGRYHVVHHVVHUHLQIHULRUHDOOD  VXGRQDQRHWFPRGXOHV
SURYYHGHUHDGXQVXRDJJLRUQDPHQWRXVDQGRL
VHJXHQWLFRPDQGL ‡ $JJLXQJHUHVHPDQFDQWLOHVHJXHQWLGXHULJKHFRPH
HYLGHQ]LDWRQHOOD Fig. 5.
sudo apt-get update
sudo apt-get upgrade

RSSXUHLPSDUWHQGRLVHJXHQWL

sudo apt-get install python-rpi.gpio


sudo apt-get install python3-rpi.gpio

  3DVVLDPRRUDDOODFRQÀJXUD]LRQHGHOODSHULIHULFD,2&PHVVD
DGLVSRVL]LRQHGD5DVSEHUU\3L
‡ SURFHGLDPRFRQO·LQVWDOOD]LRQHGHOODOLEUHULD3\WKRQ
“smbusµSHUODJHVWLRQHGHOEXV,2&

sudo apt-get install python-smbus

‡ VHJXLWDGDTXHOODGHLWRROV,2&

sudo apt-get install i2c-tools

  'REELDPRSRLDELOLWDUHLOVXSSRUWRGHOEXV,2&GDSDUWHGHO
NHUQHOSHUIDUHFLzqQHFHVVDULRULFKLDPDUHODÀQHVWUDGL Fig. 2
FRQÀJXUD]LRQHGLJLWDQGRLOFRPDQGR


,OVHFRQGRWLPHULPSRVWDWRFRQFDGHQ]DSDULD 3ULPDGLFRQFOXGHUHLOSURFHVVRGLVDELOLWD
VHFRQGRVHUYHSHUPRQLWRUDUHJOLDOODUPLQHOFDVRLQ OĬDOODUPHHDWWLYDOĬDOODUPH
cui uno dei due allarmi sia attivo, si provvederà ad 2) Azione spegnimento programmato scheda.
HVHJXLUHXQDGHOOHGXHD]LRQLGLVHJXLWRHOHQFDWH /ĬDOODUPH©VWDWRLPSRVWDWRSHUIRU]DUHOR
1) Azione accensione programmata scheda. VSHJQLPHQWRGHOODVFKHGD5DVSEHUU\3LHTXLQGL
/ĬDOODUPH©LPSRVWDWRSHUDFFHQGHUHDXQ anche della nostra elettronica, a un determinato
GDWRRUDULROĬHOHWWURQLFDGHOODQRVWUDVFKHGDHGL RUDULR,QTXHVWRFDVRORVNHWFKULOHYDFKHLOŏDJ
FRQVHJXHQ]DDQFKHOD5DVSEHUU\3L GHOOĬDOODUPH©DORJLFRHGLFRQVHJXHQ]D
4XLQGLLQTXHVWRFDVRORVNHWFKULOHYDFKHLOŏDJ DELOLWDOĬDOODUPHHGLVDELOLWDOĬDOODUPHUHVHWWD
GHOOĬDOODUPH©DIRU]DOĬDOLPHQWD]LRQHDG21 LOŏDJSHQGHQWHGHOOĬDOODUPHHLQYLDLOFRPDQGR
tramite la linea “FORCE_ONįHUHVHWWDLOŏDJGL GLVKXWGRZQDOOD5DVSEHUU\3LLOTXDOHLQL]LHU¡
allarme. ODSURSULDSURFHGXUDGLVSHJQLPHQWR&RQFOXVR

66 Maggio 2016 ~ Elettronica In


Fig. 3 Fig. 4

Fig. 5
Fig. 6

i2c-bcm2708 blacklist spi-bcm2708


i2c-dev blacklist i2c-bcm2708

  3HUXOWLPRGRYHWHYHULÀFDUHVHQHOODYRVWUDGLVWULEX]LRQHq   $TXHVWRSXQWRQRQULPDQHFKHULDYYLDUHQXRYDPHQWH
SUHVHQWHLOÀOH OD5DVSEHUU\3LHYHULÀFDUHFKHODFRPXQLFD]LRQH,2&VLD
 DWWLYD3HUIDUHFLzHVHJXLWHLOFRPDQGR
 HWFPRGSUREHGUDVSLEODFNOLVWFRQI
sudo i2cdetect -y 1
‡ 6HGRYHVVHHVVHUHSUHVHQWHDSULWHORFRQXQHGLWRUGLWHVWR
 6HWXWWRqDQGDWRDEXRQÀQHLOFRPDQGRLQYLDWRULWRUQD
 VXGRQDQRHWFPRGSUREHGUDVSLEODFNOLVWFRQI XQDWDEHOODFRPHTXHOODPRVWUDWDLQFig. 6,QSUDWLFDLO
FRPDQGRDQDOL]]DLOEXV,2&LQFHUFDGLSHULIHULFKHHQHO
‡ 6HSUHVHQWLFRPPHQWDWHXWLOL]]DQGRLOFDUDWWHUH“#”OH QRVWURFDVRKDLQGLYLGXDWRO·LQWHJUDWR0&3FRQL
VHJXHQWLULJKH VXRLGXHLQGLUL]]L[H[)

ORVKXWGRZQGHOOD5DVSEHUU\3LODOLQHD avviene semplicemente richiamando la funzione


“FORCE_ONįYHUU¡ULODVFLDWDFRQFRQVHJXHQWH “CheckAlarmsFlag()” dal main prima di entrare
VSHJQLPHQWRGHOODQRVWUDHOHWWURQLFD QHOORRSLQŎQLWR
2VVHUYLDPRRUDSLºQHOGHWWDJOLRLOFRGLFH
I due time esaminati sono dei “thread” e per SUHVHQWHQHLGXHWLPHUDGHVHPSLRTXHOORLQ
DYYLDUOLVLGHYHXVDUHODVHJXHQWHOLQHDGLFRGLFH “CheckAlarmsFlag()į6LQRWHUDQQRSLºULFKLDPL
DOODQRVWUDOLEUHULD0&3VLDDOLYHOORGLOHWWXUD
threading.Timer(1.0, CheckAlarmsFlag).start() della sola struttura dati sia a livello di chiamata
GLIXQ]LRQH$GHVHPSLRVLWHVWDQRLŏDJGHLGXH
dove il primo parametro indica la cadenza, in allarmi sfruttando la struttura dati:
TXHVWRFDVRVHFRQGRPHQWUHLOVHFRQGRSDUDPHWUR
LQGLFDDTXDOHIXQ]LRQH©DVVRFLDWR,OSULPRDYYLR if 0&3B$ODUP$OP>@:HHN'D\:N'D\%LW$ODUP,)  

Elettronica In ~ Maggio 2016 67


SUHFHGHQWH6HJXHOĬDWWLYD]LRQHGHLGXH7LPHUGL
FXLDEELDPRSDUODWRSULPDHLQŎQHLOFLFORĮwhile”
LQŎQLWR
$OOĬLQWHUQRGHOFLFORĮwhile” trovano posto la
JHVWLRQHGHLWUHSXOVDQWL33H3DLTXDOLVRQR
VWDWHDVVHJQDWHWUHIXQ]LRQLGLIIHUHQWL
,OSXOVDQWH3VHUYHSHUSURJUDPPDUHODGDWDH
OĬRUDGL0&3HSHUIDUHFL³ULFKLDPDXQD
IXQ]LRQHDSSRVLWDFKHOHJJHGDWDHRUDGLVLVWHPD
HODWUDVIHULVFHDOOĬLQWHJUDWR/DIXQ]LRQHFKHVL
RFFXSDGLSURJUDPPDUHGDWDHRUDGL0&3
si chiama “SetTimeKeeperByLocalDateTim
H ³+´ ” a cui va passato un solo parametro,
ovverRVHLOIRUPDWRGHOOĬRUDGHEEDHVVHUHKR
K,OSDUDPHWUR©GLWLSRVWULQJD ODIXQ]LRQH
©PHPRUL]]DWDQHOŎOHĮMCP79410_SetRegister.
Questa struttura dati è un array di strutture perché pyį 6HLQYHFHVLYXROHLPSRVWDUHODGDWDHOĬRUD
JOLDOODUPLVRQRGXH1HOFRGLFHHVSRVWRVLSXQWD PDQXDOPHQWHYDULFKLDPDWDODVHJXHQWHIXQ]LRQH
DOOĬDOODUPHLQSDUWLFRODUHDOUHJLVWUR:HHN'D\
ALM0WKDAY HDOUHODWLYRŏDJGLDOODUPH ManualSetTimeKeeper(Hours, Minutes, Seconds,
ALM0IF 3HULGHWWDJOLVXLUHJLVWULFRQVXOWDWHLO Set_12H_24H, Set_AM_PM, Date, Month, Year, WkDay)
GDWDVKHHW2OWUHDOWHVWVRSUDHVSRVWRFLVRQRGHOOH
chiamate a funzione, come ad esempio “MCP79410. ODTXDOHULFKLHGHXQDVHULHGLSDUDPHWUL8Q
Alarm0Bit(0)įSHUGLVDELOLWDUHOĬDOODUPHRSSXUH HVHPSLRGLXWLOL]]RSRWUHEEHHVVHUHLOVHJXHQWH
“MCP79410.ResetAlarmIntFlagBit(0)” per
UHVHWWDUHLOŏDJGHOOĬDOODUPH 0DQXDO6HW7LPH.HHSHU ³+´³$0´
Analizziamo ora la routine “main()”: in testa ad
HVVDVLHVHJXHXQDOHWWXUDGHOOD((3520LQWHUQD &RV­VLLPSRVWDOĬRUDQHOIRUPDWRĮ24HįDOOH
DOOĬ0&3HVFOXVLYDPHQWHSHUVFRSRGLGDWWLFR ODGDWD©9HQHUG­HODGLFLWXUDĮAM”
HSHUIDUHFL³VLVIUXWWDODIXQ]LRQHGLOLEUHULD rispetto a “PMįSHUGHGLVLJQLŎFDWRLQTXDQWRLO
SHUOHJJHUHXQDUUD\GLE\WHDSDUWLUHGDXQGDWR IRUPDWRGHOOĬRUD©Į24H”.
indirizzo. La funzione prevede tre parametri: 6HIRVVHVWDWDLQĮ12H” avremmo dovuto passare i
SDUDPHWULQHOVHJXHQWHPRGR
MCP79410.ReadArray(MCP79410.EEPROM_HW_ADD, 0, 13)
0DQXDO6HW7LPH.HHSHU ³+´³30´
,OSULPR©OĬLQGLUL]]RKDUGZDUHFKHFRPHJL¡
DPSLDPHQWHGHWWR©GLYHUVRGDTXHOORGHO57&& In entrambi i casi le funzioni riempono la struttura
VHJXHOĬLQGLUL]]RGLSDUWHQ]DGDFXLLQL]LDUHOD GDWLLQHUHQWHLUHJLVWULGHO7LPH.HHSHUSHUSRL
OHWWXUDGHLGDWLHLQŎQHLOQXPHURGLE\WHFKHVL ULFKLDPDUHODIXQ]LRQHGLOLEUHULDFKHHVHJXHOD
YXROHOHJJHUH,OULVXOWDWRGHOODOHWWXUDYLHQHPHVVR VFULWWXUDŎVLFDVXOGLVSRVLWLYR
LQXQDUUD\DFXLVLSXQWDFRQODVHJXHQWH ,OSXOVDQWH3VHUYHSHUSURJUDPPDUHJOLDOODUPLH
DOORVFRSRULFKLDPDGXHIXQ]LRQLGLVWLQWHXQDSHU
0&3'DWD$UUD\>L@ OĬDOODUPHHOĬDOWUDSHUOĬDOODUPH
/DFRQŎJXUD]LRQH©VRORGLWLSRPDQXDOHHYLHQH
dove “iį©OĬLQGLUL]]RGHOOĬDUUD\/DGLPHQVLRQH HVHJXLWDVRORGDFRGLFHFL³VLJQLŎFDFKHQRQ
PDVVLPD©LPSRVWDWDDE\WH,OFRQWHQXWRYLHQH abbiamo predisposto un sistema di inserimento dati
poi stampato a video facendo comparire la scritta da tastiera. La funzione da chiamare per impostare
“ElettronicaInį/DVFULWWXUDLQ((3520©VWDWDIDWWD JOLDOODUPL©ODVHJXHQWH
FRQOĬRPRQLPDIXQ]LRQH
ManualSetAlarm0(Index, Hours, Minutes, Seconds,
MCP79410.WriteArray(MCP79410.EEPROM_HW_ADD, n, m) Set_12H_24H, Set_AM_PM, Date, Month, WkDay, AlarmMask, AlarmPol)

DOODTXDOHVLSDVVDQRJOLVWHVVLSDUDPHWULGHOOD &RPHVLSX³QRWDUHFLVRQRSDUHFFKLSDUDPHWULGD

68 Maggio 2016 ~ Elettronica In


passarle; un esempio potrebbe essere:  VXGRQDQRHWFLQLWWDE

0DQXDO6HW$ODUP ³+´³$0´³/+/´)  FHUFDUHQHOŎOHODVHJXHQWHULJD

&RV­IDFHQGRVWLDPRGLFHQGRDOODIXQ]LRQHGL UHVSDZQVELQJHWW\±QRFOHDUWW\
ODYRUDUHVXOOĬDOODUPHOĬRUD©QHOIRUPDWRĮ24H”
LPSRVWDWDDOOH/DGDWD©LPSRVWDWDD  FRPPHQWDUODXWLOL]]DQGRLOFDUDWWHUHĮ#” in testa
 /ĬDQQRQRQ©VSHFLŎFDWRSHUFKªSULYRGL DOODULJDVRWWRDGHVVDDJJLXQJHUHODVHJXHQWH Įpi”
VLJQLŎFDWRSHUJOLDOODUPL,OJLRUQRGHOODVHWWLPDQD ©ORXVHUQDPH 
©OXQHG­ODPDVFKHUDSHUJOLDOODUPL©ŎVVDWDVXL
minuti e la polarità è “Logic High Level”. UHVSDZQELQORJLQISLWW\GHYWW\!
$QFKHLQTXHVWRFDVRODIXQ]LRQHULHPSHXQD GHYWW\! 
struttura dati per poi richiamare una funzione di
OLEUHULDFKHHVHJXHODVFULWWXUDŎVLFDVXOGLVSRVLWLYR  XVFLUHHVDOYDUHLOŎOHFRV­PRGLŎFDWRSUHPHQGR
6XJJHULDPRGLFRQVXOWDUHLOGDWDVKHHWSHULGHWWDJOL “ctrl+x” e successivamente “y”;
VXLUHJLVWUL  VDOYDWRLOŎOHHVHJXLUHLOVHJXHQWHFRPDQGR
,OSXOVDQWH3YLHQHXVDWRSHUGLVDELOLWDUHHUHVHWWDUH
JOLDOODUPLH'RSRLOUHVHWGHJOLDOODUPLHODORUR VXGRQDQRHWFSUR¿OH
disabilitazione lo sketch si limita a mostrare la data
HOĬRUDOHWWDGDO57&&FRQFDGHQ]DGLVHFRQGL  DQGDUHLQIRQGRDOŎOHHDJJLXQJHUHODVHJXHQWH
3HUODVWDPSDDYLGHRGLWDOLLQIRUPD]LRQLVL
richiama una funzione di stampa contenuta nel sXGRS\WKRQKRPHSL3\WKRQ3URMHFW0&3B
ŎOHĮMCP79410_PrintFunc.pyįDOODTXDOHVLGHYH /LE:.0&3B6HW$QG5HDG5HJLVWHUVS\
passare una serie di parametri per decidere cosa
stampare e cosa no. 2YYLDPHQWHFRPHSHUFRUVRGRYHWHPHWWHUHTXHOOR
La funzione in esame si chiama: del vostro sistema; nel nostro caso il path in cui si
WURYDQRLWUHŎOHGHOORVNHWFKGLHVHPSLR©Į/home/
PrintDataMCP79410(PrintTimeKeeper, PrintAlarm0, pi/PythonProject/MCP79410_Lib/WK/į$OODŎQH
PrintAlarm1, PrintPowerDown, PrintPowerUp) riavviate il sistema.

,SDUDPHWULGDSDVVDUJOLQRQVRQRDOWURFKHYDORUL CONCLUSIONI
ERROHDQLYHURRIDOVRHGLFRQRDOODIXQ]LRQHFRVDVL &RQTXHVWRDEELDPRFRQFOXVRODWUDWWD]LRQHGHOOD
vuole stampare a video. JHVWLRQHGHOODQRVWUDVFKHGDFRQ57&&WUDPLWH
&RPHVXJJHULVFRQRLQRPLLQVHTXHQ]DDEELDPR 5DVSEHUU\3L9LDEELDPRGDWRGLYHUVLVSXQWLGL
• stampa a video di data e ora; ULŏHVVLRQHSHUUHDOL]]DUHOHYRVWUHSLºGLVSDUDWH
ij VWDPSDDYLGHRLPSRVWD]LRQL$OODUPH DSSOLFD]LRQLVIUXWWDQGRODQRVWUDOLEUHULD3\WKRQ
ij VWDPSDDYLGHRLPSRVWD]LRQL$OODUPH DSSRVLWDPHQWHVFULWWDSHUOĬRFFDVLRQH
ij VWDPSDDYLGHRYDORULGL7LPH6WDPS 1RQFLULPDQHFKHDXJXUDUYLEXRQODYRUR J
3RZHU'RZQ
ij VWDPSDDYLGHRYDORULGLWLPH6WDPS3RZHU8S

6HWXWWLLYDORULERROHDQLVRQRSRVWLDĮFalse” niente
verrà stampato a video. per il MATERIALE
AVVIO AUTOMATICO DELLO SKETCH DOPO IL BOOT Lo shield RTC Raspberry-Arduino (cod. FT1254M)
,OSDVVRVXFFHVVLYRFRQVLVWHQHOUHQGHUHDXWR viene venduto montato e collaudato ed è disponibile
avviante il nostro codice dopo il boot del sistema presso Futura Elettronica al prezzo di Euro 20,00 IVA
operativo. Allo scopo, prima di tutto si deve compresa.
GHFLGHUHVHVLLQWHQGHPDQWHQHUHLOORJLQDWWLYR
oppure no; nel caso in cui si decida di saltare la fase
Il materiale va richiesto a:
GLORJLQVLGHYHSURFHGHUHFRV­
Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
  XWLOL]]DQGRLOWHUPLQDOHHVHJXLUHLOVHJXHQWH
Tel: 0331-799775 • Fax: 0331-792287 - www.futurashop.it
comando:

Elettronica In ~ Maggio 2016 69


NO V I T À A S S O L U TA !
S TA M PA N T E 3 D 4 0 x 4 0 x 4 0 c m
Nuovissima stampante 3D FDM (Fused deposition modeling)
in KIT capace di produrre stampe di 40x40x40 cm (64.000 cm3)

SIG
N E D BY
€ 999,00
DE

Cod. 3D4040
DE

SIG
NE D B Y

Prezzo IVA inclusa.


40 cm

m 40 c
40 c m

S  truttura interamente in alluminio P  iatto di stampa fisso: vetro


A  rea di stampa: X 40 cm, temperato da 6 mm
Y 40 cm, Z 40 cm R  iscaldatore per piatto di stampa:
 Diametro filamento: 1,75 mm 40 x 40 cm – 12V/240 W
 T ipo di filamento: ABS, PLA, con adesivo 3M (opzionale)
NYLON ed altri ancora C  ontrollabile da PC o da modulo
D  iametro ugello fornito: 0,4 mm LCD (opzionale)
D  iametro ugelli opzionali: A  limentazione tramite
da 0,3 mm a 0,8 mm modulo switching
V  elocità di stampa massima: 220 VAC/12 VDC 350 W
300 mm/s (in funzione  Istruzioni di montaggio in italiano
dell’oggetto da stampare) con illustrazioni

Futura Group
Futura
srl Group srl
Caratteristiche tecniche di questi prodotti
® www.futurashop.it Via
ViaAdige,
Adige,11
11• •21013
21013Gallarate
Gallarate(VA)
(VA)
e acquisti on-line su www.futurashop.it
Tel. 0331/799775
Tel. 0331/799775
• Fax. 0331/792287
Arduino
Fornisce ad Arduino la
connettività WiFi e il supporto di
memoria su SD-Card; basato su
un nuovo modulo interamente
programmabile, offre il miglior
rapporto qualità/prezzo con
consumi di elettricità ridottissimi
che lo rendono ideale per
applicazioni a batteria.

on è la prima volta che


N proponiamo uno shield
dedicato alle connessioni in rete
wireless e la ragione di ciò è du-
plice: da un lato c’è l’interesse del
mondo Arduino per applicazioni
che si connettano a smartphone
e tablet o che possano accedere a
Internet tramite WiFi e dall’altro
c’è la fervente attività dei produt-
tori che, con una buona fre-
quenza, immettono sul mercato WiFi Shield
CON ESP8266
prodotti sempre più aggiornati e
concorrenziali.
Lo shield che vi proponiamo in
queste pagine si basa sul modu-
dell’Ing. MIRCO SEGATELLO

Elettronica In ~ Novembre 2015 87


Tabella 1. Le applicazioni cui
il componente è destinato sono
home automation, reti mesh, wi-
reless industriale, baby monitor,
telecamere di rete wireless, reti
di sensori, elettronica indossabi-
le, dispositivi di localizzazione
wireless location-aware devices,
security ID tag ecc.
Le caratteristiche e le funzioni
implementate sono:
• compatibilità 802.11 b/g/n;
• WiFi Direct (P2P), soft-AP;
Fig. 1 - La famiglia di moduli ESP. • supporto stack TCP/IP;
• TR switch, balun, LNA, ampli-

lo WiFi che abbiamo utilizzato 32 bit completo di ROM, RAM Tabella 1 - Funzione dei pin del chip
nella demoboard ESP pubbli- e SRAM per programma e dati; ESP8266.
cata sullo scorso numero della il chip dispone di linee di I/O
GPIO INPUT OUTPUT PWM
rivista. Rispetto a quelli utilizzati digitali ed ingressi analogici,
GPIO0 sì no no
in passato (per esempio della oltre che di porte di comunica-
GPIO2 sì no no
Microchip), questo modulo, pre- zione come I²C, SPI e UART. Le
GPIO12 sì sì sì
senta un prezzo molto contenuto porte di comunicazione possono
GPIO13 sì sì sì
pur mantenendo caratteristiche funzionare da slave in modo da GPIO14 sì sì no
di rilievo. Il modulo si chiama interfacciare memorie esterne al GPIO15 sì sì sì
ESP03, viene commercializzato modulo ed ampliarne il funzio-
dalla Futura Elettronica (www. namento. Le linee digitali dispo-
futurashop.it) ed è basato sull’in- QLELOLVRQRVHGLFLFRQŎJXUDELOL ŎFDWRUH5)HDFFRSSLDPHQWR
tegrato ESP8266, prodotto dalla come ingressi o uscite, tutte con alla rete integrati;
Espressif Systems (http://espressif. resistenza di pull-up e con la pos- • PLL e gestore dell’alimentazio-
com) per funzionare in modo sibilità di generare un interrupt. ne integrati;
autonomo all’interno di una rete Sono disponibili anche alcune • potenza in trasmissione in
Wi-Fi. Infatti l’ESP8266 contiene linee di ingresso e di uscita ana- 802.11b di +19,5 dBm;
non solo lo stadio RF, ma anche logiche basate su un convertitore • sensore termico integrato;
un microcontrollore pienamente sigma-delta a PWM. • supporto per antenna diversi-
programmabile ed un registro Il chip è stato progettato per fun- ty;
cui fanno capo degli I/O, oltre a zionare ad una tensione di 3,3V • CPU a 32 bit;
bus di comunicazione come l’SPI con un massimo ammissibile di • SDIO 2.0, SPI, UART;
HOĬ,s&4XHVWRVLJQLŎFDFKHLO 3,6V, gli ingressi digitali dispon- • STBC, 1x1 MIMO, 2x1 MIMO;
componente può da solo imple- gono di un apposito circuito • A-MPDU, A-MSDU;
mentare la comunicazione in (overvoltage protection) per • solo 2 ms per connessione e
WiFi; inoltre, la possibilità di far proteggere l’integrato da tensioni trasferimento di pacchetti dati;
eseguire al chip un programma, in ingresso superiori a 6V. • corrente assorbita in stato di
permette la gestione di alcuni Per ultimo menzioniamo il off minore di 10 μA;
SLQ *3,2EXVYDUL DOŎQHGL supporto a tutti i protocolli di • consumo in standby minore di
realizzare un sistema che possa cifratura più moderni:WEP (RC4), 1 mW (DTIM3).
interfacciarsi con periferiche CCMP (CBC-MAC, counting
esterne di vario genere o gestire mode), TKIP (MIC, RC4) o WAPI Siccome l’ESP8266 nasce per
ingressi e uscite. (SMS4), WEP (RC4), CRC, WPA, fornire la connettività WiFi in
WPA2 e WPS. dispositivi mobili o indossabili
L’INTEGRATO ESP8266 Per completare la descrizione del alimentati a batteria, implementa
All’interno del chip ESP8266 chip ESP8266 riportiamo il fun- modalità a basso consumo di
troviamo un microcontrollore a zionamento dei singoli pin nella energia che sono: active mode, sle-

88 Novembre 2015 ~ Elettronica In


Un integrato,
tanti moduli WiFi
In commercio si trovano varie versioni di
ep mode e deep sleep mode, ognuna sull’ESP8266, che si distinguono modulo WiFi basato sul chip ESP8266
delle quali prevede l’attivazione per form-factor; noi nel nostro che si differenziano per le dimensioni ed
di un certo numero di periferiche. shield prevediamo l’ESP03, ma è i pin resi disponili sul connettore di co-
Nella sleep mode il modulo radio possibile montarvi anche l’ESP01. municazione oltre a diverse versioni del
è spento mentre rimangono attivi In alcuni moduli della serie ESP ÀUPZDUHLQWHUQR9HGLDPRLSULQFLSDOL
il timer e il watchdog e l’assorbi- sono presenti dei LED: il LED
ESP-01: il più comune modulo con anten-
mento è di soli 12 μA; in questa rosso indica presenza della ten-
na integrata nel PCB
modalità è possibile programma- sione di alimentazione (POWER - piedinatura a 2x4 contatti a passo
UHLOWLPHULQWHUQRDIŎQFKªDWWLYL STATUS) mentre il LED blu lam- 2,54;
il modulo radio a intervalli rego- peggia quando il modulo avvia - antenna su PCB;
lari per inviare o ricevere dati. il boot (MODULE STATUS) o - 2 GPIO;
All’occorrenza è possibile atti- operazioni di comunicazione. - UART URXD/UTXD;
vare il modulo radio e abilitare  UHVHWHIXQ]LRQH&+B3' 3RZHU
le trasmissioni, tramite segnali SCHEMA ELETTRICO 'RZQ 
dall’esterno. Da software è anche Andiamo ora a descrivere lo  GLPHQVLRQLGL[PP
possibile ridurre la potenza di shield appositamente proget-
ESP-02: modulo con connettore per anten-
emissione e ridurre i consumi in tato per questo modulo. Oltre na esterna, compatibile con breadboard
applicazioni in cui sono richieste all’ESP03 (siglato U3 nel circuito), - piedinatura 2x4 contatti a passo 2,54 DIP;
comunicazioni a brevi distanze nello shield si trovano alcuni - 2 GPIO;
come in dispositivi indossabili. jumper per le impostazioni e - UART URXD/UTXD;
La linea CHIP_PD disponibile sul un lettore di SD-Card multiuso  UHVHWHIXQ]LRQH&+B3' 3RZHU
connettore esterno permette di (SD1), interfacciato tramite un 'RZQ 
portare il modulo nello stato di adattatore di livelli 74HC4050  GLPHQVLRQLGLPP[PP
deep sleep mode con un assorbi- (U2) ad Arduino; l’adattatore
(639HUVLRQH607 6XIUDFH0RXQW
mento di corrente quasi zero. serve a trasformare i segnali TTL
7HFKQRORJ\ FRQWXWWLLSLQGLVSRQLELOLH
L’assorbimento di corrente du- delle linee di Arduino usate per antenna ceramica integrata
rante l’active mode raggiunge un la gestione della SD in 0/3,3V  ÀOHGLFRQWDWWLDSDVVRPP
massimo di 215 mA alla massi- come previsto dalle card di me- - antenna ceramica integrata;
ma potenza di trasmissione con moria. Lo slot per la SD permette - 7 GPIO;
protocollo 802.11b a 11 Mbps e di memorizzare vari dati: ad - UART URXD/UTXD;
scende a 145 mA con protocollo esempio una pagina web, oppure  UHVHWHIXQ]LRQH&+B3' 3RZHU
802.11g a 54 Mbps (diviene soli le registrazioni di un data-logger 'RZQ 
60 mA per l’invio di un pacchet- sul web ed altro ancora.  GLPHQVLRQLPP[PP
to di 1.024 byte con potenza in Tutta la logica è alimentata con i
(639HUVLRQH607 6XIUDFH0RXQW
antenna di -65dBm). Prima di 3,3V ricavati dal regolatore LDO 7HFKQRORJ\ FRQWXWWLLSLQGLVSRQLELOLPD
procedere facciamo notare che U1, che partendo dai 5V forniti senza antenna
esistono vari moduli WiFi basati dalla omonima linea di Arduino  ÀOHGLFRQWDWWLDSDVVRPP
- antenna esterna;
- 7 GPIO;
- UART URXD/UTXD;
 UHVHWHIXQ]LRQH&+B3' 3RZHU
'RZQ 
 GLPHQVLRQLGLPP[PP

(639HUVLRQHFRQVRODFRPXQLFD]LR-
ne UART e connettore per antenna
- piedinatura a 2x4 contatti a passo
2,54 mm;
- connettore U-FL per antenna esterna;
- nessun GPIO;
- UART URXD/UTXD;
 UHVHWHIXQ]LRQH&+B3' 3RZHU
'RZQ 
 GLPHQVLRQLGL[PP
Fig. 2 - Piedinatura del modulo ESP03.

Elettronica In ~ Novembre 2015 89


[schema ELETTRICO]

Tabella 2 - Disposizione dei jumper per la comunicazione.


ricava detta tensione, opportu-
QDPHQWHŎOWUDWDGDLFRQGHQVDWRUL COMUNICAZIONE DI ESP8266 JUMPER
C2, C4, C5, C6; il LED LD1, con VHULDOHVRIWZDUHSLQHGL$UGXLQR (637; 'H(635; '
in serie R2, indica la presenza dei UART di Arduino ESPTX=D0 e ESPRX=D1
3,3 volt. Comunicazione con PC tramite convertitore
ESPTX=D1 e ESPRX=D0
Il jumper SDCS (SD chip select) USB/seriale di Arduino
permette di selezionare il pin da
usarsi per la gestione della SD; attivo). Nello shield sono di- ESP8266-03, utili per chi volesse
SHULPSRVWD]LRQHSUHGHŎQLWD sponibili, in un connettore strip gestire direttamente il modu-
la libreria di Arduino utilizza maschio, tutti i pin del modulo lo. Entrambi i moduli previsti
il pin 4. Il jumper ESPPD (ESP
Power Down), se cortocircuitato
permette di selezionare il pin D7 Tabella 3 - Collegamento hardware dello shield.
per il controllo della modalità di PIN FUNZIONE PIN ARDUINO
funzionamento del modulo; in
SD_CS SD chip select D4 o D10
questo caso, tramite la linea D7
6'B026, 6'026, D11
di Arduino è possibile accendere 6'B0,62 6'0,62 D12
e spegnere il modulo secondo SD_CLK SD clock D13
esigenza, con un considerevole ESPTX ESP-8266 linea TX ' 5; R' 7; R'
risparmio energetico (diversa- ESPRX ESP-8266 linea RX ' 5; R' 7; R'
mente, il modulo rimarrà sempre ESPPD (63FKLSVHOHFW SRZHUGRZQFRQWURO 9R'

90 Novembre 2015 ~ Elettronica In


Comandi AT disponibili
per il modulo ESP-8266
General functions AT+ CIPSTA – Set ip address of station
dispongono di un’interfaccia AT – Test AT start up Test AT+ CIPAP – Set ip address of softAP
di comunicazione seriale stan- AT+RST – Restart module
$7*057*05²9LHZYHUVLRQLQIR TCP/IP functions
dard compatibile con Arduino,
AT+GSLP Enter deep-sleep mode AT+ CIPSTATUS – Information about
consistente nelle due linee dati ATE – AT commands echo connection
TX e RX, le quali possono esse- AT+CIPSTART – Start connection
re convogliate verso la seriale WiFi functions AT+CIPSEND – Send data
hardware, oppure sui pin D8 e $7&:02'(²:,),PRGH AT+CIPCLOSE – Close TCP or UDP
D9 (gestibili con una seriale sof- AT+CWJAP – Connect to AP connection
tware). La selezione della comu- AT+CWLAP – List available APs AT+CIFSR – Get local IP address
nicazione con U3 avviene tramite AT+CWQAP – Disconnect from AP $7&,308;²(QDEOHPXOWLSOHFRQ-
i jumper ESPRX (commutano la $7&:6$3²&RQÀJXUDWLRQRIVRIW$3 nections
mode $7&,36(59(5²&RQÀJXUHDV7&3
linea RX) ed ESPTX (commutano
AT+CWLIF – IP of stations server
la linea RX) secondo la Tabella AT+CWDHCP – Enable/Disable DHCP $7&,302'(²6HWWUDQVIHUPRGH
2. Occorre, in ogni caso, conside- $7&,367$0$&²6HWPDFDGGUHVVRI AT+ CIPSTO – Set server timeout
rare le limitazioni intrinseche di station AT+ CIUPDATE – Update through
Arduino: utilizzando la seriale $7&,3$30$&²6HWPDFDGGUHVVRI QHWZRUN
software di Arduino per comu- softAP ,3'²5HFHLYHQHWZRUNGDWD
nicare con il modulo ESP03, la
seriale hardware rimane dispo-
nibile per la programmazione e
per le comunicazioni di debug, lo UART deve essere disabilitato viene serialmente. Occorre però
mentre utilizzando la seriale caricando uno sketch che non usa porre attenzione alla versione del
hardware di Arduino (modulo la seriale hardware (il modulo modulo in possesso, in quanto i
UART) la comunicazione con il UART è disabilitato per imposta- primi moduli commercializzati
3&FUHHU¡FRQŏLWWLTXLQGLQRQ ]LRQHSUHGHŎQLWD  FRQŎUPZDUHYHUVLRQHFRPX-
sarà possibile programmare Ar- Vediamo ora l’utilizzo pratico di nicavano alla velocità di 115 kbps,
GXLQRQªLQYLDUHD6HULDO0RQLWRU questo shield partendo da alcune mentre quelli più recenti (con
messaggi di debug. È anche pos- semplici applicazioni che ci per- ŎUPZDUHYHUVLRQH[[ IXQ]LR-
sibile mettere in comunicazione il PHWWRQRGLSUHQGHUHFRQŎGHQ]D nano a 9.600 bps. La possibilità
chip ESP8266 con il PC tramite il con le funzioni implementate. di comunicare a una velocità di
convertitore USB/seriale a bordo La gestione del chip ESP8266 9.600bps permette di gestire il
di Arduino; il microcontrollore avviene con semplici comandi modulo con la seriale software,
Atmel328 non viene interessato AT da inviare serialmente; anche facilmente implementabile con
dalla comunicazione ed il modu- l’invio e la ricezione dei dati av- l’apposita libreria disponibile

Serial
Monitor per
connessione
alla rete
Wi-Fi
di casa.

Serial
Monitor per
il test come
client.

Elettronica In ~ Novembre 2015 91


&ODVVLÀFD]LRQHGHOOHSD-Card
In commercio esistono vari tipi di il logo SDHC sia sulle schede che sui
SDCard che si distinguono per la dispositivi host (fotocamere, videoca-
tecnologia impiegata, evolutasi negli PHUHHFF  AT+CWMODE=1 permette di
DQQLDSDUWLUHGDOOD6'EDVH1RQWXWWH
impostare l’accesso ad un router,
sono compatibili con le altre anche se SDXC
mentre il comando AT+CWJAP
tendenzialmente i costruttori tendono a 6'([WHQGHG 6';&ΠqXQDVFKHGD
PDQWHQHUHODUHWURFRPSDWLELOLWj 6'ŒEDVDWDVXOODVSHFLÀFD6'$ =”nomerete”,”password” ne
Di seguito sono descritte le tipologie Le capacità SDXC variano da 64 GB a permette l’accesso. Per sapere se
XQDDGXQD 7% la connessione è riuscita possia-
)RUPDWRSUHGHÀQLWRH[)$7 mo chiedere al modulo lo stato
SD 3RLFKp6';&XWLOL]]DXQÀOHV\VWHP della connessione con il comando
&DSDFLWjFKHYDQQRGD0%D*% GLYHUVRFKLDPDWRH[)$7HSRLFKqLOVXR AT+CWJAP?, mentre per cono-
)RUPDWRSUHGHÀQLWR)$7 IXQ]LRQDPHQWRqGLYHUVRULVSHWWRDOOH scere l’indirizzo IP assegnato dal
Le schede SD funzionano in tutti i schede SD standard, questo nuovo for-
router il comando è il seguente:
dispositivi host che supportano SD, PDWRQRQqFRPSDWLELOHFRQLGLVSRVLWLYL
AT+CIFSR.
6'+&R6';& KRVWFKHVXSSRUWDQRVROR6' 0%
D*% /DPDJJLRUSDUWHGHLGLVSRVLWLYL Non appena connessi alla rete,
SDHC host costruiti dopo il 2010 dovrebbe possiamo testare alcune funzio-
6'+LJK&DSDFLW\ 6'+&Œ qXQDVFKH- HVVHUHFRPSDWLELOH6';&3HUHVVHUH nalità del modulo facendolo ad
GD6'ŒEDVDWDVXOODVSHFLÀFD6' sicuri della compatibilità, cercate il logo esempio funzionare da Server nei
&DSDFLWjFKHYDQQRGD*%D*% SDXC sia sulle schede sia sui dispositivi confronti del PC; per fare questo
)RUPDWRSUHGHÀQLWR)$7 KRVW IRWRFDPHUHYLGHRFDPHUHHFF  è necessario avviare un sempli-
Poiché SDHC funziona in modo diverso cissimo client sul PC utilizzando
rispetto alle schede SD standard, que- NOTA: lettori di schede interne dei
ad esempio un software portable
VWRQXRYRIRUPDWRQRQqFRPSDWLELOH computer portatili a partire dal
di nome SocketTest, una specie
con i dispositivi host che supportano 2008 e prima potrebbero NON
VROR6' 0%²*% /DPDJJLRU VXSSRUWDUHOHVFKHGH6';&/H di monitor seriale ma per reti
parte dei lettori e dispositivi host schede SDXC funzionano nei ethernet. Invieremo in sequenza i
costruiti dopo il 2008 dovrebbe essere lettori compatibili con SDHC (non comandi:
FRPSDWLELOHFRQ6'+& LOHWWRUL6' HVHLOVLVWHPDRSHUD-
Per garantire la compatibilità, cercate WLYRGHOFRPSXWHUVXSSRUWDH[)$7 AT+CWJAP=”nomerete” , ”pas-
sword”
AT+CIPSTART=”TCP” ,
”192.168.1.128”, 9999
nell’IDE di Arduino, lasciando è a posto il modulo risponde con AT+CIPSEND=4
libera la seriale hardware di co- “OK”. Questo primo invio non fa
municare con il PC, permettendo assolutamente nulla ma permette inviate una stringa di 4 caratteri
così una facile funzione di Debug. di capire se il modulo è attivo e come ad esempio “ciao” disabi-
Per questi primi esempi, in cui funzionante; all’accensione il mo- OLWDQGROĬLQYLRGHOŎQHOLQHDHGLO
YRJOLDPRSUHQGHUHFRQŎGHQ]D dulo invia comunque la stringa ritorno carrello.
con il chip, faremo in modo da “ready...”. La ricezione di una stringa dal
poter comunicare con il chip ESP Inviando la stringa AT+RST si server sarà segnalata dalla strin-
direttamente dall’applicativo esegue un reset software del ga “+IPD” seguita dal numero di
Serial Monitor di Arduino, la- dispositivo, il quale risponderà caratteri ricevuti e quindi il testo
sciando inutilizzato il microcon- con la stringa “OK” seguita dal ricevuto.
trollore ATMEL328 della scheda. nome del fabbricante ed alcuni $EELDPRSURYDWRGLYHUVHFRQŎ-
Caricate su Arduino uno scketch dati interni al chip. La stringa gurazioni, utilizzando il modulo
che non usi la seriale, Blink.ino va AT+GMR permette di conoscere sia come client che come server ed
benissimo, e impostate i jumper ODYHUVLRQHGHOŎUPZDUHLQVWDOOD- avviato anche una comunicazio-
in modo che il modulo possa co- WR&RQTXHVWDFRQŎJXUD]LRQHLO ne UDP; in ogni caso è sempre
municare con il PC (riga 3 della modulo ESP8266 potrà comuni- stato semplice e veloce impostare
Tabella 2). care con qualsiasi applicativo del il modulo con pochissimi coman-
Aprite Serial Monitor di Arduino PC come Processing o qualsiasi di AT.
ed impostate una comunicazione monitor seriale. Nei vari listati disponibili, tro-
DESVDWWLYDQGRVLDLOŎQHOL- Possiamo sempre più prende- verete sempre una prima parte
nea che il ritorno carrello (sia NL UHFRQŎGHQ]DFRQLOPRGXOR relativa alla modalità di comuni-
che CR) quindi inviate la stringa provando a connetterci alla cazione con il modulo ESP ed alla
AT ed attendete risposta; se tutto rete Wi-Fi di casa; il comando modalità di debug, infatti in que-

92 Novembre 2015 ~ Elettronica In


sti primi esempi è sempre molto
comodo prevedere una modalità
per visionare i dati in transito dal
modulo. Collegando il jumper
ESPTX alla linea D8 e ESPRX alla
linea D9 sarà possibile gestire il
modulo utilizzando una seriale
software, lasciando libero il mo-
dulo UART dell’ATmega328 di
comunicare con il PC per scopi di
debug e programmazione; questa
modalità funziona solo con i
moduli ESP che comunicano a
9.600bps, modalità che comun- Fig. 3 - Installazione nuovo firmware.
que presenta i suoi limiti qualora
VLFRPLQFLQRDJHVWLUHŏXVVLGDWL ai siti internet. Gli unici dati
importanti contenenti oltre un da fornire sono l’indirizzo del
centinaio di caratteri, come ad server ed il nome della pagina
esempio avviene con la gestione alla quale accedere; nel listato
di pagine web. scaricabile dal nostro sito trovate
Ricordiamo che tutti gli esempi (come commenti) diversi esempi
proposti devono essere persona- di impostazioni che abbiamo
lizzati introducendo il nome del- YHULŎFDWRSHUVRQDOPHQWHWUDL
la vostra rete Wi-Fi e la password quali l’interrogazione del server
nei rispettivi campi SSID e PASS. di Google oppure la lettura dei
Abbiamo previsto, oltre alla dati meteo dal server openwea-
classica applicazione come Web thermap. Quest’ultimo esempio
Server, anche un’applicazione è particolarmente interessante
come Web Client, per dimostrare per la possibilità di conoscere le
la facilità con la quale possono condizioni meteo interrogando la Fig. 4 - Serial Monitor delle
essere richieste informazioni più vicina stazione meteo senza comunicazioni con ESP.

la necessità di utilizzare alcun


Server con sensore. Esiste anche la possibi-
SccketTest. lità di richiedere le previsioni me-
teo per i prossimi giorni; l’unico
dato da inserire è il codice della
città di cui si vogliono i dati ed
è reperibile a questo indirizzo:
http://openweathermap.org/help/
city_list.txt. Similmente, è possi-
bile interrogare il server di Yahoo
per conoscere la data e l’ora
attuale.
In questi ultimi esempi abbiamo
usato la sintassi classica html
che è composta da tre sezioni:
request (riga di richiesta), body
(corpo del messaggio) e header
(informazioni aggiuntive). La
sezione request a sua volta si
compone di tre campi: il primo è

Elettronica In ~ Novembre 2015 93


[piano di MONTAGGIO]
Elenco Componenti: messo a disposizione anche il
ŎUPZDUHGLYHUVLRQHFKH
normalmente trovate già installa-
R1: 10 kohm (0805)
R2: 330 ohm (0805) to nei moduli ESP8266.
R3÷R5: 10 kohm (0805) Una volta avviato il software
C1, C2: 220 μF 6,3 VL (non richiede installazione) è suf-
elettrolitico (Ø6mm) ŎFLHQWHVSHFLŎFDUHODSRUWD&20
C3÷C5:100 nF ceramico (0805) utilizzata per la comunicazione
C4, C5: 100 nF ceramico FRQLOPRGXORHGDSULUHLOŎOHELQ
(0805) per sapere quale seriale utilizzare
C6: C6: 22 μF 6,3 VL potete usare le informazioni for-
elettrolitico (Ø4mm)
nite dall’IDE di Arduino quando
U1: TC1262-3.3VDB
U2: 74HC4050D è connessa la scheda Arduino.
U3: ESP03 Ponete il modulo nella modali-
RST: Microswitch tà di comunicazione con il PC
PROG: Microswitch ed abilitate la modalità di boot
SDA: Connettore micro SD-Card mode del modulo ponendo la
LD1: LED verde (0805) linea GPIO0 a massa, premendo
e mantenendo premuto il pulsan-
Varie: WH352*GRSRGLFKªULDYYLDUHLO
- Strip maschio 2 vie
modulo ponendo per un attimo
- Strip maschio 3 vie (5 pz.)
- Jumper (4 pz.) la linea CHPD a livello basso
- Strip maschio 9 vie tramite il pulsante RST. Dopo
- Strip Maschio/Femmina 3 vie (2 pz.) il riavvio, il modulo si pone in
- Strip Maschio/Femmina 6 vie modalità di boot mode, pronto a
- Strip Maschio/Femmina 8 vie (2 pz.) ULFHYHUHLOQXRYRŎUPZDUHFOLF-
- Strip Maschio/Femmina 10 vie (1 pz.) cate quindi sul pulsante Down-
- Circuito stampato S1192 load per attivare il caricamento.
Appena avviato il download
GHOŎUPZDUHSRWHWHULODVFLDUH
il pulsante PROG e attendere la
il metodo di accesso e può essere saremo connessi al server con conclusione dell’operazione, che
di tipo GET (recupero informa- l’istruzione: “AT+CIPSTART = richiede in tutto alcuni minuti.
zioni), POST (invio informazioni), \”TCP\”,\””DEST_HOST”\” , Utilizzate il comando AT+GMR
HEADER (come GET, ma riceve ”DEST_PORT”\r\n”. SHUYHULŎFDUHVHLOPRGXOR
solo l’intestazione della pagina); Tutti gli esempi sono stati testati funziona correttamente e quale
il secondo è l’URI (Uniform Re- FRQPRGXOLDYHQWLŎUPZDUHYHU- YHUVLRQHGHOŎUPZDUHULVXOWD
VRXUFH,GHQWLŎHU FLR©OĬLQGLUL]]R sione 09.02, che è la più stabile installata.
della pagina cui si vuole accedere ed esente da bug; attualmente La disponibilità di una SD per
e il terzo è la versione del proto- non esiste ancora una versione salvare dei dati ci permette di
collo (nel nostro caso HTTP/1.1). GHŎQLWLYDGHOŎUPZDUHHGLQUHWH realizzare un interessante data
La sezione body contiene sem- si possono trovare versioni anche
plicemente la richiesta vera e più recenti ma ancora tutte da
propria, mentre la sezione header testare. È comunque possibile
contiene nel nostro caso l’header installare una versione differente
“HOST:”. Ecco che ad esempio GHOŎUPZDUHFRQXQDVHPSOLFH
la richiesta delle condizioni procedura che ora descrivere-
meteo può essere fatta inviando PR7UDLŎOHGLTXHVWRDUWLFROR
la richiesta: “GET /data/2.5/ troverete una cartella di nome
weather?id=3164699 HTTP/1.1 Firmware, che contiene un esegui-
HOST: api.openweathermap.org” bile di nome (63BŏDVKHUH[H,
La richiesta deve essere invia- utilizzato per caricare un nuovo
ta dopo che, ovviamente, ci ŎUPZDUHVXOPRGXORDEELDPR Web server con ESP8266.

94 Novembre 2015 ~ Elettronica In


logger che dispone della funzio-
nalità di accesso alla rete Internet
per reperire informazioni utili.
Nel caso di un data logger un
dato sicuramente importante è
la data e l’ora in cui avviene il
salvataggio dei dati, funzione
di solito svolta da un RTC (Real
Time Clock) interfacciato con Ar-
duino. Disponendo di un accesso
ad Internet, è semplice interroga-
re un server NTP per conoscere
data e ora precisi senza bisogno
di eseguire alcuna impostazione
Fig. 5 - Test SD
iniziale. Una prima semplice pro-
YDSHUYHULŎFDUHVHWXWWRIXQ]LRQD
correttamente consiste nell’inse-
rire nello slot una SD (micro SD
per la precisione) ed eseguire lo
sketch cardInfo.ino disponibile
negli esempi di sistema; assicura-
tevi che il jumper SDCS sia nella
posizione D4. Potete vedere nelle
immagini pubblicate la risposta
visualizzata su Serial Monitor re-

Fig 6 - Test scrittura/lettura su SD.


Fig.

lativa ad una SD HC funzioni di lettura funzionano


cat4 da 8GB formattata correttamente.
FAT32 utilizzata per le A questo punto siamo pronti
nostre prove. p
per implementare il nostro data
Con l’esempio ReadWrite. logger; come semplice esempio
lo
inoSRWHWHYHULŎFDUHVHOH andiamo a salvare il valore della
an
temperatura ambiente misurata
tem
tramite un semplicissimo inte-
tram
grato ccome l’LM35. Lo sketch
per la fu
funzione di data logger si
chiama E ESP8266_DataLogNTP.
ino e può essere scaricato assieme
DLŎOHDOOHJDWLGLTXHVWRSURJHWWR
DLŎOHDOOHJ
Per testare qquesto programma
dovete per prprima cosa inserire il
nome e la pass
password della vostra
rete Wi-Fi nei ccampi SSID e
PASS. Il sensore di temperatura
andrà alimentato da Arduino
tramite i pin GND e +5V mentre
la sua uscita va conn
connessa all’in-
AN0. Questo
gresso analogico AN0

Elettronica In ~ Novembr
Novembre 2015 95
vorrete programmare Arduino
dovrete sconnettere il modulo
rimuovendo i jumper, altrimenti
le due comunicazioni andran-
QRLQFRQŏLWWR1HOFDVRVLDQR
disponibili due seriali hardware
come nella board Arduino Leor-
nardo, la seriale principale sarà
utilizzata per il debug mentre la
seriale secondaria (Serial1) sarà
Web client usata per la comunicazione con il
per server modulo. Nella sezione relativa al
time NTP.
setup viene inizializzato il modu-
ORHOD6'YHULŎFDQGRFKHVLDQR
operativi. Nella sezione loop è
contenuto il codice relativo alla
funzione di data log, la prima
parte si occupa di richiamare la
funzione per l’accesso alla rete
Wi-Fi; sono previsti cinque ten-
tativi massimi. Segue la richiesta
della data e dell’ora richiamando
la funzione requestTime() che si
occupa di interrogare il server
NTP, le stringhe relative alla data
e all’ora sono disponibili trami-
te le funzioni getDateString() e
getTimeString(). Queste funzioni
permettono la formattazione di
GDWLHSRVVRQRHVVHUHPRGLŎFDWH
a seconda di quale formato si
vuole utilizzare; questo è impor-
tante nel caso di una successiva
sensore fornisce una tensione di comunicazione tra il modulo elaborazione tramite foglio di
di 10 mV ogni grado centigrado ESP8266 ed Arduino. La modali- calcolo dei dati acquisiti.
rilevato pertanto, per migliorare tà di default che abbiamo previ- Per estrapolare la data e l’ora
la risoluzione, si rende neces- sto consiste nel far comunicare dalla stringa di ritorno utilizzia-
sario impostare il fondo scala il microcontrollore ATmega328 mo la libreria time appositamen-
del convertitore A/D al valore con il modulo Wi-Fi tramite una te studiata per questa funzione;
di 1,1 volt tramite l’istruzione seriale software e di lasciare la FRPHDOVROLWR©VXIŎFLHQWHFRSLD-
analogReference(INTERNAL). seriale hardware per la funzione re l’intera cartella (di nome time)
La temperatura sarà ricavata con- di debug. La variabile DEBUG all’interno della cartella library
vertendo il valore letto dal con- può esse impostata su true o fal- di Arduino e quindi riavviare
vertitore A/D tramite l’equazio- se a seconda se volete un report l’IDE. Occorre ricordare che il
ne TEMP = analogRead(A0)/9.31. più o meno completo nei con- tempo ricavato dal server NTP
Per questo sketch abbiamo pre- fronti delle comunicazioni con il fa riferimento al meridiano di
visto l’utilizzo della linea ESPPD modulo Wi-Fi. Nel caso vogliate Greenwich (ora GMT Greenwich
(ESP8266 Power Down) che con- gestire il modulo Wi-Fi con la Mean Time ) occorre quindi tene-
sente di spegnere il modulo nei VHULDOHKDUGZDUH©VXIŎFLHQWH re conto del fuso orario Italiano
momenti di inutilizzo riducendo porre i jumper in modo che i (+1) e dell’eventuale ora legale
drasticamente i consumi. segnali ESPTX e ESPRX siano (+1 nel periodo estivo), per que-
Nella parte iniziale dello sketch connessi rispettivamente a D0 e sto abbiamo previsto la variabile
©SRVVLELOHGHŎQLUHODPRGDOLW¡ D1, ma ricordatevi che ogni volta di correzione UTCcorrection che

96 Novembre 2015 ~ Elettronica In


viene impostata a 7200 per tenere
conto dei 3600 secondi relativi
al fuso orario e dei 3.600 secondi
relativi all’ora legale. Segue la
sconnessione dalla rete Wi-Fi e
lo spegnimento del modulo per
risparmiare corrente. Le seguenti
righe di codice vengono utiliz-
zate nello sketch per costruire la
stringa che verrà scritta nella SD
card:

String dataString = getDate-


String();
dataString += “ “;
dataString += getTimeString();
dataString += “ AN0=”;
dataString +=
String(analogRead(A0)); Fig. 7 - Report relativo allo sketch.

Questa stringa potrà essere


PRGLŎFDWDVHFRQGRQHFHVVLW¡DJ-
giungendo o meno altri valori e
altri separatori. Segue la scrittura
sulla SD ed il ciclo a vuoto per
Fig. 8
l’attesa di una nuova acquisizio- Contenuto del
ne. L’intervallo di tempo tra le file di log dello
acquisizioni è impostabile trami- sketch.
te la variabile timeToLog che, per
LPSRVWD]LRQHSUHGHŎQLWDYDOH
60.000 ms (1 minuto). Abbiamo
previsto che il modulo rimanga
acceso solo per il breve lasso di
tempo necessario a connetter- CONCLUSIONI
si alla rete e ricevere i dati dal 3RVVLDPRGHŎQLUHOĬ(63XQ per il MATERIALE
server NTP, per tutto il resto del piccolo grande modulo vista la
tempo tra un log ed il successivo versatilità ed il package parti- Tutto il materiale di questo proget-
il modulo è portato nello stato di colarmente ridotto, il cui punto to può essere acquistato presso
power-down, grazie al segnale di forza è sicuramente il prezzo Futura Elettronica. La scheda Wi-
del pin D7 che comanda il pin bassissimo. Anche acquistato già Fi per Arduino con modulo ESP03
CH_PD dell’integrato EPS8266. installato in un comodo shield (cod. FT1192M) viene venduta al
Questo permette di avere un con- LOFRVWRŎQDOH©GHFLVDPHQWHSLº prezzo di Euro 27,00.
siderevole risparmio energetico contenuto dei classici shield ai I moduli WiFi, ESP03 e ESP8266,
anche se sono necessarie conti- quali eravamo abituati. Grazie al sono disponibili anche separata-
nue connessioni alla rete Wi-Fi. rilascio dell’SDK da parte dell’a- mente rispettivamente al prezzo di
1HOOD6'YLULWURYHUHWHXQŎOHGL zienda produttrice la comunità Euro 8,00 e Euro 9,00. Tutti i prezzi
nome DATALOG.TXT contenen- si è mobilitata per trovare nuovi si intendono IVA compresa.
te i valori acquisiti, come visibile ed avanzati modi di utilizzare
nella Fig. 8. Questo sketch è questo modulo, primo fra tutti la Il materiale va richiesto a:
compatibile con moduli in cui è possibilità di utilizzarlo in moda- Futura Elettronica, Via Adige 11,
LQVWDOODWRLOŎUPZDUHYHUVLRQH lità stand-alone, senza bisogno di 21013 Gallarate (VA)
9.02 e 9.03 come quello montato interfacciarlo con logiche pro- Tel: 0331-799775 • Fax: 0331-792287
nel nostro shield. grammabili esterne. J http://www.futurashop.it

Elettronica In ~ Novembre 2015 97


VERTICAL LASER
ENGRAVER di MICHELE CAIATI

per il ritaglio di pelli-


cole e rivestimenti, ma
anche verticali, come

T ipicamente un
plotter è una
speciale stampante in
ad esempio il nostro
Vertical Plotter pubbli-
cato nel fascicolo n° 200.
grado di disegnare con Ora abbiamo voluto
una penna a inchiostro spingerci più avanti, ri-
Plotter verticale a incisione come fosse a mano li- progettando tale plotter
termica con il quale stampare bera, con linee continue, verticale ma in versione
opportunamente gui- a laser, quindi con al
immagini tipo BMP in bianco e data da una meccanica posto del pennarello un
nero su diversi materiali piani di precisione; il foglio è laser allo stato solido
disposto in orizzontale in grado di tracciare col
come legno, cartone e laminati, e può essere anche di calore.
letteralmente bruciandone la materiale diverso dalla Così è nato l’incisore a
carte. Del plotter sono laser su supporto verti-
superficie pixel dopo pixel. state create nel tempo cale descritto in questo
varie versioni, anche articolo, che è un appa-

98 Maggio 2017 ~ Elettronica In


Gadget

rato dove, su un robu- incidere legno, cartone descritto nella Fig. 1, ha


sto pannello, si muove e laminati. Se è ideale una struttura portante
una testa di plottatura per effettuare stampe (base) che è costituita da
la quale, tramite un abbastanza rapide, una una lastra di legno tru-
laser a semiconduttore potenza del genere ri- ciolare laminato bianco
sorretto e posizionato chiede una certa cautela: da 18 mm di spessore,
da due cinghie dentate, sarà quindi indispensa- quadrata, avente il lato
è in grado di riprodur- bile, durante l’utilizzo di 1 metro.
re immagini tipo BMP del plotter e nelle fasi di La base del Vertical
in bianco e nero su collaudo, munirsi di oc- Laser Engraver oltre a
diversi materiali piani, chiali protettivi e avere sostenere la meccanica
letteralmente brucian- molta prudenza. dell’attrezzatura ospita i
done la superfice pixel Ma di questo ed altri vari materiali da incide-
dopo pixel. Il modulo dettagli spiegheremo re, che possono essere
laser utilizzato è a luce più avanti; ora è il tenuti in posizione da
visibile, blu a 445 nm momento di gettare uno nastro adesivo o punti-
di lunghezza d’onda sguardo alla composi- ne. È possibile utilizzare
e la sua potenza ottica zione della macchina. una base più grande
(ben 2 watt) è suffi- o addirittura fissare la
cientemente elevata da LA STRUTTURA meccanica su una pare-
produrre rapidamente Il plotter verticale che te con dei tasselli.
il calore che serve a vi proponiamo, meglio La meccanica è costi-

Elettronica In ~ Maggio 2017 99


Materiale occorrente
In questo riquadro riepiloghiamo le parti - 2 Viti M8 x 20 mm testa esagonale
occorrenti alla realizzazione del Vertical - 4 Viti M5 x 50 mm testa cilindrica
Plotter a laser, distinte per categoria. - 10 Viti M3 x 50 mm testa bombata
.STL per la stampa, accessibili
- 2 Viti M3 x 25 mm testa bombata
COMPONENTI ELETTRONICI - 8 Viti M3 x 12 mm testa bombata e scaricabili insieme ai file del
- Modulo LASER blu 2 W - 445 nm - 2 Viti M2 x 30 mm testa bombata progetto del plotter. Sono previ-
- Scheda Arduino Mega 2560 R.3 - 2 Dadi M8 cieco ste anche due piastre in PMMA
- Modulo lettore/scrittore SD Card - 12 Dadi M5 autobloccanti (polimetilmetacrilato) brunito
Reader compatibile Arduino PIC; - 4 Dadi M5 ciechi che andranno sagomate e forate
- Scheda di memoria SD - 13 Dadi M3 autobloccanti
- 2 Dadi M2 autobloccanti
come in Fig. 2 e rispettivamente,
(capacità 4 - 8GB)
- 2 Stepper driver DRV8825 + aletta di - 4 Rondelle spessore 1,8 mm foro P1 serve a sostenere i componen-
raffreddamento ø8mm ti della testina di stampa, mentre
- 2 Scheda Stepper Motor Driver - 12 Rondelle spessore 1 mm foro P2, è una protezione per scher-
Control Panel ø5 mm mare eventuali raggi riflessi du-
- Alimentatore stabilizzato - 6 Rondelle spessore 0,5 mm foro
rante il funzionamento del laser.
220V-12V 10A ø3 mm
- Alimentatore stabilizzato 220V- 5V 1A - 4 Rondelle isolanti spessore 2 mm Un altro componente da realizza-
- 2 stepper motor Nema 17 59Ncm foro ø3 mm re è il contrappeso, che è compo-
bipolare - 2 Rondelle foro ø2 mm sto da un blocchetto in metallo
- 2 finecorsa ottici - 4 Viti autofilettanti ø3mm x 9mm che serve a bilanciare la testina e
- pulsante - 2 Viti autofilettanti ø3mm x 20mm a tenerla orizzontale durante gli
- LED - 12 OR ø10/12mm
spostamenti. Questo componente
- Cavi e connettori - Contrappeso da 300g
deve avere un peso approssima-
tivo di 300 g e gli vanno praticati
COMPONENTI MECCANICI E FERRAMENTA COMPONENTI REALIZZATI IN STAMPA 3D
- Pannello in truciolare laminato 1 x 1 dei fori filettati, come mostrato
TESTINA DI STAMPA:
spessore 18 mm - 4 pezzi T1 nella Fig. 3, per il fissaggio.
- 2 Cinghie GT2 circa 4 m - 4 pezzi T2 Tutti gli elementi occorrenti
- 2 Cinghie chiuse GT2 110 denti - 4 pezzi T3 alla realizzazione del progetto
- 2 Pulegge GT2 20 denti asse ø8mm sono riportati per chiarezza nel
- 2 Pulegge GT2 20 denti asse ø5mm TRASCINATORE CINGHIA: riquadro “Materiale occorrente”,
- 2 Pulegge GT2 36 denti asse ø8mm - 1 pezzo V1-SX
- 6 Cuscinetti a sfere tipo 608ZZ distinti per categoria.
- 1 pezzi V1-DX
- 4 Cuscinetti a sfere 12 x 21 x 5 mm - 2 pezzi V2-V3 Adesso analizziamo uno ad uno
- 2 Assi ø8x51 mm alluminio - 1 pezzo V4-SX i sottosistemi componenti il plot-
- 2 Tubi ø12x22 mm alluminio - 1 pezzo V4-DX ter, partendo dagli azionamenti
- 2 Molle elicoidale 4x20 mm - 2 pezzi V5 della Testina Laser.
- Barra filettata M5 x 110mm - 1 pezzo V6-SX
- Barra filettata M5 x 124mm - 1 pezzo V6-DX
GLI AZIONAMENTI
Queste parti del Vertical Laser

tuita da due trascinatori e una


testina collegati tramite cinghie Fig. 1 - Il complesso del
dentate tipo GT2. I componen- Vertical Laser Engraver.
ti principali del Vertical Laser
Engraver sono stati realizzati
con la stampa 3D e completati da
ferramenta facilmente reperibile
sul mercato.
Per assemblare la macchina, la
prima cosa da fare sarà quindi
stampare le varie parti e procu-
rarci il necessario; allo scopo ri-
cordiamo che delle parti da stam-
pare in 3D (se avete la nostra
stampante 3Drag tanto meglio...)
rendiamo disponibili sul nostro
sito www.elettronican.it tutti i file

100 Maggio 2017 ~ Elettronica In


Fig. 2 - Le piastre della
testa da realizzare in PMMA
(non confondete P1 e P2
con le pulegge).

Fig. 3 - Dettagli del contrappeso.

Fig. 4 - Un azionamento.

Engraver sono speculari e si oc- te il materiale da incidere, quindi dentate principali abbiamo pre-
cupano di muovere le cinghie che è vitale regolare la lente del laser visto due gruppi (Fig. 4) basati
sorreggono la testina, ricevendo affinchè il fuoco coincida con la ognuno su motori stepper da 59
il moto dai motori; esse vanno superfice del piano. La testina Ncm con una risoluzione di 200
fissate saldamente nella parte deve rimanere verticale e aderen- passi per giro, montando sul loro
superiore della base in truciolato, te al materiale da incidere duran- albero delle pulegge GT2 da 20
secondo quanto mostrato nella te gli spostamenti e ciò è possibi- denti (P1). Le pulegge dei motori
Fig. 4. Il montaggio va effettuato le regolando il punto di attacco sono collegate a pulegge più
utilizzando le viti M5 x 50 mm delle cinghie in avanti o indietro grandi da 36 denti (P2) tramite
con relativi dadi e rondelle. cercando di tenere ortogonali il cinghie chiuse, creando una
Per aiutarvi nell’assemblaggio e piano di lavoro e l’asse del diodo prima demoltiplica dei giri. Le
nella composizione vi proponia- laser. Abbiamo previsto, a bordo, pulegge da 36 denti sono solidali
mo, nella Fig. 5, l’esploso della un microswitch la cui levetta con altre da 20 denti (P3) che
sezione azionamenti del plotter. verrà premuta quando la testina provvedono al trascinamento
sarà appoggiata al piano; un delle cinghie che sorreggono e
LA TESTINA LASER accidentale allontanamento o in- posizionano la sorgente laser. I
Componente vitale del plotter clinazione anomala della testina motori sono pilotati dai rispettivi
è la testa di stampa, che porta il farà scattare il microinterruttore, driver in 1/8 di passo cosicché
laser da 2 W. L’insieme è propo- spegnendo il laser per garantire per far fare all’asse del motore un
sto nella Fig. 6, dove la testina la sicurezza dell’operatore. La giro completo saranno necessari
laser è la parte della macchina Fig. 7 propone la vista in esploso 1.600 micropassi da 1/8 di passo.
che andrà a effettuare l’incisione. del complesso della testina. Il rapporto di demoltiplica tra la
Il raggio emesso dal diodo laser puleggia P2 e P1 è di 1,8 e quindi
e concentrato in un punto dovrà AZIONAMENTO DELLE CINGHIE per far compiere a P2 e P3 un
carbonizzare quasi istantanemen- Per il movimento della cinghie giro completo, il motore dovrà

Elettronica In ~ Maggio 2017 101


Fig. 5 - Esploso
azionamenti. fare 2.880 micropassi. Per calco-
lare quanti passi dovrà eseguire
il motore per spostare la cinghia
di 1 mm, dobbiamo considerare
che la puleggia di trascinamento
ha 20 denti e utilizza una cinghia
tipo GT2, cioè con un dente ogni
2 mm.
Moltiplicando 20 denti per 2 mm
otteniamo 40 mm, ovvero lo spo-
stamento della cinghia ad ogni
giro completo di P3.
Sapendo che per ogni giro di P3
il motore compie 2.880 micropas-
si, possiamo calcolare i microstep
per mm, che sono 2880/40, vale
a dire 72.
Il valore trovato ci servirà per
poter controllare con precisione
il nostro Vertical Laser Engraver,
che è teoricamente in grado di
compiere spostamenti minimi di
0,013888888888888 mm. Ricapito-
lando, abbiamo:
• motore da 200 passi giro passo
1,8°;
• driver 1/8 passo microstep;
• P1 = puleggia motore 20 denti;
• P2 = puleggia di raccordo 36
denti;
• P3 = puleggia di trascinamen-
to 20 denti;
• cinghia GT2 passo 2 mm;
• 200 x 8 = 1600 micropassi giro;
• rapporto di demoltiplica
P2/P1 = 1,8.

Quindi otteniamo 1600 x 1,8 =


2.880 micro passi per giro su P2
e P3. Avendo 20 denti x 2 mm, ci
sono 40 mm di cinghia per ogni
giro di P3.
Dividendo il numero di micro-
step per la lunghezza della cin-
ghia corrispondente otteniamo:

2880 / 40 = 72 micropassi per mm

vale a dire che il minimo movi-


mento ottenibile della cinghia
ammonta a:

1/72 = 0,013888888888888 mm
Fig. 6 - Testina laser completa: in evidenza il microswitch di sicurezza.

102 Maggio 2017 ~ Elettronica In


Fig. 7 - Esploso della testina
laser.

Fig. 8 - Aree di funzionamento del Vertical


Laser Engraver.

Elettronica In ~ Maggio 2017 103


Azionamento della cinghia visto
dall’interno e dall’esterno: il
sistema prevede un finecorsa, le dimensioni. Considerando il
basato su una levetta che penetra triangolo rettangolo EOP, pos-
un fotoaccoppiatore aperto. siamo dire che EP è uguale alla
metà del valore della coordinata
x di P, perché l’immagine che
necessario, nel creare l’immagine consideriamo ha dimensioni
da incidere, lasciare delle fasce di doppie in pixel rispetto a ciò che
pixel bianchi ai lati e sopra il sog- dobbiamo realmente stampare,
getto effettivo; saranno sufficienti quindi:
10 cm circa ai lati (200 pixel) e
20 cm sopra (400 pixel ) così da EP = x / 2
poter limitare lo spostamento
della testina. Tornando alla Fig. Considerando EO possiamo dire che:
1, avremo le due pulegge di
raggio r, il piano di larghezza AC EO + OA = BP
e altezza BF e, rappresentate in
blu, le due cinghie che si con- Siccome OA = r e PF = BF - (y
giungono nel punto P che indica / 2), poiché nelle immagini tipo
il diodo laser che puntato verso bitmap le coordinate di y cresco-
Ciò detto passiamo alla genera- il supporto andrà ad effettuare no spostandosi dall’alto verso il
zione dei file di stampa. l’incisione. Per poter controllare basso, otteniamo che:
la posizione di P dovremo quindi
GENERARE IL FILE modificare la lunghezza delle EO = BF - PF - r
Per l’incisione creeremo un’im- due cinghie attraverso la rota-
magine bitmap in bianco e nero zione coordinata delle pulegge e Adesso, con il teorema di Pitago-
con dimensioni in pixel doppie quindi conoscerne effettivamente ra calcoliamo OP:
rispetto a quelle in mm che real-
mente otterremo con il laser. Dal-
la Fig. 1, notiamo che se l’interas-
se tra le pulegge (lo chiamiamo
AC) è di 1.040 mm e la distanza
(BF) altri 1.040 mm, la nostra
immagine avrà una larghezza di
2.080 e un’altezza di 2.080 pixel.
Questo espediente ci consentirà
di incidere dei punti distanti tra
loro 0,5 mm ottenendo un miglio-
ramento della risoluzione.
Nella Fig. 1 notate delle aree in
toni di grigio: quella più chiara
rappresenta l’area limite che
possiamo utilizzare mentre la più
scura rappresenta l’area con-
sigliata per la stampa tenendo
presente le limitazioni mecca-
niche dell’apparato. Tornando
all’esempio, se le nostre pulegge
hanno interasse 1.040 mm sarà

Complesso del Vertical Laser


Engraver visto dal davanti, montato e
operativo su un foglio di cartoncino.

104 Maggio 2017 ~ Elettronica In


Listato 1 - Il codice in Python
import PIL.Image
import math
AC = 1040.000 #interasse pulegge in mm
r = 6.11 #raggio pulegge in mm
im = PIL.Image.open(“incisione.bmp”) #apriamo l’immagine da incidere
print (im.format, im.size, im.mode) #visualizziamo le informazioni sull’immagine
pix = im.load()

dimx = im.size[0] #otteniamo la larghezza dell’immagine


dimy = im.size[1] #otteniamo l’altezza dell’immagine
print (dimx) #visualizziamo la larghezza dell’immagine
print (dimy) #visualizziamo l’altezza dell’immagine

Velocita = 5000 #impostiamo la velocità massima dei motori


Delytime = 50 #impostiamo il tempo di accensione del laser
SIntensita = 255 #impostiamo l’intensità del laser
Liniziale0 = 47520 #impostiamo la lunghezza di partenza delle cinghia 1 espressa in passi del motore che equivale a 1500 mm
Liniziale1 = 47520 #impostiamo la lunghezza di partenza delle cinghia 2 espressa in passi del motore che equivale a 1500 mm

documento = open(“Laser.txt”, “w”)#apriamo ed eventualmente creiamo il file di stampa

direzione = 0
for x in range(dimx): #scorriamo l’immagine da sinistra verso destra individuando i pixel non bianchi
if direzione == 0:
for y in range(dimy): #scorriamo l’immagine dall’alto verso il basso individuando i pixel non bianchi
if pix[x,y] == 0:
print (x,’,’,y,’,’,255 - pix[x,y])
EP = x / 2.0000
BP = y / 2.0000
EO = BP - r

OP = math.sqrt(math.pow(EO,2) + math.pow(EP,2))
KP = math.sqrt(math.pow(OP,2) - math.pow(r,2))

alfa = math.asin(EP/OP)
alfag = math.degrees(alfa)
beta = math.asin(KP/OP)
betag = math.degrees(beta)
gammag = 180-(alfag + betag)

KA = 2*math.pi*r*gammag/360
Lp = KA + KP

PD = AC - EP

O1P = math.sqrt(math.pow(EO,2) + math.pow(PD,2))


K1P = math.sqrt(math.pow(O1P,2) - math.pow(r,2))

alfa1 = math.asin(PD/O1P)
alfa1g = math.degrees(alfa1)
beta1 = math.asin(K1P/O1P)
beta1g = math.degrees(beta1)
gamma1g = 180-(alfa1g + beta1g)
K1C = 2*math.pi*r*gamma1g/360
Lp1 = K1C + K1P

StepLp = Lp * 72 #trasformiamo la lunghezza della cinghia 1 in passi


StepLpr = int(round(StepLp))#poichè il numero di passi deve essere un intero arrotondiamo il valore
StepLp1 = Lp1 * 72
StepLp1r = int(round(StepLp1))

deltapassi0 = abs(StepLp - Liniziale0)#calcoliamo la variazione di passi e quindi della lunghezza della cinghia 1
deltapassi1 = abs(StepLp1 - Liniziale1)#calcoliamo la variazione di passi e quindi della lunghezza della cinghia 2

#calcoliamo la velocità dei motori in base al numero di passi che devono compiere e alla velocità massima

if deltapassi0 > deltapassi1:


rapporto = deltapassi1 / deltapassi0
V1 = int(Velocita)
V2 = int(round(Velocita * rapporto))
if deltapassi0 < deltapassi1:
rapporto = deltapassi0 / deltapassi1
V1 = int(round(Velocita * rapporto))
V2 = int(Velocita)
if deltapassi0 == deltapassi1:
V1 = int(Velocita)
V2 = int(Velocita)

#componiamo la riga di valori da scrivere sul file relativa ad un pixel

Lc = str(StepLpr)
Lc1 = str(StepLp1r)

(Continua)

Elettronica In ~ Maggio 2017 105


Listato 1 - segue
SInt = str(SIntensita)
V1s = str(V1)
V2s = str(V2)
timd = str(Delytime)
RIGA = Lc + “,” + Lc1 + “,” + V1s + “,” + V2s + “,” + SInt + “,” + timd + “\n”
documento.write(RIGA)
#aggiorniamo la posizione del laser
Liniziale0 = StepLpr
Liniziale1 = StepLp1r
if direzione == 1:
dimyrev = dimy - 1
for y in range(dimyrev,-1,-1):#scorriamo l’immagine dal basso verso l’alto individuando i pixel non bianchi
if pix[x,y] == 0:
print (x,’,’,y,’,’,255 - pix[x,y])
EP = x / 2.0000
BP = y / 2.0000
EO = BP - r

OP = math.sqrt(math.pow(EO,2) + math.pow(EP,2))
KP = math.sqrt(math.pow(OP,2) - math.pow(r,2))

alfa = math.asin(EP/OP)
alfag = math.degrees(alfa)
beta = math.asin(KP/OP)
betag = math.degrees(beta)
gammag = 180-(alfag + betag)

KA = 2*math.pi*r*gammag/360
Lp = KA + KP

PD = AC - EP

O1P = math.sqrt(math.pow(EO,2) + math.pow(PD,2))


K1P = math.sqrt(math.pow(O1P,2) - math.pow(r,2))

alfa1 = math.asin(PD/O1P)
alfa1g = math.degrees(alfa1)
beta1 = math.asin(K1P/O1P)
beta1g = math.degrees(beta1)
gamma1g = 180-(alfa1g + beta1g)
K1C = 2*math.pi*r*gamma1g/360
Lp1 = K1C + K1P

StepLp = Lp * 72 #trasformiamo la lunghezza della cinghia 1 in passi


StepLpr = int(round(StepLp))#poichè il numero di passi deve essere un intero arrotondiamo il valore
StepLp1 = Lp1 * 72
StepLp1r = int(round(StepLp1))

deltapassi0 = abs(StepLp - Liniziale0)


deltapassi1 = abs(StepLp1 - Liniziale1)
if deltapassi0 > deltapassi1:
rapporto = deltapassi1 / deltapassi0
V1 = int(Velocita)
V2 = int(round(Velocita * rapporto))

if deltapassi0 < deltapassi1:


rapporto = deltapassi0 / deltapassi1
V1 = int(round(Velocita * rapporto))
V2 = int(Velocita)

if deltapassi0 == deltapassi1:
V1 = int(Velocita)
V2 = int(Velocita)

Lc = str(StepLpr)
Lc1 = str(StepLp1r)
SInt = str(SIntensita)
V1s = str(V1)
V2s = str(V2)
timd = str(Delytime)
RIGA = Lc + “,” + Lc1 + “,” + V1s + “,” + V2s + “,” + SInt + “,” + timd + “\n”
documento.write(RIGA)

Liniziale0 = StepLpr
Liniziale1 = StepLp1r
if direzione == 0:
direzione = 1
else:
direzione = 0

documento.close()

106 Maggio 2017 ~ Elettronica In


OP = √ EO 2 + EP 2
Utilizzando il teorema di Pitago-
ra calcoliamo anche KP:

KP = √ OP 2 - r 2

Per conoscere la lunghezza esatta


della cinghia da A a P dobbia-
mo ora calcolare la lunghezza
dell’arco AK e quindi individua-
re l’angolo γ:

α = Arcosen (EP / OP)

β = Arcosen (KP / OP)

γ = 180 – ( α + β )
KA = 2 ∏ r γ / 360

Ora possiamo dire che la lun-


ghezza L della prima cinghia Fig. 9
quando il laser si trova nel punto Schema di
P sarà: collegamento.

L = KA + KP

Per calcolare la lunghezza della


seconda cinghia procederemo in
modo analogo:
si occuperà di:
PD = AC – EP • aprire l’immagine che voglia-
mo incidere;
DO’ = EO • analizzarla pixel per pixel per
calcolare le lughezze L e L’
PO’ = √ EO 2 + PD 2 relative a tutti i punti di colore
nero;
PK’ = √ PO’ 2 - r 2 • convertire tali lunghezze in
α’ = Arcosen (PD / PO’) passi da far eseguire ai motori
ad una determinata velocità;
β’ = Arcosen (PK’ / PO’) • associare ad ogni coppia di
lunghezze i valori di intensità
γ’ = 180 – ( α’ + β’ ) e durata di incisione del laser;
• salvare i dati in un file.txt
K’C = 2 ∏ r γ ‘/ 360 opportunamente formattato.

Da cui deriva che la seconda Per la realizzazione del sof-


cinghia L’ avrà lunghezza : tware utilizzeremo Python in
versione 2.7.11 in associazione
L’ = PK’ + K’C a due librerie: PIL 1.1.7 e Math

Definite le lunghezze variabi- Dettagli della testa di stampa


li delle due cinghie possiamo accesa (si vede la luce blu
realizzare un piccolo codice che parzialmente riflessa).

Elettronica In ~ Maggio 2017 107


Guarda Vertical Plotter
in azione su YouTube!
Engraver e che contiene i dati per 41080,59176,5000,3482,255,50
l’incisione. 41052,59156,5000,3497,255,50
Sulla memoria SD deve essere 41024,59137,5000,3387,255,50
presente un solo file alla volta. 40995,59117,5000,3453,255,50
Se osserviamo il codice,vedremo, .........
nella prima parte la definizione
di alcune variabili che dipendono i primi due valori racchiudono la
dalla parte meccanica della nostra lunghezza delle cinghie espresse
attrezzatura. in passi, i secondi le velocità alle
Queste impostazioni devono quali devono muoversi i motori,
Puoi vedere il
coincidere con le grandezze reali il quinto valore indica la potenza
Vertical Laser della nostra macchina. In parti- del laser che va da 0 a 255 e il sesto
Engraver mentre colare, la lunghezza iniziale delle valore indica il tempo di accensio-
incide la scritta cinghie e cioè la lunghezza che ne espresso in millisecondi.
“Elettronica In” assumono dopo che il Vertical- Ogni riga definisce un punto, quin-
su un cartoncino Laser Engraver viene acceso e di proporzionalmente alla grandez-
alla pagina si resetta utilizzando i finecorsa, za dell’immagine e alla densità di
https://youtu.be/nquqyK4Mrmg. deve coincidere con quella del punti che contiene, questo file può
Dal nostro canale YouTube firmware caricato su Arduino raggiungere dimensioni impor-
www.youtube.com/user/ElettronicaIN MEGA.Questa lunghezza é tanti.
potrai anche vedere i video espressa in passi e nel codice di
di moltissimi altri nostri progetti esempio ha un valore di 47.520, I COLLEGAMENTI
proposti in passato. che diviso 72 restituisce 660 mm. Bene, a questo punto possiamo
Ogni volta che accenderemo la passare a descrivere il cablaggio
macchina le due cinghie dentate della macchina, che va eseguito con
andranno una alla volta a scorrere riferimento alla Fig. 9.
(quest’ultima è già presente fino ad eccitare il finecorsa, per Il cervello dell’elettronica é una
nell’istallazione di Python). La poi raggiungere la lunghezza di scheda Arduino MEGA 2560 R.3
libreria Pil (Python Imaging 660mm misurata dalla puleggia al alla quale sono collegati i due dri-
Library) ci consentirà di leggere le centro dell’emettitore laser.Un’al- ver, basati sul chip A4988 dell’Al-
dimensioni dell’immagine, le co- tra grandezza fondamentale per legro, che è uno dei più utilizzati
ordinate e il colore dei vari pixel, un corretto funzionamento della per il genere di motore passo-passo
mentre la libreria Math ci darà macchina è la lunghezza massi- utilizzato nel progetto. Per comodi-
accesso alle funzioni trigonome- ma delle cinghie dentate, che va tà i driver sono montati su schede
triche che serviranno per il calcolo misurata al momento dell’innesco “A4988/DRV8825 stepper motor
della lunghezza delle cinghie. dei fine corsa e misurata sempre driver control panel/expansion
Per scaricare Python anda- dalla puleggia al centro dell’emet- board” (Fig. 10) che consentono
te su Internet alla pagina titore laser. Nelle impostazioni
http://www.python.it/, mentre la iniziali viene anche definita la po-
Libreria PIL è disponibile per il tenza e l’intervallo di tempo con
Fig. 10 - 4988/
download su http://www.py- cui viene pilotato il diodo laser e DRV8825 stepper
thonware.com/products/pil/. queste impostazioni dipendono motor driver control
Il codice (Listato 1) apre l’immagi- dal materiale che vogliamo panel/expansion
ne in bianco e nero incisione.bmp incidere e dalla potenza board.
che deve essere collocata nella del laser.
stessa cartella che lo contiene Il file Laser.txt che viene
quindi per prima cosa dobbiamo generato è un elenco di righe
convertire, ridimensionare e rino- formate da 6 valori separati da
minare il soggetto che vogliamo una virgola e apparirà in questo
incidere. Verrà generato o sovra- modo:
scritto nella stessa cartella un file 41166,59235,5000,3501,255,50
Laser.txt che sarà da copiare sulla 41137,59215,5000,3397,255,50
memoria SD del Vertical Laser 41109,59196,5000,3413,255,50

108 Maggio 2017 ~ Elettronica In


Listato 2 - Il codice per Arduino
#include <SPI.h>
#include <SD.h> // utilizziamo la libreria SD per leggere il file Laser dalla scheda SD
#include <AccelStepper.h> // utilizziamo la libreria AccelStepper per controllare i motori
AccelStepper stepper1(1, 3, 5); //assegniamo i pin 3 e 5 al motore 2 con tipologia di controllo step,dir
AccelStepper stepper2(1, 8, 9); //assegniamo i pin 8 e 9 al motore 2 con tipologia di controllo step,dir

File myFile;
long Cinlong1 = 65520; //lunghezza totale della cinghia 1 espressa in numero di passi
long Cinlong2 = 65520; //lunghezza totale della cinghia 2 espressa in numero di passi
long Stzero1 = 47520; //lunghezza della cinghia 1 nella posizione iniziale espressa in numero di passi
long Stzero2 = 47520; //lunghezza della cinghia 2 nella posizione iniziale espressa in numero di passi

const int BUTTON = 27; //creiamo la costante BUTTON per utilizzare un pulsante sul pin 27
int val = 0;
int vecchio_val = 0;
int stato = 0;

int intenslaser = 0; //creiamo la variabile per controllare la potenza del diodo laser
int delytime = 0; //creiamo la variabile per controllare i tempi diaccensione del diodo laser

void setup() {

pinMode(BUTTON, INPUT); //definiamo il pin 27 come input

pinMode(12, OUTPUT); //definiamo il pin 12 come output


analogWrite(12, 0); //portiamo a 0 l’uscita del pin

pinMode(13, OUTPUT); //definiamo il pin 13 come output


digitalWrite(13, LOW); //portiamo a 0 l’uscita del pin

const int Endstop1 = 39; //creiamo la costante Endstop1 per poter collegare il finecorsa ottico della cinghia1 sul pin 39
const int Endstop2 = 35; //creiamo la costante Endstop1 per poter collegare il finecorsa ottico della cinghia1 sul pin 35
pinMode(Endstop1, INPUT);//definiamo il pin 39 come input
pinMode(Endstop2, INPUT);//definiamo il pin 35 come input

// definiamo velocità massima e accelerazione e velocità di entrambi i motori


stepper1.setMaxSpeed(10000);
stepper1.setAcceleration(500);
stepper2.setMaxSpeed(10000);
stepper2.setAcceleration(500);
stepper1.setSpeed(1440);
stepper2.setSpeed(1440);
while (digitalRead(Endstop1) == LOW){
// muoviamo il motore della cinghia 1 per raggiungere il finecorsa
stepper1.setSpeed(10000);
stepper1.runSpeed();
}
// muoviamo il motore della cinghia 1 di 216 passi in senso opposto per disimpegnare il finecorsa
stepper1.move(-216);
while (stepper1.distanceToGo() != 0){
stepper1.run();
}
// muoviamo il motore della cinghia 1 di 9 passi alla volta per raggiungere un allineamento preciso con il finecorsa
while (digitalRead(Endstop1) == LOW){
stepper1.move(9);
stepper1.run();
}
// muoviamo il motore della cinghia 2 per raggiungere il finecorsa
while (digitalRead(Endstop2)== LOW){
stepper2.setSpeed(10000);
stepper2.runSpeed();
}
// muoviamo il motore della cinghia 2 di 216 passi in senso opposto per disimpegnare il finecorsa
stepper2.move(-216);
while (stepper2.distanceToGo() != 0){
stepper2.run();
}
// muoviamo il motore della cinghia 2 di 9 passi alla volta per raggiungere un allineamento preciso con il finecorsa
while (digitalRead(Endstop2)== LOW){
stepper2.move(9);
stepper2.run();
}
//assegniamo alle cinghie il loro valore massimo di lunghezza poiché si trovano i posizione di finecorsa
stepper1.setCurrentPosition(Cinlong1);
delay(15);
stepper2.setCurrentPosition(Cinlong2);
delay(15);

(Continua)

Elettronica In ~ Maggio 2017 109


Listato 2 - segue
// portiamo la testina del laser nella posizione di partenza
stepper1.move(Stzero1 - Cinlong1);
stepper2.move(Stzero1 - Cinlong2);
while ((stepper1.distanceToGo() != 0) or (stepper2.distanceToGo() != 0)) {
stepper1.setSpeed(5000);
stepper1.runSpeedToPosition();
stepper2.setSpeed(5000);
stepper2.runSpeedToPosition();
stepper2.run();
}
// inizializziamo la scheda SD e apriamo il file Laser.txt

pinMode(53, OUTPUT);

if (!SD.begin(53)) {

return;
}

myFile = SD.open(“Laser.txt”);
}
void loop() {
// utilizziamo un pulsante per far partire la stampa
val = digitalRead(BUTTON);
if ((val == HIGH) && (vecchio_val == LOW)){
stato = 1 - stato;
delay(15);
}
vecchio_val = val;
//leggiamo il file Laser.txt e assegniamo i valori alle variabili
if (stato == 1) {
if (myFile.available() > 0) {
long Lung1= myFile.parseInt();
long Lung2= myFile.parseInt();
int V1= myFile.parseInt();
int V2= myFile.parseInt();
int Intensita= myFile.parseInt();
int delytime= myFile.parseInt();
// quando Lung1 e Lung2 sono uguali a zero significa che il file è stato letto completamente e il Vertical laser si ferma
if ((Lung1 == 0) && (Lung2 == 0)){

Stzero1 = 0;
Stzero2 = 0;
}
// definiamo il numero di passi e la direzione da far eseguire ai due motori
stepper1.move(Lung1 - Stzero1);
stepper2.move(Lung2 - Stzero2);

//aspettiamo finché il laser non abbia raggiunto la posizione assegnatagli


while ((stepper1.distanceToGo() != 0) or (stepper2.distanceToGo() != 0)){
stepper1.setSpeed(V1);
stepper1.runSpeedToPosition();
stepper2.setSpeed(V2);
stepper2.runSpeedToPosition();
stepper2.run();

}
//attiviamo il laser sul pin 12 e una spia sul pin 13 con intensità e durata definiti dal file Laser.txt in associazione
al punto raggiunto.
if ((stepper1.distanceToGo() == 0) && (stepper2.distanceToGo() == 0)){
analogWrite(12, Intensita);
digitalWrite(13, HIGH);
delay(delytime);
analogWrite(12, 0);
digitalWrite(13, LOW);
//aggiorniamo la posizione della testina laser
Stzero1 = Lung1;
Stzero2 = Lung2;
//se premiamo nuovamente il pulsante il processo di incisione si annulla e il Vertical laser si ferma
if (digitalRead(BUTTON) == 1){
stato = 0;
myFile.close();
}
}
}
}
}

110 Maggio 2017 ~ Elettronica In


la testa di stampa nella posizione
iniziale) e successivamente attende
che venga premuto il pulsante sul
pin 27 per iniziare a leggere il file
sulla SD-Card e iniziare ad incidere
i dati che riceve; il codice corrispon-
dente al firmware per Arduino è
riportato nel Listato 2.

CONCLUSIONI
Bene, crediamo di avervi detto
tutto; il progetto è completamente
aperto, quindi si presta alle vostre
personalizzazioni ed eventuali
L’insieme dell’elettronica schematizzato nel disegno di cablaggio,
espansioni, che vi saranno facili,
montato sul retro del piano del plotter e chiuso con del plexiglass.
Gli alimentatori sono sotto. alla luce della spiegazione fornita
in queste pagine. Non possiamo
fare altro che augurarvi buon diver-
la definizione dei micropassi e per il funzionamento della scheda timento con un’unica raccomanda-
semplificano i cablaggi. I piedini di controllo. Il modulo laser é col- zione: durante l’utilizzo del plotter
utilizzati per il comando dei due legato al pin 12 di Arduino MEGA state lontani con gli occhi dalla luce
driver sono: e necessita di un’alimentazione del laser e non guardate di lato la
esterna, visto l’assorbimento. In macchina, se non altro per evitare
g
- pin 3 -> STEP serie al positivo dell’alimentazione la luce rifratta.
- pin 5 -> DIR del laser va posto il microswitch di
sicurezza che la interrompe se si
per quello del motore sinistro e: stacca la testina dal piano.
Per la SD-Card l’autore ha previ- per il MATERIALE
- pin 8 -> STEP sto un modulo esterno, tuttavia vi
- pin 9 -> DIR ricordiamo che esiste un apposito Tutti i componenti utilizzati in que-
shield compatibile con la Uno e la sto progetto sono di facile reperi-
per quello dello stepper destro. MEGA, più pratico perché mon- bilità. Il materiale elencato di se-
La macchina è provvista di finecor- tabile direttamente a catasta sulla guito può essere acquistato presso
sa ottici alimentati a 5V e collegati Arduino; l’unico accorgimento da Futura Elettronica: il modulo laser
rispettivamente al pin 35 e al pin 39, utilizzare è, in questo caso, modifi- blu 2 W - 445 nm (cod. LASER2W)
di un pulsante di azionamento col- care nello sketch i pin assegnati alla è in vendita a Euro 339,00, la
legato al pin 27, di una spia a LED lettura della SD-Card, che utilizzan- board Arduino MEGA2560 REV3
(sostanzialmente un LED con tanto do lo shield diventano: (cod. ARDUINOMEGAREV3) è
di resistore di limitazione incorpo- disponibile a Euro 43,00, lo shield
rato nel contenitore) collegata al pin - D4 -> SD_CS per Arduino con slot per SD Card
13 e di un lettore di SD-Card per il - D11 -> SD_DI (cod. SDCARDSHIELD) costa
funzionamento in modo autonomo - D12 -> SD_DO Euro 12,00, il driver per la sche-
collegato secondo lo schema: - D13 -> SD_CLK da controller della stampante
3DRAG (cod. DDRIVER) costa
- pin50 -> MISO Bene, ciò detto vediamo gli aspetti Euro 7,90, l’alimentatore switching
- pin51 -> MOSI firmware del progetto. 220 VAC/12 VDC 150 W - (cod.
- pin52 -> SCK FR548) è in vendita a Euro 32,00.
- pin53 ->Z CS LO SKETCH ARDUINO
Il firmware che andrà caricato Il materiale va richiesto a:
Due alimentatori stabilizzati for- nella Arduino MEGA si occupa di Futura Elettronica, Via Adige 11,
niscono energia al sistema: uno da azzerare la meccanica della mac- 21013 Gallarate (VA)
12V per il movimento dei motori e china al momento dell’accensione Tel: 0331-799775
l’accensione del laser e l’altro da 5V (per azzerare intendiamo portare http://www.futurashop.it

Elettronica In ~ Maggio 2017 111


Elettronica In - la più prestigiosa
rivista di progettazione elettronica

MESI
TUTTI i
LA!
in EDICO

TI SEI PERSO DEGLI ARTICOLI INTERESSANTI?


• Progetti pratici CREA LA TUA RACCOLTA ARRETRATI SU SUPPORTO USB
• Articoli didattici Crea con pochi clic una raccolta digitale di
• Corsi hardware e software arretrati personalizzata. Riceverai, direttamente
a casa tua, una card contenente una pen drive
• News dal mondo dell’elettronica USB da 2GB nella quale troverai i pdf dei
...e molto altro ancora. numeri di Elettronica In che hai scelto.
Le raccolte sono disponibili in tre differenti
ABBONATI! SOLO PER TE ALTRI VANTAGGI: formati: da 10, da 25 e da 50 arretrati.
++La DISCOUNT CARD che ti consentirà di usufruire
di uno sconto del 10% su tutti i prodotti acquistati
direttamente e on-line da Futura Elettronica.
++Un volume a scelta della collana “L’Elettronica per tutti”.
++La possibilità di leggere la versione digitale della rivista
direttamente da PC.

PER ABBONARTI COLLEGATI AL SITO

www.elettronicain.it
FUTURA GROUP srl
Futura Via Adige 11
21013 Gallarate (VA)
Group
Edizioni TEL.: 0331 752668
Fax: 0331 792287
Didattica

Realizziamo un semplice circuito


per giocare in tre modalità
differenti utilizzando la scheda
Arduino Uno e pochi altri
componenti elettronici.

G IOCARDUINO:
ARDUINO TI SFIDA
IN GIOCHI DI LOGICA
di BRUNO BERTUCCI

n questi anni abbiamo visto Arduino in ai più, forse anche a causa del proliferare di gio-
I molte vesti e in tutti gli ambiti possibili, che
spaziano dalle applicazioni didattiche e quel-
chi elettronici e videogiochi sempre più tecnolo-
gici e improntati sull’azione. Abbiamo pensato
le semi-professionali, da quelle più serie alle che, insieme a voi e grazie all’utilizzo della più
ludiche: per intendersi, ai giochi e ai gadget. Nei innovativa delle schede elettroniche, potremmo
SDUDJUDŎFKHVHJXRQRFRQWLQXLDPRVXOŎORQHGHL dare nuova linfa vitale a questi avvincenti giochi
giochi, per proporvi un circuito -sempre basato classici.
sulla popolare scheda di prototipazione- che vi Il progetto originariamente nasce in ambito
consentirà di misurarvi in giochi di logica e, per scolastico, da un’idea sviluppata insieme a un
l’esattezza, con tre giochi; questi, pur apparte- gruppo di studenti di un istituto tecnico (Ludo-
nendo alla tradizione popolare, sono sconosciuti vica Siclari, Vincenzo Buccafurri, Paolo Grimal-

Elettronica In ~ Settembre 2016 73


[schema ELETTRICO]

esempio, oltre che essere un gio-


co o un gadget da regalare a un
ŎJOLRDXQFRQRVFHQWHRSDUHQWH
potrebbe diventare un’occasione
per avvicinare tali persone allo
studio dell’elettronica attraver-
so il divertimento.
In ogni caso, se anche siete
lontani dal mondo della scuola,
potrete proporre ai vostri amici
HSDUHQWLGLDFFHWWDUHODVŎGD
lanciata da Arduino. Il clima
di entusiasmo e partecipazione
che i giochi realizzabili con esso
sono in grado di suscitare nei
giocatori coinvolti vi sorpren-
derà.

SCHEMA ELETTRICO
Per realizzare il nostro gioco
trivalente facciamo uso, oltre
che di una Arduino (la Uno va
benissimo...) di un apposito
shield progettato per lo scopo.
Lo schema elettrico di tale shield
(che vedete qui accanto) è dav-
vero semplice: i pin digitali di
Arduino Uno sono tutti utilizzati
come uscite digitali, ognuna del-
le quali alimenta uno dei tredici
LED rossi da 3 mm collegati ai
pin 0÷12; un LED di colore ver-
de è invece collegato al pin 13.
I 13 LED rossi servono a si-
PXODUHLŎDPPLIHULHDGDUHOH
di, Luca Lepera, Rosario Mussa- Il circuito che vi presentiamo segnalazioni durante la partita,
ri, Carmine Scarpino e Vitaliano rappresenta un nostro ulteriore come sarà meglio spiegato più
Vizzani che ringraziamo per la contributo in tal senso. La no- avanti; il LED verde è solo per le
collaborazione [ndr]). Sempre stra “mission”, infatti, è divul- segnalazioni di gioco.
più spesso si parla della neces- gare e diffondere l’elettronica Le resistenze da 1 k: collegate
sità di introdurre nelle scuole a tutti i livelli, come dimostra, in serie a ciascun LED limitano
italiane l’innovazione didattica oltre un ventennio di rivista e la la corrente circolante in ognu-
e tecnologica come elemento in- creazione dell’iniziativa Futura no di essi a 3 mA. Con questo
dispensabile per il rilancio della Academy (http://futura.academy/), valore di corrente si ottiene
formazione tecnica. nata con lo scopo di trasmette- una buona luminosità dei LED
Da sempre Elettronica In è re le nostre competenze anche senza sovraccaricare gli I/O
impegnata in primo piano in agli insegnanti delle scuole a della scheda Arduino, i quali, lo
questo campo, al punto da LQGLUL]]RWHFQLFRDIŎQFK©ORUR ricordiamo, erogano al massimo
rappresentare per i lettori -siano stessi possano poi metterle a 40 mA, ma in tali condizioni la
essi hobbisti, studenti, docenti, disposizione dei propri studenti tensione corrispondente allo
professionisti- una fonte inesau- per arricchirne la formazione e stato logico cala fortemente
ribile di idee da sperimentare in il bagaglio culturale. VFHQGHDFLUFD9LQVXIŎFLHQWL
forme sempre nuove. L’applicazione qui descritta, per ad accendere LED che non siano

74 Settembre 2016 ~ Elettronica In


rossi); per avere livelli logici ac-
cettabili dobbiamo restare entro
i 10 milliampere e nel nostro
FDVRWDOHFRQGL]LRQH©YHULŎFDWD
in quanto con 5V su ciascun I/O
in corrispondenza dell’1 logico e
una caduta sui LED di poco infe-
riore ai 2 volt, in ogni resistenza
(e quindi in ciascun LED acceso) Arduino
scorrono 3 milliampere.
Avendo già utilizzato tutti i ora è primo!
pin digitali di Arduino come
uscite destinate all’accensione
del LED, abbiamo fatto ricorso La popolare scheda di prototipazione fa il suo ingresso nel
DXQVHPSOLFHDUWLŎFLRFKHFL mondo dell’Internet of Things con due novità all’insegna
ha consentito di utilizzare gli della connettività. L’universo Arduino vede infatti brillare due
ingressi analogici alla stregua di nuove stelle, chiamate Arduino Primo e Arduino Primo Core,
quelli digitali. Come sappiamo, presentate poco dopo il Maker Faire di San Francisco.
gli ingressi analogici di Arduino Non solo IoT, comunque, ma una proposta destinata anche a
leggono dei valori compresi tra maker, sviluppatori e a chiunque abbia il desiderio di applicarsi
un minimo di 0 e un massimo di nello sviluppo di progetti innovativi.
5 volt e restituiscono un nume- Progettate per lavorare insieme, le due board dispongono
ro intero variabile tra 0 e 1.023, nativamente di connettività con sensori a infrarossi e
essendo il convertitore analogico Bluetooth grazie a un chip fornito dal neo-partner Nordic
digitale (ADC) utilizzato dalla Semiconductors; è implementata anche la connettività Wi-Fi,
scheda a 10 bit. anche se presente al momento nella sola Arduino Primo. Le
Tramite delle resistenze da 10 due schede sono quindi connesse con più di un link, integrando
k: gli ingressi analogici del funzionalità che in genere richiedevano l’aggiunta di moduli
microcontrollore sono forzati supplementari; in un certo senso vanno nella direzione in cui
ad assumere la tensione di 0 già ci siamo mossi un anno fa proponendo le nostre Fishino.
volt, per scongiurare la lettura La Primo è espandibile con gli shield e una porta MicroUSB e
di valori casuali. Solo a segui- si potrà programmare tramite l’IDE, ma anche con strumenti
to della pressione dei pulsanti più potenti. La Core è una micro scheda circolare che si
P1÷P5, che fanno capo agli attiva con una pila “a pastiglia”; si immette in una “carrier
ingressi A0÷A4, o alla chiusura board” (chiamata AlicePad) che fornisce la connettività USB e
l’elettricità per la ricarica delle batterie della Core stessa.

del ponticello JP1, che fa capo a 800) e true (corrispondente a


all’ingresso A5, sul pin analogi- valori restituiti dal convertitore
co corrispondente sarà presente ADC maggiori di 800).
una tensione di 5 volt; questo Dunque, Arduino leggerà lo
perché un capo dei pulsanti e stato dei pulsanti e del jumper
del jumper è collegato alla linea J1 attraverso il proprio ADC
dei 5V di Arduino. sfruttando la tensione presente
Il codice scritto per Arduino è in ai capi delle rispettive resistenze
grado di distinguere queste due di pull-down.
condizioni di funzionamento
e di associare a delle variabili IL PRIMO GIOCO PROPOSTO
booleane due stati logici: false Il meccanismo del primo gioco
Fig. 1 - Posizionamento del ponticello
JP1 per impostare la modalità di gioco (corrispondente a valori restitui- è molto semplice. Disposti 13
casuale. ti dal convertitore ADC inferiori ŎDPPLIHULVXXQSLDQRDWXUQR

Elettronica In ~ Settembre 2016 75


Listato 1
//****************************************************************************************************************
//*** gioca *******************************************************************************************************
//****************************************************************************************************************

void gioca() {

......

if ((mossaAllaMacchina==true) && (abilitaMossa==true) && (vinceGiocatore==false) && (vinceMacchina==false)) {


¿DPPLIHUL'D3UHQGHUH UDQGRP   $UGXLQRLQL]LDSUHQGHQGRXQQXPHURDFDVRFRPSUHVRWUD
LI ¿DPPLIHUL'D3UHQGHUH¿DPP3UHVL!  ^ HSHUQRQIDUVFRSULUHLOJLRFRDOO¶DYYHUVDULR
¿DPPLIHUL'D3UHQGHUH    $UGXLQRHYLWDGLSHUGHUH¿QFKpqSRVVLELOH
}
LI SULQFLSLDQWH IDOVH ^  $UGXLQRJLRFDVHFRQGRODVWUDWHJLDRWWLPDOHSHUYLQFHUH
LI ¿DPP3UHVL   ^  'RSRODJLRFDWDGHOVHFRQGRJLRFDWRUHLOQXPHURWRWDOHGL
¿DPPLIHUL'D3UHQGHUH   ¿DPPLIHULUDFFROWLGHYHHVVHUHSDULDRXQVXRPXOWLSOR
}
LI ¿DPP3UHVL   ^
¿DPPLIHUL'D3UHQGHUH 
}
LI ¿DPP3UHVL   ^
¿DPPLIHUL'D3UHQGHUH 
}
}
......

due giocatori raccolgono un gioca per primo. Pertanto se riuscire da soli e senza aiuti a
numero variabile tra uno e tre cominciate voi a giocare non battere Arduino.
di essi per volta. Perde il gio- avete alcuna possibilità di vitto- Inoltre, per rendere più equili-
catore che raccoglie l’ultimo ria. Allo stesso modo, se Ardu- brata la partita, il codice prevede
ŎDPPLIHUR ino inizia a giocare per primo che il microcontrollore possa
1HOQRVWURSURJHWWRLŎDPPLIHUL è destinato a perdere. Se però giocare in modo casuale, così
sono sostituiti da 13 LED rossi e sbagliate anche una sola mossa, come farebbe un principiante.
la raccolta di questi da parte del Arduino recupera lo svantaggio Basta chiudere il ponticello JP1
giocatore è effettuata tramite tre e vince. sulla scheda, come mostrato
pulsanti. Altri due pulsanti sono Abbiamo pensato di svelarvi la in Fig. 1, in modo da portare
utilizzati per stabilire chi inizia strategia ottimale, che dovrete l’ingresso analogico A5 a 5 volt.
a giocare per primo. usare per vincere, “nasconden- Questa opzione risulta interessan-
Avrete intuito certamente che dola” tra i commenti del codice, te anche nel caso in cui vorrete
c’è il trucco: perde sempre chi per non togliervi il gusto di far capire gradualmente il trucco
all’ignaro giocatore che avrete
LQYLWDWRDVŎGDUH$UGXLQR
Fig. 2 - Significato Le istruzioni per giocare sono
INIZIA dei pulsanti e dei LED riportate di seguito. Fate riferi-
IL GIOCATORE dello shield. mento alla Fig. 2 per individuare
INIZIA i pulsanti e i LED che vengono
ARDUINO richiamati nella procedura.
1. se tutti i LED rossi lampeggia-
no, vuol dire che non è stata
effettuata la scelta iniziale
su chi deve cominciare; ciò
avviene sia al primo avvio di
Arduino, sia dopo che sono
trascorsi tre secondi dalla
premiazione del vincitore;
VINCE IL 2. per iniziare a giocare bisogna
GIOCATORE
VINCE premere il pulsante P5 (se si
ARDUINO desidera che Arduino faccia
la prima mossa) o il pulsante

76 Settembre 2016 ~ Elettronica In


Tabella 1 - Strategia vincente per il secondo gioco: si possono raccogliere
uno o due fiammeferi e vince chi raccoglie l’ultimo fiammifero.
Il gioco è attivo quando il ponticello JP1 sulla scheda è aperto.
P4 (se si desidera che la prima
mossa spetti al giocatore); Numero di
3. inizialmente vengono accesi Vincitore Note sulla strategia vincente
ÀDPPLIHUL
tutti i 13 LED rossi; Chi gioca Il giocatore che gioca per primo vince sicuramente
1
4. il turno del giocatore è segna- per primo SHUFKpUDFFRJOLHO·XQLFRÀDPPLIHUR
lato dal lampeggio del LED Chi gioca Il giocatore che gioca per primo vince sicuramente
2
verde LD14; il lampeggio per primo SHUFKpUDFFRJOLHGXHÀDPPLIHUL
termina appena il giocatore 3HUYLQFHUHLOVHFRQGRJLRFDWRUHUDFFRJOLHUjXQÀDPPLIHUR
Chi gioca
compie la sua scelta, premen- 3
per secondo
VHLOSULPRJLRFDWRUHQHUDFFRJOLHGXHRGXHÀDPPLIHUL
do il pulsante P1 per prendere VHLOSULPRJLRFDWRUHQHUDFFRJOLHXQR
WUHŎDPPLIHULLOSXOVDQWH Il giocatore che gioca per primo vince sicuramente se raccoglie
Chi gioca
P2 per prenderne due e il 4 XQÀDPPLIHURSRLFKpULFRQGXFHLOJLRFRDOODVLWXD]LRQH
per primo
FRQÀDPPLIHUL
pulsante P3 per prendere un
ŎDPPLIHUR Il giocatore che gioca per primo vince sicuramente
Chi gioca
5 VHUDFFRJOLHÀDPPLIHULSRLFKpULFRQGXFHLOJLRFR
5. quando è il turno di gioco di per primo
DOODVLWXD]LRQHFRQÀDPPLIHUL
Arduino, la sua mossa è ritar-
Il giocatore che gioca per secondo vince sicuramente
data di 2 secondi; Chi gioca
6 VHUDFFRJOLHÀDPPLIHULHULFRQGXFHLOJLRFRDOODVLWXD]LRQH
6. se vince il giocatore, i sei LED per secondo
FRQÀDPPLIHUL
rossi LD1÷LD6 lampeggiano
Chi gioca
per tre secondi; 7 /DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
per primo
7. se vince Arduino, i sei LED Chi gioca
rossi LD1÷LD6 lampeggiano 8 /DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
per primo
per tre secondi; Chi gioca La stessa strategia del caso di un numero
9
8. passati 3 secondi dalla pre- per secondo GLÀDPPLIHULPXOWLSORGL
miazione si ritorna al punto 1; Chi gioca
10 /DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
comunque la scelta di iniziare per primo
una nuova partita può essere 11
Chi gioca
/DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
effettuata in qualsiasi istante. per primo
Chi gioca La stessa strategia del caso di un numero
12
per secondo GLÀDPPLIHULPXOWLSORGL
LO SKETCH PER
IL PRIMO GIOCO Chi gioca
13 /DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
per primo
Lo sketch da installare su Ardui-
no per il primo gioco è riportato
nel Listato 1. Esso è contenuto documentato, a tutto vantaggio come faremmo noi al suo posto:
QHOŎOHGiocoDeiFiammiferi-1.ino, di chi è alle prime armi. Pertanto
scaricabile dal nostro sito Inter- nel loop sono presenti i richiami YRLGORRS ^
OHJJL,QJUHVVL 
net www.elettronicain.it. Abbiamo alle varie sezioni di codice che VHJQDOD(VHJXL6FHOWD,QL]LDOH 
pensato di strutturare il codice in gestiscono il gioco. Come potete VHJQDOD7XUQR'HO*LRFDWRUH 
modo da assicurarne un’elevata notare, il tutto è organizzato per VWDELOLVFL&KL*LRFD3HU3ULPR 
JLRFD 
leggibilità. Esso è stato anche far ragionare la scheda un po’ SUHPLD9LQFLWRUH 
}

Infatti, il microcontrollore Atme-


ga contenuto in Arduino interro-
ga gli ingressi per vedere quali
sono le mosse dell’avversario,
stabilisce se bisogna iniziare una
nuova partita o segnalare che
ancora non è stata fatta la scelta
LQL]LDOHJLRFDUHHLQŎQHSUHPLD-
re il vincitore con l’accensione
dei LED di uno o dell’altro lato
(vedere la Fig. 2).

Elettronica In ~ Settembre 2016 77


Tabella 2 - Strategia vincente per il terzo gioco: si possono raccogliere
uno o due fiammiferi e perde chi raccoglie per ultimo il fiammifero.
Il gioco è attivo quando il ponticello JP1 sulla scheda è chiuso.

Numero di GLI ALTRI DUE GIOCHI


Vincitore Note sulla strategia vincente
ÀDPPLIHUL Il secondo gioco che vi propo-
Chi gioca Il giocatore che gioca per primo perde sicuramente niamo è una variante del primo:
1
per secondo SHUFKpUDFFRJOLHO·XQLFRÀDPPLIHUR LOQXPHURGLŎDPPLIHULGDXWL-
Chi gioca Il giocatore che gioca per primo vince sicuramente perché lizzare può essere compreso fra
2
per primo UDFFRJOLHXQÀDPPLIHURODVFLDQGRO·XOWLPRDOO·DYYHUVDULR HGLVSRVWLLŎDPPLIHULVX
3
Chi gioca Il giocatore che gioca per primo vince sicuramente perché un piano, a turno, i due giocatori
per primo UDFFRJOLHGXHÀDPPLIHULODVFLDQGRO·XOWLPRDOO·DYYHUVDULR raccolgono uno o due di essi per
Chi gioca
3HUYLQFHUHLOVHFRQGRJLRFDWRUHUDFFRJOLHUjXQÀDPPLIHUR volta. Vince la partita il giocato-
4 VHLOSULPRJLRFDWRUHQHUDFFRJOLHGXHRGXHÀDPPLIHUL UHFKHUDFFRJOLHOĬXOWLPRŎDP-
per secondo
VHLOSULPRJLRFDWRUHQHUDFFRJOLHXQR
mifero. Per selezionare questo
Il giocatore che gioca per primo vince sicuramente gioco è necessario che il ponti-
Chi gioca
5 VHUDFFRJOLHXQÀDPPLIHURSRLFKpULFRQGXFHLOJLRFR
per primo
DOODVLWXD]LRQHFRQÀDPPLIHUL
cello JP1 sullo shield, mostrato
in Fig. 1, sia aperto.
Il giocatore che gioca per primo vince sicuramente
Chi gioca per ,QŎQHYHGLDPRLOWHU]RJLRFR
6 VHUDFFRJOLHGXHÀDPPLIHULSRLFKpULFRQGXFHLOJLRFR
primo che è simile al secondo; questa
DOODVLWXD]LRQHFRQÀDPPLIHUL
volta, però, perde la partita il
,OJLRFDWRUHFKHJLRFDSHUVHFRQGRYLQFHVLFXUDPHQWH
giocatore che raccoglie l’ultimo
Chi gioca SRLFKpULFRQGXFHLOJLRFRDOODVLWXD]LRQHFRQÀDPPLIHUL
7 ŎDPPLIHUR3HUVHOH]LRQDUH
per secondo UDFFRJOLHUjXQÀDPPLIHURVHLOSULPRJLRFDWRUHQHUDFFRJOLH
GXHRGXHÀDPPLIHULVHLOSULPRJLRFDWRUHQHUDFFRJOLHXQR  questo gioco è necessario che il
Chi gioca
ponticello JP1 sullo shield, mo-
8 /DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL strato in Fig. 1, sia chiuso.
per primo
Chi gioca Anche in questo caso c’è il truc-
9 /DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
per primo co: vince sempre un determinato
Chi gioca /DVWHVVDVWUDWHJLDGHOFDVRGLXQQXPHURGLÀDPPLIHULPXOWLSOR giocatore. Ovviamente ciò avvie-
10
per secondo GLHDXPHQWDWRGL ne solo se questi gioca secondo
11
Chi gioca
/DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL
una strategia ottimale.
per primo Questa strategia, che cambia al
12
Chi gioca
/DVWHVVDVWUDWHJLDGHOFDVRGLÀDPPLIHUL mutare delle condizioni di gioco,
per primo dipende dal gioco selezionato,
Chi gioca /DVWHVVDVWUDWHJLDGHOFDVRGLXQQXPHURGLÀDPPLIHULPXOWLSOR GDOQXPHURGLŎDPPLIHULWRWDOL
13
per secondo GLHDXPHQWDWRGL
usati e da quale giocatore inizia

[piano di MONTAGGIO]
Elenco
Componenti:
P1÷P5: Microswitch
R1÷R13, R20: 1 kohm
R14÷R19: 10 kohm
LD1÷LD14: LED
3mm rosso

Varie:
- Jumper
- Strip M/F 10 vie
- Strip M/F 6 vie
- Strip M/F 8 vie (2 pz.)
- Strip M/F 2x3 vie
- Strip maschio 2 vie
- Circuito stampato S1268 (68 x 54 mm)

78 Settembre 2016 ~ Elettronica In


Listato 2
//***********************************************************************************************************
 JLRFR8QR  9,1&(&+,5$&&2*/,(/¶8/7,02),$00,)(52
//***********************************************************************************************************

void giocoUno() {

......

if ((mossaAllaMacchina==true) && (abilitaMossa==true) && (vinceGiocatore==false) && (vinceMacchina==false)) {


VZLWFK ¿DPPLIHUL*LRFR¿DPP3UHVL ^/DVWUDWHJLDYLQFHQWHqLQGLFDWDGLVHJXLWR YHGLWDEHOOD
FDVH
¿DPPLIHUL'D3UHQGHUH 
YLQFH0DFFKLQD WUXH
EUHDN
FDVH

......

 FDVH
......

//***********************************************************************************************************
 JLRFR'XH  3(5'(&+,5$&&2*/,(/¶8/7,02),$00,)(52
//***********************************************************************************************************

YRLGJLRFR'XH ^

......

if ((mossaAllaMacchina==true) && (abilitaMossa==true) && (vinceGiocatore==false) && (vinceMacchina==false)) {


VZLWFK ¿DPPLIHUL*LRFR¿DPP3UHVL ^/DVWUDWHJLDYLQFHQWHqLQGLFDWDGLVHJXLWR YHGLWDEHOOD
FDVH
¿DPPLIHUL'D3UHQGHUH 
YLQFH*LRFDWRUH WUXH
EUHDN
FDVH

......

 FDVH
......

per primo. In verità, più che di fate riferimento alla Fig. 2 per desidera che la prima mossa
un trucco si tratta di una formu- individuare facilmente i pulsanti spetti al giocatore).
la numerica. La strategia otti- e i LED che vengono richiamati 3. La modalità di programma-
male di gioco, infatti, ha molto nella lista. zione è segnalata dall’accen-
a che fare con la matematica e La procedura è di seguito de- sione del LED verde LD14.
con la logica. Avvalendovi della scritta passo per passo. 4. Inizialmente risulteranno
Tabella 1, della Tabella 2 e dei 1. Se tutti i LED rossi lampeggia- accesi i quattro LED rossi
commenti del codice potrete no, vuol dire che non è stata LD1÷LD4. A ogni pressione
approfondire, se ne avete voglia, effettuata la scelta iniziale del pulsante P1 il numero di
questo aspetto. su chi deve cominciare. Ciò LED rossi accesi aumenterà
Le istruzioni per giocare ai due avviene sia al primo avvio di di uno. Dopo l’accensione
nuovi giochi sono riportate di Arduino, sia dopo che sono del tredicesimo LED rosso si
seguito. trascorsi tre secondi dalla riparte dai quattro LED accesi.
A differenza del gioco preceden- premiazione del vincitore. 5. Per uscire dalla programma-
te, per consentire al giocatore 2. Per entrare in modalità pro- zione occorre premere insie-
di scegliere il numero totale dei grammazione bisogna preme- me i pulsanti P2 e P3. Il LED
ŎDPPLIHULFRQFXLJLRFDUH© re il pulsante P5 (se si deside- verde LD14 si spegne e subito
stata predisposta una semplice ra che Arduino faccia la prima dopo il gioco comincia.
procedura di programmazione; mossa) o il pulsante P4 (se si 6. Il turno del giocatore è segna-

Elettronica In ~ Settembre 2016 79


lato dal lampeggio del LED FDVHWUXH i LED (riferitevi, per l’orienta-
JLRFR'XH 
verde LD14. Il lampeggio EUHDN mento, al piano di montaggio
termina appena il giocatore } visibile nelle pagine precedenti
SUHPLD9LQFLWRUH 
compie la sua scelta, premen- } e ricordate che nei LED il catodo
do il pulsante P3 per prendere è l’elettrodo che sta dalla parte
GXHŎDPPLIHULHLOSXOVDQWH In base allo stato del ponticello dello smusso del contenitore) e i
P2 per prenderne uno. JP1 il programma principale connettori strip femmina a passo
7. Quando è il turno di gioco richiama due diverse sezioni di 2,54 mm con piedini lunghi 20
di Arduino, la sua mossa è codice per gestire il gioco. Le mm. Proseguite montando il
ritardata di due secondi. strategie ottimali di gioco ripor- pin-strip a due poli per il jumper
8. Se vince il giocatore, i sei LED tate nella Tabella 1 e Tabella 2, J1.
rossi LD1÷LD6 lampeggiano vengono implementate, utililiz- Fatto ciò il montaggio è com-
per tre secondi. zando la struttura switch ... case, SOHWDWRYHULŎFDWRFKHWXWWLL
9. Se vince Arduino, i sei LED in due differenti sottoprogram- componenti siano al loro posto
rossi LD1÷LD6 lampeggiano mi, la cui parte iniziale è quella e orientati correttamente potete
per tre secondi. che vedete nel Listato 2 . inserire lo shield sulla vostra Ar-
9. Passati 3 secondi dalla GXLQRTXLQGLFDULFDUHLOŎUPZD-
premiazione del giocatore REALIZZAZIONE PRATICA re e iniziare a giocare.
evidenziato dai LED, si ritor- Descritto l’hardware, ossia lo Se vi è più comodo potete inseri-
na al punto 1. Comunque la VKLHOGHDQDOL]]DWRLOŎUPZD- re l’insieme in un contenitore in
scelta di iniziare una nuova re per i tre giochi, possiamo plastica di dimensioni adeguate,
partita può essere effettuata passare alla descrizione della prolungando l’attuatore dei
in qualsiasi istante, quindi si costruzione del circuito; data pulsanti con dei tondini di pla-
può anche ricominciare senza l’estrema semplicità dello stica (PVC) piena del diametro
attendere il termine della schema, potreste anche montare di 5 o 6 mm. È anche pensabile
partita. il circuito direttamente su una cambiare tipo di pulsanti, utiliz-
basetta millefori o su una scheda zandone di più grandi e magari
LO SKETCH PER IL SECONDO breadboard, comunque abbiamo colorati, da applicare a un pan-
E IL TERZO GIOCO previsto un circuito stampato di nello della scatola collegandoli
Passiamo adesso a esaminare cui sul nostro sito Internet www. poi alle rispettive piazzole dello
l’ultimo sketch da installare in elettronicain.it pubblichiamo la VKLHOGWUDPLWHVSH]]RQLGLŎORLQ
Arduino, che è quello necessario traccia lato rame della basetta. guaina.
per implementare il secondo Il c.s. è del tipo a semplice rama- Detto ciò non c’è altro da ag-
HWHU]RJLRFRWDOHŎUPZDUH© tura, quindi realizzarlo è facile e giungere; ci resta solo da augu-
J
FRQWHQXWRQHOŎOHGiocoDeiFiam- alla portata di tutti, dato che non rarvi buon divertimento!
miferi-2e3.ino scaricabile dal è richiesto di allineare le due
nostro sito Internet www.elettro- tracce né il doppio passaggio di
nicain.itLQVLHPHDJOLDOWULŎOHGHO esposizione nel bromografo con
progetto. il relativo sviluppo, né occorre
Anche in questo caso il codice è creare le vie tra le due facce. per il MATERIALE
strutturato in modo da assicu- Anche la scelta dei componenti
rarne un’elevata leggibilità ed è utilizzati, che sono tutti a mon- -
ben documentato. taggio tradizionale (THT) va sto progetto è di facile reperibilità.
La parte principale è il loop, nella direzione di rendere la rea- Il master del circuito stampato e i
come visibile qui di seguito: lizzazione dello shield a portata file degli sketch possono essere
di chiunque sappia utilizzare un scaricati dal sito della rivista.
YRLGORRS ^
OHJJL,QJUHVVL  saldatore.
VHJQDOD(VHJXL6FHOWD,QL]LDOH  Dunque, incisa e forata la baset-
VHJQDOD7XUQR'HO*LRFDWRUH  Il materiale va richiesto a:
LPSRVWD&KL*LRFD3HU3ULPRB)LDP ta potete iniziare il montaggio
Futura Elettronica, Via Adige 11,
PLIHUL*LRFR  dei componenti: partite dalle re-
VZLWFK JLRFR ^ 21013 Gallarate (VA)
FDVHIDOVH
sistenze e dai pulsanti miniatura,
Tel: 0331-799775 • Fax: 0331-792287
JLRFR8QR  che sono i componenti a più
EUHDN http://www.futurashop.it
EDVVRSURŎORTXLQGLVLVWHPDWH

80 Settembre 2016 ~ Elettronica In


Arduino

Aggiungiamo un display grafico touch


alle nostre board Arduino-like,
con un hardware e tre librerie ad hoc.

TFT SHIELD
PER FISHINO
di MASSIMO DEL FEDELE

D opo avervi presentato ben quattro schede di


prototipazione della serie Fishino (la UNO, la
Fishino 32, la MEGA, la Guppy...ed una quinta è
HD44780), perché volevamo un bello schermo
grafico caratterizzato da dimensioni ridotte e una
discreta risoluzione, sul quale mostrare icone, sim-
in arrivo!), abbiamo iniziato a sentire il bisogno boli e fare un po’ di grafica. Ci siamo quindi messi
di a proporre un po’ di elettronica di contorno. In alla ricerca di qualcosa di esistente, riscontrando,
particolare, abbiamo sentito la mancanza di un di- tuttavia, che i pur molti display (e shield che li sup-
splay da abbinare loro, per corredare le applicazioni portano) hanno parecchie limitazioni.
con output visivi che non fossero semplicemente Per questo abbiamo voluto realizzarci qualcosa su
LED accesi o spenti. Ma non ci bastava un semplice misura, ossia uno shield con a bordo un prestante
display per testo (come ad esempio i comunissi- display, che vi descriviamo in questo articolo.
mi alfanumerici a 2 o 4 righe basato su controller Partiamo dall’inizio, ossia dalla fase di progetto,

Elettronica In ~ Giugno 2017 43


Fig. 1
L’assemblaggio
del display sullo
shield. interessante e di utilizzo semplicissimo, che vi
presenteremo in queste pagine.
Per renderne ancora più agevole l’utilizzo
abbiamo provveduto a preparare tre apposite
librerie, due delle quali di derivazione Adafru-
it, in grado di gestire il display stesso, ed una
totalmente sviluppata da noi per la gestione del
touch-panel che esso incorpora.

UNO SHIELD “UNIVERSALE”


Contrariamente al solito, inizieremo la descrizio-
ne dello shield...dalla fine! Infatti, la cosa più com-
plessa nello sviluppo del progetto è stata proprio la
dicendo che volevamo creazione del layout della scheda, dovendo abbi-
qualcosa in grado di soddisfa- nare ad essa board anche parecchio diverse le une
re i seguenti requisiti: dalle altre. Abbiamo quindi iniziato con lo sviluppo
• dimensioni sufficientemente ridotte (2,4 o “grafico” della scheda, per poi andare a ritroso fino
al massimo 3,2 pollici); ad ottenere lo schema elettrico.
• risoluzione minima di 320x240 pixel, con profon- Iniziamo dall’ingombro: il primo requisito era
dità di colore elevata; quello di ottenere una scheda con dimensioni pa-
• interfaccia touch che ci permetta di interagire con ragonabili alla nostra Fishino UNO (ma anche alla
il nostro Fishino; Fishino32 e ad Arduino UNO); quindi il display va
• impegno di poche risorse hardware della scheda, sovrapposto senza o quasi aumentarne l’ingombro
in modo da poterlo utilizzare anche con i modelli laterale: si sviluppa tutto nello spessore. Abbia-
di Fishino dotati di pochi I/O (la Guppy, per mo quindi optato per un “sandwich” consistente,
esempio); nell’ordine, dal display TFT, dallo shield e, infine,
• uno shield che si adattasse a tutti i prodotti della dalla scheda a microcontroller; la Fig. 1 chiarisce
serie Fishino ed anche a molti della serie Ardui- meglio il concetto.
no, senza bisogno di connessioni volanti In questa immagine potete vedere il “mockup”
• la possibilità di collegare altri componenti (modello grafico) dello shield con display ed un
insieme allo shield, quindi l’esposizione di tutti Fishino MEGA montati, che è stata la nostra base di
gli I/O delle varie schede anche con il display partenza.
montato. L’esigenza di accedere a tutti gli I/O della scheda
ha imposto l’aggiunta, lateralmente, di due file di
Crediamo di essere riusciti nei nostri propositi connettori maschio paralleli a quelli destinati ad in-
quasi al 100% (vedremo in seguito alcuni piccoli filarsi nei connettori femmina della scheda, ai quali
“limiti”, facilmente superabili), con un prodotto è possibile connettere i consueti cavetti Dupont.

Fig. 2
Esploso
dello Fig. 3
shield Esploso dello
e delle shield e delle board
board Fishino, visto
Fishino. da sopra.

44 Giugno 2017 ~ Elettronica In


Una volta stabilito a grandi linee il layout della sche-
da, la dimensione del display è stata fissata in 2,8
pollici come massimo (può accettare anche il display
più piccolo da 2,4 pollici), in modo da non superare
l’ingombro previsto.
Un altro parametro che ha vincolato la dimensione è
stato l’esigenza di utilizzare il minor numero di I/O
possibili; abbiamo quindi scartato tutti i display con
interfaccia parallela (8 ma anche 16 bit) che avreb-
bero occupato praticamente tutte le risorse delle
schede più “piccole” e ci siamo orientati verso un
display con comunicazione SPI, reperibile facilmen-
te nel formato, appunto, di 2,4 pollici o 2,8 pollici. Fig. 4 - Layout dei connettori dello shield.
Questo display utilizza le linee SPI (MISO, MOSI
e SCK), in comune con il modulo WiFi e le schede
SD (ed altro eventuale!), una linea di selezione ed Il “problema” non è risolvibile, visto che alcuni con-
una di controllo per il display ed altre 2 linee per nettori devono avere una posizione ben precisa gli
lo schermo touch-sensitive, quindi quattro I/O uni con gli altri: per esempio il connettore ISP che
utilizzati in “esclusiva” contro 10÷12 minimo per i porta i segnali SPI sia dell’UNO che del Mega.
modelli ad interfaccia parallela. Per ovviare all’inconveniente ci sono più possibilità:
Come vedremo in seguito, abbiamo poi aggiunto • montare solo i connettori strettamente necessari
altre funzionalità opzionali, ottenibili con l’utilizzo alla Fishino da innestare, soluzione, questa, da
di pochi altri I/O. noi scelta nel progetto, visto che è presumibile
Fissati quindi layout e display, occorreva trovare un che lo shield, pur essendo “universale”, venga
modo per poter “infilare” tutti i modelli di board destinato di volta in volta ad un solo controller;
previsti sullo stesso shield. Visto che la tecnologia lo svantaggio è che lo shield, una volta montato
attuale lo permette, abbiamo realizzato i modelli per poter supportare UNO/MEGA/32 non è
3D di tutte le schede, il modello 3D del display ed il in grado di montare Guppy/Nano/Piranha, e
modello 3D iniziale dello shield, in modo da poterli viceversa, senza sostituire i connettori;
sovrapporre graficamente e visualizzare eventuali • montare tutti i connettori eliminando i soli pin
interferenze; nella Fig. 2 e nella Fig. 3 trovate i dise- che interferiscono, soluzione, questa, che sarebbe
gni in esploso visti dal basso e dall’alto del nostro quasi ottimale, salvo che i segnali corrispondenti
shield con sovrapposte un buon numero di schede ai pin eliminati non verrebbero portati ai connet-
Fishino. Resta inteso che di Fishino se ne monta una tori aggiuntivi laterali (qualcuno potrà preferire
sola per volta. questa soluzione, quindi la esporremo dettaglia-
Abbiamo quindi cercato la posizione migliore per le tamente in seguito);
schede “piccole” (Fishino Guppy/Arduino Nano e • “girare” i connettori ESPCONN ed ICSP sulle
la futura Fishino Piranha, pin-out compatibile con schede UNO e 32 dal lato opposto della board,
l’Arduino MKR1000) in modo da non avere inter- soluzione che risolve tutto, ma purtroppo richie-
ferenze tra i connettori (cosa impossibile al 100%, de una modifica delle schede suddette, consisten-
come vedremo a breve) e da poter restare negli te nel dissaldare i connettori presenti e risaldarli
ingombri previsti. sul lato opposto; anche questa soluzione è prati-
Ecco quindi nascere il layout definitivo della scheda, cabile, ma richiede una buona manualità per non
mostrato nella Fig. 4 dal lato di inserimento dei con- danneggiare le schede.
troller (vale a dire delle schede Fishino/Arduino).
Tutto perfetto, quindi? Purtroppo no, perché le Come detto, noi abbiamo optato per la prima solu-
schede Fishino UNO e 32 hanno due connettori zione, soprattutto tenendo conto che lo shield verrà
ausiliari, per la precisione il connettore ESPCONN proposto in kit, quindi con i connettori da montare;
sulla UNO ed il connettore ICSP sulla 32 che vanno nulla vieta comunque di sceglierne un’altra.
ad interferire con i connettori delle schede “piccole”
(Nano/Guppy e Piranha/MKR1000); l’inserimento SCHEMA ELETTRICO
è fisicamente possibile, ma i segnali non sono com- Dopo aver studiato il layout della scheda, eccoci
patibili con i circuiti della scheda. pronti per lo schema elettrico! Il tutto è piuttosto

Elettronica In ~ Giugno 2017 45


[schema ELETTRICO]

46 Giugno 2017 ~ Elettronica In


semplice, si tratta soltanto di collegare i vari segnali
e prevedere i necessari ponticelli per poterli adat-
tare alle varie schede. In particolare, l’esigenza si fa
sentire per le schede Piranha/MKR1000, che hanno
un pin-out completamente diverso rispetto alle
altre, ed anche i segnali di interrupt/SPI relativi.
La prima cosa strana che si può notare nello schema
elettrico è il raddoppio di tutti i componenti attivi
e passivi. Questo è stato fatto per poter realizzare
una scheda in grado di montare sia componenti
in formato SMD, cosa vantaggiosa per una produ-
zione industriale, sia in formato THT (con i reofori
passanti), in modo da poter offrire la scheda in for-
ma di kit assemblabile anche senza esperienza nei
montaggi superficiali. Quindi, nello schema tutti i
componenti “sdoppiati” sono da intendersi come
alternativi tra il formato SMD e THT.
Iniziamo col descrivere l’alimentazione, che potreb-
be sembrare superflua (tutte le schede utilizzate
hanno un’uscita di alimentazione a 3,3 volt), ma che,
vista la scarsa disponibilità di corrente su alcune bo-
ard, in particolar modo le Arduino originali e molti
cloni economici, risulta indispensabile.
Si tratta di un semplicissimo regolatore lineare low
drop-out da 3,3 V, in grado di erogare poco meno di
un ampere in uscita, corrente fin troppo abbondan-
te per lo scopo.
Il ponticello denominato PWR permette di selezio-
nare la tensione proveniente dal regolatore interno
o direttamente dalla linea a 3,3 volt della board
connessa. Può sembrare superfluo ma, avendo una
scheda con sufficiente disponibilità di corrente sui
3,3 volt, come la serie Fishino, ci permette di rispar-
miare il regolatore U1 ed i condensatori a corredo
volendo limitare i costi al massimo.
Analizziamo ora il connettore del display TFT e la
componentistica annessa: il visualizzatore utilizzato
lavora con una tensione di 3,3 V e richiede livelli
logici corrispondenti; fornendo livelli a 5 volt si può
facilmente danneggiare. Per ovviare al problema
abbiamo inserito dei limitatori di livello costituiti
ciascuno da una resistenza (R1÷R8) ed un diodo
connesso verso il positivo dell’alimentazione a 3,3
volt. Questo permette, in presenza di un segnale di
valore superiore, di “scaricarlo” sui 3,3 volt, limi-
tandolo automaticamente a quel valore.
Le resistenze scelte hanno due esigenze contrappo-
ste: devono essere sufficientemente alte di valore
per non assorbire una corrente eccessiva e nel
contempo sufficientemente basse da non causare
un ritardo nei segnali veloci. Come potete notare,
nelle linee di abilitazione e di controllo (IRQ, DC ed
i due CS), dove viaggiano segnali “lenti”, le resi-

Elettronica In ~ Giugno 2017 47


[piano di MONTAGGIO]

Elenco Componenti:

R1: 10 kohm
R2: 1 kohm
R3: 1 kohm
R4: 330 ohm
R5: 1 kohm
R6: 330 ohm
R7: 330 ohm
R8: 1 kohm
C1: 100 µF 16 VL elettrolitico
Q1: BS170
U1:NCP1117ST33
D1: 1N4148
D2: 1N4148
D3: 1N4148
D4: 1N4148
D5: 1N4148
D6: 1N4148
D7: 1N4148
RESET: Microswitch
WAKE: Microswitch
BUZ: Buzzer senza elettronica
CN1: Strip Maschio 8 vie
CN2: Strip Maschio 10 vie
CN3: Strip Maschio 8 vie
CN4: Strip Maschio 8 vie
CN5: Strip Maschio 8 vie

stenze hanno un valore di 1 kohm, dando quindi la linee di controllo del display: SJ_T_IRQ, SJ_T_CS,
precedenza alla bassa corrente rispetto alla velocità SJ_DC e SJ_CS. A cosa servono? Semplicemente, nel
di risposta; per contro, nelle tre linee dove viag- tempo ci siamo accorti che spesso gli shield, aven-
giano i segnali SPI, che possono assumere valori do collegamenti prestabiliti ai pin digitali, sono
di frequenza sopra ai 10 MHz, abbiamo optato per molto vincolanti. Se si ha la necessità di connettere
un valore decisamente più basso, ovvero 330 ohm. qualcos’altro che utilizza gli stessi I/O (un altro
Anche con questo valore, superare i 12÷16 MHz di- shield in cascata, per esempio) le cose si complicano
venta difficile, infatti in libreria abbiamo limitato la e si ha la scelta tra il non usare gli shield insieme
frequenza dei segnali SPI a 12 MHz: un valore più oppure il tagliare alcune piste del PCB. Tagliando
che sufficiente per lavorare a una velocità discreta. questi ponticelli, invece, è possibile liberare gli I/O
I connettori MODE (montati vicino al condensatore corrispondenti senza dover manomettere il circuito
C1) servono per selezionare l’utilizzo con schede stampato; ovviamente è poi necessario realizzare
“standard” (UNO, MEGA, 32 e simili) oppure di dei collegamenti volanti con altri I/O per utilizzare
tipo Piranha/MKR1000 che hanno segnali differenti. il display, ma questo è molto semplice.
Anche i connettori JTMOSI, JTMISO, JTSCK ven- Il MOSFET Q1, insieme alla resistenza R1 ed al
gono utilizzati per la selezione del controller, e più connettore JTLED viene utilizzato, opzionalmente,
precisamente per gestire la differente posizione dei per il controllo della retroilluminazione del display.
segnali SPI sulle schede. Lasciandolo aperto, il MOSFET risulta polarizzato
Come possibilità aggiuntiva abbiamo inserito inol- da R1 e quindi l’illuminazione è accesa; inserendo
tre dei ponticelli sul PCB per poter sconnettere le 4 un jumper è possibile controllarla tramite un I/O

48 Giugno 2017 ~ Elettronica In


CN6: Strip Maschio 10 vie
CN7: Strip Maschio 8 vie
CN8: Strip Maschio 8 vie
CN9: Strip Femmina 15 vie
CN10: Strip Femmina 15 vie
CN11: Strip Femmina 15 vie
CN12: Strip Femmina 15 vie
CN13: Strip Femmina 2x6 vie
CN14: Strip Maschio 10 vie
TFT: Strip Femmina 14 vie
JTLED: Strip Maschio 3 vie
JTMODE: Strip Maschio 3 vie
JTDC: Strip Maschio 3 vie
JTMOSI: Strip Maschio 3 vie
JTMISO: Strip Maschio 3 vie
JTSCK: Strip Maschio 3 vie
JBUZ: Strip Maschio 3 vie
JPWR: Strip Maschio 3 vie
JSPI: Strip Maschio 2x3 vie
SPI: Strip Femmina 2x3 vie

Varie:
- Jumper (8 pz.)
- Display Touch 2,4” o 2,8”
- Circuito stampato S1328 (88x56mm)

digitale del controller, e più precisamente il D8 I/O digitale, e più precisamente al D9 sulle schede
sulle schede UNO/MEGA/32 e il D3 sulla Piranha/ UNO/MEGA/32 o al D4 su Piranha/MKR1000, se-
MKR1000. lezionabili anche qui tramite un connettore, il JBUZ.
Tramite questa caratteristica è quindi possibile Lasciando il connettore aperto risparmiamo una
risparmiare corrente di alimentazione quando non linea di I/O ma non potremo sfruttare il cicalino.
serve che il display sia visibile. Quest’ultimo è di tipo passivo, va quindi pilotato
Successivamente possiamo notare i due pulsanti, con un segnale PWM di frequenza opportuna, gesti-
RESET e WAKE, che vengono utilizzati rispetti- to via software.
vamente per resettare il controller (una comodità Vediamo, infine, il percorso dei segnali SPI e l’ulti-
rispetto al dover “cercare” il pulsante sulla scheda mo connettore di selezione schede, lo JSPI. Come
che, specialmente sul MEGA, risulta difficilmente detto in precedenza, i segnali SPI viaggiano su di-
raggiungibile) e per “risvegliarlo”, oppure per altri versi I/O a seconda della scheda. Sulla UNO e sulla
usi a scelta. Il pulsante WAKE è infatti connesso Mega (e la Fishino 32) la cosa è semplificata dal
alla stessa linea di interrupt del touch controller e connettore ISP, che li riporta indipendentemente
può quindi venire usato per uscire dalla modalità di da dove vengono connessi ; questo viene sfruttato
stand-by anche col display completamente spento. tramite il connettore SPI che raccoglie tali segnali.
Abbiamo poi voluto inserire anche un cicalino, per Sulle schede Piranha/MKR1000 abbiamo già visto
poter avere un feedback acustico, sia del tocco sul i relativi jumper. Restano fuori Guppy ed Arduino
display che di eventuali condizioni di errore. Il Nano che, pur avendo il connettore ISP, l’hanno
cicalino è connesso (opzionalmente) ad un altro montato dal lato “sbagliato” della scheda, e quindi

Elettronica In ~ Giugno 2017 49


Fig. 5 - I punti di interferenza su Fishino32. Fig. 6 - Punti di interferenza su Fishino UNO.

non è possibile sfruttarlo nel nostro shield. Montan- pin che interferiscono, rendendo lo shield sempre
do Guppy o Nano è quindi necessario inserire i tre utilizzabile con tutte le schede, al prezzo di non
jumper nel connettore JSPI che realizzano il collega- portare all’esterno alcuni del segnali disponibili.
mento richiesto alle linee SPI. Vediamo qui di seguito le interferenze e i pin da
eliminare.
REALIZZAZIONE PRATICA
La costruzione dello shield è alla portata anche di UTILIZZO CON FISHINO32
chi ha poca esperienza, grazie alla possibilità di La board Fishino32 interferisce con i connettori del-
montare componenti passanti tradizionali. Nulla le schede Guppy/Piranha solo su due punti, visibili
vieta, nel caso preferiate, di utilizzare i componenti nella Fig. 5.
SMD. Evitando di montare il connettore nei due punti
Consigliamo come sempre di montare per primi segnalati si risolvono completamente le interferen-
i componenti a basso profilo e poco ingombranti, ze, al costo di non portare all’esterno i segnali VIN
quindi resistenze e diodi, seguiti dai condensatori della scheda PIRANHA ed il D4 della scheda Gup-
elettrolitici, il regolatore di tensione ed il MOSFET. py. Il VIN è necessario solo se si alimenta la scheda
Successivamente vanno disposti i pulsanti ed il ci- con una tensione esterna, mentre il D4 del Guppy,
calino e, per ultimi, essendo piuttosto ingombranti, essendo utilizzato anche dalla scheda SD interna, è
i connettori. probabilmente inutile per un utilizzo esterno.
Qui di seguito potete vedere due immagini dello Eliminando questi due “spezzoni” di connettore è
shield, visto sia dal lato superiore (componenti pas- quindi possibile montare senza ulteriori modifiche
sivi/attivi, jumper e connettore per il display TFT) le seguenti schede: Arduino UNO, MEGA e Nano,
sia dal lato inferiore (connettori per le board). Fishino MEGA, Fishino32, Fishino Guppy, Fishino
L’unica cosa a cui occorre fare particolare attenzio- Piranha ed Arduino MKR1000. La scheda Fishino
ne è il lato di montaggio dei vari header; montan- UNO risente di altre interferenze, che descriveremo
doli dal lato sbagliato ovviamente non riuscirete ad nei prossimi paragrafi.
infilare i controller, i jumper o il display!
Come anticipato in precedenza, a causa di alcune UTILIZZO CON FISHINO UNO
interferenze tra i vari connettori delle schede utiliz- La scheda FishinoUNO interferisce con i connettori
zabili con il nostro shield, non è possibile montare delle board Guppy/Piranha in quattro punti, evi-
tutti i connettori nello stesso tempo, a meno di non denziati nella Fig. 6.
utilizzare particolari accorgimenti. Se ricordate, ab- Anche in questo caso è possibile rendere il no-
biamo prospettato 3 possibilità, la terza delle quali stro shield TFT “universale” eliminando i pin dei
comporta una modifica alla scheda controller origi- connettori indicati dalle frecce nella predetta figura.
nale che però lasciamo alla scelta di chi è dotato di Tuttavia in questo caso occorre sacrificare le con-
buona manualità. nessioni esterne sui due canali analogici A5 ed A6
Le altre due alternative sono quella di montare del PIRANHA e la VIN della Guppy. La linea GND
solo i connettori necessari alla propria scheda, cosa è presente anche su un altro pin quindi non dà
peraltro che non ha bisogno di ulteriori spiegazioni, problemi.
oppure quella di eliminare da alcuni connettori i Eliminando questi quattro pin è possibile montare

50 Giugno 2017 ~ Elettronica In


Listato 1
#include <SPI.h>
le seguenti schede: Arduino UNO/MEGA/NANO, #include <FishinoGFX.h>
Fishino UNO, Fishino MEGA, Fishino GUPPY, Fi- #include <FishinoILI9341.h>
shino PIRANHA, ma non la Fishino32 che richiede // questa linea è per comodità, in modo da non dover scrivere
l’eliminazione dei pin al paragrafo precedente. // FishinoILI9341 ad ogni comando inviato al display
#define tft FishinoILI9341
Prendendo entrambi gli accorgimenti è ovviamente
possibile montare tutte le schede disponibili. void setup()
{
// inizializza lo schermo
ED ORA... SOFTWARE! tft.begin();
Come accennato nell’introduzione, per la gestione
// cancella lo sfondo riempiendolo di nero
dello shield abbiamo approntato tre librerie che ne tft.fillScreen(ILI9341_BLACK);
consentono il controllo completo. Queste sono:
// disegna una croce che percorre tutto lo schermo
• FishinoGFX, versione praticamente identica // in due colori
all’analoga di Adafruit, che gestisce le funzioni tft.drawLine(0, 0, tft.width(), tft.height(), ILI9341_RED);
grafiche “ad alto livello”; tft.drawLine(0, tft.height(), tft.width(), 0, ILI9341_GREEN);

• FishinoILI9341, che gestisce le funzioni di inter- }
faccia con il display a livello hardware; anche
void loop()
questa libreria è stata realizzata partendo dall’a- {
naloga di Adafruit, ma con modifiche abbastanza }
sostanziali;
• FishinoXPT2046; che gestisce il touch screen,
scritta da zero di nostro pugno.
ferenti (rosso e verde) che attraversano lo schermo.
Iniziamo dalla sezione display, con uno sketch sem- Le funzioni tft.width() e tft.height() forniscono
plicissimo che inizializza lo schermo e disegna una rispettivamente la larghezza e l’altezza del display
croce in due colori; lo trovate nel Listato 1. in pixel.
Come potete notare lo sketch è semplicissimo. La La libreria è molto estesa e tra le funzioni che
funzione loop() risulta vuota (non c’è nulla da ripe- implementa permette di tracciare punti, linee,
tere!), mentre tutto si svolge nella setup(). cerchi, rettangoli, immagini, testi, eccetera. In
La prima linea di questa: essa è anche possibile “ruotare” lo schermo, in

tft.begin();

Listato 2
inizializza lo schermo. Utilizzando lo shield con
le schede previste non occorre specificare i pin di #include <Flash.h>
#include <FishinoXPT2046.h>
connessione; la libreria si occupa di tutto. Volendo #include <SPI.h>
utilizzare connessioni differenti, occorre specificare
quali I/O utilizzare, nella funzione begin(): // questa linea è per comodità, in modo da non dover scrivere
// FishinoXPT2046 ad ogni comando
#define touch FishinoXPT2046
tft.begin(cs_pin, dc_pin);
void setup()
{
Dove in cs_pin e dc_pin vanno indicati i pin cui // inizializza la porta seriale
Serial.begin(115200);
sono connesse le linee CS e DC del display. }
Andiamo alla linea:
void loop()
{
tft.fillScreen(ILI9341_BLACK); if(touch.touching())
{
uint16_t x, y, z;
la quale riempie semplicemente lo schermo di nero, touch.read(x, y, z);
cancellandolo. Successivamente troviamo le due Serial << “X : “ << x << “\n”;
Serial << “Y : “ << y << “\n”;
righe di codice: Serial << “Z : “ << z << “\n”;
Serial << “------------------\n”;
tft.drawLine(0, 0, tft.width(), tft.height(), ILI9341_RED); }
tft.drawLine(0, tft.height(), tft.width(), 0, ILI9341_GREEN); delay(200);
}
che si occupano di disegnare due linee di colori dif-

Elettronica In ~ Giugno 2017 51


Shield e display montati
sulla Fishino MEGA.

occorre specificare le
connessioni hardware
SE si utilizza lo shield con
le schede previste; altrimen-
ti prima di iniziare ad usare i
comandi occorre indicarle tramite la
linea seguente nella setup():

touch.connect(cs, irq);

dove CS è il pin a cui è collegata la linea CS del touch


controller, mentre IRQ è la linea relativa al segnale
di tocco dello schermo, che deve essere connessa ad
una linea digitale che supporta gli interrupt.

CONCLUSIONI
In questo articolo abbiamo colmato quella che
modo da disegnarci sopra in modalità orizzon- ritenevamo una lacuna, ossia la mancanza di una
tale o addirittura di capovolgere l’immagine periferica display per le nostre Fishino; ecco quindi
visualizzata. uno shield con LCD grafico e dotato addirittura di
Nella libreria sono contenuti alcuni esempi, tra interfaccia tattile, abbinabile a tutte le board Fishino
cui due “painter” che permettono di disegnare sinora proposte e alla nascente Piranha.
sullo schermo sfruttando il touch-screen incor- Con i brevissimi esempi di codice appena proposti
porato, oltre a un test grafico che mostra le varie e descritti si conclude la presentazione del nostro
primitive disponibili. shield display per le board Fishino.
Vediamo ora la sezione touch-screen, della quale Prossimamente pubblicheremo un esempio di
si occupa la libreria FishinoXPT2046. utilizzo più complesso, sfruttando le caratteristiche
Anche qui mostriamo un esempio semplice-sem- di Fishino32. g

plice, rimandando quelli allegati alle librerie per


le caratteristiche più complesse.
Lo sketch mostrato nel Listato 2 attende sempli-
cemente che si tocchi lo schermo e stampa sul per il MATERIALE
monitor seriale dell’IDE Arduino la posizione in
cui avviene il tocco. Lo shield (cod. FT1328K) viene venduto in Kit al
Come potete notare, anche qui la semplicità è di- prezzo di Euro 19,00. Lo shield non comprende il
sarmante; la setup() si limita ad avviare la porta display che però è possibile acquistare separa-
seriale, mentre nella loop si attende il tocco dello tamente scegliendo fra il display LCD touch da
schermo tramite l’istruzione: 2,4” SPI (cod. LCDTOUCH24SER) che costa
if(touch.touching())
Euro 16,90, o quello da 2,8” SPI (cod. LCDTOU-
CH28SER) che è disponibile a Euro 19,50. Tutti
e, quando questo avviene, si leggono le coordina- questi prodotti si possono acquistare presso Fu-
te ed il valore di pressione tramite le istruzioni: tura Elettronica. I prezzi si intendono IVA com-
presa.
uint16_t x, y, z;
touch.read(x, y, z);
Il materiale va richiesto a:
Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
che poi vengono visualizzati sul monitor seriale. Tel: 0331-799775 - http://www.futurashop.it
Anche qui, come per la libreria del display, non

52 Giugno 2017 ~ Elettronica In


Arduino

Aggiungiamo un display grafico touch


alle nostre board Arduino-like,
con un hardware e tre librerie ad hoc.

TFT SHIELD
PER FISHINO
di MASSIMO DEL FEDELE

D opo avervi presentato ben quattro schede di


prototipazione della serie Fishino (la UNO, la
Fishino 32, la MEGA, la Guppy...ed una quinta è
HD44780), perché volevamo un bello schermo
grafico caratterizzato da dimensioni ridotte e una
discreta risoluzione, sul quale mostrare icone, sim-
in arrivo!), abbiamo iniziato a sentire il bisogno boli e fare un po’ di grafica. Ci siamo quindi messi
di a proporre un po’ di elettronica di contorno. In alla ricerca di qualcosa di esistente, riscontrando,
particolare, abbiamo sentito la mancanza di un di- tuttavia, che i pur molti display (e shield che li sup-
splay da abbinare loro, per corredare le applicazioni portano) hanno parecchie limitazioni.
con output visivi che non fossero semplicemente Per questo abbiamo voluto realizzarci qualcosa su
LED accesi o spenti. Ma non ci bastava un semplice misura, ossia uno shield con a bordo un prestante
display per testo (come ad esempio i comunissi- display, che vi descriviamo in questo articolo.
mi alfanumerici a 2 o 4 righe basato su controller Partiamo dall’inizio, ossia dalla fase di progetto,

Elettronica In ~ Giugno 2017 43


Fig. 1
L’assemblaggio
del display sullo
shield. interessante e di utilizzo semplicissimo, che vi
presenteremo in queste pagine.
Per renderne ancora più agevole l’utilizzo
abbiamo provveduto a preparare tre apposite
librerie, due delle quali di derivazione Adafru-
it, in grado di gestire il display stesso, ed una
totalmente sviluppata da noi per la gestione del
touch-panel che esso incorpora.

UNO SHIELD “UNIVERSALE”


Contrariamente al solito, inizieremo la descrizio-
ne dello shield...dalla fine! Infatti, la cosa più com-
plessa nello sviluppo del progetto è stata proprio la
dicendo che volevamo creazione del layout della scheda, dovendo abbi-
qualcosa in grado di soddisfa- nare ad essa board anche parecchio diverse le une
re i seguenti requisiti: dalle altre. Abbiamo quindi iniziato con lo sviluppo
• dimensioni sufficientemente ridotte (2,4 o “grafico” della scheda, per poi andare a ritroso fino
al massimo 3,2 pollici); ad ottenere lo schema elettrico.
• risoluzione minima di 320x240 pixel, con profon- Iniziamo dall’ingombro: il primo requisito era
dità di colore elevata; quello di ottenere una scheda con dimensioni pa-
• interfaccia touch che ci permetta di interagire con ragonabili alla nostra Fishino UNO (ma anche alla
il nostro Fishino; Fishino32 e ad Arduino UNO); quindi il display va
• impegno di poche risorse hardware della scheda, sovrapposto senza o quasi aumentarne l’ingombro
in modo da poterlo utilizzare anche con i modelli laterale: si sviluppa tutto nello spessore. Abbia-
di Fishino dotati di pochi I/O (la Guppy, per mo quindi optato per un “sandwich” consistente,
esempio); nell’ordine, dal display TFT, dallo shield e, infine,
• uno shield che si adattasse a tutti i prodotti della dalla scheda a microcontroller; la Fig. 1 chiarisce
serie Fishino ed anche a molti della serie Ardui- meglio il concetto.
no, senza bisogno di connessioni volanti In questa immagine potete vedere il “mockup”
• la possibilità di collegare altri componenti (modello grafico) dello shield con display ed un
insieme allo shield, quindi l’esposizione di tutti Fishino MEGA montati, che è stata la nostra base di
gli I/O delle varie schede anche con il display partenza.
montato. L’esigenza di accedere a tutti gli I/O della scheda
ha imposto l’aggiunta, lateralmente, di due file di
Crediamo di essere riusciti nei nostri propositi connettori maschio paralleli a quelli destinati ad in-
quasi al 100% (vedremo in seguito alcuni piccoli filarsi nei connettori femmina della scheda, ai quali
“limiti”, facilmente superabili), con un prodotto è possibile connettere i consueti cavetti Dupont.

Fig. 2
Esploso
dello Fig. 3
shield Esploso dello
e delle shield e delle board
board Fishino, visto
Fishino. da sopra.

44 Giugno 2017 ~ Elettronica In


Una volta stabilito a grandi linee il layout della sche-
da, la dimensione del display è stata fissata in 2,8
pollici come massimo (può accettare anche il display
più piccolo da 2,4 pollici), in modo da non superare
l’ingombro previsto.
Un altro parametro che ha vincolato la dimensione è
stato l’esigenza di utilizzare il minor numero di I/O
possibili; abbiamo quindi scartato tutti i display con
interfaccia parallela (8 ma anche 16 bit) che avreb-
bero occupato praticamente tutte le risorse delle
schede più “piccole” e ci siamo orientati verso un
display con comunicazione SPI, reperibile facilmen-
te nel formato, appunto, di 2,4 pollici o 2,8 pollici. Fig. 4 - Layout dei connettori dello shield.
Questo display utilizza le linee SPI (MISO, MOSI
e SCK), in comune con il modulo WiFi e le schede
SD (ed altro eventuale!), una linea di selezione ed Il “problema” non è risolvibile, visto che alcuni con-
una di controllo per il display ed altre 2 linee per nettori devono avere una posizione ben precisa gli
lo schermo touch-sensitive, quindi quattro I/O uni con gli altri: per esempio il connettore ISP che
utilizzati in “esclusiva” contro 10÷12 minimo per i porta i segnali SPI sia dell’UNO che del Mega.
modelli ad interfaccia parallela. Per ovviare all’inconveniente ci sono più possibilità:
Come vedremo in seguito, abbiamo poi aggiunto • montare solo i connettori strettamente necessari
altre funzionalità opzionali, ottenibili con l’utilizzo alla Fishino da innestare, soluzione, questa, da
di pochi altri I/O. noi scelta nel progetto, visto che è presumibile
Fissati quindi layout e display, occorreva trovare un che lo shield, pur essendo “universale”, venga
modo per poter “infilare” tutti i modelli di board destinato di volta in volta ad un solo controller;
previsti sullo stesso shield. Visto che la tecnologia lo svantaggio è che lo shield, una volta montato
attuale lo permette, abbiamo realizzato i modelli per poter supportare UNO/MEGA/32 non è
3D di tutte le schede, il modello 3D del display ed il in grado di montare Guppy/Nano/Piranha, e
modello 3D iniziale dello shield, in modo da poterli viceversa, senza sostituire i connettori;
sovrapporre graficamente e visualizzare eventuali • montare tutti i connettori eliminando i soli pin
interferenze; nella Fig. 2 e nella Fig. 3 trovate i dise- che interferiscono, soluzione, questa, che sarebbe
gni in esploso visti dal basso e dall’alto del nostro quasi ottimale, salvo che i segnali corrispondenti
shield con sovrapposte un buon numero di schede ai pin eliminati non verrebbero portati ai connet-
Fishino. Resta inteso che di Fishino se ne monta una tori aggiuntivi laterali (qualcuno potrà preferire
sola per volta. questa soluzione, quindi la esporremo dettaglia-
Abbiamo quindi cercato la posizione migliore per le tamente in seguito);
schede “piccole” (Fishino Guppy/Arduino Nano e • “girare” i connettori ESPCONN ed ICSP sulle
la futura Fishino Piranha, pin-out compatibile con schede UNO e 32 dal lato opposto della board,
l’Arduino MKR1000) in modo da non avere inter- soluzione che risolve tutto, ma purtroppo richie-
ferenze tra i connettori (cosa impossibile al 100%, de una modifica delle schede suddette, consisten-
come vedremo a breve) e da poter restare negli te nel dissaldare i connettori presenti e risaldarli
ingombri previsti. sul lato opposto; anche questa soluzione è prati-
Ecco quindi nascere il layout definitivo della scheda, cabile, ma richiede una buona manualità per non
mostrato nella Fig. 4 dal lato di inserimento dei con- danneggiare le schede.
troller (vale a dire delle schede Fishino/Arduino).
Tutto perfetto, quindi? Purtroppo no, perché le Come detto, noi abbiamo optato per la prima solu-
schede Fishino UNO e 32 hanno due connettori zione, soprattutto tenendo conto che lo shield verrà
ausiliari, per la precisione il connettore ESPCONN proposto in kit, quindi con i connettori da montare;
sulla UNO ed il connettore ICSP sulla 32 che vanno nulla vieta comunque di sceglierne un’altra.
ad interferire con i connettori delle schede “piccole”
(Nano/Guppy e Piranha/MKR1000); l’inserimento SCHEMA ELETTRICO
è fisicamente possibile, ma i segnali non sono com- Dopo aver studiato il layout della scheda, eccoci
patibili con i circuiti della scheda. pronti per lo schema elettrico! Il tutto è piuttosto

Elettronica In ~ Giugno 2017 45


[schema ELETTRICO]

46 Giugno 2017 ~ Elettronica In


semplice, si tratta soltanto di collegare i vari segnali
e prevedere i necessari ponticelli per poterli adat-
tare alle varie schede. In particolare, l’esigenza si fa
sentire per le schede Piranha/MKR1000, che hanno
un pin-out completamente diverso rispetto alle
altre, ed anche i segnali di interrupt/SPI relativi.
La prima cosa strana che si può notare nello schema
elettrico è il raddoppio di tutti i componenti attivi
e passivi. Questo è stato fatto per poter realizzare
una scheda in grado di montare sia componenti
in formato SMD, cosa vantaggiosa per una produ-
zione industriale, sia in formato THT (con i reofori
passanti), in modo da poter offrire la scheda in for-
ma di kit assemblabile anche senza esperienza nei
montaggi superficiali. Quindi, nello schema tutti i
componenti “sdoppiati” sono da intendersi come
alternativi tra il formato SMD e THT.
Iniziamo col descrivere l’alimentazione, che potreb-
be sembrare superflua (tutte le schede utilizzate
hanno un’uscita di alimentazione a 3,3 volt), ma che,
vista la scarsa disponibilità di corrente su alcune bo-
ard, in particolar modo le Arduino originali e molti
cloni economici, risulta indispensabile.
Si tratta di un semplicissimo regolatore lineare low
drop-out da 3,3 V, in grado di erogare poco meno di
un ampere in uscita, corrente fin troppo abbondan-
te per lo scopo.
Il ponticello denominato PWR permette di selezio-
nare la tensione proveniente dal regolatore interno
o direttamente dalla linea a 3,3 volt della board
connessa. Può sembrare superfluo ma, avendo una
scheda con sufficiente disponibilità di corrente sui
3,3 volt, come la serie Fishino, ci permette di rispar-
miare il regolatore U1 ed i condensatori a corredo
volendo limitare i costi al massimo.
Analizziamo ora il connettore del display TFT e la
componentistica annessa: il visualizzatore utilizzato
lavora con una tensione di 3,3 V e richiede livelli
logici corrispondenti; fornendo livelli a 5 volt si può
facilmente danneggiare. Per ovviare al problema
abbiamo inserito dei limitatori di livello costituiti
ciascuno da una resistenza (R1÷R8) ed un diodo
connesso verso il positivo dell’alimentazione a 3,3
volt. Questo permette, in presenza di un segnale di
valore superiore, di “scaricarlo” sui 3,3 volt, limi-
tandolo automaticamente a quel valore.
Le resistenze scelte hanno due esigenze contrappo-
ste: devono essere sufficientemente alte di valore
per non assorbire una corrente eccessiva e nel
contempo sufficientemente basse da non causare
un ritardo nei segnali veloci. Come potete notare,
nelle linee di abilitazione e di controllo (IRQ, DC ed
i due CS), dove viaggiano segnali “lenti”, le resi-

Elettronica In ~ Giugno 2017 47


[piano di MONTAGGIO]

Elenco Componenti:

R1: 10 kohm
R2: 1 kohm
R3: 1 kohm
R4: 330 ohm
R5: 1 kohm
R6: 330 ohm
R7: 330 ohm
R8: 1 kohm
C1: 100 µF 16 VL elettrolitico
Q1: BS170
U1:NCP1117ST33
D1: 1N4148
D2: 1N4148
D3: 1N4148
D4: 1N4148
D5: 1N4148
D6: 1N4148
D7: 1N4148
RESET: Microswitch
WAKE: Microswitch
BUZ: Buzzer senza elettronica
CN1: Strip Maschio 8 vie
CN2: Strip Maschio 10 vie
CN3: Strip Maschio 8 vie
CN4: Strip Maschio 8 vie
CN5: Strip Maschio 8 vie

stenze hanno un valore di 1 kohm, dando quindi la linee di controllo del display: SJ_T_IRQ, SJ_T_CS,
precedenza alla bassa corrente rispetto alla velocità SJ_DC e SJ_CS. A cosa servono? Semplicemente, nel
di risposta; per contro, nelle tre linee dove viag- tempo ci siamo accorti che spesso gli shield, aven-
giano i segnali SPI, che possono assumere valori do collegamenti prestabiliti ai pin digitali, sono
di frequenza sopra ai 10 MHz, abbiamo optato per molto vincolanti. Se si ha la necessità di connettere
un valore decisamente più basso, ovvero 330 ohm. qualcos’altro che utilizza gli stessi I/O (un altro
Anche con questo valore, superare i 12÷16 MHz di- shield in cascata, per esempio) le cose si complicano
venta difficile, infatti in libreria abbiamo limitato la e si ha la scelta tra il non usare gli shield insieme
frequenza dei segnali SPI a 12 MHz: un valore più oppure il tagliare alcune piste del PCB. Tagliando
che sufficiente per lavorare a una velocità discreta. questi ponticelli, invece, è possibile liberare gli I/O
I connettori MODE (montati vicino al condensatore corrispondenti senza dover manomettere il circuito
C1) servono per selezionare l’utilizzo con schede stampato; ovviamente è poi necessario realizzare
“standard” (UNO, MEGA, 32 e simili) oppure di dei collegamenti volanti con altri I/O per utilizzare
tipo Piranha/MKR1000 che hanno segnali differenti. il display, ma questo è molto semplice.
Anche i connettori JTMOSI, JTMISO, JTSCK ven- Il MOSFET Q1, insieme alla resistenza R1 ed al
gono utilizzati per la selezione del controller, e più connettore JTLED viene utilizzato, opzionalmente,
precisamente per gestire la differente posizione dei per il controllo della retroilluminazione del display.
segnali SPI sulle schede. Lasciandolo aperto, il MOSFET risulta polarizzato
Come possibilità aggiuntiva abbiamo inserito inol- da R1 e quindi l’illuminazione è accesa; inserendo
tre dei ponticelli sul PCB per poter sconnettere le 4 un jumper è possibile controllarla tramite un I/O

48 Giugno 2017 ~ Elettronica In


CN6: Strip Maschio 10 vie
CN7: Strip Maschio 8 vie
CN8: Strip Maschio 8 vie
CN9: Strip Femmina 15 vie
CN10: Strip Femmina 15 vie
CN11: Strip Femmina 15 vie
CN12: Strip Femmina 15 vie
CN13: Strip Femmina 2x6 vie
CN14: Strip Maschio 10 vie
TFT: Strip Femmina 14 vie
JTLED: Strip Maschio 3 vie
JTMODE: Strip Maschio 3 vie
JTDC: Strip Maschio 3 vie
JTMOSI: Strip Maschio 3 vie
JTMISO: Strip Maschio 3 vie
JTSCK: Strip Maschio 3 vie
JBUZ: Strip Maschio 3 vie
JPWR: Strip Maschio 3 vie
JSPI: Strip Maschio 2x3 vie
SPI: Strip Femmina 2x3 vie

Varie:
- Jumper (8 pz.)
- Display Touch 2,4” o 2,8”
- Circuito stampato S1328 (88x56mm)

digitale del controller, e più precisamente il D8 I/O digitale, e più precisamente al D9 sulle schede
sulle schede UNO/MEGA/32 e il D3 sulla Piranha/ UNO/MEGA/32 o al D4 su Piranha/MKR1000, se-
MKR1000. lezionabili anche qui tramite un connettore, il JBUZ.
Tramite questa caratteristica è quindi possibile Lasciando il connettore aperto risparmiamo una
risparmiare corrente di alimentazione quando non linea di I/O ma non potremo sfruttare il cicalino.
serve che il display sia visibile. Quest’ultimo è di tipo passivo, va quindi pilotato
Successivamente possiamo notare i due pulsanti, con un segnale PWM di frequenza opportuna, gesti-
RESET e WAKE, che vengono utilizzati rispetti- to via software.
vamente per resettare il controller (una comodità Vediamo, infine, il percorso dei segnali SPI e l’ulti-
rispetto al dover “cercare” il pulsante sulla scheda mo connettore di selezione schede, lo JSPI. Come
che, specialmente sul MEGA, risulta difficilmente detto in precedenza, i segnali SPI viaggiano su di-
raggiungibile) e per “risvegliarlo”, oppure per altri versi I/O a seconda della scheda. Sulla UNO e sulla
usi a scelta. Il pulsante WAKE è infatti connesso Mega (e la Fishino 32) la cosa è semplificata dal
alla stessa linea di interrupt del touch controller e connettore ISP, che li riporta indipendentemente
può quindi venire usato per uscire dalla modalità di da dove vengono connessi ; questo viene sfruttato
stand-by anche col display completamente spento. tramite il connettore SPI che raccoglie tali segnali.
Abbiamo poi voluto inserire anche un cicalino, per Sulle schede Piranha/MKR1000 abbiamo già visto
poter avere un feedback acustico, sia del tocco sul i relativi jumper. Restano fuori Guppy ed Arduino
display che di eventuali condizioni di errore. Il Nano che, pur avendo il connettore ISP, l’hanno
cicalino è connesso (opzionalmente) ad un altro montato dal lato “sbagliato” della scheda, e quindi

Elettronica In ~ Giugno 2017 49


Fig. 5 - I punti di interferenza su Fishino32. Fig. 6 - Punti di interferenza su Fishino UNO.

non è possibile sfruttarlo nel nostro shield. Montan- pin che interferiscono, rendendo lo shield sempre
do Guppy o Nano è quindi necessario inserire i tre utilizzabile con tutte le schede, al prezzo di non
jumper nel connettore JSPI che realizzano il collega- portare all’esterno alcuni del segnali disponibili.
mento richiesto alle linee SPI. Vediamo qui di seguito le interferenze e i pin da
eliminare.
REALIZZAZIONE PRATICA
La costruzione dello shield è alla portata anche di UTILIZZO CON FISHINO32
chi ha poca esperienza, grazie alla possibilità di La board Fishino32 interferisce con i connettori del-
montare componenti passanti tradizionali. Nulla le schede Guppy/Piranha solo su due punti, visibili
vieta, nel caso preferiate, di utilizzare i componenti nella Fig. 5.
SMD. Evitando di montare il connettore nei due punti
Consigliamo come sempre di montare per primi segnalati si risolvono completamente le interferen-
i componenti a basso profilo e poco ingombranti, ze, al costo di non portare all’esterno i segnali VIN
quindi resistenze e diodi, seguiti dai condensatori della scheda PIRANHA ed il D4 della scheda Gup-
elettrolitici, il regolatore di tensione ed il MOSFET. py. Il VIN è necessario solo se si alimenta la scheda
Successivamente vanno disposti i pulsanti ed il ci- con una tensione esterna, mentre il D4 del Guppy,
calino e, per ultimi, essendo piuttosto ingombranti, essendo utilizzato anche dalla scheda SD interna, è
i connettori. probabilmente inutile per un utilizzo esterno.
Qui di seguito potete vedere due immagini dello Eliminando questi due “spezzoni” di connettore è
shield, visto sia dal lato superiore (componenti pas- quindi possibile montare senza ulteriori modifiche
sivi/attivi, jumper e connettore per il display TFT) le seguenti schede: Arduino UNO, MEGA e Nano,
sia dal lato inferiore (connettori per le board). Fishino MEGA, Fishino32, Fishino Guppy, Fishino
L’unica cosa a cui occorre fare particolare attenzio- Piranha ed Arduino MKR1000. La scheda Fishino
ne è il lato di montaggio dei vari header; montan- UNO risente di altre interferenze, che descriveremo
doli dal lato sbagliato ovviamente non riuscirete ad nei prossimi paragrafi.
infilare i controller, i jumper o il display!
Come anticipato in precedenza, a causa di alcune UTILIZZO CON FISHINO UNO
interferenze tra i vari connettori delle schede utiliz- La scheda FishinoUNO interferisce con i connettori
zabili con il nostro shield, non è possibile montare delle board Guppy/Piranha in quattro punti, evi-
tutti i connettori nello stesso tempo, a meno di non denziati nella Fig. 6.
utilizzare particolari accorgimenti. Se ricordate, ab- Anche in questo caso è possibile rendere il no-
biamo prospettato 3 possibilità, la terza delle quali stro shield TFT “universale” eliminando i pin dei
comporta una modifica alla scheda controller origi- connettori indicati dalle frecce nella predetta figura.
nale che però lasciamo alla scelta di chi è dotato di Tuttavia in questo caso occorre sacrificare le con-
buona manualità. nessioni esterne sui due canali analogici A5 ed A6
Le altre due alternative sono quella di montare del PIRANHA e la VIN della Guppy. La linea GND
solo i connettori necessari alla propria scheda, cosa è presente anche su un altro pin quindi non dà
peraltro che non ha bisogno di ulteriori spiegazioni, problemi.
oppure quella di eliminare da alcuni connettori i Eliminando questi quattro pin è possibile montare

50 Giugno 2017 ~ Elettronica In


Listato 1
#include <SPI.h>
le seguenti schede: Arduino UNO/MEGA/NANO, #include <FishinoGFX.h>
Fishino UNO, Fishino MEGA, Fishino GUPPY, Fi- #include <FishinoILI9341.h>
shino PIRANHA, ma non la Fishino32 che richiede // questa linea è per comodità, in modo da non dover scrivere
l’eliminazione dei pin al paragrafo precedente. // FishinoILI9341 ad ogni comando inviato al display
#define tft FishinoILI9341
Prendendo entrambi gli accorgimenti è ovviamente
possibile montare tutte le schede disponibili. void setup()
{
// inizializza lo schermo
ED ORA... SOFTWARE! tft.begin();
Come accennato nell’introduzione, per la gestione
// cancella lo sfondo riempiendolo di nero
dello shield abbiamo approntato tre librerie che ne tft.fillScreen(ILI9341_BLACK);
consentono il controllo completo. Queste sono:
// disegna una croce che percorre tutto lo schermo
• FishinoGFX, versione praticamente identica // in due colori
all’analoga di Adafruit, che gestisce le funzioni tft.drawLine(0, 0, tft.width(), tft.height(), ILI9341_RED);
grafiche “ad alto livello”; tft.drawLine(0, tft.height(), tft.width(), 0, ILI9341_GREEN);

• FishinoILI9341, che gestisce le funzioni di inter- }
faccia con il display a livello hardware; anche
void loop()
questa libreria è stata realizzata partendo dall’a- {
naloga di Adafruit, ma con modifiche abbastanza }
sostanziali;
• FishinoXPT2046; che gestisce il touch screen,
scritta da zero di nostro pugno.
ferenti (rosso e verde) che attraversano lo schermo.
Iniziamo dalla sezione display, con uno sketch sem- Le funzioni tft.width() e tft.height() forniscono
plicissimo che inizializza lo schermo e disegna una rispettivamente la larghezza e l’altezza del display
croce in due colori; lo trovate nel Listato 1. in pixel.
Come potete notare lo sketch è semplicissimo. La La libreria è molto estesa e tra le funzioni che
funzione loop() risulta vuota (non c’è nulla da ripe- implementa permette di tracciare punti, linee,
tere!), mentre tutto si svolge nella setup(). cerchi, rettangoli, immagini, testi, eccetera. In
La prima linea di questa: essa è anche possibile “ruotare” lo schermo, in

tft.begin();

Listato 2
inizializza lo schermo. Utilizzando lo shield con
le schede previste non occorre specificare i pin di #include <Flash.h>
#include <FishinoXPT2046.h>
connessione; la libreria si occupa di tutto. Volendo #include <SPI.h>
utilizzare connessioni differenti, occorre specificare
quali I/O utilizzare, nella funzione begin(): // questa linea è per comodità, in modo da non dover scrivere
// FishinoXPT2046 ad ogni comando
#define touch FishinoXPT2046
tft.begin(cs_pin, dc_pin);
void setup()
{
Dove in cs_pin e dc_pin vanno indicati i pin cui // inizializza la porta seriale
Serial.begin(115200);
sono connesse le linee CS e DC del display. }
Andiamo alla linea:
void loop()
{
tft.fillScreen(ILI9341_BLACK); if(touch.touching())
{
uint16_t x, y, z;
la quale riempie semplicemente lo schermo di nero, touch.read(x, y, z);
cancellandolo. Successivamente troviamo le due Serial << “X : “ << x << “\n”;
Serial << “Y : “ << y << “\n”;
righe di codice: Serial << “Z : “ << z << “\n”;
Serial << “------------------\n”;
tft.drawLine(0, 0, tft.width(), tft.height(), ILI9341_RED); }
tft.drawLine(0, tft.height(), tft.width(), 0, ILI9341_GREEN); delay(200);
}
che si occupano di disegnare due linee di colori dif-

Elettronica In ~ Giugno 2017 51


Shield e display montati
sulla Fishino MEGA.

occorre specificare le
connessioni hardware
SE si utilizza lo shield con
le schede previste; altrimen-
ti prima di iniziare ad usare i
comandi occorre indicarle tramite la
linea seguente nella setup():

touch.connect(cs, irq);

dove CS è il pin a cui è collegata la linea CS del touch


controller, mentre IRQ è la linea relativa al segnale
di tocco dello schermo, che deve essere connessa ad
una linea digitale che supporta gli interrupt.

CONCLUSIONI
In questo articolo abbiamo colmato quella che
modo da disegnarci sopra in modalità orizzon- ritenevamo una lacuna, ossia la mancanza di una
tale o addirittura di capovolgere l’immagine periferica display per le nostre Fishino; ecco quindi
visualizzata. uno shield con LCD grafico e dotato addirittura di
Nella libreria sono contenuti alcuni esempi, tra interfaccia tattile, abbinabile a tutte le board Fishino
cui due “painter” che permettono di disegnare sinora proposte e alla nascente Piranha.
sullo schermo sfruttando il touch-screen incor- Con i brevissimi esempi di codice appena proposti
porato, oltre a un test grafico che mostra le varie e descritti si conclude la presentazione del nostro
primitive disponibili. shield display per le board Fishino.
Vediamo ora la sezione touch-screen, della quale Prossimamente pubblicheremo un esempio di
si occupa la libreria FishinoXPT2046. utilizzo più complesso, sfruttando le caratteristiche
Anche qui mostriamo un esempio semplice-sem- di Fishino32. g

plice, rimandando quelli allegati alle librerie per


le caratteristiche più complesse.
Lo sketch mostrato nel Listato 2 attende sempli-
cemente che si tocchi lo schermo e stampa sul per il MATERIALE
monitor seriale dell’IDE Arduino la posizione in
cui avviene il tocco. Lo shield (cod. FT1328K) viene venduto in Kit al
Come potete notare, anche qui la semplicità è di- prezzo di Euro 19,00. Lo shield non comprende il
sarmante; la setup() si limita ad avviare la porta display che però è possibile acquistare separa-
seriale, mentre nella loop si attende il tocco dello tamente scegliendo fra il display LCD touch da
schermo tramite l’istruzione: 2,4” SPI (cod. LCDTOUCH24SER) che costa
if(touch.touching())
Euro 16,90, o quello da 2,8” SPI (cod. LCDTOU-
CH28SER) che è disponibile a Euro 19,50. Tutti
e, quando questo avviene, si leggono le coordina- questi prodotti si possono acquistare presso Fu-
te ed il valore di pressione tramite le istruzioni: tura Elettronica. I prezzi si intendono IVA com-
presa.
uint16_t x, y, z;
touch.read(x, y, z);
Il materiale va richiesto a:
Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
che poi vengono visualizzati sul monitor seriale. Tel: 0331-799775 - http://www.futurashop.it
Anche qui, come per la libreria del display, non

52 Giugno 2017 ~ Elettronica In


Home Project

TERMOSTATO
CON FISHINO

di ANDREA SIMONE COSTA


la prima app di mes- che abbiamo parlato di una piattaforma IoT,
saggistica ad adottare la Telegram e utilizzato ovvero ThingSpeak, la
crittografia dei messaggi, i suoi bot è stato nel quale ci permette di in-
implementata solo di progetto Notes Machine viare gratuitamente dei
recente in Whatsapp. La comparso nel numero dati dal nostro Fishino
particolarità che rende di Febbraio 2017. In per disporli su un gra-
“superiore” Telegram è il esso abbiamo già ana- fico, anch’esso in buona
fatto che supporta i bot, lizzato le potenzialità parte personalizzabile.
che sono utenti virtuali della libreria Fishgram, Per questo progetto
o, se preferite, dei robot creata per sfruttare è stato utilizzato un
software, in grado di appieno il nostro bot, Fishino Guppy, molto

M algrado in que- interagire come fossero perciò senza dilungarci utile date le sue ridotte
sti anni si siano veri utenti e di realizzare troppo sulla sua imple- dimensioni, in simbiosi
affermati, dilagando, i varie funzioni in ma- mentazione, in questo con una semplice PCB
social network e i servizi niera automatica; utenti articolo ne vedremo creata su misura. Su di
di instant messaging, particolari anche perché un’altra interessante essa possiamo trovare:
molte persone non non devono essere applicazione. • un pulsante, con la
vanno oltre Whatsapp, associati a un numero di Accenneremo anche a possibilità di colle-
ignorando l’esistenza di telefono.
servizi di messaggistica L’ultima volta
validi come Telegram.
Eppure Telegram è stata
Sfruttando la
versatilità dei bot
messi a disposizione
da Telegram,
sviluppiamo
un termostato
controllabile da
smartphone con
semplici messaggi
istantanei.

Elettronica In ~ Maggio 2017 87


[schema ELETTRICO]

pubblicherà on-line la variazione di temperatura


su una piattaforna consultabile da qualsiasi dispo-
sitivo e in caso di superamento di una temperatura
di allarme, ci avviserà immediatamente tramite un
messaggio personalizzabile da sketch.
Di norma i termostati sono caratterizzati da un’iste-
resi, vale a dire che l’apertura o chiusura dell’in-
terruttore avviene a due soglie di temperatura: una
superiore e una inferiore e anche nel nostro sistema
questa possibilità è stata prevista.
Nel programma che andremo a creare sarà possibile
impostare un’isteresi a minimo 1 °C, ciò significa
che la differenza tra la soglia superiore e quella in-
feriore della temperatura che vogliamo mantenere,
sarà di 2 °C (ritoccando il software potrete restrin-
gere l’isteresi).
Per chiarire questo concetto immaginiamo di essere
in estate e di voler mantenere una temperatura sta-
bile di 20°C; per impostazione predefinita, la soglia
superiore verrà posizionata a 21°C e quella infe-
riore a 19°C. Appena la temperatura dell’ambiente
supererà i 21°C il termostato attiverà il condiziona-
tore per far scendere la temperatura. Quando verrà
interrotta l’azione del condizionatore? Qui entra
in gioco la soglia inferiore: appena la temperatura
scenderà sotto i 19°C il condizionatore verrà arre-
stato. Esso rientrerà in funzione solo nel caso in cui
la temperatura superasse di nuovo i 21 °C.
Anche queste soglie (oltre quelle di allarme, neces-
sarie per avvisarci in caso di malfunzionamento)
garne un altro tramite un pratico morsetto; e la temperatura da mantenere saranno impostate
• un connettore S.I.L. maschio per utilizzare quat- grazie a Telegram.
tro I/O, Vcc e massa all’esterno (utili per even-
tuali espansioni); IL SENSORE DI TEMPERATURA DS18B20
• un sensore di temperatura digitale DS18B20; Il DS18B20 è un sensore di temperatura digitale.
• un relé con relativo morsetto, il cui funzionamen- Ciò significa che esso comunica i valori registrati
to è segnalato da un LED. alla Fishino non tramite una tensione da leggere su
un pin analogico, come ad esempio il famoso LM35,
Per praticità, con il nostro codice gestiremo sola- ma attraverso un segnale digitale. Per interpretare
mente il sensore di temperatura e il relé, ma nulla correttamente questo segnale è perciò necessaria
vieta di connettere più relé trasformando gli ingres- una libreria, anzi due.
si analogici in uscite digitali via software. La prima è la OneWire, la quale permette di comu-

IL TERMOSTATO
Innanzitutto spendiamo due parole per spiegare
cos’è e come funziona il nostro termostato, la cui CARATTERISTICHE TECNICHE
logica di funzionamento verrà replicata nello sketch.
Si tratta di un termostato composto da un elemento g Connessione WiFi
sensibile alle variazioni di temperatura, che aziona g Gestione tramite smartphone
un interruttore o deviatore al superamento o alla di- g Sensore di temperatura DS18B20
scesa sotto una soglia preimpostata. Il controllo del- g Temperatura e isteresi programmabili
g Soglie di allarme programmabili
le temperature avviene direttamente da smartphone,
g Uscita a relé
grazie all’app Telegram. Il nostro sistema, inoltre,

88 Maggio 2017 ~ Elettronica In


[piano di MONTAGGIO]
nicare con qualsiasi sensore che, appunto, invia i
dati attraverso un solo pin digitale.
La seconda è la DallasTemperature, scritta per que-
sta famiglia di sensori, che si appoggia alla OneW-
ire per comunicare con il nostro DS18B20, come
mostrano le seguenti righe di codice:

#define TEMP 5
OneWire oneWire(TEMP);
DallasTemperature sensors(&oneWire);

La PCB è stata strutturata in modo che il pin di co-


municazione del sensore sia connesso al pin 5 della
Guppy.
Perciò “diamo in pasto” questo pin alla libreria
OneWire creandone un’istanza, dopodiché attivia-
mo anche la DallasTemperature inviando ad essa
il riferimento all’istanza precedentemente creata.
Elenco Componenti:
Queste istruzioni sono da inserire prima della void
setup(). In essa invece è sufficiente avviare la comu- R1: 10 kohm Varie:
nicazione tra il sensore e il microcontrollore con: R2, R3: 4,7 kohm - Strip maschio 90° 8 vie
R4: 470 ohm - Morsetto 2 poli passo 2,54mm
T1: BC547 - Morsetto 3 poli passo
sensors.begin()
LD1: LED 3 mm rosso 2,54mm
P1: Microswitch 90° - Strip femmina tornito
Qui termina la configurazione necessaria per il D1, D2: 1N4148 15 vie (2 pz.)
sensore. Nella void loop(), la quale, ricordiamo, U1: DS18B20 - Circuito stampato S1314
deve durare il meno possibile per evitare chiamate RL1: Relé 5V singolo scambio (69 x 28mm)
a FishGram.loop() troppo distanti tra loro in
termini di tempo, sfruttiamo la nota millis() per
leggere dal sensore il valore della temperatura
ogni tot secondi. THINGSPEAK
Il sensore non è tra i più veloci, nel senso che si Sappiamo perfettamente che il mondo dell’IoT non
adegua lentamente alle variazioni di temperatura; è limitato ad apparecchiature sofisticate e costose ed
ma questo non è un problema poiché la tempera- oggi ne vedremo un esempio: creeremo un basilare
tura in un ambiente come una stanza difficilmente sistema IoT costituito dalla Fishino, la quale si pre-
presenta variazioni repentine. occuperà di raccogliere i dati relativi alla tempera-
Infatti abbiamo previsto circa 30 secondi tra un’in- tura per poi inviarli sulla rete, e da una piattaforma
terrogazione e l’altra del sensore. IoT sul web, la quale avrà come compito l’analisi
Le istruzioni principali che troviamo nel blocco di e la visualizzazione di questi dati. Parliamo di
codice sono le seguenti: Thingspeak, che rappresenta un ottimo connubio
tra semplicità di utilizzo e affidabilità, oltre ad
sensors.requestTemperatures(); avere il supporto nativo al mondo di Arduino e una
temp = sensors.getTempCByIndex(0); formula base gratuita che è più che sufficiente per il
relay(); nostro scopo.
Una volta creato un account su questa piattaforma
Le prime due sono necessarie per richiedere e web (accessibile da https://thingspeak.com), dopo
ricevere la temperatura dall’unico sensore presente, aver confermato la nostra identità tramite un’e-mail
nonché primo e per questo legato all’indice di va- di conferma che riceveremo nella nostra casella di
lore 0. La temperatura viene poi memorizzata nella posta, ci ritroveremo davanti alla schermata rappre-
variabile temp. sentata nella Fig. 1.
La void relay() si occupa, come è facile intuire, della Dovremo quindi creare un nuovo canale, il quale si
gestione del relé presente sulla PCB e verrà analiz- può considerare come il “luogo” virtuale sul quale
zata più avanti. i nostri dati verranno immagazzinati e visualizza-

Elettronica In ~ Maggio 2017 89


Fig. 1 - L’account in Thingspeak. Fig. 2 - La finestra di creazione del canale.

ti, facendo clic sul pulsante New Channel. Questo che si apre, dopo aver fatto clic sul pulsante Save
ci aprirà la pagina visualizzata nella Fig. 2, dove Channel, clicchiamo su Chiavi API e annotiamo le
troviamo le impostazioni da effettuare per il nostro due chiavi, oltre all’ID del canale che compare poco
canale: possiamo scegliere un nome, una descrizio- più sopra Fig. 5.
ne, decidere se rendere o meno il canale pubblico e Adesso possiamo finalmente analizzare il codice
scegliere quanti diversi campi dovrà avere il nostro presente nel nostro sketch.
canale (fino a un massimo di otto), potendoli rino- Come prima cosa includiamo la libreria ThingSpeak,
minare a piacimento. In altre parole, nel caso in cui senza la quale dovremmo occuparci manualmente
vogliamo visualizzare una temperatura, l’umidità delle varie richieste http. Prima della void setup()
e la luminosità di una stanza, non c’è bisogno di troviamo anche:
creare tre canali diversi. È sufficiente creare un ca-
nale e assegnare ad esso tre campi: uno per ciascuna FishinoClient client;
grandezza fisica misurata. unsigned long myChannelNumber = 241871;
Nella Fig. 3 possiamo vedere una delle possibili const char * myReadAPIKey = “****************”;
configurazioni del canale utilizzato per questo const char * myWriteAPIKey = “****************”;
progetto.
Creato e configurato il canale, clicchiamo sul pul- La comunicazione, come già accennato, avviene
sante Save Channel, che si trova ben evidente nella tramite il protocollo http, per questo è necessario
parte finale della pagina web visibile nella Fig. 4, in creare un’istanza della classe FishinoClient. Do-
modo da salvare le impostazioni del nostro canale. podiché inseriamo l’ID del canale e le due chiavi
Fatto ciò, non ci rimane che inviare i nostri dati; per precedentemente ottenute nelle rispettive variabili.
fare questo abbiamo bisogno della chiave di lettura Nella void setup() troviamo invece un’unica istru-
(la quale non sarà utilizzata per il nostro progetto) e zione, la quale avvia la libreria grazie all’oggetto
scrittura del canale, oltre al suo ID. Nella schermata client precedentemente creato:

Fig. 3 - Una possibile configurazione del canale. Fig. 4 - Il pulsante per il salvataggio del canale creato.

90 Maggio 2017 ~ Elettronica In


Fig. 5 - Chiavi e ID canale. Fig. 6 - Visualizzazione di un canale di tipo pubblico

ThingSpeak.begin(client); esaustivamente presentato e analizzato la versatilità


di questa libreria, la quale ci permette di instaurare
Infine nella void loop(), sempre sfruttando la una comunicazione tra Fishino e un qualsiasi dispo-
funzione millis(), inviamo al nostro canale su sitivo che supporti Telegram tramite un bot. Perciò
ThingSpeak il valore della temperatura tramite le entreremo subito nel cuore del codice (scaricabile
seguenti due istruzioni: dal sito della rivista), naturalmente con le dovute
spiegazioni.
ThingSpeak.setField(1, temp); Diversamente dal progetto della Notes Machine
ThingSpeak.writeFields(myChannelNumber, utilizzeremo un procedimento più semplice per me-
myWriteAPIKey); morizzare i vari comandi; in essa si era presentato
l’uso dei templates, ma ci limiteremo a comparare
Nella prima scegliamo in quale degli otto campi vi- alcune stringhe. Ovviamente sarà un codice meno
sualizzare la temperatura; nel nostro caso abbiamo elegante e performante rispetto al precedente, ma di
attivato solo il primo per questo scopo, perciò inse- immediata comprensione.
riamo il numero 1, e scegliamo quale valore inviare. Prima di analizzare nel dettaglio la
Dato che la temperatura viene memorizzata nella FishgramHandler() incentriamo l’attenzione sulle
variabile temp è questa che dobbiamo inserire come seguenti istruzioni presenti nel setup:
secondo parametro.
Nella seconda permettiamo alla Fishino Guppy di bool b = true;
scrivere i dati sul canale tramite il suo ID e la chiave FishGram.restrict(b);
di scrittura. Ecco fatto! FishGram.allow(myId);
Nel caso in cui abbiamo impostato il nostro canale
come pubblico, è sufficiente digitare il seguente Tramite le prime due andiamo ad attivare la white-
URL per visualizzare da un qualunque dispositivo list messa a disposizione da Fishgram. Solamente
il risultato (Fig. 6), naturalmente sostituendo alla gli ID presenti in questa lista saranno autorizzati
voce ‘idcanale’ l’ID del nostro canale: a comunicare con il Fishino attraverso il bot. Per
aggiungere un ID a questa lista si utilizza la terza
https://thingspeak.com/channels/idcanale istruzione, da ripetere nel caso di più ID.
Tra gli esempi messi a disposizione da questa
È doveroso fare una precisazione: la versione base libreria ce ne è uno che ci permette agilmente di
di ThingSpeak prevede 15 secondi di intervallo conoscere sia il nostro ID che quello di chiunque
minimo tra due aggiornamenti del valore della scriva al bot controllato da Fishino, semplicemente
grandezza sotto osservazione, oltre a 20 secondi di aprendo il monitor seriale.
analisi del dato ricevuto. Consideriamo adesso la FishgramHandler(). Dopo
Inviare il valore della temperatura ogni 60 secondi è quattro costrutti if che analizzeremo a breve, i quali
perciò un buon compromesso. controllano alcune variabili booleane, troviamo una
seconda serie di cinque costrutti if con una condi-
FISHGRAM zione leggermente particolare.
L’articolo comparso sul numero di Febbraio 2017 ha La funzione strcmp() presente in ciascuno di essi

Elettronica In ~ Maggio 2017 91


confronta il messaggio appena ricevuto con una Il messaggio chiederà di inviare un valore nume-
stringa da noi decisa. rico per impostare ad esempio la soglia di allerta
Nel caso in cui quest’ultima è esattamente uguale superiore. Ciò significa che alla successiva chiamata
al messaggio la funzione strcmp() restituisce 0, per della FishgramHandler() il messaggio non dovrà
questo è necessario anteporre ad essa il punto escla- essere analizzato dalle varie strcmp(); dovrà invece
mativo di negazione: andare a modificare il valore della variabile corri-
spondente all’opzione da impostare.
if (!strcmp(message, “/temp”)) Per questo i quattro costrutti if sono stati inseriti
per primi. Essendo set_up = true si eseguirà la
Trovata l’uguaglianza, questi cinque costrutti if si li- seguente porzione di codice:
mitano a creare ed inviare un messaggio di risposta
per poi terminare la funzione FishgramHandler(): if (set_up)
{
String ans = F(“La temperatura vale: “); if ((atoi(message) > (setTemp + diff / 2)))
ans += temp; {
ans += “°C”; sup = atoi(message);
FishGram.sendMessage(id, ans.c_str()); String ans = F(“Soglia superiore impostata a “);
return true; ans += sup;
ans += “°C”;
Questi ci permettono di conoscere l’ultimo valore FishGram.sendMessage(id, ans.c_str());
di temperatura misurato, le due soglie di allerta set_up = false;
in caso di malfunzionamento, la temperatura che } else {
abbiamo deciso di mantenere e il valore del diffe- String ans = F(“Soglia superiore non valida, riprova”);
renziale, cioè la differenza tra la soglia superiore e FishGram.sendMessage(id, ans.c_str());
quella inferiore del ciclo di isteresi della temperatu- }
ra. La terza serie di sei costrutti if permette invece return true;
di impostare alcuni di questi valori, appoggiandosi }
ad alcune variabili booleane. I primi due sono
speculari, infatti impostano o la stagione calda o la Il messaggio contenente il valore numerico verrà
stagione fredda modificando il valore della variabi- analizzato dalla funzione atoi(), la quale converte
le hot. una stringa in un numero intero. Se questo valore
Per fare un piccolo esempio: in estate superati i è maggiore o uguale alla temperatura da mante-
22°C sarà necessario attivare il condizionatore, nere sommata alla metà del differenziale, ovvero
mentre in inverno, superata la stessa soglia, sarà se è maggiore o uguale della soglia superiore del
necessario disattivare l’impianto di riscaldamento. ciclo di isteresi, allora verrà impostata la variabile
Questa variabile verrà sfruttata nella void relay() corrispondente e dopo un messaggio di conferma
che discuteremo più avanti. la variabile booleana di appoggio verrà “disattiva-
Gli ultimi quattro costrutti if della terza serie ta”. Se invece il valore non è corretto l’utente verrà
“attivano” ciascuno la propria variabile booleana,
disattivando quella degli altri tre, per poi anch’es-
si inviare un breve messaggio e terminare la
FishgramHandler():

if (!strcmp(message, “/set_up”))
{
set_up = true;
set_temp = false;
set_diff = false;
set_down = false;
String ans = F(“Imposta la soglia superiore:”);
FishGram.sendMessage(id, ans.c_str());
return true;
}

92 Maggio 2017 ~ Elettronica In


Fig. 8
Fig. 7
Il pulsante
Il menu
slash per
creato.
consultare
il menu.

avvisato e la variabile set_up rimarrà true per risultare difficile memorizzare tutti i vari comandi
permettere un altro tentativo. disponibili. Ecco che l’app ci viene in aiuto, perché
Adesso consideriamo meglio le condizioni da veri- infatti in un paio di passaggi è possibile creare un
ficare prima di memorizzare un nuovo valore nella piccolo menu, con la lista dei comandi e le relative
variabile contenente la soglia di allerta superiore descrizioni (Fig. 7), che verrà visualizzato alla pres-
(all’interno del codice troverete tutti i commenti che sione dell’icona contenente uno slash (Fig. 8).
spiegano nel dettaglio tutti i test che vengono fatti Infatti i comandi su Telegram iniziano proprio con
ai valori prima di essere memorizzati). uno slash “/”, come ad esempio “/start” che serve
Come già accennato la soglia di allerta superiore ad avviare per la prima volta un bot. Per questo i
deve essere maggiore o uguale alla soglia superio- comandi da noi scelti e inseriti nelle varie strcmp()
re del ciclo di isteresi. Esempio chiarificatore. Se iniziano tutti con “/”.
vogliamo mantenere 20°C, con un differenziale In effetti non è obbligatorio, però non inserendo
impostato a 2°C, la soglia superiore del ciclo di uno slash iniziale sacrificheremo l’opportunità di
isteresi automaticamente sarà pari a 21°C, cioè la creare la lista di comandi.
metà del differenziale sommata alla temperatura Colleghiamoci quindi al “padre di tutti i bot”, ovve-
da mantenere. Per questo sarebbe inadeguata una ro BotFather, come abbiamo fatto per creare un bot
soglia superiore di allerta per malfunzionamenti seguendo l’articolo di Febbraio 2017.
inferiore ai 21°C. Inseriamo quindi il comando “/setcommands” e se-
Lo stesso ragionamento si applica alla soglia di lezioniamo il bot interessato: Doinobot, nel nostro
allerta inferiore. caso (Fig. 9).
Per impostazione predefinita, queste variabili ven- A questo punto BotFather ci chiede di inserire i vari
gono impostate a: comandi in un messaggio, seguendo un preciso
• 20°C per la temperatura da mantenere; schema, senza però aggiungere lo slash iniziale (Fig.
• 100°C per la soglia superiore; 10). Per il nostro progetto risponderemo quindi con
• 0°C per la soglia inferiore; il seguente messaggio (Fig. 11):
• 2°C per l’isteresi.
temp - visualizza l’ultima temperatura rilevata
Dal punto di vista dell’utente Telegram, potrebbe up - visualizza la soglia superiore

Elettronica In ~ Maggio 2017 93


Fig. 10
Fig. 9 Telegram
Invio del richiede
comando l’inserimento di
verso tutti i comandi
Doinobot. in un unico
messaggio.

down - visualizza la soglia inferiore if (hot)


stemp - visualizza la temperatura da mantenere {
diff - visualizza il differenziale if (temp > (setTemp + diff / 2))
set_hot - imposta stagione calda {
set_cold - imposta stagione fredda digitalWrite(RELAY, HIGH);
set_temp - imposta la temperatura da mantenere }
set_diff - imposta il differenziale if (temp < (setTemp - diff / 2))
set_up - imposta la soglia di allerta superiore {
set_down - imposta la soglia di allerta inferiore digitalWrite(RELAY, LOW);
}
Se tutto è andato a buon fine, riceveremo il messag- } else {
gio di conferma di Fig. 12. A questo punto torniamo if (temp > (setTemp + diff / 2))
nella chat personale con il bot e premiamo sull’ico- {
na contenente uno slash, evidenziata nella Fig. 8. La digitalWrite(RELAY, LOW);
Fig. 7 ci mostra il risultato ottenuto. Nella Fig. 13 }
possiamo vedere la risposta che otteniamo se pre- if (temp < (setTemp - diff / 2))
miamo sul comando “/temp”. {
Infine non dimentichiamo di inserire l’istruzione digitalWrite(RELAY, HIGH);
FishGram.loop(); all’interno della void loop(). }
Ricordiamo che essa deve durare il meno possibi- }
le, per garantire un corretto funzionamento della
libreria Fishgram. Il blocco di codice appena esposto controlla innan-
zitutto quale stagione è stata impostata, dopodi-
VOID RELAY() ché nel caso in cui la temperatura superi la soglia
Affrontiamo, infine, la spiegazione di questa proce- superiore dell’isteresi (temperatura da mantenere +
dura, che viene chiamata qualche istante dopo l’ef- differenziale / 2) o scenda al di sotto di quella infe-
fettuazione di una nuova misura della temperatura. riore (temperatura da mantenere - differenziale / 2),
rispettivamente attiverà o disattiverà il relé.

94 Maggio 2017 ~ Elettronica In


Fig. 11 Fig. 12
Il nostro Messaggio
messaggio di conferma
di risposta. da parte di
BotFather.

La macro RELAY è stata definita prima della void dedMessage settate a “false” per impostazione
setup() assegnandole il valore 2, dato che utilizzan- predefinita, all’utente verrà inviato un messaggio.
do il circuito (ossia lo shield qui proposto) prece- Entrambi i costrutti if, prima di terminare, settano
dentemente descritto, il pin di attivazione del relé a “true” la rispettiva variabile booleana, in modo da
in esso presente si troverà connesso al pin 2 della non recapitare di nuovo il messaggio alla successi-
Fishino Guppy. va chiamata della void relay().

if ((temp > sup) && (!supExceededMessage)) if ((supExceededMessage) && (temp <


{ sup))
String ans = F(“Attenzione! {
La temperatura e’ …”); String ans = F(“Anormalita’ risolta…”);
FishGram.sendMessage(myId, ans.c_str()); FishGram.sendMessage(myId, ans.c_str());
supExceededMessage = true; supExceededMessage = false;
} }
if ((temp < inf) && (!infExceededMessage))
{ if ((infExceededMessage) && (temp > inf))
String ans = F(“Attenzione! {
La temperatura e’ …”); String ans = F(“Anormalita’ risolta…”);
FishGram.sendMessage(myId, ans.c_str()); FishGram.sendMessage(myId, ans.c_str());
infExceededMessage = true; infExceededMessage = false;
} }

Il secondo blocco di codice (qui sopra) avverte di Quest’ultimo blocco di codice è utilizzato per
un possibile malfunzionamento, sfruttando i valori resettare la condizione di allarme: appena la tem-
delle due soglie di allarme. La prima volta che la peratura rientra nella norma, essendo supExcee-
temperatura supera la soglia di avviso superiore dedMessage o infExceededMessage settate a
o scende al di sotto di quella inferiore, essendo le “true”, viene eseguito il corrispondente costrutto if
variabili supExceededMessage e infExcee- che, sempre con un messaggio, avvisa l’utente che

Elettronica In ~ Maggio 2017 95


Fig. 13
Risposta al
comando /temp.

il problema è risolto. Le due variabili booleane ven-


gono quindi reimpostate a “false” e il compito della
void relay() termina qua.
Ovviamente sia la condizione di allarme che quella
di reset dello stesso possono essere arricchite a
piacere, ad esempio tramite l’accensione di LED o
attraverso suoni di avviso.

CONCLUSIONE
Un termostato è l’esempio ideale per mostrare sia le
potenzialità della libreria Fishgram sia la versatilità
delle schede Fishino, specialmente nell’ambito IoT.
La connettività WiFi, unita alla capacità di sostenere
scambio di dati tramite il protocollo HTTPS, è parte
integrante di queste board, mantenendo la semplici-
tà di utilizzo intrinseca del mondo Arduino.
Ci auguriamo di avervi fornito ancora una volta
una prova di ciò con l’applicazione qui descritta. g

per il MATERIALE
Tutti i componenti utilizzati in questo progetto
sono di facile reperibilità. Il master del circuito
stampato può essere scaricato dal sito della
rivista (www.elettronicain.it). La scheda Fishi-
no GUPPY (cod. GUPPY) è disponibile pres-
so Futura Elettronica al prezzo di Euro 33,90.
Il prezzo si intende IVA compresa.

Il materiale va richiesto a:
Futura Elettronica, Via Adige 11,
21013 Gallarate (VA) - Tel: 0331-799775
http://www.futurashop.it

96 Maggio 2017 ~ Elettronica In


Automazione
Shield che rende
disponibili 16 I/OO
digitali o altrettanti
anti
PWM impiegando
un solo canale
I²C-Bus di Arduino.
no.
Ideale per gestiree
LED multicolore o
servomotori.

octopus, ESPANSIONE
“TENTACOLARE” PER
ARDUINO/FISHINO
di MASSIMO DEL FEDELE

er quanto pratiche e capaci


P di realizzare innumerevoli
applicazioni, le schede Arduino
e compatibili hanno due limiti: la
memoria di programma relativa-
mente ridotta e la ridotta quan-
tità di uscite disponibili, specie
di I/O cui si può assegnare un
segnale PWM. Per esempio, una
Arduino/Fishino UNO dispone
di sole sei uscite PWM e, a meno
di non generare i relativi segnali
via software (con notevole im-
pegno del processore), permette
il pilotaggio di un solo driver e
quindi un solo LED RGBW di po-
tenza, o in alternativa di sei led
monocromatici.

Elettronica In ~ Marzo 2016 59


[schema ELETTRICO]
Lo stesso limite emerge quando
si vogliono pilotare più di 6 ser-
vomotori con le stesse schede;
la realizzazione di un robot tipo
“hexapod”, che richiede ben 12
servi, risulta problematica, se
non impossibile. Anche gli in-
gressi e le uscite digitali sono
limitati; sempre parlando delle
schede Arduino, abbiamo un to-
tale di 13 I/O digitali e 6 ingressi
analogici, utilizzabili anch’essi in
digitale; sembrerebbero anche ab-
bondanti, se non fosse che molti
di questi vengono utilizzati per le
periferiche a bordo o dagli shield
di espansione. In pratica, realiz-
zando un progetto con uno shield
Ethernet/WiFi, una memoria SD
e che necessita dell’ uscita seriale
e di qualche ingresso analogico,
restano a disposizione solo sei
I/O digitali che sono spesso in-
sufficienti per progetti di media
complessità.
Per tutti questi motivi abbiamo
pensato di progettare uno shield
di espansione, compatibile con
le varie schede Arduino e con la
nostra Fishino UNO (e la Fishi-
no Mega che vi presenteremo a
breve) che, senza praticamente
impegnare risorse hardware, per-
mette di avere a disposizione ben
16 uscite in PWM e 16 ingressi/
uscite digitali aggiuntivi. Non
solo, le schede sono sovrappo-
nibili fino ad un massimo di 8,
consentendo di gestire con Ardu-
ino fino a 128 I/O digitali e 128
uscite PWM aggiuntive; il tutto
reso completamente trasparente
all’utilizzatore tramite una libre-
ria realizzata ad-hoc.

SCHEMA ELETTRICO
Lo shield qui proposto è composto
da tre blocchi:
• espansione I/O digitali;
• espansione PWM;
• circuito di protezione dall’inver-
sione di polarità sull’alimenta-
zione esterna.

60 Marzo 2016 ~ Elettronica In


ESPANSIONE I/O DIGITALI GLDOLPHQWD]LRQHQHLQŏXHQ]LQRLOIXQ]LRQDPHQWR
Questa sezione si basa sul ben noto integrato e la linea RST che, connessa al reset di Arduino,
MCP23017, nell’abituale versione controllata trami- consente di ripristinare il funzionamento all’accen-
WHLQWHUIDFFLD,s&%XVTXLQGLWUDPLWHGXHVROLŎOLLO sione e/o alla pressione del tasto RESET.
FORFN 6&/ HGLOŎORGLGDWD 6'$ 
Esiste anche una versione controllabile tramite SEZIONE PWM
interfaccia SPI, più veloce ma che impegna quattro Questa sezione si basa sul meno noto ma non per
linee della CPU e che quindi non abbiamo utilizza- questo meno versatile PCA9685, un integrato in
to. grado di generare 16 segnali PWM quasi indipen-
Come tutti i dispositivi I²C, prevede un indirizza- denti (vedremo nella descrizione delle librerie che
mento tramite una sequenza di bit inviati sulle due la frequenza deve essere la stessa per tutte le uscite).
linee, che attivano l’integrato solo se l’indirizzo Questo integrato consente un indirizzamento di ben
corrisponde. sei bit, tramite gli ingressi A0..A5, che permettereb-
Nel caso dell’ MCP23017 l’indirizzo è composto be la sovrapposizione di 64 schede diverse; essendo
GDXQDSDUWHŎVVDLQGLFDWDFRPH0&3B,&B però il limite imposto dall’ MCP di 8 schede (e risul-
%$6(B$''5(66QHOODQRVWUDOLEUHULDSDULDOQX- tando 64 schede connesse ad un singolo bus decisa-
mero esadecimale 0x20, i cui ultimi TRE bit sono mente troppe) abbiamo sfruttato i soli bits A0÷A2,
però impostabili mediante tre pin esterni (A0, A1 ottenendo così anche qui la possibilità di connettere
ed A2) ai valori binari da 000 (0 decimale) a 111 otto dispositivi diversi, collegando i rimanenti pins
(7 decimale), permettendo quindi di variare l’in- di indirizzamento direttamente a massa. La fre-
dirizzo completo tra 0x20 e 0x27 inclusi. Questo quenza del PWM è impostabile tramite un registro
indirizzamento consente il collegamento allo stesso interno (prescaler)
p ) con la seguente
g formula:
I²C-Bus di otto MCP23017, a patto che per ogni di-
spositivo venga scelto un indirizzo differente tra gli
otto disponibili.
L’integrato è dotato di due porte I/O digitali ad 8
bit (GPA0÷GPA7 e GPB0÷GPB7), per un totale di L’integrato è in grado sia di generare la frequenza
16 linee complessive, impostabili singolarmente di clock internamente, tramite un oscillatore da 25
come ingresso o uscita, con o senza resistenze di MHz che consente di ottenere frequenze PWM da
pullup interne, tramite la libreria software di cui 24 a 1.526 Hz, sia di operare con un clock esterno
parleremo in seguito. massimo di 50 MHz, che però non abbiamo utiliz-
Per ogni canale ad 8 bit il chip è in grado di gene- zato nella nostra scheda.
rare un segnale di interrupt, sulle uscite INTA e A differenza dell’ MCP23017, questo integrato non
INTBDOYHULŎFDUVLGLRJQLFDPELRGLVWDWRGHJOL dispone di un ingresso di reset; la relativa funziona-
ingressi, sia separatamente per ogni gruppo di 8 lità va quindi realizzata tramite software (è previsto
porte (permettendo quindi di distinguere gli inter- un indirizzo I²C speciale per il reset) oppure sem-
rupt a livello hardware tra i 2 canali) oppure con- plicemente ripristinando via software il contenuto
giuntamente, un solo segnale di interrupt per tutti dei registi (cosa da noi effettuata tramite la libreria).
gli ingressi. È invece disponibile un ingresso OE in grado di
La generazione degli interrupt al cambio di stato disabilitare tutte le uscite contemporaneamente, che
degli ingressi è un grande vantaggio quando è ne- abbiamo ritenuto opportuno portare all’esterno
FHVVDULRRWWHQHUHULVSRVWHLPPHGLDWHDOYHULŎFDUVL dando la possibilità, tramite un ponticello, di colle-
di eventi esterni, e consente di compensare la limi- garlo all’I/O D9 di arduino nel caso se ne presenti
tazione delle schede come Arduino/Fishino UNO, la necessità.
dotate di due soli ingressi di interrupt. Una possibilità interessante di questo integrato è di
Le uscite INTA ed INTB sono collegabili tramite poter operare sulle uscite sia in modalità totem-pole,
due ponticelli distinti agli indirizzi, rispettivamen- con una coppia di MOSFET complementari, in gra-
te 2 e 3 di Arduino, gli unici in grado di rilevare un do di fornire una corrente sia positiva (source) che
cambio di stato; tramite software sarà poi possibile negativa (sink), con valori massimi rispettivamente
scegliere se utilizzare entrambi, solo uno o nessuno. di 10 mA e 25 mA a 5 volt, che in modalità open-
Completa la descrizione di questa sezione il con- drain (o collettore aperto, in italiano), in grado di
densatore di disaccoppiamento C3, situato in pros- IRUQLUHVRORXQDFRUUHQWHQHJDWLYDŎQRDP$
simità del chip per evitare che disturbi sulle linee modalità questa utile in alcuni casi.

Elettronica In ~ Marzo 2016 61


Dalle caratteristiche (e da altre che qui tralasciamo ,OYDORUHVFHOWRv)©VXIŎFLHQWHŎQRDFRUUHQWL
per brevità) si evince che l’integrato è nato per pi- di qualche ampere; nel caso di correnti più elevate
lotare in PWM dei LED, connessi direttamente alle e/o di assorbimenti molto impulsivi consigliamo di
uscite tramite resistenze; ciò non toglie che, come inserire un condensatore aggiuntivo di capacità ele-
vedremo, è possibile utilizzarlo per innumerevoli vata esternamente sulla linea di alimentazione.
altre applicazioni. Sullo schema potrete notare, in-
fatti, una serie di resistenze in serie alle uscite (in- REALIZZAZIONE PRATICA
serite per proteggere le medesime da sovracorrenti) Lo shield è realizzato su un circuito stampato a
che portano ad un connettore a tre pin per uscita doppia faccia con fori metallizzati e fa uso di com-
sui quali, oltre al segnale PWM vengono riportate ponenti in SMD; trattandosi di un montaggio super-
la massa ed una tensione positiva della quale par- ŎFLDOHRFFRUUHODFRQVXHWDDWWHQ]LRQHLQSDUWLFRODU
leremo più avanti. Questo connettore, realizzato ad modo per i componenti più piccoli e quelli con i pin
angolo di 90°, permette di connettere direttamente molto ravvicinati.
alle uscite 16 servocontrolli senza impedire la so- La maggiore attenzione è richiesta dall’integrato
vrapposizione di ulteriori schede Octopus. PCA9685, fornito in package TSSOP28 a 28 pin con
spaziatura di soli 0,65 mm, e dalle le reti resistive
PROTEZIONE DALL’INVERSIONE DI POLARITÀ R3÷R6, che hanno pin piccoli e molto ravvicinati;
Come abbiamo accennato nelle pagine precedenti, attenzione anche al condensatore elettrolitico C1
la scheda è stata pensata per poter pilotare diret- che, pur non essendo di dimensioni particolarmen-
tamente dei servocomandi, collegandoli al connet- te ridotte, ha i pin sotto il corpo che sporgono solo
tore angolato. Questi componenti assorbono una pochissimo dal medesimo.
notevole corrente di picco ed è impensabile poterli Con un minimo di pratica, una lente d’ingrandi-
alimentare con i 5 volt di Arduino; è stato quindi mento e una pinzetta, un buon saldatore a punta
previsto un connettore per fornire alla scheda una ŎQH GDQRQSLºGL:GLSRWHQ]D HGXQRWWLPR
tensione esterna con corrente adeguata. Per evitare ŏXVVDQWH FKHDLXWDDIRQGHUHHDGLVWULEXLUHOR
che un’inversione di polarità distrugga scheda e stagno su piedini e piazzole) risulta comunque ab-
servocontrolli, abbiamo inserito in serie all’alimen- bastanza semplice montare il circuito; nel caso coli
tazione il Mosfet Q1, a canale P, in grado di lasciar troppa lega saldante e faccia cortocircuiti tra i pin
passare la corrente solo nella direzione corretta. degli integrati è possibile rimediare cospargendoli
Perchè un mosfet e non un semplice diodo? Il mo- GLŏXVVDQWHSXOHQGRPROWREHQHODSXQWDGHOVDOGD-
WLYR©FKHLOGLRGRKDXQDFDGXWDGLWHQVLRQHŎVVD tore e scaldandoli in modo che lo stagno in eccesso
ai suoi capi (leggermente variabile con la corrente) risalga per sulla punta liberandoli. Solitamente con
FKHVHULVXOWDLQLQŏXHQWHSHUWHQVLRQLPHGLRHOHYD- 2-3 passaggi anche i cortocircuiti più ostici si risol-
te e basse correnti, causa perdite e surriscaldamenti vono in questo modo.
notevoli nel caso opposto di elevate correnti e basse Occorre fare solo attenzione alla temperatura del
tensioni. chip, evitando di soffermarsi troppo tempo col sal-
Ad esempio, scegliendo un diodo Schottky con una datore e, nel caso occorra ripetere il procedimento,
caduta di tensione intorno a 0,5 V e facendo scor- lasciando raffreddare per qualche decina di secondi
rere una corrente di 4 ampere, esso si trova a dover il componente.
dissipare ben 2 W: e un diodo da 2 watt ha dimen- Chi non se la sentirà di realizzare lo shield
sioni non trascurabili e scalda molto. potrà acquistarlo (presso la Futura Elettroni-
Per contro, il MOSFET selezionato ha una resisten- ca, www.futurashop.it) in versione montata e collau-
za di conduzione particolarmente bassa, pari a 51 data, con i connettori laterali e frontali non montati;
mOhm (milliohm) alla stessa corrente di drain. La ciò per offrire la possibilità di cambiare tipologia
dissipazione diviene quindi, sempre nelle condizio- di connettore, per avere i contatti delle uscite (tipo
ni di cui sopra, pari a: servo, quindi con PWM, +5V e massa in linea) ac-
cessibili in verticale o frontalmente.

LA LIBRERIA
Una potenza quindi decisamente inferiore, con con- Come già accennato, per questa scheda abbiamo
seguente minor surriscaldamento e maggior durata realizzato un’apposita libreria software, denomi-
di eventuali batterie. Il condensatore elettrolitico C1 nata Octopus, dotata di alcune particolarità che ne
ŎOWUDODWHQVLRQHLQLQJUHVVRGDHYHQWXDOLGLVWXUEL rendono semplicissimo l’utilizzo.

62 Marzo 2016 ~ Elettronica In


[piano di MONTAGGIO]
La prima particolarità interessante della libreria si
può notare dalle linee GHOOĬLQFOXGHŎOH Octopus.h):

GHŎQH2FWRSXVBBRFWRSXV
2FWRSXV&ODVV BBRFWRSXV 

HGDOOHOLQHHGHOŎOHVRUJHQWH Octopus.cpp):
2FWRSXV&ODVV BBRFWRSXV
{
 VWDWLF2FWRSXV&ODVVRFWR
 UHWXUQRFWR
}

Questa modalità apparentemente strana di utilizzo


della variabile Octopus permette di ovviare ad uno
dei problemi del C++, ovvero dell’inizializzazione
delle variabili globali che non avviene in un ordine
predeterminato ma è casuale, e viene effettuata al
caricamento dello sketch. Nel nostro caso, dovendo
inizializzare l’interfaccia I²C tramite le istruzioni:

:LUHEHJLQ 
:LUHVHW&ORFN  

prima dell’utilizzo della libreria, risulta impossibile


creare la variabile statica Octopus al momento del
caricamento del programma, visto che l’ interfaccia
Wire in quel momento non è ancora stata inizia-
lizzata. La soluzione prescelta permette per contro
di ottenere la creazione della variabile al primo
utilizzo della medesima, e quindi dopo aver inizia-
lizzato correttamente l’interfaccia I²C-Bus; questo Elenco Componenti:
ci ha permesso di realizzare un codice che, senza
nessuna riga di programma aggiuntiva, è in grado R1: 10 kohm (0805)
di contare ed inizializzare correttamente tutti gli R2: Array 4x10 kohm (0603)
shield Octopus connessi e di numerarne automa- R3÷R6: Array 4x220 ohm (0603)
C1: 100 μF 16 VL elettrolitico (Ø6mm)
ticamente le uscite in ordine di indirizzo I²C. Ad
C2. 1 μF ceramico (0805)
esempio, se alla nostra Arduino applichiamo due C3: 1 μF ceramico (0805)
shield, avremo a disposizione 32 I/O digitali, nu- Q1: NTD25P03L (DPACK)
merati da 0 a 31, e 32 PWM, numerati anch’essi da U1: PCA9685PW
0 a 31. U2: MCP23017-E/SO
La libreria fornisce due funzioni che permettono di
conoscere il numero di schede connesse ed il nu- Varie:
mero di I/O e PWM disponibili: - Strip M/F 6 vie
- Strip M/F 8 vie (2 pz.)
UHWXUQQXPEHURIERDUGVIRXQG - Strip M/F 10 vie
XLQWBWJHW1XP%RDUGV YRLG FRQVW - Strip M/F 2x3 vie
  - Strip Maschio 3x16 vie 90°
UHWXUQQXPEHURIDYDLODEOH,2
- Strip Maschio 16 vie 90°
XLQWBWJHW1XP,2 YRLG FRQVW  - Jumper (3 pz.)
- Strip Maschio 3 vie
Come detto in precedenza, la frequenza del PWM - Strip Maschio 2 vie (2 pz.)
è unica per ogni scheda, quindi per ogni gruppo - Morsetto 2 poli passo 3mm
di 16 uscite PWM; è impostabile tramite le due - Circuito stampato S1226
funzioni seguenti, la prima scheda per scheda e

Elettronica In ~ Marzo 2016 63


Listato 1 Ad esempio, per impostare l’uscita 30 ( la terzultima
della seconda scheda connessa) al 50% del valore
// Progetto : OctopusTest massimo, occorre scrivere
#include <Wire.h>
#include <Octopus.h>
2FWRSXVDQDORJ:ULWH  
uint16_t i = 1;
uint16_t valueTable[16];
Il terzo parametro opzionale, invert, è utile nel caso
// Codice di inizializzazionecode si connettano dei led in uscita sfruttando le uscite
void setup(void) in modalità open collector e collegandone gli anodi
{
Serial.begin(115200); al positivo; in questo caso si ha bisogno di un’uscita
Serial.println(“OCTOPUS TEST APP”); inversa (più tempo resta alta, meno corrente scorre
Wire.begin(); nel led) ed è quindi necessario impostare il parame-
Wire.setClock(400000); tro a true per ottenere una luminosità crescente con
delay(500);
il valore val.
Serial.print(“Found #”); Come avrete sicuramente notato, il valore del PWM
Serial.print((int)Octopus.getNumBoards()); a differenza delle uscite di Arduino è a 16 bit, dei
Serial.println(“ OCTOPUS boards”);
delay(500); quali ne vengono utilizzati 12, permettendo quindi
una variazione di intensità a 4.096 livelli al posto
Octopus.setPWMFreq(1526);
dei 256 di Arduino; questo consente, per esempio,
for(int k = 0; k < 16; k++) un controllo molto più graduale dell’intensità della
valueTable[k] = (- (double)k * k / 64 +
0.25 * k) * 4096;
luce emessa da LED connessi alla scheda.
} Per contro occorre ricordarsi di questo quando si
imposta il valore, visto che un numero pari a 255,
FLFORLQ¿QLWR
void loop(void) che su Arduino corrisponde all’intensità massi-
{ ma, qui corrisponde ad un valore piuttosto basso
for(uint8_t p = 0; p < 16; p++)
Octopus.analogWrite(p, valueTable[(i + (255/4.096 del massimo).
p) % 16]); Per la gestione degli I/O digitali, la libreria fornisce
i++;
delay(50);
le seguenti funzioni, praticamente identiche a quel-
} le delle librerie standard, se non per il fatto di poter
utilizzare un numero anche molto grande di porta:

GLJLWDO,2
YRLGSLQ0RGH XLQWBWSRUWXLQWBWPRGH 
la seconda per tutte le schede connesse in un solo ERROGLJLWDO5HDG XLQWBWSRUW 
YRLGGLJLWDO:ULWH XLQWBWSRUWERROYDOXH 
comando:  
UHDGZULWHDOOGLJLWDOSLQVRIJLYHQERDUGDWRQFH
VHWSZPIUHTXHQF\IRUDVLQJOHFRQQHFWHGERDUG XLQWBWGLJLWDO5HDG$OO XLQWBWERDUG 
YDOLGYDOXHV+]+] YRLGGLJLWDO:ULWH$OO XLQWBWERDUGXLQWBWYDO 
YRLGVHW3:0)UHT XLQWBWERDUGXLQWBWIUHT 
 
VHWSZPIUHTXHQF\IRU$//FRQQHFWHGERDUGV Le ultime due funzioni permettono di leggere e scri-
YRLGVHW3:0)UHT XLQWBWIUHT  vere tutti i ports digitali di una scheda in un colpo
solo, tramite una variabile a 16 bit; questo risulta
Nella prima occorre indicare il numero di scheda PROWRFRPRGRQHOFDVRVLDEELDELVRJQRGLPRGLŎ-
(che va da 0 a Octopus.getNumBoards()) e la frequen- care o leggere molto rapidamente le porte digitali.
za di PWM, da 24 Hz a 1.526 Hz; nella seconda è Al momento della pubblicazione di questo articolo
VXIŎFLHQWHLQGLFDUHODIUHTXHQ]DHWXWWHOHVFKHGH la libreria (scaricabile dal nostro sito www.elettroni-
verranno impostate su quella. All’accensione, la cain.itLQVLHPHDLŎOHGHOSURJHWWR ©LQIDVHGLFRP-
frequenza preimpostata è di 200 Hz, adatta ai ser- pletamento, e le funzioni degli interrupt e della mo-
vocontrolli ma anche ai LED. Il valore delle uscite GLŎFDGLPRGDOLW¡GHOOHXVFLWH3:0 RSHQGUDLQ
PWM è impostabile, analogamente alle librerie di totem pole) devono essere completate.
Arduino, tramite la funzione seguente:
UNO SKETCH DI PROVA
SZPRXWSXW
YRLGDQDORJ:ULWH XLQWBWSRUWXLQWBWYDOERROLQ- Per concludere, presentiamo un semplice sketch che
YHUW IDOVH  permette di visualizzare una “coda” luminosa utiliz-

64 Marzo 2016 ~ Elettronica In


zando 16 LED connessi alle uscite PWM (Listato 1).
Il codice inizializza l’interfaccia seriale, stampa un
messaggio, inizializza l’I²C, stampa il numero di
schede rilevate e, utilizzando la prima di esse (usci-
te PWM da 0 a 15) crea una sorta di ‘serpente’ lumi-
noso sfruttando 16 led.
I valori di luminosità del ‘serpente’ sono preven-
tivamente calcolati nella setup ed inseriti in una
tabella contenente 16 valori; a seconda del punto di
partenza della tabella (variabile ‘i’ nel loop) la ‘testa
del serpente’ si trova in un punto differente, crean-
do quindi l’effetto visivo voluto.
Come si nota, a parte il dover inserire ‘Octopus.’
davanti ai comandi analogWrite() l’utilizzo è prati-
camente identico alla libreria n ativa di Arduino.
L’unica cosa degna di nota è il calcolo dei valori di
luminosità, effettuato qui con un polinomio del se-
condo ordine in modo da creare un effetto di onda;
sono possibili altri metodi con funzioni trigonome-
triche o semplicemente con una variazione lineare
su cui potrete sperimentare; ad esempio:

IRU LQWN NN


 VLQ7DEOH>N@  VLQ 0B3, N 

per un andamento sinusoidale, oppure


IRU LQWN NN
 LI N 
  VLQ7DEOH>N@   GRXEOH N
 HOVH
  VLQ7DEOH>N@   GRXEOH N 


per un andamento bilineare.


Concludiamo qui la descrizione della nostra scheda
Octopus; potete ora sperimentare i diversi effetti
luminosi utilizzando ad esempio il driver Colibrì
presentato nel numero scorso di Elettronica In. J

per il MATERIALE
Lo shield Octopus (cod. OCTOPUS) è disponibile pres-
so Futura Elettronica nella versione con la componen-
tistica SMD premontata a 24,00 Euro (con i connettori
laterali e frontali da montare). Software e sketch sono
scaricabili gratuitamente sul sito www.elettronicain.it.
Il prezzo si intende IVA compresa.

Il materiale va richiesto a:
Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
Tel: 0331-799775 • Fax: 0331-792287 - www.futurashop.it

Elettronica In ~ Marzo 2016 65


R icordate il progetto
Fish’n Tweets, che
permetteva di controlla-
qui proposta non è
limitata al giorno degli
innamorati ma trova
re gli I/O di Fishino tra- impiego nella realtà
mite dei tweet? Ebbene, quotidiana, perché
si è trattato del nostro implementa anche una
primo esperimento di funzione di gestione
interazione tra Fishino della “lista della spesa”,
e il mondo dei Social. che permette di memo-
L’applicativo è tutt’ora rizzare una sequenza
valido ma, a causa della di prodotti, inviandone
“lentezza” di Twitter, a il nome tramite un
volte il tempo intercorso messaggino Telegram
tra un comando e la sua in qualsiasi momento e
esecuzione può supera- permettendo di con-
re i 20 secondi. sultarla e/o stamparla,
Twitter inoltre è sempre da remoto. Ciò
piuttosto complesso trova applicazione ad
da gestire, soprattutto esempio in un ristoran-
nella fase iniziale di te, dove l’avventore può
creazione delle chiavi fare il proprio ordine,
di accesso, dell’utente che verrà stampato alla
“robot”, eccetera. cassa in automatico.
Visto che volevamo L’applicazione ci per-
tornare sull’argomento mette di introdurre una
e che San Valentino libreria di interfaccia
incombe, abbiamo con Telegram apposita-
pensato di prendere i mente sviluppata, che
classici “due piccioni ci consentirà non solo lo aperto a tutti salvo bile (ed economico) non
con una fava” realiz- di controllare Fishino alcuni utenti “disturba- supporta la connessione
zando un’applicazio- da qualsiasi parte del tori”. Come vedrete la sicura (SSL/HTTPS),
ne, -stavolta basata mondo, ma anche di libreria si presenta in quindi non è utilizzabi-
sul servizio di instant leggerne gli ingressi modo piuttosto modu- le per l’interfacciamento
messaging Telegram- e, se vogliamo, di farci lare e semplice da usare, con i social che la ri-
che può essere un avvisare in caso si veri- nascondendo all’utente chiedono, come Twitter,
modo suggestivo per fichino eventi partico- i dettagli tecnici dell’im- Telegram ed altri.
mandare messaggi per- lari, sempre tramite un plementazione e della Disponendo, invece, di
sonalizzati alla propria messaggio Telegram. comunicazione con uno shield più recente,
amata, stampati da una La libreria è dotata dei Fishino. Questi applica- è possibile adattare la
micro-stampante. necessari strumenti di tivi possono funzionare libreria ad esso.
I messaggi possono “sicurezza”: è possibi- anche con una scheda
essere sia personalizzati le lasciare l’accesso a Arduino dotata di shield TELEGRAM E I SUOI “BOT”
che scelti da un data- tutti, vincolarlo solo ad WiFi, tuttavia dipende Cos’è un “bot”? In
base predisposto su un utenti specifici oppure, dallo shield. Quello più sintesi, è un account
server. L’applicazione se necessario, lasciar- comunemente disponi- “virtuale” di Telegram,

90 Febbraio 2017 ~ Elettronica In


Applicazioni

NOTES
MACHINE sparire dal server
poco dopo essere
seconda della piattafor-
ma. Una volta installato

CON FISHINO
stati processati; ed eseguito, vi troverete
• non possono iniziare di fronte alla schermata
una conversazio- di Fig. 1. Per creare il
ne ma rispondono bot bisogna ricorre-
se interessati; per re al “padre di tutti i
di MASSIMO DEL FEDELE comunicare con un bot”, ovvero all’utente
bot occorre aggiun- BotFather: è sufficiente
gerlo ad un gruppo digitarne il nome nella
Appoggiandoci a un bot, oppure inviargli un casella di ricerca (Fig. 2).
messaggio iniziale; Vi apparirà la schermata
stampiamo con una stampantina • hanno un “nome introduttiva di BotFa-
termica remota messaggi utente” che finisce ther; cliccate su Start
sempre in “bot”; per (in basso) per avviare il
composti su Telegram. Una esempio, TriviaBot, bot; BotFather rispon-
soluzione dalle mille applicazioni, Fishino_bot; derà con un messaggio
• anche se aggiunti a esplicativo contenente
utilizzabile per stampare liste e un gruppo, non rice- una lista dei principali
ordini in un locale e, perché no, vono tutti i messaggi comandi disponibili
se non impostati allo (Fig. 3).
per mandare messaggi stampati scopo. Siccome vogliamo
alla propria “bella” il giorno di creare un nostro bot,
CREIAMO IL NOSTRO BOT clicchiamo sul comando
San Valentino e non solo. Iniziamo subito con la /newbot (Fig. 4).
creazione del bot che ci BotFather ci chiede di
servirà per interagire dare un nome al nostro
con Fishino. bot; scegliamo un nome
per creare il quale non da Fishino e che sarà Per prima cosa, se non a caso, per esempio
servono numeri di in grado di rispondere l’avete ancora fatto, Pippo (Fig. 5).
telefono, dati personali, alle nostre richieste e/o occorre scaricare ed in- Ci viene quindi chiesto
eccetera. Questo tipo inviarci messaggi. stallare Telegram; nelle uno ‘user name’ per il
di account deve essere Il bot è quindi un robot, immagini in queste nostro bot; questo deve
creato da un account programmabile per pagine vedete l’instal- per forza essere unico
“reale”; per il resto, può eseguire determinate lazione su un desktop e terminare in ‘bot’; nel
funzionare come un azioni. I bot: Linux (l’abbiamo fatto caso scegliessimo uno
utente simulato, riceve- • non mostrano il loro per catturare le scher- username già occupato
re ed inviare messaggi, stato (online/offline); mate), ma normalmente BotFather ci avviserà e
ed altro. sono sempre attivi l’applicazione è installa- ci imporrà di cambiarlo.
A noi interessa qualcosa e “vedono” all’istan- ta su uno smartphone. In questo caso PippoBot
che possa interagire sia te (o quasi) i nostri Nell’installazione vi è già in uso (ovviamen-
con il nostro Fishino che messaggi; verrà chiesto di confer- te!), quindi scegliere-
con uno o più utenti; • hanno una memoria mare il vostro numero mo PippoRobot che
creeremo quindi un bot limitata; i vecchi di telefono e/o un casualmente è libero;
che verrà controllato messaggi possono codice di sicurezza, a BotFather ci avviserà

Elettronica In ~ Febbraio 2017 91


permette di richiedere i messaggi
ricevuti dal bot ha il formato
seguente:

GET /botTOKEN/getUpdates?offset=
nnn&timeout=4&limit=1&allowed_
updates=messages HTTP/1.1
User-Agent: FishGram 1.0.0
Host: api.telegram.org

Fig. 1 - Installazione di Telegram. In questo formato di richiesta:


• TOKEN è il nostro token di
accesso, visto al paragrafo
dell’avvenuta creazione del lissimo bot occorre, perché sia precedente;
nostro bot e ci darà le istruzioni utile, potergli inviare e ricevere • offset=nnnn rappresenta il
per utilizzarlo da remoto (Fig. 6). messaggi, oltre che dall’app Tele- primo ID di messaggio cui
Come potete notare, il nostro bot gram, anche attraverso il nostro siamo interessati;
è accessibile tramite l’indirizzo Fishino. Per interagire con il bot • limit=1 indica a Telegram di
Telegram: Telegram utilizza il protocollo fornirci un solo messaggio
HTTPS con un formato ben speci- per richiesta (Telegram può
telegram.me/PippoRobot fico; in particolare, i comandi fornire più messaggi per ogni
possono essere impartiti tramite richiesta di aggiornamento);
e per controllarlo è necessario direttive HTTP GET e POST, e • allowed_updates=messages
possedere il token di sicurezza negli headers http inviati deve indica che siamo interessati
fornito da BotFather: sempre essere presente il nostro solo ai messaggi e non, per
token. Per esempio, una richie- esempio, ai file audio e/o
Use this token to access the HTTP API: sta di tipo ‘getUpdates’, che ci immagini.
nnnnnnnnn:XXXXXXX-
YYYYYYY_
ZZZZZZZZZZZZZZZZZZZ

Il token (qui oscurato) è indi-


spensabile per garantire la sicu-
rezza che nessuno possa “ma-
nomettere” il nostro bot. Questo
token andrà inserito nel codice
del nostro sketch, come vedremo
in seguito, quindi prendetene
nota e, soprattutto, mantenetela
ben segreta visto che chiunque
ne viene in possesso è in grado di
fare qualsiasi cosa con il nostro
bot, compreso cancellarlo.
Clicchiamo ora sul link telegram.
me/PippoRobot (Fig. 7) e successi-
vamente sul comando Start, che
avvierà il nostro bot inviandogli
un messaggio iniziale (Fig. 8).
Ecco fatto! Abbiamo creato il
nostro primo bot di Telegram!

LA LIBRERIA FISHGRAM
Una volta creato il nostro bel- Fig. 2 - Ricerca di BotFather.

92 Febbraio 2017 ~ Elettronica In


Possiamo provare il comando
direttamente sul browser, im-
mettendo nella casella dell’indi-
rizzo il testo seguente (sostituite
TOKEN con il vostro token di
accesso):

https://api.telegram.org/botTOKEN/
getUpdates?offset=0&timeout=4&li
mit=1&allowed_updates=messages

Scrivete, ovviamente, tutto su


una sola riga. Telegram risponde-
rà con un testo in formato JSON
come il seguente:

{“ok”:true,”result”:[{“update_
id”:904783368,
“message”:{“message_id”:2,”f
rom”:{“id”:nnnnnnnnn,”first_ Fig. 4 - Creazione del nostro Bot.
name”:”Massimo”,”last_name”:”Del Fe
dele”},”chat”:{“id”:nnnnnnnnn,”fir
st_name”:”Massimo”,”last_name”:”Del di risposta contiene parecchie do come offset=id+1 potremo
Fedele”,”type”:”private”},”date”:14 informazioni, tra cui il mittente richiedere i messaggi a partire
83380231,”text”:”ciao Pippo”}}]} del messaggio, l’id del messaggio dal successivo), eccetera.
(tramite il quale, per esempio, in È facile capire che, senza un’ap-
Come si può notare, il testo una chiamata successiva invian- posita libreria software, il fun-
zionamento della cosa risulta
piuttosto complesso. Se l’invio
della richiesta è relativamente
semplice (basta utilizzare un
oggetto FishinoClient, collegarlo
all’indirizzo richiesto, ed inviare
una serie di stringhe di caratteri),
l’analisi del JSON restituito non
è altrettanto banale, soprattutto
a causa delle risorse limitate del
nostro Fishino, specialmente
per quanto riguarda la memoria
RAM.
Per questo ci viene in aiuto la
libreria JSONStreamingParser,
scritta per il progetto Fish’n Twe-
ets, che è in grado di “digerire”
l’output di Telegram, carattere
per carattere, senza bisogno di
memorizzare nulla, e di spezzet-
tarlo in tanti elementi del tipo
nome: valore e, ad ogni elemento
ricevuto, chiamare una funzione
da noi definita.
Siccome spiegare il funzionamen-
Fig. 3 - Risposta di BotFather. to della libreria richiederebbe

Elettronica In ~ Febbraio 2017 93


rilevanti tre punti, il primo dei
quali è costituito dalla funzione
di gestione degli eventi (di cui
parleremo tra poco):

bool FishGramHandler(uint32_t id,


const char *firstName, const char *la-
stName, const char *message)

Il secondo è “inizializzazione di
FishGram”:

// start FishGram
FishGram.
event(FishGramHandler);
FishGram.begin(F(MY_TELE-
GRAM_TOKEN));

E il terzo è la chiamata nel loop:


Fig. 5 - Assegnazione del nome al Bot.
FishGram.loop();

metà delle pagine di questo fasci- di FishGram (Listato 1). Semplice, vero? Ma come fun-
colo, se non oltre, partiremo da Come potete vedere, il grosso ziona? Ebbene, a differenza della
un piccolo sketch di esempio per dello sketch è l’inizializzazione maggior parte degli sketch cui
mostrarne l’utilizzo; chi volesse di Fishino, il collegamento al rou- siamo abituati, la libreria Fi-
approfondire troverà il codice ter, eccetera. Per quanto riguarda shGram funziona per eventi; una
della libreria stessa molto com- FishGram in pratica troviamo volta inizializzata, resta quasi
mentato e quindi relativamente
facile da capire. Affronteremo co-
munque, durante la spiegazione
dell’utilizzo, di alcune peculiarità
e scelte apparentemente strane
che abbiamo effettuato nella
scrittura della stessa.

UN PRIMO SKETCH,
SEMPLICE SEMPLICE
Iniziamo... dall’inizio! Proviamo
a visualizzare i messaggi che
vengono inviati al nostro bot sul
monitor seriale; per far questo lo
sketch è davvero semplicissimo.
Per questo (primo) esempio, inse-
riremo il codice completo (com-
presa l’inizializzazione di Fishino,
la connessione al router WiFi,
eccetera, in modo da permettere
a chiunque di collaudarlo “al
volo” semplicemente copiando
il codice nell’IDE; per i prossimi
esempi eviteremo tutto questo ed
inseriremo solo il codice specifico Fig. 6 - Completamento del bot.

94 Febbraio 2017 ~ Elettronica In


invisibile e, soprattutto, occupa
pochissime risorse di calcolo e di
memoria. L’importante è che la
chiamata FishGram.loop();
dentro al loop venga eseguita
spesso.
Questa chiamata, che normal-
mente dura poche decine di mi-
crosecondi, consente alla libreria
di gestire un timer interno e di ri-
chiamare, ad intervalli prefissati,
il server di Telegram e richiedere
eventuali aggiornamenti.
Se questi aggiornamenti non
sono presenti, torna senza fare
nulla; se invece c’è qualche
novità la raccoglie, organizza
e chiama la funzione evento
FishGramHandler() passan-
dole come parametri l’id, il nome
ed il cognome del mittente ed il Fig. 7 - Avvio del bot.
testo del messaggio.
Con questa funzione possiamo rispettivamente per collegare la chiedere a FishGram gli aggior-
quindi stampare sulla porta se- nostra funzione di gestione degli namenti “ogni tanto”, ma con
riale quello che riceviamo. eventi e per dire a FishGram chi questo meccanismo sarà la stessa
Le due chiamate nel setup, ovve- è il nostro bot tramite il token. libreria ad avvisarci se e solo se
ro la FishGram.event() e la Non saremo quindi noi, dentro arriva qualcosa di interessante
FishGram.begin(), servono allo sketch, a doverci ricordare di dal nostro bot.
Quali sono gli svantaggi di
un simile metodo? In pra-
tica ce n’è solo uno: se la
FishGram.loop() non viene
eseguita abbastanza spesso il
programma risponde male. Per
esempio, se infilassimo una
delay(1000) dentro alla loop(), la
libreria riuscirebbe ad elaborare
solo un carattere ricevuto ogni
secondo, quindi passerebbero
giornate prima di avere una
risposta, o, più probabilmente, il
server di Telegram chiuderebbe
la connessione prima.
Quindi è ben possibile (anzi, lo
scopo di questo sistema è proprio
quello!) far eseguire al nostro
Fishino qualcos’altro, mentre è
in attesa di messaggi, ma questo
qualcos’altro non deve nè bloc-
care l’esecuzione del loop() nè
impiegare troppo tempo. Quindi,
niente delay(), niente while() con
Fig. 8 - Messaggio iniziale del bot. durate lunghe e/o attesa di pul-

Elettronica In ~ Febbraio 2017 95


Listato 1
#include <Fishino.h>
#include <JSONStreamingParser.h> santi da premere, eccetera. Tutto
#include <FishGram.h>
#include <SPI.h> dev’essere eseguito senza blocca-
re il loop, quindi con millis() per
#define MY_SSID “IL_MIO_SSID”
#define MY_PASS “LA_MIA_PASSWORD” i ritardi e controlli “volanti” per
eventuali pulsanti da rilevare.
// se volete un IP dinamico basta commentare/eliminare le 3 righe seguenti
#define IPADDR 192, 168, 1, 251 Esistono alternative ma vanifi-
#define GATEWAY 192, 168, 1, 1 cano in parte i vantaggi dell’ap-
#define NETMASK 255, 255, 255, 0
proccio; ad esempio, se vogliamo
#define MY_TELEGRAM_TOKEN “LA_TOKEN_DEL_MIO_BOT_TELEGRAM” attendere che un I/O vada a
#ifdef IPADDR livello HIGH, invece di fare:
IPAddress ip(IPADDR);
#ifdef GATEWAY
IPAddress gw(GATEWAY); while(!digitalRead(5))
#else
;
IPAddress gw(ip[0], ip[1], ip[2], 1);
#endif
#ifdef NETMASK
IPAddress nm(NETMASK); possiamo scrivere:
#else
IPAddress nm(255, 255, 255, 0);
#endif while(!digitalRead(5))
#endif FishGram.loop();
// fishgram event handler -- just display message on serial port
bool FishGramHandler(uint32_t id, const char *firstName, const char *lastName, const char *message) In modo che FishGram continui
{
Serial << F(“Ho ricevuto un messaggio da ‘”) << firstName << “’\n”; ad essere richiamata nell’atte-
Serial << F(“Il messaggio dice: ‘”) << message << “’\n”; sa. Allo stesso modo, invece di
return true;
} utilizzare:
void setup(void)
{ delay(1000);
Serial.begin(115200);
while (!Serial)
; dovremo procedere con l’utilizzo
while(!Fishino.reset()) della millis() in questo modo:
Serial << F(“Fishino RESET FAILED, RETRYING...\n”); uint32_t tim = millis() + 1000;
Serial << F(“Fishino WiFi RESET OK\n”);
while(millis() < tim)
Fishino.setMode(STATION_MODE); FishGram.loop();
Fishino.setPhyMode(PHY_MODE_11G);

Serial << F(“Connecting to AP...”); Ma è possibile aggiungere alla


while(!Fishino.begin(MY_SSID, MY_PASS))
{ libreria una funzione del tipo
Serial << “.”; seguente?
delay(2000);
}
Serial << “OK\n”;
FishGram.aspettaMessaggio()

#ifdef IPADDR
Fishino.config(ip, gw, nm);
#else
Certamente si... ma se il messag-
Fishino.staStartDHCP(); gio non arriva, lo sketch rimane
#endif
bloccato all’infinito oppure per
Serial << F(“Waiting for IP...”); un tempo prefissato senza co-
while(Fishino.status() != STATION_GOT_IP)
{ munque poter fare altro, quindi
Serial << “.”; abbiamo appositamente evitato
delay(500);
} di introdurla.
Serial << F(“OK\n”); Sul monitor seriale verrà visua-
// start FishGram lizzato qualcosa di simile:
FishGram.event(FishGramHandler);
FishGram.begin(F(MY_TELEGRAM_TOKEN));
} Fishino WiFi RESET OK
Connecting to AP...OK
void loop(void)
{ Waiting for IP........OK
FishGram.loop();
}
Ho ricevuto un messaggio da ‘Massimo’

96 Febbraio 2017 ~ Elettronica In


La stampante termica
Per stampare i nostri messaggi in- baud;
viati da Telegram ci siamo avvalsi • dimensioni (LxPxH): 111 x 65 x 57 mm;
Il messaggio dice: ‘Ciao Pippo, di una piccola stampante a carta • temperatura di esercizio: 5°÷ 50°C.
come stai?’ termica facilmente reperibile in
commercio negli store on-line per La stampante è la classica termica
INVIARE UN MESSAGGIO maker, come www.futurashop.it. simile a molti modelli esistenti da
La stampantina è del tipo a 20
DA FISHINO A UN UTENTE anni, però nasce -guardacaso- per
colonne e stampa su rotolo di il mondo Arduino; allo scopo viene
Se ricordate, nel paragrafo
carta termica da 57,5 ±0,5 mm e fornita con a corredo l’apposita
sulle differenze tra un bot ed un si interfaccia tramite una connes- libreria firmware.
umano era specificato un punto sione seriale a livello TTL. Nello specifico, nel nostro sketch
apparentemente poco importante Di seguito ne elenchiamo le carat- per Fishino abbiamo integrato e
ma che invece è fondamentale: teristiche. utilizzato la stessa libreria fornita
un bot non può iniziare una • tensione di alimentazione: da Adafruit.
conversazione. Non possiamo 5÷9 Vcc;
quindi dire al nostro Fishino • assorbimento max: 1,5 A;
• velocità di stampa:
“cerca Giuseppe e spediscigli un
50÷80 mm/s
messaggio”. Questa è stata una
• risoluzione: 8 pixel/mm, 384
scelta ben precisa di chi ha svi- pixel/linea
luppato le API di Telegram, per • larghezza effettiva di
impedire un uso improprio dei stampa: 48mm
bot. Come potete ben immagina- • set caratteri: ASCII,GB2312-80;
re, se ci fosse questa possibilità • font stampa:
sarebbe semplicissimo realizzare ANK: 5 × 7,
uno spam-bot in grado di inviare cinese: 12 x 24, 24 × 24;
• protocollo: TTL Serial, 19.200
migliaia di messaggi indeside-
rati a chiunque! Come possiamo
fare, quindi? Semplicemente, una
volta inviato almeno un messag-
gio al nostro bot, questo avrà a piccola modifica allo sketch, qui di seguito. La prima è:
disposizione l’id della chat (che che ci permette di ottenere un
poi è anche l’id di chi ha invia- feedback da parte di FishGram // end - termina la libreria
to il messaggio) e potrà quindi sul nostro telefonino; per far //FishGram
rispondere a questo utente e questo è sufficiente modificare la bool end(void);
ad altri eventuali che l’hanno funzione di gestione degli eventi
contattato. Vediamo quindi una come nel Listato 2. E, al prossimo e in pratica non serve mai, a
messaggio inviato, il nostro bot, meno di non utilizzare FishGram
oltre a mostrarci l’output sul mo- sporadicamente e voler liberare
Il sistema in versione San nitor seriale, ci risponderà come tutta la memoria che occupa.
Valentino: la stampante è mostrato in Fig. 9.
montata in un quadro in tema.
La funzione FishGram.sendMes- // cancella i dati locali
sage(), non dovendo attendere al- FishGramClass &clear(void);
cunché, si comporta come siamo
abituati: viene richiamata dove in pratica non è indispensabi-
vogliamo, esegue il suo compito le; libera la memoria utilizzata
e poi ci lascia proseguire. da FishGram fino al prossimo
Il primo parametro, id, è l’id evento.
dell’utente a cui si vuole inviare
il messaggio; il secondo è il mes- // abilita/disabilita la lista di
saggio vero e proprio. //utenti ammessi
FishGramClass &restrict(bool b =
LA LIBRERIA IN DETTAGLIO true);
Come avete visto nei due esempi FishGramClass &noRestrict(void) {
precedenti, la libreria è piuttosto return restrict(false); }
semplice; contiene comunque
altre utili funzioni che vediamo queste ultime due funzioni

Elettronica In ~ Febbraio 2017 97


sono utilissime per eseguire un
controllo su chi può mandare
messaggi al nostro bot; se attiva-
ta con restrict() la funzione scarta
automaticamente tutti i messaggi
provenienti da id non contenuti
nella lista al punto seguente.

// aggiunge un ID utente alla lista


//di utenti ammessi
FishGramClass &allow(uint32_t id);

questa funzione permette di


aggiungere un id utente alla lista
degli utenti ammessi; se la fun- Fig. 9
zione viene abilitata con restrict(), Risposta
solo gli utenti presenti in questa del bot.
lista vedranno accolti i loro mes-
saggi dal bot.

// aggiunge un ID utente alla lista


//di utenti bloccati recupererà i 10 messaggi prece- Queste due funzioni permettono
FishGramClass &block(uint32_t id); denti: di inviare un messaggio tramite
FishGram a un ID specifico:
Nel Listato 3 invece vediamo la // imposta la funzione di gestione
lista degli utenti bloccati; qualsia- //degli eventi // invia un messaggio ad un ID spe-
si id presente in questa lista viene FishGramClass &event(FishGramEvent e); cifico pezzo per pezzo
considerato come spam e quindi bool startMessage(uint32_t const &id,
ignorato. Questa funzione installa il uint16_t len);
All’avvio, di default FishGram gestore di eventi, come visto in bool contMessage(const char *msg);
legge l’ultimo messaggio dispo- precedenza: bool contMessage(const __FlashStrin-
nibile, lo scarta ed attende nuovi gHelper *msg);
messaggi; a volte è desiderabile // invia un messaggio ad un ID bool contMessage(char c);
leggere anche messaggi prece- //specifico bool endMessage(void);
denti all’avvio, cosa ottenibile bool sendMessage(uint32_t const &id,
con questa funzione. Se introdu- const char *msg); queste cinque funzioni permetto-
ciamo recoverOldMessages(10), bool sendMessage(uint32_t const &id, no di inviare un messaggio pezzo
ad esempio, all’avvio, FishGram const __FlashStringHelper *msg); per pezzo, quindi comode se la
memoria RAM è scarsa. L’unico
“inghippo” è che è necessario
Listato 2 conoscere a priori la lunghezza
complessiva del messaggio, da
// fishgram event handler -- display message on serial port and give feedback to sender passare come parametro alla
bool FishGramHandler(uint32_t id, const char *firstName, const char *lastName, const char *message)
{
startMessage(). Il messaggio può
Serial << F(“Ho ricevuto un messaggio da ‘”) << firstName << “’\n”; poi essere inviato tramite varie
Serial << F(“Il messaggio dice: ‘”) << message << “’\n”; chiamate alla contMessage(), e
String s; terminato con la endMessage().
s = “Ciao, “;
s += firstName;
s += “, ho ricevuto il tuo messaggio ‘”; LA NOTE MACHINE
s += message; Dopo aver esaminato la libreria
s += “’”;
FishGram.sendMessage(id, s.c_str());
FishGram in dettaglio possiamo
return true; vederne un’applicazione un po’
} più complessa. In principio le

98 Febbraio 2017 ~ Elettronica In


Listato 3
// imposta il numero di messaggi precedenti da recuperare
cose sono abbastanza semplici: // -1 per TUTTI (usare con cautela!), 0 per nessuno.
basta “trasformare” i messaggi // dev’essere chiamata prima della begin()
in comandi per il nostro Fishino, FishGramClass &recoverOldMessages(uint32_t n = (uint32_t)-1);

eseguire questi comandi ed invia-


re un’eventuale risposta/confer-
ma al mittente. Come dicevamo Ad esempio, inviando il messag- Il modo più semplice per imple-
nell’introduzione, abbiamo pen- gio ‘stampa Ci vediamo stasera?’ mentare la cosa è quello di una
sato di implementare un sistema la frase ‘Ci vediamo stasera?’ “linked list”, ovvero una lista di
che permetta di: verrà stampata immediatamente elementi collegati alla quale è
• stampare messaggi inviati da e, nello stesso tempo, riceveremo possibile aggiungere o togliere
Telegram; su Telegram un messaggio di (quest’ultima funzione qui non è
• rispondere ad un messaggio conferma. utilizzata) degli elementi. Gli ele-
particolare con una citazione o Vediamo quindi le parti salienti menti stessi, poi, sono costituiti
un messaggino romantico; dell’applicazione. Innanzitutto, dal testo del comando abbinato
• stampare una citazione o un abbiamo bisogno di una funzione alla funzione che lo gestisce.
messaggino romantico; che gestisca l’evento proveniente Iniziamo con questi ultimi, di-
• gestire una lista di oggetti che da Telegram (quella che nei due chiarati come nel Listato 4.
potrebbe corrispondere ad una piccoli esempi di prima si limita- La typedef iniziale serve a for-
lista della spesa; va a mostrare il messaggio sulla nire una sintassi abbreviata per
• consultare e stampare la stessa. seriale e/o reinviarlo al mittente gestire le funzioni che esegui-
come conferma). In questo caso ranno i nostri comandi. In poche
Scendendo in dettaglio, i coman- le cose si complicano leggermen- parole, queste funzioni hanno
di sono implementati analizzan- te, dovendo analizzare il testo del come parametri l’id, nome e
do l’inizio del messaggio inviato, messaggio per estrarne i coman- cognome del mittente ed il corpo
ricercandovi le seguenti parole: di. Abbiamo poi bisogno della del messaggio senza il nome del
lista di comandi, memorizzata comando; ritornano un valore
• stampa invia alla stampante il in qualche modo “comodo” e di booleano in base all’esito del
resto del testo del messaggio; una serie di funzioni che gesti- comando stesso (valore qui non
• romantico preleva una frase scano i comandi stessi. usato, ma potrebbe servire per
romantica da un database e la
invia come risposta;
• citazione preleva una citazione
da un database e la invia come Fig. 10 - Piedinatura
risposta; della Fishino Guppy.
• stampa romantico preleva una
frase romantica da un database
e la stampa;
• stampa citazione preleva una
citazione da un database e la
stampa;
• aggiungi aggiunge un oggetto
alla lista della spesa;
• rimuovi rimuove un oggetto
dalla lista della spesa;
• mostra lista invia come rispo-
sta il contenuto della lista della
spesa;
• stampa lista stampa la lista
della spesa;
• svuota lista svuota la lista
della spesa;
• help mostra l’elenco dei co-
mandi disponibili (questa lista).

Elettronica In ~ Febbraio 2017 99


Listato 4
typedef bool (*CommandHandler)(uint32_t, const char *, const char *, const char *);
struct CommandElement: public ListElement<CommandElement> to, senza dover scrivere una sola
{
const FLASH_HELPER *name;
riga di codice aggiuntivo. Allo
CommandHandler handler; stesso modo, se desiderassimo
CommandElement(const FLASH_HELPER *_name, CommandHandler _handler): una lista di Rose, potremmo
name(_name), handler(_handler) {}
}; scrivere:

List<Rose> listaRose;

Listato 5 Una bella differenza dal dover ri-


commandList.add(new CommandElement(F(“aggiungi”) , Cmd_AggiungiLista)); scrivere ogni volta tutto il codice
commandList.add(new CommandElement(F(“rimuovi”) , Cmd_RimuoviLista)); per gestire tipi di dati differenti!
commandList.add(new CommandElement(F(“mostra lista”) , Cmd_MostraLista));
commandList.add(new CommandElement(F(“stampa lista”) , Cmd_StampaLista));
La template List si trova nel file
commandList.add(new CommandElement(F(“svuota lista”) , Cmd_SvuotaLista)); List.h dentro alla cartella del
commandList.add(new CommandElement(F(“stampa romantico”) , Cmd_StampaRomantico)); progetto; è probabile che in una
commandList.add(new CommandElement(F(“romantico”) , Cmd_Romantico));
commandList.add(new CommandElement(F(“stampa citazione”) , Cmd_StampaCitazione)); futura versione delle librerie
commandList.add(new CommandElement(F(“citazione”) , Cmd_Citazione)); raccoglieremo un po’ di codice
commandList.add(new CommandElement(F(“stampa”) , Cmd_Stampa));
commandList.add(new CommandElement(F(“help”) , Cmd_Help)); riutilizzabile come questo in una
libreria apposita. Analizzando
il codice corrispondente, si nota
che il template fornisce funzio-
comandi differenti). La struct utilizzarne una già fatta da altri? ni per aggiungere, eliminare e
CommandElement rappresenta Alla prima domanda e mezza si percorrere tutti gli elementi della
invece la descrizione del coman- può rispondere che una template lista; non si tratta di un codice
do vero e proprio, ovvero il testo è quello che si chiama una classe particolarmente complesso nè
(name) ed il puntatore alla fun- generica, ovvero può essere performante, ma svolge egregia-
zione che lo gestisce (handler). utilizzata per gestire differenti mente il suo compito.
Nella struct (che è praticamente tipi di oggetti. Quindi, se volessi- Alla seconda domanda... non c’è
la stessa cosa di una class, salvo mo realizzare una lista di patate, una risposta: è vero che esistono
qualche lieve differenza) abbia- basterebbe scrivere: in rete decine di implementazioni
mo anche inserito un costruttore di Liste, Array, eccetera; sempli-
che permette di inizializzarla. La List<Patate> listaPatate; cemente abbiamo preferito scri-
FLASH_HELPER è una macro verne una limitata (e facilmente
(#define) che dipende dal con- ed otterremmo quanto desidera- comprensibile) adatta al nostro
troller usato; per gli 8 bit viene
tradotta in __FlashStringHelper,
per poter utilizzare le stringhe PRINTER

nella memoria flash (e quindi


risparmiare preziosa RAM), Fig. 11 - Cablaggio
mentre nei 32 bit viene tradotta dell’elettronica.
6
in una semplice char, visto che
per queste tipologie di controller 5

non c’è differenza tra stringhe in GND


RAM o nella Flash.
VIN
La lista dei comandi viene quindi
7V
rappresentata in questo modo:

List<CommandElement> commandList;

Qui utilizziamo una template


scritta da noi per gestire una lista
di oggetti generici. Perché una
template (e soprattutto... cos’è
una template???), e perché non

100 Febbraio 2017 ~ Elettronica In


scopo, anche per motivi didattici. remo solo una breve descrizione; che) vengono implementate per
Una volta dichiarata la lista di non si tratta di codice partico- forza di cose appoggiandoci ad
comandi occorre riempirla, e larmente complesso ma appe- un server esterno, tramite un
questo avviene nelle linee del santirebbe comunque troppo programmino in php contenente
Listato 5. La funzione add ag- l’articolo. Il codice è comunque una serie di frasi preimpostate ed
giunge un nuovo (new) elemento ben commentato e scaricabile dal un algoritmo per poterne genera-
(CommandElement) inizializzan- nostro sito www.elettronicain.it e, re una casuale ad ogni accesso, a
dolo con il nome del comando e in seguito, verrà incluso tra gli meno di non richiederne una spe-
la funzione di gestione (handler) esempi nelle librerie di Fishino. cifica. Ma perché un php esterno?
corrispondente. Ad esempio, la Le citazioni (e le frasi romanti- Non si potevano implementare
prima riga implementa il co-
mando “aggiungi” gestito dalla
funzione Cmd_AggiungiLista().
Torniamo ora al gestore degli Listato 6
eventi di FishGram, che utilizza
il codice di Listato 6. // fishgram event handler
bool FishGramHandler(uint32_t id, const char *firstName, const char *lastName, const char *message)
Questo non fa altro che percor- {
rere tutta la lista di comandi, CommandElement *elem = commandList.head();
while(elem)
confrontandoli con l’inizio del {
messaggio ricevuto; quando tro- if(starts(message, elem->name))
{
va una corrispondenza termina message += strlen_P((const char *)elem->name);
la ricerca ed esegue il comando while(*message && isspace(*message))
corrispondente. message++;
return elem->handler(id, firstName, lastName, message);
Se non trova una corrispondenza }
invia al mittente un messaggio di elem = elem->next();
}
errore (la penultima riga).
La funzione starts() richiamata // command not found
FishGram.sendMessage(id, F(“Comando sconosciuto - inviare ‘help’ per lista comandi”));
dall’handler è un piccolo helper return false;
(funzione di utilità) che controlla }
se un testo inizia con una stringa
prefissata, ed è definita poche
righe sopra (Listato 7). Listato 7
Non ci resta che vedere una delle
funzioni di gestione dei comandi; bool starts(const char *msg, const FLASH_HELPER *cmd)
{
per semplicità vedremo quella char c;
che implementa il comando uint16_t i = 0;
while( (c = charAt(cmd, i++)) != 0)
‘stampa’ (Listato 8). if(toupper(*msg++) != toupper(c))
Questa funzione non fa altro return false;
che stampare, come richiesto, il return true;
}
mesaggio (sendToPrint(str)) e
risponderci con un messaggio di
conferma, costruito per rispar-
miare ripetizioni con la helloMsg
Listato 8
(che crea una stringa costituita da bool Cmd_Stampa(uint32_t id, const char *firstName, const char *lastName, const char *str)
“Ciao <nome>, “, aggiungendovi {
// print the message
il testo “ho stampato il tuo mes- sendToPrint(str);
saggio ‘”, il testo del messaggio
e la virgoletta di chiusura finale, // send a confirmation back to bot
String ans = helloMsg(firstName, lastName);
reinviandolo poi al mittente tra- ans += F(“ho stampato il tuo messaggio ‘”);
mite la FishGram.sendMessage(). ans += str;
ans += “’”;
FishGram.sendMessage(id, ans.c_str());
CITAZIONI E LISTA DELLA SPESA return false;
}
Per queste due funzionalità da-

Elettronica In ~ Febbraio 2017 101


Listato 9
// la lista della spesa
struct ShoppingListElement: public ListElement<ShoppingListElement>
{ che sarebbe utile ma che avreb-
char *item; be complicato il codice oppure
ShoppingListElement(const char *s) { item = strdup(s); }
virtual ~ShoppingListElement() { if(item) free(item); }
limitato la generalità dello stesso.
}; Per cercare un oggetto nella lista
List<ShoppingListElement>shoppingList; dovremo quindi eseguirne una
scansione completa “a mano”,
come fa il gestore di eventi di
direttamente sul Fishino, magari di inviare un messaggio anche FishGram visto sopra.
con l’utilizzo di una scheda SD? carattere per carattere, senza
Si, ma non con le versioni UNO quindi la necessità di doverlo L’ELETTRONICA
e GUPPY che abbiamo scelto per scaricare per intero sul Fishino). Il collegamento della stampante è
l’applicazione, soprattutto per Il codice di richiesta della cita- davvero semplicissimo (Fig. 11);
motivi di compattezza. Queste zione al server è contenuto nei bastano tre cavetti: uno da
infatti non hanno lo spazio di moduli Cit.h e Cit.cpp, anch’essi collegare alla massa del Fishino,
memoria sufficiente per gestire reperibili nella cartella dell’appli- uno alla linea D6 (il TX, ovvero
sia FishGram che la scheda SD. cazione, ed è di facile comprensio- l’RX della stampante) ed uno
Utilizzando lo (scarso) spazio ne e ben commentato. Per quanto alla linea D5 (l’RX, ovvero il TX
lasciato libero in Flash dall’appli- riguarda la lista della spesa, della stampante). La stampantina
cazione avremmo potuto mettere invece... abbiamo sfruttato ancora comunica tramite un semplice
insieme poche frasi, cosa che una volta la nostra template List, protocollo seriale, per il quale
avrebbe portato a ripetizioni nel essendo questa perfetta per gesti- sfruttiamo una SoftwareSerial
breve termine. Utilizzando una re questo tipo di dati; la dichiara- tramite l’apposita libreria, ed
Fishino Mega o, ancora meglio, la zione è riportata sul Listato 9. è gestita dalla libreria Adafru-
nuova Fishino32 questi problemi Come si può vedere, abbiamo it_Thermal.
spariscono completamente ed è prima definito una nuova struct Bene, si conclude qui la descri-
possibile implementare in locale contenente il dato che ci interessa zione della nostra Note Machine,
anche un grosso database di (un semplice puntatore a carat- utilizzabile anche come spunto
citazioni su scheda SD o anche tere, che conterrà una stringa di per controlli molto diversi, quali
direttamente nella memoria testo allocata dinamicamente per esempio la gestione di luci,
Flash del controller. tramite strdup()); la novità qui è allarmi ed altro. Prossimamente
Tornando alle citazioni, la richie- il distruttore (~ShoppingListEle- presenteremo altre interessanti
sta avviene, tramite protocollo ment()) che si occupa di liberare applicazioni di Telegram. g
HTTP (per i limiti di Fishino la memoria dinamica quando
di non poter aprire più di una eliminiamo l’elemento.
connessione HTTPS alla volta) La dichiarazione della lista è
tramite una semplice richiesta quindi immediata, come si vede
per il MATERIALE
GET ad una path situata sul sito dalla linea successiva alla struct,
www.fishino.it. Il modulo PHP ed il suo utilizzo identico a quel- Tutti i componenti utilizzati in questo
risponde con una stringa di testo lo relativo alla lista di comandi. progetto sono disponibili presso Fu-
semplice con questo formato: In questo caso utilizziamo anche tura Elettronica. La mini stampante
la funzione remove() per elimina- termica (cod. COM10438) è in ven-
ID, LEN, citazione re, a richiesta, elementi dalla lista. dita a Euro 79,00, la board Fishino
Per esempio, se vogliamo aggiun- GUPPY (cod. GUPPY) è disponibi-
dove ID è un numero identifi- gere “Pasta” alla lista tramite le a Euro 33,90 e l’alimentatore da
cativo della citazione, per poter- codice, possiamo scrivere: rete switching multitensione (cod.
la “ripescare”, ad esempio, per PSSMV1) costa Euro 15,50. I prezzi
mandare al mittente la conferma shoppingList.add(new
si intendono IVA compresa.
di quanto si è stampato; LEN è la ShoppingListElement(“Pasta”));
lunghezza del testo della citazio- Il materiale va richiesto a:
ne stessa, necessaria per poter Come accennato, la nostra imple- Futura Elettronica, Via Adige 11,
utilizzare le funzioni startMes- mentazione di List è ben lungi 21013 Gallarate (VA)
sage() e annesse della libreria dall’essere completa; manca, per Tel: 0331-799775
FishGram (ricordate? Permettono esempio, una funzione di ricerca, http://www.futurashop.it

102 Febbraio 2017 ~ Elettronica In


Arduino

La nostra versione
della popolare e
potente Arduino
MEGA, basata su un
hardware rivisitato
specialmente nella
sezione di
alimentazione.

FISHINO
DIVENTA MEGA
di MASSIMO DEL FEDELE

on è passato nean- schede microSD ed un


N che tanto tempo
da quando abbiamo
RTC (Real Time Clock,
orologio in tempo reale).
presentato la nostra Come anticipato allora,
board Fishino UNO, la board non voleva
una scheda compatibile essere un “pezzo unico”
con Arduino UNO ma ma la prima di una serie
dotata di interessanti completa di schede
periferiche aggiuntive a Arduino-compatibili con
bordo, quali un modu- prestazioni e funzio-
lo WiFi, un lettore di nalità estese, di cui si

Elettronica
Elet
t In ~ Aprile 2016 91
[schema ELETTRICO]

92 Aprile 2016 ~ Elettronica In


sentiva la mancanza. In questo tazione, che portano tre tensioni:
articolo presentiamo quindi la • VLiPo, che fa capo al connetto-
seconda scheda della serie: la re per la batteria ricaricabile ai
Fishino MEGA. Si tratta di una polimeri di litio (LiPo);
board, compatibile con Arduino • VUSB, che fa capo al connetto-
Mega, nel cui hardware abbiamo re microUSB;
LPSOHPHQWDWRXQDVLJQLŎFDWLYD • VIN, che fa capo al plug di
novità: la possibilità di ottenere alimentazione PWRIN.
l’alimentazione a batteria.
Vediamo innanzitutto le caratte- Le due tensioni solitamente
ristiche complete della Fishino più elevate, ossia VUSB e VIN
MEGA: (in realtà al connettore PWRIN
• compatibile al 100% con Ardu- possiamo applicare una tensione
ino MEGA; PLQRUHŎQRDYROWVHEEHQH
• modulo WiFi a bordo, con sia sconsigliabile perché compor-
dotazione completa di librerie WDXQFDORGLHIŎFLHQ]D YHQJRQR
da noi sviluppate; fatte passare attraverso i due
• lettore di microSD a bordo; diodi Schottky di potenza D6
• modulo RTC a bordo; e D7, mentre la tensione “più
• alimentazione switching inte- EDVVDįSHUPRWLYLGLHIŎFLHQ]D
grale, in grado di fornire 800 viene instradata verso il MOSFET
mA-1A circa (complessivi tra i a canale P siglato Q2.
3 ed i 5 volt), a partire da una Tralasciamo per un istante il
tensione in ingresso che può funzionamento di Q2, sul quale
variare da 3 e 20 volt; ritorneremo a breve, e conside-
• connettore per batteria LiPo a riamo solo il diodo interno al
cella singola e caricabatteria a medesimo; i tre diodi (D6, D7 ed
bordo; il diodo interno al MOSFET) rea-
• connettore laterale aggiuntivo lizzano una porta OR di potenza,
per risolvere il noto bug di la quale permette di ottenere
disallineamento della serie in uscita la tensione maggiore
Arduino, che ne rende impos- tra quelle presenti agli ingressi;
sibile l’utilizzo con schede supponiamo ad esempio di avere
millefori e breadboard. solo la tensione VLiPo, di circa
3,7V: in questo caso il diodo
SCHEMA ELETTRICO interno al MOSFET risulta pola-
Il “pezzo forte” di questa nuova rizzato direttamente portando
scheda è la sezione di alimenta- verso il convertitore la medesima
zione, che ha richiesto un lungo tensione, che non può ritornare
tempo di sviluppo ed ha anche verso gli altri due ingressi a cau-
portato alla realizzazione di un sa della presenza dei diodi D6 e
alimentatore multiuso separato D7 polarizzati inversamente.
la cui descrizione è iniziata in Ora, se colleghiamo il connettore
Marzo e si conclude in questo microUSB, la tensione VUSB di 5
stesso fascicolo: il Torpedo. Per volt polarizza direttamente il dio-
una descrizione dettagliata del do D6 e raggiunge il convertitore
convertitore SEPIC utilizzato mentre il diodo interno al MO-
rimandiamo quindi al relativo SFET si trova con una tensione
articolo, mentre qui ci limiteremo di 4 volt all’anodo e di 5 volt al
a farne una descrizione somma- catodo e risulta quindi polarizza-
ria e ad analizzare la circuiteria to inversamente, interdicendosi.
di contorno in dettaglio. 6HLQŎQHDOLPHQWLDPRDQFKH
Iniziamo dagli ingressi di alimen- l’ingresso PWRIN con una

Elettronica In ~ Aprile 2016 93


[piano di MONTAGGIO]
Elenco Componenti:

R1: 1 kohm (0805) R33: 10 kohm (0805)


R2: 10 kohm (0805) R34: 10 kohm (0805)
R3, R4: 1 kohm (0805) R35: 10 kohm (0805)
R5: 10 kohm (0805) C1: 22 pF ceramico
R6: 470 ohm (0805) (0805)
R7: 2,4 kohm (0805) C2: 22 pF ceramico
R8: 1 kohm (0805) (0805)
R9: 10 kohm (0805) C3: 1 μF ceramico (0805)
R10: 2,7 kohm (0805) C4: 100 nF ceramico
R11: 2,2 kohm (0805) (0805)
R12: 220 kohm (0805) C5: 1 μF ceramico (0805)
R13: 97,6 kohm (0805) C6: 4,7 μF ceramico
R14: 13,3 kohm (0805) (0805)
R15: 470 ohm (0805) C7: 100 nF ceramico
R16, R17: 10 kohm (0805)
(0805) C8: 22 pF ceramico
R17: 10 kohm (0805) (0805)
R18: 475 kohm (0805) C9: 22 pF ceramico
R19: 105 kohm (0805) (0805)
R20: 1 kohm (0805) C10: 100 nF ceramico
R21: 220 kohm (0805) (0805)
R22÷R25: 1 kohm C11: 100 nF ceramico
(0805) (0805)
R26: 3,3 kohm (0805) C12: 22 μF 25 VL
R27: 10 kohm (0805) tantalio (0805)
R28÷R31: 3,3 kohm C13: 4,7 μF 25 VL
(0805) tantalio (0805)
R32: 10 kohm (1206) C14: 22 μF ceramico

tensione superiore ai 5 volt, ad re rilevanti ad alte correnti. bita diminuisce con l’aumentare
esempio di 15 volt, il diodo D7 Facciamo un esempio pratico: della tensione in ingresso, a
risulterà polarizzato direttamen- supponiamo che l’utilizzato- differenza dei regolatori lineari
te, portando la tensione VIN al re (dopo il convertitore di cui utilizzati sulla serie Arduino, nei
convertitore, mentre i diodi D6 parleremo in seguito) assorba quali la corrente assorbita resta
e quello interno al MOSFET ver- 800 mA a 5 volt di tensione e che identica a quella fornita e, molti-
ranno polarizzati inversamente il convertitore abbia un’ottima plicata per la caduta di tensione
interdicendosi. HIŎFLHQ]D LOFLUFD FRVD entrata-uscita, causa una rilevan-
Abbiamo quindi ottenuto lo sco- vicina a quella reale del nostro te dissipazione termica da parte
SRSUHŎVVDWRRYYHURXQDFRP- circuito. Ipotizziamo altresì che i del regolatore.
mutazione totalmente automatica diodi Schottky presentino una ca- Nella formula, la caduta di
della sorgente di alimentazione. duta di tensione di circa 0,5 volt. tensione del diodo è stata consi-
Torniamo ora al MOSFET inseri- Alimentando il tutto attraverso il derata (0,5 volt), cosa che porta
to sulla linea positiva del con- plug PWRIN con una tensione di OĬHIŎFLHQ]DFRPSOHVVLYDD
nettore LiPo; apparentemente si 15 volt, otterremo un assorbimen-
tratta di un componente super- to di corrente pari a:
ŏXRHVVHQGRVXIŎFLHQWHLOVXR
diodo interno per realizzare la
commutazione; purtroppo i diodi, contro il 90% teorico dato dal
anche gli Schottky, hanno una convertitore. Il diodo causa quindi
caduta di tensione ai loro capi, Da subito si nota il grosso van- XQDSHUGLWDGLHIŎFLHQ]DGLXQ
che, per quanto piccola sia, causa taggio di utilizzare un alimenta- 3%, che possiamo considerare
perdite di potenza tali da risulta- tore switching: la corrente assor- trascurabile. Dalla formula si nota

94 Aprile 2016 ~ Elettronica In


(0805) ESP: Modulo ESP8266
C15: 100 pF ceramico X1: Quarzo 12 MHz
(0805) X2: Quarzo 16 MHz
C16: 10 μF ceramico X3: Quarzo 32.768 kHz
(0805) L1: 2,2 μH
C17: 100 nF ceramico L2: 6,8 μH
(0805) L3: 6,8 μH
C18: 1 μF ceramico (0805) BAT: Porta Batteria
CHARGE: LED rosso CR1220 da CS
(0805) FUSE: 500mA (1210)
WHITE: LED bianco (0805) RESET: Microswitch
RX: LED giallo (0805) SD: Connettore micro-SD
TX: LED blu (0805) USB: Connettore
POWER: LED verde (0805) micro-USB
D1÷D5: RB521S-30TE61
D6÷D8: SS34 Varie:
D9: RB521S-30TE61 - Plug alimentazione
D10: RB521S-30TE61 - Connettore JST 2 vie
Q1: 2N7002 passo 2 mm
Q2: NTR4171P - Strip maschio 2x3 vie
Q3: 2N7002 - Strip maschio 2 vie (2 pz.)
U1: CH340G - Strip femmina 8 vie (5 pz.)
U2: MCP73831T-2 - Strip femmina 10 vie
U3: SX1308 (2 pz.)
U4: ATMEGA2560-16AU - Strip femmina 2x18 vie
(MF1257) - Batteria CR1220
U5: LC3406 - Circuito stampato
U6: DS1307Z+ S1257

che l’incidenza della caduta sul In questo caso la caduta di che è un’espressione di secondo
diodo aumenta col diminuire della tensione sul diodo ha portato ad grado in ILiPo; inserendo i valori
tensione in ingresso, il che è logico XQDSHUGLWDGLHIŎFLHQ]DGLEHQ e risolvendola, si ottiene:
perché lo switching trasferisce la il 12,5%, proprio dove servirebbe
potenza convertendone tensione e LQYHFHXQĬHIŎFLHQ]DPDJJLRUH
corrente: crescendo la tensione cala visto che alimentiamo la scheda a
la corrente e viceversa. batteria. Una corrente ben inferiore ai
Facciamo ora lo stesso calcolo uti- Oltretutto, una caduta di 0,5 volt 1.433,7 mA del caso precedente.
lizzando una tensione in ingresso sul diodo con una corrente di ,QWDOLFRQGL]LRQLOĬHIŎFLHQ]D
di 3,6 volt (un valore prossimo a 1,4 ampere corrisponde ad una diventa:
quello della batteria LiPo): potenza dissipata di 0,7 W, che
su un componente di piccole
dimensioni porta ad un notevole
incremento di temperatura.
Il MOSFET, per contro, non ha
Vediamo innanzitutto che per XQDFDGXWDŎVVDDLVXRLFDSLPD Quindi il MOSFET causa una
poter ottenere 800 mA in uscita presenta, in conduzione, una re- perdita di solo il 3,2% contro il
dobbiamo prelevare dall’ingresso sistenza che dipende dal compo- 12% del diodo.
EHQP$OĬHIŎFLHQ]DUHDOH nente utilizzato; nel nostro caso Stabilita l’utilità del MOSFET,
diventa quindi: vale al massimo 100 milliohm. resta da trovare il modo per
Il calcolo si complica un pochino: portarlo in conduzione quando
serve. Essendo un canale P, per
ottenere ciò occorre polarizzarne

Elettronica In ~ Aprile 2016 95


il gate con una tensione negativa volta un semplice Buck (o step- della Fishino MEGA, ma ciò non
rispetto al source; trattandosi di down, abbassatore) converter che, QHLQŎFLDLOIXQ]LRQDPHQWROĬXQL-
un MOSFET a bassa tensione di SHUPRWLYLGLHIŎFLHQ]D©VWDWR co inconveniente è l’illuminazio-
gate, per ottenere la resistenza di realizzato tramite un convertitore ne del LED di carica in quei casi.
conduzione richiesta (RdsON in- sincrono, ovvero dotato all’inter- Il piedino PROG viene utilizzato
feriore ai 100 m: VRQRVXIŎFLHQWL no di un secondo MOSFET al po- per impostare la corrente di
circa 2,5 volt. A questo provvede sto del diodo Schottky utilizzato carica, che nel nostro circuito può
la resistenza R12, che polarizza normalmente. Da questo conver- essere scelta tra due valori: circa
negativamente il gate. Per contro titore escono i 3,3 volt necessari 100 mA con il ponticello siglato
i diodi Shottky per piccoli segnali ad alimentare il modulo WiFi 500 MA aperto (viene inserita la
D4 e D5, uniti alla resistenza ed il lettore di microSD; come sola resistenza R9 da 10 kohm)
R11 (quest’ultima per evitare anticipato, la corrente disponibile oppure circa 500 mA con il pon-
che sul gate arrivi una tensione si aggira sugli 800 mA - 1 ampere ticello chiuso, il che corrisponde
superiore a quella ammissibile, complessivi tra i 5 volt ed i 3 volt, a inserire in parallelo alla R9 la
fungendo da partitore insieme cosa che permette di alimentare R10 da 2,7 kohm. La formula per
alla R12) si occupano di portare parecchi moduli esterni senza impostare la corrente di carica,
all’interdizione il MOSFET quan- che l’alimentazione vada in crisi nel caso si ritenesse necessario
do è presente una tensione agli come succede spesso con Ardui- PRGLŎFDUOD©ODVHJXHQWH
ingressi USB e/o PWRIN. no ed i suoi regolatori lineari.
La tensione prescelta raggiunge i Una piccola parentesi: potrete no-
piedini 4 e 5 dell’U3, che è la base tare la dimensione estremamente
del convertitore SEPIC. Il conver- ridotta delle tre induttanze e dei
titore è stato ampiamente de- FRQGHQVDWRULGLŎOWURGHOOĬDOL- dove RPROG è la resistenza
scritto nei relativi articoli, quindi mentazione; questo è stato reso applicata al piedino PROG, in
ne daremo solo un breve cenno; possibile da un lato dall’elevata KOhm, ed IREG è la corrente di
il vantaggio di questo schema è frequenza di lavoro degli inte- carica, in mA. Lo stesso piedino
principalmente la possibilità di grati switching (sopra il MHz) PROG se connesso al positivo
ottenere in uscita una tensione e dall’altro dalla disponibilità dell’alimentazione o se lasciato
sia inferiore che superiore a di condensatori ceramici ad alta ŏXWWXDQWH GLVFRQQHVVR VHUYH
quella in ingresso, unendo così i capacità. a disabilitare la carica, disatti-
vantaggi di un convertitore Buck vando i circuiti interni dell’inte-
e di un Boost, ma utilizzando un Stadio carica batteria grato e riducendone il consumo
solo integrato switching. Il cuore di questo stadio è l’inte- praticamente a zero; questo viene
La tensione in uscita è regolata grato U2, un ben noto MCP73831, utilizzato nel nostro schema
dal partitore costituito da R13 ed che contiene all’interno tutti i inserendo il MOSFET Q1, un
R14, che forniscono una tensione circuiti necessari alla carica ed comune 2N7002 a canale N che,
di riferimento di 0,6 volt all’in- al mantenimento della stessa di quando il gate risulta polarizzato
gresso FB dell’integrato quando una batteria ai polimeri di litio negativamente, scollega di fatto
in uscita sono presenti 5 volt. a cella singola. L’integrato viene le 2 resistenze di programmazio-
All’uscita del convertitore SEPIC alimentato tramite una tensione ne rendendo l’ingresso PROG
troviamo quindi una tensione a 5 volt applicata al piedino VIN, ŏXWWXDQWH
continua di 5 volt. Il LED verde mentre la batteria da caricare Il MOSFET è pilotato dallo stesso
POWER funge da spia di accen- viene connessa al piedino VBAT segnale utilizzato per pilotare
sione ed è disattivabile tagliando disaccoppiandola con un conden- l’interruttore della batteria Q2,
il ponticello SMD PWLED, in satore ceramico da 4,7 μF, che ga- anche se in modalità inversa :
modo da ridurre i consumi rantisce la stabilità dell’integrato. una tensione agli ingressi VUSB
all’osso se si vuole alimentare il Il chip integra un sistema per o VIN lo porta in conduzione
Fishino MEGA a batteria, cosa rilevare la presenza della batteria, attivando la carica, mentre in as-
che ci era stata richiesta dagli sistema a dire il vero piuttosto senza (quando il circuito risulta
utenti di Fishino UNO. critico che a volte ne segnala la alimentato dalla sola batteria)
La tensione di 5 volt in uscita presenza anche quando non è il MOSFET viene interdetto e la
dal SEPIC entra in un ulteriore connessa, in particolar modo a carica disattivata.
convertitore switching, questa basse tensioni di alimentazione Per concludere la descrizione,

96 Aprile 2016 ~ Elettronica In


Librerie disponibili
Attualmente sono state realizzate due
librerie per la gestione del Fishino, di
seguito descritte.
• Libreria Fishino: è l’esatto equiva-
si noti il jumper siglato MEAS nota sui connettori di I/O : come
lente della libreria Ethernet o WiFi di
(measure, misura) che permette si può notare dalle immagini è
Arduino. In questa libreria vengono
di collegare l’ingresso analogico stato aggiunto un piccolo GHÀQLWHOHFODVVL)LVKLQR&ODVV JHVWLR-
ADC0 del controller alla batteria FRQQHWWRUHDSLQVDIŎDQFDWR ne a basso livello, analoga alla Ether-
per eseguire il controllo dello a quello standard ma legger- QHW&ODVVR:L)L&ODVVGL$UGXLQR HOH
stato della carica. mente sfalsato in modo da poter ULVSHWWLYHFODVVL)LVKLQR&OLHQW O·DQDOR-
utilizzare una scheda preforata JRGHOOD(WKHUQHW&OLHQWH:L)L&OLHQW 
Interfaccia USB standard per gli shields, risol- )LVKLQR6HFXUH&OLHQW QRQSUHVHQWH
L’interfaccia USB è la medesima vendo quindi l’annoso problema nelle librerie originali, permette con-
QHVVLRQLDVHUYHUVLFXUL66/+7736 H
utilizzata per il Fishino UNO, del passo errato dei connettori di
)LVKLQR6HUYHU (WKHUQHW6HUYHUH:L)L-
quindi ci limiteremo ad un picco- $UGXLQRVHQ]DSHUDOWURLQŎFLDUQH
6HUYHU 4XHVWHFODVVLVRQRXWLOL]]DWH
lo accenno, rimandando al succi- la compatibilità con gli shields in modo pressochè identico alle origi-
tato articolo per una descrizione esistenti. nali, quindi negli sketch esistenti che
approfondita. Lo stadio gravita utilizzano l’Ethernet o il WiFi basta
attorno all’ormai noto CH340G, Interfaccia SPI cambiare il tipo delle varie variabili
un’alternativa estremamente va- Adattatori di livello per ottenerne il funzionamento con
lida al più noto FT232 o ad altre Anche questa sezione risulta pra- LO:L)LGL)LVKLQR/HXQLFKH OHJJHUH 
soluzioni con microcontrollori; il ticamente identica a quella già differenze sono sull’inizializzazione,
essendo il modulo WiFi di Fishino
chip è stato scelto sia per motivi vista nel Fishino UNO; serve ad
dotato di caratteristiche aggiuntive
di economicità che di semplicità adattare i livelli delle logiche a 5
rispetto al WiFi originale.
circuitale, a parità di prestazioni. volt dell’ATMEGA con quelle a • Libreria FishinoWebServer: è
L’integrato fornisce in uscita tutti 3.3 volt del modulo WiFi e della il porting su Fishino della nota
i segnali di un’interfaccia RS232 scheda microSD. L’adattamento TinyWebServer; consente la crea-
standard, dei quali utilizziamo viene realizzato semplicemente zione di un completo server web
solo quelli di trasmissione/rice- tramite partitori resistivi (resi- sulla scheda. È stata inoltre inserita
zione dati (Rx e Tx) ed il segnale stenze da R22 a R31) nella dire- la libreria Flash nel pacchetto di
DTR utilizzato per il reset auto- zione 5V -> 3.3V, mentre nella download visto che è utilizzata dalla
FishinoWebServer per spostare le
matico in fase di programmazio- direzione inversa viene sfruttato
costanti nella memoria Flash liberan-
ne, come nell’Arduino originale, il fatto che le logiche a 5 volt
do così la poca RAM a disposizione.
cosa che permette il caricamento accettano come segnali alti valori 4XHVWDOLEUHULDqFRPXQTXHUHSHULEL-
degli sketch senza dover premere ben inferiori a 3 volt, risultando le in rete, ma l’abbiamo allegata per
pulsanti o azionare interruttori. quindi compatibili con le logi- comodità d’uso. Le rimanenti librerie
Torneremo in seguito sulla cir- che a 3.3 volt. Il segnale MISO necessarie sono già disponibili nei
cuiteria di Reset perchè rispetto (Master In Slave Out) in teoria vari download dell’IDE di Arduino;
DOOĬRULJLQDOH©VWDWDPRGLŎFDWDLQ non richiederebbe un adattamen- sono in particolare necessarie la SD
modo da permettere in futuro la to, visto che la direzione va dalla SHUODJHVWLRQHGHOOHVFKHGH0LFUR-
6' HOD57&OLESHUODJHVWLRQHGHO
riprogrammazione dell’ATmega logica a 3.3 volt verso quella a 5
PRGXOR57&FRQLO'6HGDOWUH
via WiFi. volt; l’abbiamo inserito comun-
librerie di sistema. Le librerie sono in
que in previsione della futura continuo sviluppo e presto verranno
ATmega 2560 HVWHQVLRQHGHOŎUPZDUHGHOPR- corredate di funzionalità aggiuntive;
In questa sezione lo schema di dulo WiFi che permetterà il cari- è già stata recentemente implemen-
Fishino MEGA non si discosta camento degli sketch attraverso tata la gestione degli I/O digitali
da quello di Arduino MEGA; il medesimo, cosa che richiede aggiuntivi presenti sul connettore
il controller è il medesimo, uno scambio di ruoli, diventando (63&211PHQWUHqSUHYLVWDDEUHYH
corredato dall’usuale quarzo in quel caso il modulo WiFi il la gestione della seriale, dell’input
analogico e delle uscite PWM sempre
a 16 MHz, dai 2 condensatori master e l’ATmega lo slave.
VXOFRQQHWWRUH(63&211
sul circuito oscillante e da un
certo numero di condensatori Interfaccia scheda MicroSD 1HOSDFFKHWWRGLGRZQORDGVRQRSUHVHQWL
di disaccoppiamento sulle linee L’interfaccia è la medesima che altre librerie, utilizzate per lo più nelle
di alimentazione, necessari per abbiamo descritto nel Fishino demo che sono state sviluppate e/o ver-
evitare che disturbi sulle linee di UNO, e rispecchia lo shield SD ranno sviluppate in seguito; consigliamo
DOLPHQWD]LRQHSRVVDQRLQŏXHQ]D- (o analoghi combinati); funziona di installare tutto il contenuto nell’appo-
re il funzionamento del chip. Una attraverso le linee SPI tra cui sita cartella di Arduino.

Elettronica In ~ Aprile 2016 97


TX
Fig. 1
Connessioni RX
della Fishino
MOSI (dati dall’ATmega verso la MEGA.
SD, Master Out Slave In), MISO
(dati dalla SD all’ATmega, Ma-
ster In Slave Out) e SCK (clock).
I valori verso la scheda SD sono
ovviamente ridotti dagli adatta-
tori di livello di cui al paragrafo
precedente.
La selezione della scheda avviene
tramite la linea SDCS, attiva a zionamento, come si
livello basso. In questo caso vedrà negli esempi presen-
l’adattamento di livello viene tati in seguito. ESP-TX
effettuato tramite una resistenza
(R23) verso il positivo e un diodo Sezione WiFi ESP-RX
(D9), che permette il solo passag- Anche il modulo WiFi è rimasto *1' *3,2
gio delle sole correnti negative. invariato rispetto a quello della
Lo schema scelto consente di ave- scheda Fishino UNO; rimandia- modulo al reset, senza il quale
re la scheda in standby quando il mo perciò all’articolo, pubblicato il modulo stesso si avvierebbe
segnale SDCS (connesso al pin nel fascicolo n° 199, dove è stato nella modalità “caricamento da
digitale 4 del Fishino MEGA) non descritto in maniera esauriente. SD” che lo renderebbe inutiliz-
è utilizzato; col pin in modalità Riportiamo quindi solo alcune zabile. Questo risulta necessario
threestate (ovvero ad alta impe- note importanti, ovvero il tipo poichè la linea GPIO15 ha anche
denza) il diodo non conduce e di comunicazione con l’atmega, funzione di Slave Select (SS) del
sull’ingresso SDCS è presente realizzata tramite interfaccia SPI modulo e non può quindi essere