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
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ŎQHG5DGLRFKH 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ŎJXUDELOLDQFKHGLQDPLFD- 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
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 DELOLWDWDWUDPLWHODFRQŎ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.
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\ORDGOXQJKH]]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
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.
YRLGVHW0RGXODWLRQXQVLJQHGFKDUPRG
'HFLGHVH)6.R22.
LQWUHDG0RGXODWLRQ
$WWLYDLOSDUWLFRODUHPRGRRSHUDWLYR
6/((3
67%<
)67; SURQWRDWUDVPHWWHUH
YRLGVHW6WDWE\WHV
7; WUDVPHWWH
LQWUHDG6WDW
)65; SURQWRDULFHYHUH
5; VH)6.22.5;&217VH/R5DULFHYH
5;6,1* VROR/R5D
&$' VROR/R5D
YRLGVHW)UHTÁRDWIUHT
)UHTXHQ]DSRUWDQWHLQ0K]
ÁRDWUHDG)UHT
YRLGVHW%36LQWESV
%LW5DWHVHLQPRGDOLWj)66.22.
XQVLJQHGLQWUHDG%36
3RWHQ]DGLWUDVPLVVLRQHSSXzHVVHUH
G%PP: G%PP: G%PP: YRLGVHW3RZHUE\WHS
G%PP:GHI G%PP:
$ELOLWDGLVDELOLWDODPRGDOLWjDSDFFKHWWRGHI6HGLVDELOLWDWDYDLQPRGDOLWjµFRQWLQXRXVµ YRLGVHW3DFN1R3DFNE\WHSN
'HÀQLVFHODIXQ]LRQDOLWjGLRJQXQRGHLSLQGL,2SHULOFRGLFHYDOYHGHUHWDEHOODFRUULVSRQGHQWHVXOGDWDVKHHW YRLGVHW,2E\WHQLRE\WHYDO
/XQJKH]]DHWLSRGHOSUHDPERORGHOSDFFKHWWR YRLGVHW3UHDPEOHXQVLJQHGLQWOHQE\WHSRO
,QGLUL]]RUHWHVHSUHVHQWHOXQJKH]]DDUUD\GLYDORUL YRLGVHW6\QFE\WHRQE\WHOHQE\WHYDO>@
&DULFDODFRGD),)2FRQLGDWLGDVSHGLUH YRLGGDWD7R6HQGE\WHGDWD>@LQWOHQ
/HJJHGDOODODFRGD),)2LGDWLULFHYXWL YRLGGDWD5HFHLYHGE\WHGDWD>@LQWOHQ
/HJJHLOSULPRRLOVHFRQGRUHJLVWURGLÁDJ E\WHJHW)ODJVE\WHQUHJ
/HJJHLOÁDJQGDOSULPRRGDOVHFRQGRUHJLVWURGHLÁDJ E\WHJHW)ODJE\WHQÁDJE\WHQUHJ
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]]RWKUHHVWDWHHVDGVRORFKDUSHU$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;
YDORULGLGHIDXOWLQL]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;
(continua)
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
LIPRGH 5&DYLGVHQ6HWDGGVRFNRQRII al suo funzionamento, è disponibile
LIPRGH 5&YHOOHPDQ6HWDGGVRFNRQRII
LIRQRII 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
LIPRGH ^IRUL LLDGG$Y>L@ EXII>L@¶¶`
LIPRGH ^IRUL LLDGG9O>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,
LISRZHU_SRZHU!^6HULDOSULQWOQ³1.´UHWXUQ` 21013 Gallarate (VA)
6;VHW3RZHUSRZHU
6HULDOSULQWOQ³2.´ Tel: 0331-799775 • Fax: 0331-792287
} http://www.futurashop.it
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
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]]DYDULDELOHIRUPDWR
dalle seguenti parti (Fig. 3).
1. Un preambolo di sincroniz-
zazione di lunghezza mo-
GLŎFDELOHHIRUPDWRFRQXQ
VLPERORE\WHSUHGHŎ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
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) &RGLFH6SUHDGLQJIDFWRUVHVLYXROHFDPELDUHSHUWHVW
LQW%: &RGLFH%DQGZLGWKVHVLYXROHFDPELDUHSHUWHVW articolo, affronteremo la pro-
LQW3:5 SRWHQ]DLQWUDVPLVVLRQHFRGLFH 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;VHW3RZHU3:5
/5VHW&RQ¿J6)%:VHVLYXROHFDPELDUHSHUWHVWGHI Per questo motivo la libreria è
VKRZ&RQ¿J VWDWDPRGLŎFDWDFRQOĬLQWURGX-
6HULDOSULQWOQ³:DLWLQJIRUPHVVDJH´
/5UHFHLYH0HVV0RGHVLPHWWHLQPRGDOLWjULFH]LRQH zione di indirizzi e di funzioni
} GLFULWWRJUDŎD$(6FKHSHU³
void loop()
appesantiscono poco Arduino
{ sia in termini di prestazioni che
LI6+,(/'^GHOD\UHWXUQ` di occupazione di memoria.
LIJHW0HVV^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/5GDWD5HDGUHFEXIIUHFOHQ ^GHOD\UHWXUQIDOVH`
6HULDOSULQW³³6HULDOSULQWOQUHFEXII
VQSULQWIGDWDIRUPDW6;JHW/RUD5VVL6;ODVW/RUD3DFNHW5VVL
6;ODVW/RUD3DFNHW6QU
6HULDOSULQWOQGDWD
return true; per il MATERIALE
}
void sendEcho()
{ FT1190M) comprensiva di modulo
6;VHW6WDWH67'%<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 VWUOHQVHQGEXII
a 39,50 Euro. Il modulo DRF1278F
6HULDOSULQW³!³6HULDOSULQWOQVHQGEXIIVSHGLVFH è disponibile anche separatamene
LI/5VHQG0HVVVHQGEXIIEXIÀ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³6HULDOSULQWOQ6;UHDG)UHT
6HULDOSULQW³7UDQVPLWSRZHUP:³6HULDOSULQWOQ6;JHW3RZHU Il materiale va richiesto a:
6HULDOSULQW³3UHDPEOHE\WHV6HULDOSULQW6;JHW/RUD3UHDPEOH/HQ6HULDOSULQWOQ³´
VQSULQWIGDWD´6S)DFWRUG%DQG:G&UG´6;JHW/RUD6SU)DFWRU Futura Elettronica, Via Adige 11,
6;JHW/RUD%Z6;JHW/RUD&U 21013 Gallarate (VA)
6HULDOSULQWOQGDWD
6HULDOSULQW³5DWHE\WHVHF³6HULDOSULQWOQ6;JHW65DWH
Tel: 0331-799775 • Fax: 0331-792287
} http://www.futurashop.it
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,
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³6HULDOSULQWOQ7+,6$''
6HULDOSULQWOQ³/R5DWUDQVPLWWHUUHDG\´
6;VHW3RZHU3:5
VKRZ&RQ¿J
/5UHFHLYH0HVV0RGHVHWVKLHOGLQFRQWLQXRXVUHFHLYLQJPRGH
`
YRLGORRS
{
GHOD\
LI6+,(/'UHWXUQ VHODVFKHGDQRQqRSHUDWLYDQRQSXzIDUHQXOOD
LQWQE
LIQE JHW,QSXW!6HqVWDWRLQVHULWRXQFRPDQGR
^LIVHQG%XIIQEJHW5HSOD\`
LIQE JHW0HVV!^`6HqDUULYDWRXQPHVVDJJLRVSRQWDQHRORVWDPSD
`
YRLGVHWXS
{
SLQ0RGHSLQJR,1387B38//83
GLJLWDO:ULWHSLQI
SLQ0RGHSLQI287387
SLQ0RGHSVRXQG287387
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³6HULDOSULQWOQ7+,6$''
6;VHW3RZHU3:5
VKRZ&RQ¿J
6HULDOSULQWOQ³:DLWLQJIRUPHVVDJH´
/5UHFHLYH0HVV0RGHVHWVKLHOGLQFRQWLQXRXVUHFHLYLQJPRGH
`
YRLGORRS
{
LQWQE
LI6+,(/'^GHOD\UHWXUQ`VHODVFKHGDQRQqRSHUDWLYDQRQSXzIDUHQXOOD
LIQE JHW0HVV!6HULFHYHXQFRPDQGRORHVHJXHHULVSRQGH
^GHFRGHQE/5UHFHLYH0HVV0RGH`SRLVLULPHWWHLQULFH]LRQH
LIJHW,QSXW6HLOSXOVDQWHLQWHUUXWWRUHqSUHPXWRPDQGDXQDYYLVR
^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-
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
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ŎFDVFDULFDELOH 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-
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 IXRFRWUHPRODQWHHLOŎ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
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ŎORUHVLVWHQ]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-
O DIRETTAMENTE
DAL TUO TABLET
O SMARTPHONE
APP SCARICABILE
GRATUITAMENTE DA:
FISHINO,
L’ARDUINO DIVENTA
WIRELESS
di MASSIMO DEL FEDELE
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-
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
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ŎOHVLQHVVDFRQWHQXWLQHOOD 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
FISHINO,
L’ARDUINO DIVENTA
WIRELESS
di MASSIMO DEL FEDELE
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>...
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
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
);
Listato 10
// tenta la connessione al server
FishinoClient client;
if (client.connect(“www.google.com”, 80)) {
Serial.println(“connected to server”);
OHJJHODULVSRVWD¿QFKqLOFOLHQWUHVWDFRQQHVVR
do {
¿QFKqFLVRQRE\WHVLQDUULYR
while (client.available()) {
// 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¿J0\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();
; }
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
// 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
€ 15,00 € 22,00
Cod. ABCARDU
€ 9, 90
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
®
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.
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+]
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.
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
mcp79410.ControlReg.Bit.Alarm0_Enable = 1;
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
Il materiale va richiesto a:
Futura Elettronica, Via Adige 11, 21013 Gallarate (VA)
Tel: 0331-799775 • Fax: 0331-792287 - www.futurashop.it
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.
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
LO9HQHUGGHOHSHUIDUHFL³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 GLHVHJXLUHLOFRQIURQWRVRORVXLVHFRQGLOHULJKH
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()”
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
3DVVLDPRRUDDOODFRQÀJXUD]LRQHGHOODSHULIHULFD,2&PHVVD
DGLVSRVL]LRQHGD5DVSEHUU\3L
SURFHGLDPRFRQO·LQVWDOOD]LRQHGHOODOLEUHULD3\WKRQ
“smbusµSHUODJHVWLRQHGHOEXV,2&
VHJXLWDGDTXHOODGHLWRROV,2&
'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
Fig. 5
Fig. 6
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[)
DOODTXDOHVLSDVVDQRJOLVWHVVLSDUDPHWULGHOOD &RPHVLSX³QRWDUHFLVRQRSDUHFFKLSDUDPHWULGD
&RVIDFHQGRVWLDPRGLFHQGRDOODIXQ]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
©OXQHGODPDVFKHUDSHUJOLDOODUPL©ŎVVDWDVXL
minuti e la polarità è “Logic High Level”. UHVSDZQELQORJLQISLWW\GHYWW\!
$QFKHLQTXHVWRFDVRODIXQ]LRQHULHPSHXQD GHYWW\!
struttura dati per poi richiamare una funzione di
OLEUHULDFKHHVHJXHODVFULWWXUDŎVLFDVXOGLVSRVLWLYR XVFLUHHVDOYDUHLOŎOHFRVPRGLŎ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:
SIG
N E D BY
€ 999,00
DE
Cod. 3D4040
DE
SIG
NE D B Y
m 40 c
40 c m
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.
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,2EXVYDULDOŎ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-
(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.
Serial
Monitor per
connessione
alla rete
Wi-Fi
di casa.
Serial
Monitor per
il test come
client.
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
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-
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à
1/72 = 0,013888888888888 mm
Fig. 6 - Testina laser completa: in evidenza il microswitch di sicurezza.
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
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
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
Lc = str(StepLpr)
Lc1 = str(StepLp1r)
(Continua)
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
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
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()
KP = √ OP 2 - r 2
γ = 180 – ( α + β )
KA = 2 ∏ r γ / 360
L = KA + KP
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() {
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
(Continua)
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);
}
//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();
}
}
}
}
}
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
MESI
TUTTI i
LA!
in EDICO
www.elettronicain.it
FUTURA GROUP srl
Futura Via Adige 11
21013 Gallarate (VA)
Group
Edizioni TEL.: 0331 752668
Fax: 0331 792287
Didattica
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-
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
void gioca() {
......
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
[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)
void giocoUno() {
......
......
FDVH
......
//***********************************************************************************************************
JLRFR'XH
3(5'(&+,5$&&2*/,(/¶8/7,02),$00,)(52
//***********************************************************************************************************
YRLGJLRFR'XH^
......
......
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-
TFT SHIELD
PER FISHINO
di MASSIMO DEL FEDELE
Fig. 2
Esploso
dello Fig. 3
shield Esploso dello
e delle shield e delle board
board Fishino, visto
Fishino. da sopra.
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
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
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
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-
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);
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
TFT SHIELD
PER FISHINO
di MASSIMO DEL FEDELE
Fig. 2
Esploso
dello Fig. 3
shield Esploso dello
e delle shield e delle board
board Fishino, visto
Fishino. da sopra.
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
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
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
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-
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);
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
TERMOSTATO
CON FISHINO
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.
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,
#define TEMP 5
OneWire oneWire(TEMP);
DallasTemperature sensors(&oneWire);
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.
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;
}
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
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().
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
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
octopus, ESPANSIONE
“TENTACOLARE” PER
ARDUINO/FISHINO
di MASSIMO DEL FEDELE
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.
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.
GHŎQH2FWRSXVBBRFWRSXV
2FWRSXV&ODVV BBRFWRSXV
HGDOOHOLQHHGHOŎOHVRUJHQWHOctopus.cpp):
2FWRSXV&ODVV BBRFWRSXV
{
VWDWLF2FWRSXV&ODVVRFWR
UHWXUQRFWR
}
:LUHEHJLQ
:LUHVHW&ORFN
GLJLWDO,2
YRLGSLQ0RGHXLQWBWSRUWXLQWBWPRGH
la seconda per tutte le schede connesse in un solo ERROGLJLWDO5HDGXLQWBWSRUW
YRLGGLJLWDO:ULWHXLQWBWSRUWERROYDOXH
comando:
UHDGZULWHDOOGLJLWDOSLQVRIJLYHQERDUGDWRQFH
VHWSZPIUHTXHQF\IRUDVLQJOHFRQQHFWHGERDUG XLQWBWGLJLWDO5HDG$OOXLQWBWERDUG
YDOLGYDOXHV+]+] YRLGGLJLWDO:ULWH$OOXLQWBWERDUGXLQWBWYDO
YRLGVHW3:0)UHTXLQWBWERDUGXLQWBWIUHT
VHWSZPIUHTXHQF\IRU$//FRQQHFWHGERDUGV Le ultime due funzioni permettono di leggere e scri-
YRLGVHW3:0)UHTXLQWBWIUHT 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:0RSHQGUDLQ
PWM è impostabile, analogamente alle librerie di totem pole) devono essere completate.
Arduino, tramite la funzione seguente:
UNO SKETCH DI PROVA
SZPRXWSXW
YRLGDQDORJ:ULWHXLQWBWSRUWXLQWBWYDOERROLQ- Per concludere, presentiamo un semplice sketch che
YHUW IDOVH permette di visualizzare una “coda” luminosa utiliz-
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
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à
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
LA LIBRERIA FISHGRAM
Una volta creato il nostro bel- Fig. 2 - Ricerca di BotFather.
https://api.telegram.org/botTOKEN/
getUpdates?offset=0&timeout=4&li
mit=1&allowed_updates=messages
{“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
Il secondo è “inizializzazione di
FishGram”:
// start FishGram
FishGram.
event(FishGramHandler);
FishGram.begin(F(MY_TELE-
GRAM_TOKEN));
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.
List<Rose> listaRose;
List<CommandElement> commandList;
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
Elettronica
Elet
t In ~ Aprile 2016 91
[schema ELETTRICO]
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]DLOFLUFDFRVD 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
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
la strada
to normale, GPIO0 a 1) o da
interfaccia seriale, utilizzato
per la riprogrammazione del
all’IoT ŎUPZDUH*3,2D
• GPIO2, GPIO4 e GPIO5 sono
disponibili per l’uso come
Il nome è già un programma: Visible Things, ossia “cose visibili” pin digitali, e sono sfruttabili
(ad evidenziare la possibilità di creare applicazioni concrete) tramite le apposite funzioni di
è la piattaforma per lo sviluppo di sistemi e applicazioni IoT libreria come fossero estensio-
di Silica (www.avnetmemec-silica.com), che offre risorse ni dei pin digitali di Arduino.
hardware e software integrate per collegare sensori intelligenti Rx e Tx costituiscono la porta
e dispositivi embedded direttamente alle applicazioni cloud seriale hardware del modulo e
tramite funzioni di connettività a corto raggio verso unità sono utilizzati anche in fase di
gateway e connessioni WiFi, 3G e 4G. Supporta anche le reti SURJUDPPD]LRQHGHOŎUPZDUH
IoT in tecnologia SIGFOX e LoRaWAN. Il produttore offre già tre Una prossima estensione del
starter kit basati su microcontrollori ARM Cortex. ŎUPZDUHQHSHUPHWWHU¡OĬXVR
come porta seriale aggiunti-
Realizziamo un
sistema per il
controllo degli
elettrodomestici e
apparati elettrici
di casa attraverso
WiFi gestito tramite
smartphone.
ai 5V, il filo nero a GND ed il filo accettare gli inevitabili tempi di sola riga di codice.
giallo, del segnale, all’ingresso 2 latenza intrinseci della comu- Il sito di riferimento dove trovate
di Fishino. Per il corretto funzio- nicazione con protocollo html. tutti i dettagli dell’applicazione è
namento, il sensore richiede una È quindi preferibile prevedere http://www.roboremo.com.
resistenza di pull-up del valore un’applicazione nativa in grado Scaricate pertanto RoboRemo-
di 10 kohm 1/4 di watt connessa di garantire tempi di esecuzione Free da Play Store (ovvero, se
tra il pin 2 ed il pin 5V di Fishino. pressoché immediati; possiamo avete installata un’app che
Con la configurazione proposta trovarla nel Play Store Google ed identifica ed esegue i QR-Code,
potremo attivare tre utilizzatori è un’app che fa proprio al caso leggete il codice in Fig. 12) e
ed anche misurare la temperatu- nostro perché, senza scrivere installatela; la versione free è
ra di una stanza. alcuna riga di codice, permette completamente gratuita e non ri-
Vediamo ora come implementare di creare la propria personale chiede alcun tipo di registrazione,
il controllo con lo smartphone, interfaccia, da utilizzare in tutti però è limitata a cinque widget
prendendo in considerazione il quei progetti in cui è richiesto (senza contare il pulsante menu e
fatto che vogliamo un’interfaccia un controllo remoto. L’app si i text field), più che sufficienti per
personalizzata che sia di sempli- chiama RoboRemo e integra un la nostra applicazione. La versio-
ce e immediato utilizzo. Scar- editor (in-app) a widget con il ne a pagamento non ha questa
tiamo l’impiego di un modulo quale è possibile creare un’inter- limitazione.
Bluetooth essenzialmente per la faccia custom ed assegnare ad Appena avviata l’applicazione, ci
scarsa portata e per l’impossi- ogni elemento un’azione rivolta ritroveremo la pagina di lavoro
bilità di impartire un comando ad un dispositivo remoto. Robo- vuota nella quale troviamo il
da più dispositivi contempora- Remo supporta comunicazioni solo pulsante menu; tappiamo
neamente. Sfruttiamo invece la Bluetooth, TCP, UDP e persino pertanto su di esso e abilitiamo la
connessione WiFi nativa della USB, permettendo di sfruttare creazione dell’interfaccia (Fig. 3)
scheda Fishino, considerando tutte le periferiche di comuni- toccando edit ui; a questo punto
che oramai in ogni abitazione è cazioni disponibili in un dispo- potremmo premere su un punto
presente una rete WiFi privata, sitivo mobile. Sono disponibili i qualsiasi dello schermo e si apri-
che può far da ponte a tutte le più importanti widget adatti ad rà l’elenco delle widget dal quale
apparecchiature connesse. Una interfacce di controllo, ma non sceglieremo button (Fig. 4).
prima soluzione sarebbe quella manca la possibilità di fare grafi- L’elemento scelto sarà inserito
di implementare un Web Server ci ed inviare comandi a intervalli nella schermata; ponendo il
su Fishino, cosa relativamente regolari; il tutto è completamente dito sull’angolo alto sinistro e
semplice da fare, ma dovremmo configurabile senza scrivere una trascinandolo (funzione drag-
}
sendcmd = sendcmd + tmp + “°C\n”; per il MATERIALE
TELECOMANDO
BLUETOOTH
el fascicolo 197 avevamo presentato il progetto vano. Siccome in quel progetto avevamo utilizzato
N di un emulatore di telecomandi a raggi infra-
rossi costituito dalla board RandA (una Arduino
uno shield per Arduino, ci siamo chiesti perché
non riutilizzarlo rivedendo il progetto originale
con da un lato i connettori per interfacciarsi a Ra- in chiave Arduino, ossia togliendo Raspberry Pi e
spberry Pi e dall’altro quelli per gli shield Arduino) RandA e applicando lo shield direttamente ad una
ed un apposito shield (ArdIR), che permetteva di scheda Arduino Uno. Detto...fatto! In queste pagine
controllare gli elettrodomestici di casa riprodu- vedremo come controllare lo shield ArdIR attra-
cendo i segnali emessi dai relativi telecomandi. verso un collegamento di tipo Bluetooth, dunque a
La peculiarità di tale progetto era la possibilità di FRUWRUDJJLRFL³VLJQLŎFDFKHLOGLVSRVLWLYRĮUHPR-
effettuarne il controllo anche a distanza, attraverso to” controllanteGRYU¡RSHUDUHQHOORVWHVVRHGLŎFLR
Internet, tramite un’apposita interfaccia web acces- del sistema, ad una distanza non superiore a pochi
sibile dal browser dei dispositivi che vi si collega- metri, specialmente se vi sono grossi muri interpo-
Fig. 1
L’ambiente di sviluppo utilizzato volta che l’interfaccia è abilitata il connect() dichiarato nella classe
è Android Studio, recentemente programma permette di accedere ĮEWB&OLHQWFODVVį
sponsorizzato da Google come alla lista dei dispositivi Bluetooth Una volta instaurato il collega-
VRIWZDUHXIŎFLDOHSHUORVYLOXSSR attivi nelle vicinanze, ed è compi- mento con lo shield Bluetooth,
di applicazioni Android in luogo to dell’utente selezionare quello la nostra app resta in attesa che
di Eclipse. di suo interesse: in questo caso l’utente selezioni uno dei canali
Dal punto di vista dell’utilizza- VLWUDWWDGHOPRGXOR51GHOOR resi disponibili dall’interfaccia
tore, la nostra app richiede la shield Bluetooth facente capo JUDŎFDFKHGRYUDQQRSRLYHQL-
gestione di due fasi: al sistema cui è collegato ArdIR. re trasmessi in infrarosso dallo
1) ricerca e connessione al dispo- Fatto ciò, il programma appren- shield ArdIR. Quando ciò av-
sitivo Bluetooth desiderato, GHOĬLQGLUL]]RŎVLFR0$&GLWDOH viene, si compone un messaggio
ovvero lo shield FT1032M; dispositivo e può effettuarne la formato da una precisa sequenza
2) selezione del canale da attivare, connessione tramite il metodo di dati numerici fra i quali è con-
per la trasmissione del codice
verso lo shield FT1032M.
Elenco Componenti:
R1: 4,7 kohm C3: 1 μF 63 VL poliestere P1: Microswitch
R2: 4,7 kohm C4: 1 μF 63 VL poliestere P2: Microswitch
R3: 1 kohm LD1: LED verde 5 mm
R4: 1 kohm LD2: LED rosso 5 mm Varie:
R5: 22 ohm LD3: LED IR 5 mm - Strip M/F 6 vie
R6: 1 kohm LD4: LED IR 5 mm - Strip M/F 8 vie (2 pz.)
R7: 1 kohm LD5: LED IR 5 mm - Strip M/F 10 vie
R8: 4,7 kohm LD6: LED giallo 5 mm - Strip M/F 2x3 vie
R9: 4,7 kohm IR1: IR38DM - Strip maschio 2 vie
R10: 22 ohm SENS: DS18B20+ - Jumper
C1: 1 μF 63 VL poliestere T1: BC337 - Zoccolo 4+4
C2: 47 μF 16 VL elettrolitico U1: 24LC256 - Circuito stampato S1219
tenuto anche il codice del canale era stato richiesto). Pertanto queste informazioni ed i dati in arrivo dal
scelto, e nel contempo si chiama stringhe saranno ricevute dalla Bluetooth, scatenando automati-
il metodo write() della classe app e visualizzate direttamente camente la chiamata del metodo
ĮEWB&OLHQWFODVVįSUHSRVWRDOOD sull’interfaccia utente. handleMessage() dell’handler,
trasmissione di tali dati tramite Notate che l’operazione di lettura e rendendo così il messaggio
Bluetooth. GHOPHVVDJJLR©VHSDUDWDGDOŏXVVR disponibile alla MainActivity che
Ciò fatto, il programma è già principale del programma: in tal SURYYHGHU¡LQŎQHDOODYLVXDOL]]D-
pronto per gestire un successivo modo si evita che esso si blocchi zione sullo schermo.
comando impartito dall’utente e nel caso che il messaggio di ritorno Passiamo ad analizzare la funzio-
rimane contestualmente in ascolto non venisse per qualche motivo QDOLW¡GHOODFODVVHĮEWB&OLHQWFODVVį
di possibili messaggi ritornati dal ricevuto. Più nel dettaglio, utiliz- che sovrintende alla comunica-
dispositivo Bluetooth remoto. Nel ziamo un meccanismo di Android zione Bluetooth verso Arduino
nostro caso (analogamente a quan- previsto per lo scambio di dati tra FRQŎJXUDQGRLOGLVSRVLWLYR
to avveniva sulla versione con- threads diversi, ovvero la coda di (come dice il nome stesso) come
trollata via web) tali dati possono messaggi (MessageQueue): nel periferica client, mentre il lato
arrivare da Arduino, il quale, dopo FDVRVSHFLŎFRQHOOD0DLQ$FWLYLW\ Arduino giocherà il ruolo di ser-
aver ricevuto ed elaborato il co- abbiamo istanziato un oggetto ver (per inciso, l’architettura di
mando, oltre ad attivare lo shield di tipo handler, passandone base è stata mutuata dal progetto
ArdIR ritrasmette su Bluetooth SRLLOULIHULPHQWRDOODFODVVHĮEWB Į%OXHWRRWK&KDWįXQDGHPRVXOOD
l’esito dell’operazione attraverso Clientclass” (quando viene creato comunicazione Bluetooth dispo-
VWULQJKHGLFDUDWWHULĮ2.įĮ)DLOį l’oggetto); quest’ultima lo userà nibile dal sito web www.developer.
oppure il valore di temperatura se per trasmettere i messaggi con le android.com). Lo schema logico
Arduino) trasmetterà la stringa nel seguente modo: scatenerà, come anzidetto, l’at-
di dati, essa verrà ricomposta dal • crea un messaggio chiamando WLYD]LRQHGHOODĮFRQWURSDUWHį
codice sino a ricevere il carattere obtainMessage() e passandovi (il metodo handleMessage())
GLŎQHOLQHD$TXHVWRSXQWRLO la stringa di dati; dell’handler, che essendo im-
nostro processo utilizza l’handler • dall’istanza del messaggio plementato nella MainActivity
fornitogli dalla MainActivity per appena creato, chiama il me- rende i dati disponibili in tale
trasmettergli la stringa ricevuta, todo SendToTarget(); questo classe.
SKETCH ARDIR_BT
Dal lato Arduino ritroviamo,
come accennato, lo shield ArdIR,
che viene gestito attraverso un
ŎUPZDUHLQODUJDSDUWHGHULYDWR
dallo sketch ArdIR.ino, spiegato
anch’esso nell’articolo relativo
allo shield anzidetto; per questa
ragione qui focalizzeremo la
Fig. 5 QRVWUDDWWHQ]LRQHVXOOHPRGLŎFKH
fatte rispetto a tale sketch.