Non ci sono prodotti a carrello.
Eccoci alla presentazione di un altro validissimo Firmware per il TiDiGino contest realizzato da Ettore Massimo Albani che si introduce così:
Premessa
È stato bello e stimolante per me partecipare al contest: una vera e propria fontana della giovinezza.
La sfida era quella, all’età di 57 anni, di imparare un nuovo linguaggio e di farlo con un progetto ben preciso in mente: un inseguitore solare ed un sistema di gestione dell’energia.
Per il mio compleanno a metà di Agosto mi sono fatto il regalo dell’Arduino Mega 2560 ed ho iniziato a studiare, facendo i primi sketch.
…
Spero che scuserete eventuali ingenuità nella programmazione: prima di dire di conoscere un linguaggio, occorre molto più tempo dei pochi mesi che ho avuto a disposizione.
Grazie per la pazienza.
La scheda
Il TiGiDino è il nuovo nato della serie di telecontrolli dotati di modulo GSM SIM900.
Diversamente dai suoi predecessori, il TiGiDino si basa sul processore ATmega2560, lo stesso adottato dall’Arduino MEGA 2560 e da questi deriva la sua struttura.
Vediamo in dettaglio le sue caratteristiche, confrontandole con quelle dell’Arduino MEGA 2560.
Si osserva che rispetto al modello normale ci sono in più:
- modulo GSM;
- DTMF;
- pulsante utente;
- ponticello removibile per auto reset;
- 2 ingressi optoisolati;
- 2 uscite a relè;
- sensore di temperatura seriale con protocollo One Wire;
- memoria EEPROM seriale da 32 KB
- 5 LED: 2 rossi per le uscite relè, 1 verde per l’attività del modulo GSM e 2 disponibili per il programma.
Purtroppo, per limitare le dimensioni della scheda e limitare i costi, abbiamo dovuto rinunciare ad alcune cose:
- Alimentazione solo esterna (12V, 1A)
- I/O digitali o uscite PWM limitati a 10 (+2 se non si adoperano gli interrupt esterni);
- ingressi analogici limitati a 6;
- interrupt esterni limitati a 2;
- porte seriali limitate ad 1 (+1 utilizzata dal modulo GSM);
- connettore TWI (Twin Wire Interface) assente (utilizzato dalla memoria EEPROM seriale);
Tuttavia, pur con queste limitazioni, TiGiDino rappresenta un potente sistema di telecontrollo programmabile grazie alla interfaccia IDE di Arduino.
Quello che avrei desiderato in più sulla scheda:
- un paio di LED per monitorare gli ingressi;
- un LED collegato al pin 13 delle linee di I/O digitale per uguagliare quello presente su Arduino MEGA 2560
- un cicalino piezoelettrico;
- un microfono preamplificato ed un altoparlante per chiamate vocali;
- sensore temperatura esterno (vedi Emulazione Temperatura).
Ho avuto modo di provare due esemplari di TiDiGino: il primo dopo qualche giorno ha presentato un problema hardware (la linea Reset del micro non funzionava più) e ho dovuto aspettare un secondo esemplare per continuare le prove.
Il secondo esemplare aveva ancora il resistore R20 saldato sul PCB, mentre avrebbe dovuto essere eliminato per non causare problemi quando la porta USB non è connessa.
Infatti, l’alimentazione del micro di interfaccia USB FT232RL è fornita direttamente dalla linea a 5 V proveniente dal PC: senza l’alimentazione la porta RTS (Request To Send) attraverso il resistore R20 porta a massa la corrispondente porta RST (Reset) del ATmega2560 che quindi rimane bloccato.
Poiché il TiDiGino è ancora in fase di testing avanzato (beta testing) è facile che l’assistenza non abbia ancora confidenza con questa informazione.
Comunque, nulla di grave, a patto che non vengano più distribuite schede con questo problema (NdR: attualmente tutti i TiDiGino vengono forniti senza la resistenza montata): essendo il componente a montaggio superficiale, non è agevole dissaldarlo, vista anche la vicinanza con altri componenti.
Futura Elettronica ha a catalogo un contenitore plastico già forato per fissaggio al muro: consiglio vivamente di acquistarlo insieme al TiDiGino.
Ricordatevi anche di acquistare un alimentatore a 12 V che possa erogare almeno 1 A di corrente continua anche di tipo non stabilizzato ed un cavo USB (maschio A – maschio micro A) per il collegamento al PC.
Se poi volete strafare, perché non aggiungere una batteria tampone da 12 V 7,2 Ah (tipo quelle usate nei sistemi antifurto)?
Installazione ambiente di sviluppo
Per poter programmare la scheda TiDiGino è necessario disporre sul PC o notebook dell’ambiente di sviluppo Arduino attualmente alla versione 0023 (NdR: al momento in cui scriviamo è stata rilasciata la versione Arduino1.0 che però mostra alcune incompatibilità, stiamo procedendo alla messa a punto del firmware).
A questo proposito vi faccio notare che Factotum è stato sviluppato con la versione 0022: non dovrebbero esserci problemi ad usare una versione più recente, poiché la versione 0023 possiede in più i riferimenti hardware (inf) per le versioni più recenti (R3) delle schede Arduino; comunque rammentate questo particolare se ci fossero problemi.
Se ancora non lo avete fatto, recatevi nel sito (purtroppo solo in lingua inglese):
Scaricate il software (circa 85 MB) per il sistema operativo di cui disponete (Windows, Mac OS X oppure Linux).
L’ambiente di sviluppo è in realtà un’applicazione Java che consiglio di installare all’interno di una cartella (directory) chiamata Arduino.
Io posseggo Windows XP Pro e l’ho installato all’interno della cartella Documenti; questo il percorso completo:
C:\Documents and Settings\<nome utente>\Documenti\Arduino\Arduino-0023
Essendo un’applicazione Java non viene registrata nel registro dei programmi di Windows (Registry) e non viene neanche inserita nello Start: conviene creare a mano un collegamento al programma Arduino.exe da inserire sul Desktop per un più comodo accesso ad esso:
Ora bisogna aggiungere nella cartella libraries le librerie aggiuntive utilizzate da Factotum: per farlo copiate semplicemente le cartelle fornite:
- Dallas
- GSM_TDGINO contiene versione modificata di GSM.h per eliminare il DEBUG
- M24LC256
- OneWire
Poiché la libreria GSM_ TDGINO viene fornita con attivato il DEBUG e questo consuma molta memoria, raccomando di usare la mia versione che ha il DEBUG disattivato, altrimenti il programma potrebbe non funzionare correttamente.
Adesso l’operazione più delicata: bisogna sostituire il file pins_arduino.c con il file con lo stesso nome, ma contenente la mappa dei pin di TiDiGino.
Il file si trova nella cartella:
…\Arduino\Arduino-0023\hardware\arduino\cores\arduino
Vi consiglio, però, di conservare il vecchio file anziché cancellarlo rinominandolo, ad esempio, pins_arduino_Original.c, magari conservando anche una copia del nuovo.
Prestate molta attenzione a non inserire spazi nel nome del file.
Come ultima operazione, copiate la cartella Factotum all’interno della cartella Arduino: vi consiglio di creare allo scopo una nuova cartella Progetti e di inserirci dentro la cartella Factotum.
Adesso possiamo collegare, finalmente, l’alimentazione al nostro TiDiGino e, quindi, collegare il cavetto USB al nostro PC o notebook.
Il TiDiGino, contrariamente alla scheda Arduino MEGA 2560 che usa il processore ATmega8, usa il processore FT232 come interfaccia USB, quindi i driver sono diversi e vanno caricati separatamente.
Niente paura, l’operazione è quasi del tutto automatica: basta indicare in fase di installazione del drive la cartella drivers di Arduino che contiene a sua volta la cartella FDTI USB Drivers.
Dopo aver caricato Factotum, vi troverete con una finestra simile a questa:
La prima cosa da fare è selezionare il tipo di scheda (Arduino MEGA 2560):
Poi si indica la Serial Port fornita dal drive USB:
Finalmente con l’icona Upload si può caricare Factotum sulla scheda.
Se tutto è stato fatto correttamente, i due LED Rx e Tx a bordo di TiDiGino inizieranno a lampeggiare velocemente, indicando l’uploading.
Una volta terminata questa fase, si può lanciare il Serial Monitor (previa impostazione della velocità a 9600 baud) per interagire con Factotum:
Nell’esempio sopra riportato si osserva la versione del programma e la sua emulazione (TEMPERATURA).
Si noti come Factotum abbia caricato le variabili preferenziali e ripristinato le uscite (variabile RIP settata a true).
Poiché il funzionamento dell’emulazione era Automatico. Factotum ne segnala la condizione.
Il messaggio di Startup viene visualizzato e, poiché nell’esempio esisteva un numero preferenziale a cui inviare uno squillo, viene visualizzato l’evento.
Se ci fossero stati più numeri preferenziali a cui inviare squilli e/o SMS, ci sarebbe stata l’indicazione relativa.
Inviando TEMP? (campo in alto con il pulsante Send), si ottiene la temperatura minima, massima e ambientale.
Purtroppo esiste un problema: come sarà specificato più avanti, il modulo GSM allo startup potrebbe non configurarsi correttamente, risultando un apparente blocco.
Compare la scritta “Richiesta password…” come se il programma dovesse rispondere ad una chiamata vocale (DTMF) e rimane in quella situazione per 30 secondi, dopodiché la chiamata viene terminata ed il sistema prosegue normalmente le sue funzioni.
Il software
Il programma Factotum è il risultato del Contest proposto da Elettronica In per sviluppare un’applicazione per TiGiDino che consentisse di emulare i precedenti progetti di telecontrollo GSM:
- TDG134 – Apricancello
- TDG133 – Telecontrollo 2 in / 2 out (TDG140 + DTMF)
- TDG139 – Termostato
Tre sono perciò le versioni disponibili: Apricancello, Telecontrollo, Temperatura.
Il codice compilato della versione più complessa occupa oltre 55 KB della memoria Flash del processore, oltre ovviamente lo spazio di memorizzazione delle variabili nella SRAM.
Non è stata utilizzata la memoria EEPROM da 4 KB interna al processore, proprio per dare modo agli sviluppatori di caricare un programma diverso (che usi questa memoria) senza cancellare i dati memorizzati nella memoria EEPROM seriale ausiliaria da 32 KB.
Anche la SIM (Subscriber Identity Module) del gestore telefonico scelto non viene utilizzata per memorizzare i numeri telefonici, poiché, in questo modo, è possibile sostituirla con un’altra senza perdere i numeri telefonici già memorizzati.
Sono stati aggiunti dei comandi speciali per consentire agli “smanettoni” di accedere a tutti gli altri ingressi/uscite disponibili (vedi Comandi aggiuntivi).
Le parti essenziali sono:
- initialize inclusioni, direttive di compilazione, dichiarazioni di variabili e costanti;
- setup inizializzazione classi, inizializzazione variabili;
- loop ciclo principale che comprende:
- procedure di input;
- procedure elaborazione dati;
- procedure di output;
Resta da comprendere il complesso delle temporizzazioni nell’ambito del ciclo di loop.
Alcune procedure, infatti, sono sottoposte ad un contatore temporale o timer.
Il processore, una volta terminata la fase di inizialize e quella di setup, entra in quella di loop e vi permane sino a quando non viene attivato il reset oppure viene tolta l’alimentazione.
La velocità di ciclo complessiva non è stimabile a priori poiché esistono alcune procedure che usano una quantità di tempo variabile secondo il loro stato interno (ad esempio la procedura di risposta ad una chiamata vocale).
Ipotizziamo che sia di 5 cicli/secondo: la singola procedura di input, ad esempio, verrebbe eseguita 5 volte in un secondo.
Consideriamo la procedura di input relativa all’acquisizione della temperatura: il processore eseguirebbe, perciò, la misura della temperatura 5 volte ogni secondo.
Basterebbe avere una lettura ogni 3-4 secondi e, con il tempo risparmiato, il ciclo complessivo diventerebbe più breve, a tutto vantaggio di altre procedure più lunghe.
Ecco spiegato l’uso dei timer: è un artificio per consentire alle varie procedure di essere eseguite a scadenze prefissate, solo quando il loro contatore temporale supera un certo valore.
La funzione millis() restituisce il numero di millisecondi passati dal momento in cui il sistema è partito: essendo un valore unsigned long raggiunge il suo massimo dopo circa 50 giorni di funzionamento, dopodiché il conteggio riparte da zero.
Inserendo questo valore in una variabile contatore è possibile ad ogni ciclo confrontare il nuovo valore di millis() con quello memorizzato.
Se la differenza è maggiore od uguale al valore programmato (costante) il tempo è stato raggiunto, si esegue la procedura corrispondente e si reimposta la variabile contatore al nuovo valore di millis(); se, invece, la differenza è minore la procedura non viene eseguita.
Esiste, però, un caso in cui il valore della variabile contatore è maggiore di millis(): quando il contatore di millis() raggiunge il suo massimo e si azzera tra un controllo e l’altro.
In questo caso si considera il tempo scaduto e si ricade nel primo caso.
Senza questo controllo si rischia, dopo 50 giorni di funzionamento, di non vedere eseguite le procedure di timing.
... // ---------- Utility - TimerCheck ---------- boolean TimeElapsed(unsigned long Timer, unsigned long StopTime) { unsigned long T = millis(); if (Timer > T) return true; // internal timer resetted after ~50 days if ((T - Timer) > StopTime) return true; // time elapsed else return false; } ...
Ecco la dichiarazione delle costanti di tempo all’inizio del programma (Timing):
... // ---------- DECLARATION - Timing ---------- const unsigned long LEDClockRefresh = 1000; unsigned long LEDClockTimer = 0; const unsigned long GSMRefresh = 3000; // 1000-n ms unsigned long GSMTimer = 0; const byte AnaInReads = 1; // 1-n cicli lettura const unsigned long AnaInDelay = 120; // 100-n µs (min time reading = 100 µs x channel) const unsigned long AnaInRefresh = 20; // 0-n ms unsigned long AnaInTimer = 0; const unsigned long DigInRefresh = 100; // 0-n ms const unsigned long DigInDebounce = 20; // 20-n ms unsigned long DigInTimer = 0; const unsigned long OptInRefresh = 100; // 0-n ms const unsigned long OptInDebounce = 20; // 20-n ms unsigned long OptInTimer = 0; const unsigned long TempRefresh = 1000; // 0-n ms unsigned long TempTimer = 0; const unsigned long SerRxRefresh = 150; // min-n ms [min = RxBuffer / (Baud / 11)] unsigned long SerRxTimer = 0; // (@ 9600 baud = 128/873 = 140 ms) ...
Un esempio è il lampeggio del LED: per consentire di verificare che il programma è esecutivo, il LED3 lampeggia alla velocità di 1 Hz.
Se smette di lampeggiare non necessariamente significa che il sistema è bloccato, ma potrebbe essere impegnato in una procedura lunga (ad esempio rispondere ad una chiamata vocale).
Librerie aggiuntive
Il programma Factotum si avvale di alcune librerie aggiuntive richiamate nell’area INCLUDE:
... #include <EEPROM.h> // ATmega2560 internal EEPROM #include <Wire.h> // Two Wire I2C protocol (used by serial EEPROM) #include <M24LC256.h> // serial EEPROM on TiDiGino #include <stdlib.h> // for float to string conversion #include <OneWire.h> // One Wire protocol (used by temperature sensor) #include <DallasTemperature.h> // Dallas DS18B20 temperature sensor #include <GSM.h> // for GSM SIM900 module ...
- Wire.h protocollo Two Wire I2C per comunicare con la serial EEPROM;
- M24LC256.h gestisce le routine di memorizzazione veloce della EEPROM seriale;
- stdlib.h contiene la funzione dtostrf() per visualizzare valori float (temperatura);
- OneWire.h gestisce il protocollo One Wire usato dal sensore di temperatura;
- DallasTemperature.h gestisce il sensore di temperatura Dallas;
- GSM.h gestisce il modulo GSM SIM900.
L’ultima libreria indicata (GSM.h) è la più importante poiché gestisce il modulo GSM SIM900.
Questa libreria è derivata da quella utilizzata dal GSM Shield for Arduino, opportunamente modificata da Boris Landoni per funzionare con TiDiGino.
Poiché la libreria modificata non aveva indicazioni di come usarla (escludendo gli esempi forniti non del tutto esaustivi), ho seguito le indicazioni di quella originale fornite da GSM Playground Sketches:
www.hwkitchen.com/news/gsm-playground-sketches/
Si faccia attenzione che nel manuale ci sono delle piccole differenze rispetto alla versione per TiDiGino (ad esempio il TurnOn() non ha nessun parametro).
Come afferma la documentazione a corredo (vedi allegato), la tecnica usata per la comunicazione con il modulo è del tipo blocking, ovvero il processore è bloccato finché la comunicazione non termina. Fortunatamente sono stati inseriti dei timer di timeout per uscire da pericolose situazioni di blocco totale.
Il funzionamento della libreria è discreto, ma alla volte si presentano delle anomalie:
- in caso di caduta della tensione a seguito di un blackout oppure a seguito di un reset, al suo ripristino il modulo GSM non sempre si inizializza correttamente, indicando una chiamata a cui il sistema sta rispondendo; avendo inserito un timeout di 30 secondi, basta aspettare che la chiamata venga chiusa e il sistema riprende il suo funzionamento normale.
- i toni emessi dal DTMF hanno un ritardo di risposta troppo elevato (> 1200 ms) e perciò i beep sono troppo distanziati.
Per la verità inizialmente la libreria funzionava molto male, ma questo succedeva prima che scoprissi il problema: l’echo.
L’echo è una modalità usata nei terminali per visualizzare sullo schermo ciò che si batte sulla tastiera o si invia.
La cosa può sembrare scontata ma non lo è: il fatto che si inviino dei caratteri non implica necessariamente che essi siano visualizzato sul dispositivo di “ascolto”.
Gli esempi forniti a corredo riportano la presenza del metodo aggiuntivo Echo(1) che consente di attivare l’echo dei comandi AT, mentre nella libreria originale questo comando è stato disattivato.
Probabilmente il metodo è stato aggiunto per effettuare il debug del sistema: peccato che, con il comando echo inserito, la ricezione degli SMS non potesse funzionare e forse anche altre funzioni!
La spiegazione del perché è piuttosto complessa, ma possiamo dire che la presenza sul buffer di ricezione dell’echo del penultimo comando inviato veniva interpretato come la risposta all’ultimo comando inviato.
Ho impiegato diverso tempo per capire che il problema non era all’interno del mio software, ma nella libreria: è normale dare per scontato che la libreria sia funzionante, non vi pare?
Perciò, nel Setup di Factotum occorre inserire il comando Echo(0) e non Echo(1)!
... ... // ---------- SETUP - GSM & DTMF ---------- pinMode(GSMDCDPin, INPUT); pinMode(GSMRNGPin, INPUT); pinMode(GSMCTSPin, INPUT); pinMode(GSMLEDPin, INPUT); pinMode(GSMStaPin, INPUT); pinMode(DTMFSTDPin, INPUT); pinMode(DTMFQ1Pin, INPUT); pinMode(DTMFQ2Pin, INPUT); pinMode(DTMFQ3Pin, INPUT); pinMode(DTMFQ4Pin, INPUT); pinMode(GSMDTRPin, OUTPUT); pinMode(GSMRTSPin, OUTPUT); pinMode(GSMResPin, OUTPUT); pinMode(GSMPwrPin, OUTPUT); gsm.TurnOn(115200); // module power on gsm.Echo(0); // disable AT echo gsm.CheckRegistration(); // verifica registrazione alla rete ... ...
Tutte queste cose hanno contribuito non poco all’allungamento della fase di debug (decine e decine di telefonate ed SMS persi per questi problemi).
A mio avviso la libreria è da considerare più un punto d’inizio che la soluzione definitiva e sarebbe opportuno riscriverla per un migliore abbinamento con TiDiGino.
Tuttavia, poiché gli organizzatori del contest hanno fornito questa versione, questa non è stata modificata, accettandone le limitazioni.
Mappa di memoria
Come già accennato, Factotum adopera esclusivamente la memoria seriale EEPROM per le sue variabili. Essa è stata suddivisa in cinque aree:
Area | Indirizzo Iniziale
(hex) |
Indirizzo Finale
(hex) |
Descrizione |
Generale | 0000 | 00FF | Contiene i valori delle variabili generali |
Ingressi | 0100 | 01FF | Contiene i valori delle variabili ingressi |
Temperatura | 0200 | 02FF | Contiene i valori delle variabili temperatura |
Uscite | 0300 | 03FF | Contiene i valori delle variabili uscite |
Rubrica | 1000 | 1FFF | Contiene la rubrica dei numeri telefonici (256) |
La mappa si commenta da sola: nella prima parte vengono salvati i valori delle variabili personalizzate dall’utente, mentre nell’ultima vengono salvati i numeri telefonici da chiamare e/o a cui mandare un SMS (vedi allegato 3).
Si noti che i “buchi” (gap) presenti (aree di memoria libera) hanno il solo scopo di suddividere le varie zone per poter più facilmente apportare delle aggiunte successive.
Ad ogni attivazione del programma, la EEPROM seriale viene analizzata sul suo primo byte per sapere se è vergine o meno (contenuto FF se vergine): se lo è vengono salvate tutte le variabili nell’area di memoria corrispondente, altrimenti il sistema le caricherà dalla stessa area.
E’ del tutto evidente che all’inizio le variabile operative e quelle in memoria saranno identiche.
Successivamente, man mano che il sistema viene personalizzato (cambiando, ad esempio, il messaggio iniziale di attivazione) sarà possibile riallineare i due contenuti usando il comando speciale SAV (save) che memorizza le variabili nella EEPROM: ciò consentirà ai successivi riavvii del sistema di usare le variabili personalizzate anziché quelle preimpostate.
Avrei potuto memorizzare immediatamente i parametri nella EEPROM seriale, ma in questo modo è possibile testare il risultato delle modifiche apportate prima di memorizzarle definitivamente.
A tale scopo ho anche aggiunto il comando RES;<psw> che consente di resettare il sistema anche da remoto. Si noti che non è un vero reset hardware, ma piuttosto una re-inizializzazione.
Una certa attenzione va rivolta all’uso del pulsante utente.
Infatti, tenendolo premuto mentre si riavvia il sistema la memoria EEPROM seriale viene completamente cancellata.
La cosa può essere utile, in caso di malfunzionamento del sistema, per ripristinare le impostazioni originali ed è segnalata sia sul Monitor Seriale con un apposito messaggio, sia attraverso 3 rapidi lampeggi del LED3 (giallo).
Memoria SRAM
Un grosso problema che ho dovuto affrontare è quello del relativamente limitato spazio della memoria SRAM.
A quanto sembra, oltre una certa occupazione di memoria, Arduino MEGA 2560 entra in crisi.
Con una occupazione di circa 60 KB della memoria Flash da parte del programma, lo spazio SRAM si riduce a circa 2,5 KB degli 8 KB iniziali. Può sembrare molto, ma per un programma come questo che si basa su una forte interazione “verbale” con l’utente, la memoria libera viene presto saturata dal contenuto delle variabili stringa, con un conseguente crash del sistema.
Per esempio, inserendo i comandi aggiuntivi con l’emulazione Telecontrollo, al momento della ricezione di un SMS (che richiede ben 161 byte per la sua allocazione), il sistema attualmente si resetta, segno che è stata esaurito lo spazio in memoria SRAM.
Ho dovuto faticare non poco per limitare la dimensione delle stringhe allo stretto necessario (ecco il motivo per cui, ad esempio, i messaggi di allarme sono stati limitati a 30 caratteri dei 100 originari).
Certo si potrebbero usare delle tecniche particolari, come quella di memorizzare le variabili stringa nella memoria Flash oppure in quella della EEPROM interna all’ATmega2560, ma mi sembra assurdo che i progettisti di Arduino non abbiano pensato a questa limitazione. Sarebbe bastato portare a 16K la memoria SRAM!
Comunque, conto di risolvere il problema nelle successive versioni del programma.
Ora come ora, per far funzionare correttamente Factotum occorre rinunciare alle modalità di debug della libreria GSM: in pratica bisogna trasformare in commento le definizioni nell’area DEFINE (parte iniziale del file GSM.h).
/* GSM.h - library for the GSM Playground - GSM Shield for Arduino Released under the Creative Commons Attribution-Share Alike 3.0 License http://www.creativecommons.org/licenses/by-sa/3.0/ www.hwkitchen.com library version 1.01 by Boris Landoni */ #ifndef __GSM #define __GSM #include "WProgram.h" // DEFINE // #define DEBUG_PRINT // #define DEBUG_GSMRX // #define DEBUG_LED_ENABLED // #define DEBUG_SMS_ENABLED ... ...
Le emulazioni
Sono disponibili tre emulazioni: Apricancello, Telecontrollo e Temperatura.
Avrei voluto usare una variabile per attivare queste emulazioni, ma, purtroppo, a causa della limitazione di memoria accennata prima, l’unico sistema per poter attivare queste emulazioni è quello di usare le direttive di compilazione (anche in questo caso, eliminando le limitazioni di memoria nelle future versioni del programma, il problema sarà risolto).
In pratica bisogna modificare nell’area DEFINE le prime tre definizioni, lasciando attiva solo quella che interessa.
Nell’esempio sottostante viene attivata, ad esempio, l’emulazione TEMPERATURA, mentre le precedenti due sono state opportunamente trasformate in commento:
/* FACTOTUM 1.0 per TiDiGino vers. 1.0 by Ettore Massimo Albani 30/11/2011 www.cyberhs.it [email protected] */ // ========================= DEFINE ========================= //#define APRICANCELLO // emulazione apricancello (~ 45 KB Flash) //#define TELECONTROLLO // emulazione telecontrollo (~ 51 KB Flash) #define TEMPERATURA // emulazione termostato (~ 52 KB Flash) #define COMANDIEXP // comandi aggiuntivi (~ 5 KB Flash) //#define DEBUG // solo per debug ... ...
Si noti la presenza della definizione COMANDIEXP che inserisci alcuni comandi aggiuntivi utili per una interazione con le altre risorse del sistema (vedi paragrafo comandi aggiuntivi).
Il passo successivo sarà quello di eseguire l’upload del programma sulla scheda TiGiDino connessa al PC tramite la porta USB.
I comandi
Esistono quattro modi diversi per fornire i comandi al TiGiDino dotato del programma Factotum:
- diretto – tramite un PC ed un qualsiasi programma terminale mediante la connessione USB;
- remoto – tramite un SMS inviato da un qualsiasi cellulare, purché il numero telefonico appartenga ad uno degli otto numeri autorizzati;
- remoto – tramite una telefonata usando la tastiera DTMF, purché si disponga della password di autorizzazione;
- remoto – tramite una telefonata, purché il numero telefonico appartenga ad uno dei 256 numeri della lista apricancello (compresi i primi otto autorizzati).
Si noti che, mentre i primi due metodi possono utilizzare tutti i comandi a disposizione, il terzo metodo è limitato ai soli comandi che gestiscono le due uscite, mentre il quarto può funzionare solo con l’emulazione apricancello, essendo l’uscita collegata all’apricancello.
L’elenco completo di tutti comandi è in allegato 4.
Si è cercato il più possibile di non modificare i comandi originali (come richiesto dal contest) e di rendere la sintassi unica per tutti, semplificando il loro inserimento tramite SMS.
A tale scopo, i caratteri separatori <:> e <;> possono essere sostituiti da un semplice spazio (molto più facile da inserire in un SMS) o qualsiasi altro carattere: il programma non si basa sulla loro presenza per verificare la sintassi del comando (eccezione i comandi PEEK e POKE).
Naturalmente occorrerà prestare attenzione a non inserire due spazi al posto di uno, come pure non inserirlo affatto!
Ad esempio, il comando NOR 21 oppure NOR:21 fornirà lo stesso risultato (temperatura normale impostata a 21 °C), ma scrivendo NOR21 la temperatura sarà impostata a 1 °C.
Ancora, nell’inserimento numerico non confondete lo “0” (zero) con la “O” (maiuscola o minuscola). Quindi, occhio alla sintassi!
Per evitare ambiguità, si è evitato l’uso del punto e della virgola come simboli separatori delle cifre decimali: come conseguenza non è possibile inserire cifre decimali, ma solo intere, eventualmente con segno negativo.
L’unica occasione in cui si potrebbe sentire questa esigenza è nel settaggio delle variabili di temperatura ALLMAX, ALLMIN e NOR, ma con piccole modifiche si potrebbe rimediare a questo inconveniente.
Comandi tramite USB
È il sistema più pratico per personalizzare Factotum. Naturalmente bisogna disporre di un PC, di un programma di comunicazione seriale (tipo HyperTerminal) e di un cavetto USB maschio A – maschio B mini.
La porta USB del TiGiDino viene riconosciuta automaticamente, ma bisogna fornire i drive per il chip FT232.
Contrariamente ai comandi tramite SMS, la variabile RISP non viene resettata dopo aver inviata la risposta: quindi è possibile disattivare la risposta in maniera indefinita.
Tramite i comandi aggiuntivi PEEK e POKE, esiste la possibilità di accedere all’intera mappa di memoria tramite un programma esterno.
Comandi tramite SMS
Ad ogni comando inviato tramite SMS da un numero telefonico preferenziale viene inviato un SMS di risposta.
È possibile inviare più comandi nello stesso SMS avendo l’accortezza di separarli con il carattere “,”: in questo modo si risparmia tempo e denaro con l’unico limite dei 160 caratteri a disposizione per un SMS.
Esiste anche la possibilità di evitare la risposta usando il comando RISP:OFF che setta la corrispondente variabile booleana RISP a false.
Questo comando deve essere dato all’interno di ogni SMS a cui non si desidera avere risposta in quanto la variabile viene ripristinata a true dopo il suo utilizzo.
Si consiglia di inviare questo comando solo dopo aver preso confidenza con il sistema.
Comandi tramite DTMF
Con questa modalità è possibile fornire dei comandi relativi agli ingressi optoisolati ad alle uscite a relè.
L’elenco completo di tutti comandi è in allegato 5.
Quando il modulo riceve una chiamata vocale, risponde con tre beep stando ad indicare la richiesta della password che è un numero di 5 digit.
Al quinto digit viene verificata la sua validità e la risposta è un beep.
Se, invece, la password è errata, vengono emessi nuovamente tre beep e la verifica riprende.
Tutto questo deve verificarsi in un tempo prestabilito dal timer che è stato predisposto per 30 secondi, dopo i quali la chiamata viene terminata.
Passata la verifica della password, possiamo fornire i comandi indicati nella tabella, ricevendo le risposte o le conferme sotto forma di beep.
Comandi aggiuntivi
Oltre ai comandi standard, se in fase di compilazione è stato predisposto il define COMANDIEXP, sono disponibili dei comandi aggiuntivi utili per conoscere lo stato degli ingressi e delle uscite non gestiti direttamente da Factotum.
Si noti che ho ripartito in questo modo le altre porte di I/O a disposizione:
Porte | Pin | Note |
Digital Input | 62, 4, 5, 6, 7 | Il pin 62 corrisponde al pulsante utente |
Digital Output | 8, 9, 10, 11 | |
PWM Output | 12, 13 | |
Interrupt | 2, 3 | Non gestiti attualmente |
Analog Input | A0, A1, A2, A3, A4, A5 | Attivato resistore interno di pull up da 20K |
Per quello che riguarda gli ingressi analogici, per evitare false letture, viene effettuata una media di n letture consecutive (con n personalizzabile attraverso la costante AnaInReads = 1÷n).
Un comando aggiuntivo che ho dovuto eliminare per problemi di memoria è l’utilissimo HELP: avrebbe consentito di ottenere l’elenco completo di tutti i comandi con relativo significato e sintassi.
Comunque non escludo, una volta risolto il problema della memoria, che le successive versioni possano contenere questo comando.
Il programma prevede una funzionalità di monitoraggio sulla serial 0 connessa al PC.
Tutti gli eventi vengono visualizzati nella finestra del Serial Monitor dell’IDE di Arduino configurato con queste impostazioni: auto scroll, 9600 baud, no line ending.
I due ultimi comandi PEEK e POKE danno la possibilità di leggere e scrivere le informazioni dalla/nella memoria EEPROM seriale.
Sono questi comandi pensati per una personalizzazione di Factotum attraverso l’interazione con un programma di comunicazione esterno.
Si noti che questi due comandi utilizzano i caratteri separatori <:> e <;> che, quindi, non possono essere omessi.
Ecco un esempio di visualizzazione degli ingressi analogici:
Si noti che l’ingresso A2 è stato portato a massa, mentre gli altri sono liberi (resistore di pullup interno da 20 K).
In questo altro esempio sono visualizzati le uscite digitali, gli ingressi digitali e le uscite PWM dopo aver settato l’uscita PWM 10 a 55:
Si noti l’errore di assegnazione PWM e la risposta del sistema.
I numeri preferenziali e l’autoapprendimento
La rubrica è composta da 256 numeri telefonici, ma i primi 8 hanno una funzione speciale e vengono detti preferenziali poiché è con essi che è possibile impostare le preferenze.
Il numero preferenziale, infatti, consente di fornire comandi al TiDiGino sottoforma di SMS per personalizzare l’ambiente secondo le proprie esigenze o preferenze.
Quando il programma parte per la prima volta oppure viene resettato con la cancellazione forzata della memoria seriale EEPROM (vedi “Mappa di memoria”), non ha inserito alcun numero preferenziale da cui accettare gli SMS e, quindi, personalizzare TiDiGino.
L’unico modo è tramite un collegamento locale con un PC via USB.
Tuttavia, esiste un’ulteriore possibilità detta di autoapprendimento.
Si chiama semplicemente TiDiGino con il cellulare il cui numero telefonico si desidera diventi il primo della lista dei preferenziali: se la locazione è vuota, il programma memorizza il numero e da quel momento gli SMS (da quel numero) verranno accettati.
Per memorizzare gli altri numeri, si può usare il comando NUM<1÷8>:<num>;<psw> mentre il comando NUM<1÷8>;<psw> li cancella.
Per avere una lista completa di tutti gli 8 numeri preferenziali si deve usare il comando NUM?;<psw> che fornisce un’uscita (su monitor o tramite SMS) come questa:
1: +393458007xxx V numero che riceverà solo squilli (V)
2: — S V
3: — S V
4: +390498056xxx S V numero che riceverà sia SMS (S) che squilli (V)
5: — S V
6: — S V
7: — S V
8: — S V
I comandi SMS<123…8>:<ON/OFF>;<psw> e VOC<123…8>:<ON/OFF>;<psw> consentono di attivare o disattivare per ognuno dei numeri preferenziali l’invio di SMS e/o squilli in caso di allarme ingressi.
Esempio:
SMS248:ON;12345 attiva invio SMS per numeri preferenziali 2, 4 e 8
VOC1268:OFF;12345 disattiva squilli per numeri preferenziali 1, 2, 6 e 8
Emulazione Apricancello
Questa è l’emulazione meno complessa. Utilizza l’area rubrica delle EEPROM seriale per memorizzare, oltre agli 8 numeri preferenziali, altri 248 numeri telefonici, per un totale di 256 numeri.
I numeri telefonici sono stati previsti con un massimo di 16 caratteri, compreso il prefisso internazionale.
È stato aggiunto il comando PRE:<prefix> che consente di inserire il prefisso di default che per l’Italia è “+39”. Ricordo che il “+” corrisponde al doppio zero “00”. La sua lunghezza massima è di 5 caratteri.
Nel caso il numero telefonico inserito non contenga il prefisso, questo viene automaticamente aggiunto dal programma.
Il numero telefonico (a parte il prefisso) non può essere più lungo di 10 caratteri (11 per zone ad alta concentrazioni di telefoni).
Quindi 11 caratteri più 5 di prefisso sono appunto 16 caratteri.
Si noti che il limite di memorizzazione di 256 numeri telefonici è più che altro pratico, poiché lo spazio di memoria consentirebbe la memorizzazione di altri 1536 numeri!
Ad ogni chiamata ricevuta dal modulo GSM, viene controllata l’identità del chiamante ovvero il numero di telefono. Se il numero di telefono corrisponde ad un elemento della lista, viene attivato il relè 1 connesso al sistema apricancello e quindi il programma termina la telefonata.
In questo modo il chiamante non spende nulla per la telefonata (un bel risparmio!).
La stessa apertura può essere fatta anche in locale, tenendo premuto il pulsante utente della scheda per almeno un ciclo di loop (circa 1 secondo).
I numeri preferenziali possono anche inviare SMS contenenti i comandi.
Emulazione Telecontrollo
Una spiegazione delle funzioni di allarme è d’obbligo.
Gli ingressi optoisolati possono essere processati se la variabile ALI (allarme ingressi) è true. La variabile viene controllata dal relativo comando ALI (che fantasia!): se posto in ON la variabile assume valore true, viceversa con OFF essa assume valore false.
I livelli degli ingressi di allarme possono essere A (alto), B (basso) e V (variazione): impostando il comando LIV<1/2>:<A/B/V> relativo ad uno dei due ingressi si stabilisce quando il livello di tensione deve essere considerato allarme.
Un ingresso entrato in stato di allarme non viene considerato subito tale, ma deve passare un certo tempo (detto di osservazione o di preallarme). Questo tempo è controllato dalle variabili OSS1 e OSS2 ed è settato dal relativo comando OSS<1/2>:<0÷59> (tempo espresso in secondi).
Una volta trascorso questo tempo, se l’ingresso non ha subito variazioni, l’allarme diventa effettivo.
È a questo punto che parte il timer del tempo di inibizione controllato dalle variabili INI1 ed INI2 e settato dal relativo comando INI<1/2>:<0÷59> (tempo espresso in minuti).
In pratica, esprime il tempo per il quale l’allarme non deve generare altri SMS e/o squilli agli otto possibili numeri preferenziali.
I comandi SMS<123…8>:<ON/OFF>;<psw> e VOC<123…8>:<ON/OFF>;<psw> consentono di attivare o disattivare per ognuno dei numeri preferenziali l’invio di SMS e/o squilli in caso di allarme ingressi.
Esempio:
SMS248:ON;12345 attiva invio SMS per numeri preferenziali 2, 4 e 8
VOC1268:OFF;12345 disattiva squilli per numeri preferenziali 1, 2, 6 e 8
Emulazione Temperatura
Il sensore per la temperatura ambientale DS18B20 (DALLAS-MAXIM) consente di scegliere vari livelli di risoluzione:
- 9 bit risoluzione 0,5°C
- 10 bit risoluzione 0,25°C
- 11 bit risoluzione 0,125°C
- 12 bit risoluzione 0,0625°C
Si è scelto di usare la massima risoluzione di 12 bit per garantire l’apprezzamento del decimo di grado.
Il range di temperatura del sensore è compreso tra -55°C e +125°C, anche se la precisione di ±0.5°C è garantita tra -10°C e +85°C.
Comunque, per un controllo di temperatura ambientale sono valori più che sufficienti.
Purtroppo questa precisione della misura è falsata dal fatto che dopo qualche minuto di funzionamento del sistema, la temperatura rilevata sale di circa 2 gradi rispetto a quella ambiente.
Tuttavia, non credo che il problema sia la vicinanza di qualche componente “caldo” sulla scheda e neanche di qualche esoterica influenza del generatore RF del modulo GSM.
La logica vorrebbe che il sia pur minimo consumo di corrente (da 1 a 4 mA) da parte del dispositivo fosse sufficiente ad innalzare la temperatura del diodo interno di rilevamento, ma possibile che i progettisti non se ne siano accorti?
La casa costruttrice del sensore pare fosse a conoscenza di un problema simile per il sensore DS1820 (vedi rapporto DALLAS allegato) sottoposto alla temperatura di vapore, imputando la causa ad un resistore collegato all’oscillatore interno del sistema di conteggio che è sensibile agli stress meccanici.
Lo stesso documento afferma che i problemi sono stati risolti con il DS18S20, ma non parla del DS18B20 usato in questo caso. Noto soltanto che con il DS18S20 la risoluzione è scesa a soli 9 bit (risoluzione 0,5°C): come mai?
Il documento è del 7 marzo 2000 e dopo un anno la DALLAS è stata acquisita dalla MAXIM: forse nell’acquisizione i tecnici si sono accorti dei problemi ed hanno ridotto la risoluzione per evitare “rogne” con la clientela? Mah!
Il fatto è che il problema c’è e non è trascurabile (due gradi sono tanti…).
Si potrebbe pensare ad un offset di un paio di gradi da sottrarre progressivamente nell’arco di 5 minuti alla temperatura rilevata per tener conto di questo effetto indesiderato, ma sarebbe un palliativo poco elegante.
Mi domando, allora, se non sia meglio utilizzare un più economico NATIONAL LM35, vista la presenza degli ingressi analogici inutilizzati.
Volendo proprio usare un sensore One Wire sarebbe stato meglio predisporne un montaggio separato dalla scheda del TiDiGino e, magari, prevedere un secondo sensore delle stesso tipo per la rilevazione della temperatura esterna: il protocollo, infatti, prevede la possibilità di più dispositivi presenti sullo stesso bus.
È stata aggiunto il comando IST:<0÷20> collegato alla variabile IST che esprime l’isteresi in decimi di grado (valore di default 5 corrispondente a 0,5°C) per evitare ravvicinate attivazioni/disattivazioni del relè 1 collegato alla caldaia.
In pratica, il relè si attiva sotto la temperatura di (NOR – IST) e si disattiva sopra la temperatura di (NOR + IST)
Certo sarebbe stato meglio predisporre un controllo di tipo PID (Proporzionale Integrativo Derivativo) per prevedere il naturale ritardo nella risposta del sistema Ambiente-Caldaia (dovuto al volano termico), cosa che è presente nei moderni crono-termostati.
Tuttavia, considerando le finalità di questo apparecchio (controllo remoto dell’impianto di riscaldamento della casa in montagna e simili), questa funzione non è indispensabile.
Per lo stesso motivo, il range di temperatura è stato ridotto a valori compresi tra -10°C e +85°C, in modo da garantire la precisione della misura.
Naturalmente i comandi NOR, ALLMIN ed ALLMAX verificano la congruenza delle temperature all’interno di questo range ed anche tra loro (non è possibile, ad esempio, inserire un NOR a 18°C con un ALLMIN settato a 20°C).
Per quanto riguarda il pulsante utente, tenendolo premuto per almeno un ciclo di loop (1 secondo), commuta la modalità di funzionamento (Automatico/Manuale/Termostato) in modo ciclico.
Il LED3 si attiva quando il funzionamento è automatico, mentre il LED4 si attiva quando il funzionamento è su termostato. In caso di funzionamento manuale, invece, i due LED risultano spenti.
LED | Colore | Segnalazione | Note |
1 | Rosso | Stato uscita 1 | Caldaia accesa/spenta |
2 | Rosso | Stato uscita 2 | non utilizzata |
3 | Giallo | Funzionamento automatico | Se spenti indicano il funzionamento manuale |
4 | Giallo | Funzionamento termostato |
Per quanto riguarda gli ingressi optoisolati:
Ingresso Optoisolato | Funzione | Allarme | Note |
1 | Caldaia in avaria | Allarme caldaia | Collegare in parallelo spia avaria caldaia |
2 | Termostato | nessuno | Collegare in parallelo al termostato ambiente (se presente) |
È possibile fornire comandi diretti alle uscite a relè, ma solo per il relè 2.
Il relè 1 (caldaia) , essendo controllato dalla procedura di controllo temperatura, può essere controllato solo se il funzionamento è manuale.
I comandi SMS<123…8>:<ON/OFF>;<psw> e VOC<123…8>:<ON/OFF>;<psw> consentono di attivare o disattivare, per ognuno dei numeri preferenziali, l’invio di SMS e/o squilli in caso di allarme temperatura e/o caldaia.
Difetti conosciuti
La prima regola di un programmatore è quella di non essere il collaudatore del proprio software; questa regola, in questo caso, non è stata osservata con la conseguenza che è possibile che nel software ci siano delle sviste o degli errori in alcuni punti.
Lascio ai validi tecnici di Futura Elettronica l’onere delle prove, pregandoli di segnalarmi qualsiasi anomalia.
Certo sarebbe desiderabile che non esistessero difetti, ma purtroppo questo non può accadere, almeno per le versioni iniziali del programma:
- in caso di caduta della tensione a seguito di un blackout, al suo ripristino il modulo GSM non sempre si inizializza correttamente (presenza sul mio prototipo del resistore R20?);
- nel caso di assenza della SIM, la velocità di ciclo scende sensibilmente;
- il comando FIL:<ON/OFF>, pur essendo presente e funzionante, non viene gestito (non riesco a comprenderne l’utilità);
- il comando SIC:<ON/OFF> non viene gestito poiché i comandi DTMF sono tutti condizionati dall’inserimento della password (una tantum);
- i beep DTMF generati dal modulo GSM richiedono un tempo eccessivamente lungo;
- le temperature ALLMIN, ALLMAX e NOR sono numeri interi e quindi non possono contenere decimali;
- la temperatura rilevata dal sensore sale di due gradi rispetto a quella ambientale dopo 5 minuti circa dall’accensione del sistema e ciò è fuorviante ai fini del controllo ambientale;
- non è indispensabile ma sarebbe meglio aggiungere un LED per indicare l’attività del processore: il LED3 usato allo scopo è già utilizzato dall’emulazione Temperatura, mentre sarebbe più utile collegarne uno al classico pin 13 in modo da essere compatibile con la serie Arduino.
Ad alcuni di essi si può rimediare, ma per altri è richiesta una maggiore quantità di tempo per prove e migliorie.
PINOUT
ATmega2560 | Arduino MEGA 2560 | TiDiGino | |||||
Pin | Pin Name | Pin | Port | Port Name | Pin | Port | Port Name |
2 | PE0 (RXD0-PCINT8) | 0 | 0 | RX0 | 0 | 0 | RX0 |
3 | PE1 (TXD0) | 1 | 1 | TX0 | 1 | 1 | TX0 |
6 | PE4 (OC3B-INT4) | 2 | 2 | PWM-INT4 | 2 | 2 | PWM-INT4 |
7 | PE5 (OC3C-INT5) | 3 | 3 | PWM-INT5 | 3 | 3 | PWM-INT5 |
1 | PG5 (OC0B) | 4 | 4 | PWM | 4 | 4 | PWM |
5 | PE3 (OC3A-AIN1) | 5 | 5 | PWM | 5 | 5 | PWM |
15 | PH3 (OC4A) | 6 | 6 | PWM | 6 | 6 | PWM |
16 | PH4 (OC4B) | 7 | 7 | PWM | 7 | 7 | PWM |
17 | PH5 (OC4C) | 8 | 8 | PWM | 8 | 8 | PWM |
18 | PH6 (OC2B) | 9 | 9 | PWM | 9 | 9 | PWM |
23 | PB4 (OC2A-PCINT4) | 10 | 10 | PWM | 10 | 10 | PWM |
24 | PB5 (OC1A-PCINT5) | 11 | 11 | PWM | 11 | 11 | PWM |
25 | PB6 (OC1B-PCINT6) | 12 | 12 | PWM | 12 | 12 | PWM |
26 | PB7 (OC0A-OC1C-PCINT7) | 13 | 13 | PWM (LED) | 13 | 13 | PWM |
64 | PJ1 (TXD3-PCINT10) | 14 | 14 | TX3 | 14 | DTMF STD | |
63 | PJ0 (RXD3-PCINT9) | 15 | 15 | RX3 | 15 | <n.c.> | |
13 | PH1 (TXD2) | 16 | 16 | TX2 | 16 | <n.c.> | |
12 | PH0 (RXD2) | 17 | 17 | RX2 | 17 | <n.c.> | |
46 | PD3 (TXD1-INT3) | 18 | 18 | TX1-INT3 | GSM15 | 18 | GSM15 TX1 |
45 | PD2 (RXD1-INT2) | 19 | 19 | RX1-INT2 | GSM16 | 19 | GSM16 RX1 |
44 | PD1 (SDA-INT1) | 20 | 20 | SDA-INT1 | 20 | SDA (EEPROM2) | |
43 | PD0 (SCL-INT0) | 21 | 21 | SCL-INT0 | 21 | SCL (EEPROM2) | |
78 | PA0 (AD0) | 22 | 22 | Digital I/O | 22 | <n.c.> | |
77 | PA1 (AD1) | 23 | 23 | Digital I/O | 23 | <n.c.> | |
76 | PA2 (AD2) | 24 | 24 | Digital I/O | 24 | <n.c.> | |
75 | PA3 (AD3) | 25 | 25 | Digital I/O | 25 | LED3 | |
74 | PA4 (AD4) | 26 | 26 | Digital I/O | 26 | LED4 | |
73 | PA5 (AD5) | 27 | 27 | Digital I/O | GSM18 | 27 | GSM DCD |
71 | PA7 (AD7) | 29 | 29 | Digital I/O | GSM14 | 29 | GSM RTS |
60 | PC7 (A15) | 30 | 30 | Digital I/O | 30 | <n.c.> | |
59 | PC6 (A14) | 31 | 31 | Digital I/O | 31 | <n.c.> | |
72 | PA6 (AD6) | 31 | 31 | Digital I/O | GSM17 | 31 | GSM DTR |
58 | PC5 (A13) | 32 | 32 | Digital I/O | 32 | <n.c.> | |
57 | PC4 (A12) | 33 | 33 | Digital I/O | 33 | <n.c.> | |
56 | PC3 (A11) | 34 | 34 | Digital I/O | GSM12 | 34 | GSM RING |
55 | PC2 (A10) | 35 | 35 | Digital I/O | GSM06 | 35 | GSM RESET |
54 | PC1 (A9) | 36 | 36 | Digital I/O | 36 | RLYOUT 1 | |
53 | PC0 (A8) | 37 | 37 | Digital I/O | 37 | RLYOUT 2 | |
50 | PD7 (T0) | 38 | 38 | Digital I/O | 38 | <n.c.> | |
70 | PG2 (ALE) | 39 | 39 | Digital I/O | GSM13 | 39 | GSM CTS |
52 | PG1 (RD) | 40 | 40 | Digital I/O | 40 | <n.c.> | |
51 | PG0 (WR) | 41 | 41 | Digital I/O | 41 | <n.c.> | |
42 | PL7 | 42 | 42 | Digital I/O | 42 | <n.c.> | |
41 | PL6 | 43 | 43 | Digital I/O | 43 | <n.c.> | |
40 | PL5 (OC5C) | 44 | 44 | Digital I/O | 44 | <n.c.> | |
39 | PL4 (OC5B) | 45 | 45 | Digital I/O | 45 | <n.c.> | |
38 | PL3 (OC5A) | 46 | 46 | Digital I/O | 46 | <n.c.> | |
37 | PL2 (T5) | 47 | 47 | Digital I/O | 47 | <n.c.> | |
36 | PL1 (ICP5) | 48 | 48 | Digital I/O | 48 | <n.c.> | |
35 | PL0 (ICP4) | 49 | 49 | Digital I/O | 49 | <n.c.> | |
22 | PB3 (MISO-PCINT3) | 50 | 50 | MISO (ICSP1) | ICSP1 | 50 | MISO |
21 | PB2 (MOSI-PCINT2) | 51 | 51 | MOSI (ICSP4) | ICSP4 | 51 | MOSI |
20 | PB1 (SCK-PCINT1) | 52 | 52 | SCK (ICSP3) | ICSP3 | 52 | SCK |
19 | PB0 (SS-PCINT0) | 53 | 53 | Digital I/O (SS) | 53 | <n.c.> | |
97 | PF0 (ADC0) | A0 | 54 | Analog 0 | A0 | 54 | Analog 0 |
96 | PF1 (ADC1) | A1 | 55 | Analog 1 | A1 | 55 | Analog 1 |
95 | PF2 (ADC2) | A2 | 56 | Analog 2 | A2 | 56 | Analog 2 |
94 | PF3 (ADC3) | A3 | 57 | Analog 3 | A3 | 57 | Analog 3 |
93 | PF4 (ADC4-TCK) | A4 | 58 | Analog 4 | A4 | 58 | Analog 4 |
92 | PF5 (ADC5-TMS) | A5 | 59 | Analog 5 | A5 | 59 | Analog 5 |
91 | PF6 (ADC6-TDO) | A6 | 60 | Analog 6 | 60 | <n.c.> | |
90 | PF7 (ADC7-TDI) | A7 | 61 | Analog 7 | 61 | <n.c.> | |
89 | PK0 (ADC8-PCINT16) | A8 | 62 | Analog 8 | 62 | P2 (pulsante utente) | |
88 | PK1 (ADC9-PCINT17) | A9 | 63 | Analog 9 | 63 | TEMP | |
87 | PK2 (ADC10-PCINT18) | A10 | 64 | Analog 10 | 64 | <n.c.> | |
86 | PK3 (ADC11-PCINT19) | A11 | 65 | Analog 11 | 65 | <n.c.> | |
85 | PK4 (ADC12-PCINT20) | A12 | 66 | Analog 12 | 66 | <n.c.> | |
84 | PK5 (ADC13-PCINT21) | A13 | 67 | Analog 13 | 67 | <n.c.> | |
83 | PK6 (ADC14-PCINT22) | A14 | 68 | Analog 14 | 68 | <n.c.> | |
82 | PK7 (ADC15-PCINT23) | A15 | 69 | Analog 15 | 69 | <n.c.> | |
65 | PJ2 (XCK3-PCINT11) | 72 | <n.c.> | 72 | DTMF Q1 | ||
66 | PJ3 (PCINT12) | 73 | <n.c.> | 73 | DTMF Q2 | ||
67 | PJ4 (PCINT13) | 74 | <n.c.> | 74 | DTMF Q3 | ||
68 | PJ5 (PCINT14) | 75 | <n.c.> | 75 | DTMF Q4 | ||
69 | PJ6 (PCINT 15) | 76 | <n.c.> | GSM19 | 76 | GSM NETLED (|| LED5) | |
79 | PJ7 | 77 | <n.c.> | GSM01 | 77 | GSM ON/OFF | |
9 | PE7 (CLKO-ICP3-INT7) | 83 | <n.c.> | 83 | IN2 | ||
8 | PE6 (T3-INT6) | 84 | <n.c.> | 84 | IN1 | ||
10 | VCC | VCC | VCC | ||||
31 | VCC | VCC | VCC | ||||
61 | VCC | VCC | VCC | ||||
80 | VCC | VCC | VCC | ||||
100 | AVCC | VCC | VCC | ||||
98 | AREF | Aref | Aref | ||||
11 | GND | GND | GND | ||||
32 | GND | GND | GND | ||||
62 | GND | GND | GND | ||||
81 | GND | GND | GND | ||||
99 | AGND | GND | GND | ||||
30 | RESET | RES | RES | ||||
4 | PE2 (XCK0-AIN0) | <n.c.> | <n.c.> | ||||
14 | PH2 (XCK2) | <n.c.> | <n.c.> | ||||
27 | PH7 (T4) | <n.c.> | <n.c.> | ||||
28 | PG3 (TOSC2) | <n.c.> | <n.c.> | ||||
29 | PG4 (TOSC1) | <n.c.> | <n.c.> | ||||
33 | XTAL2 | <n.c.> | <n.c.> | ||||
34 | XTAL1 | <n.c.> | <n.c.> | ||||
47 | PD4 (ICP1) | <n.c.> | <n.c.> | ||||
48 | PD5 (XCK1) | <n.c.> | <n.c.> | ||||
49 | PD6 (T1) | <n.c.> | <n.c.> | ||||
GSM03 | GSM03 VCC | ||||||
GSM10 | GSM10 ADC | ||||||
GSM11 | GSM11 AGND | ||||||
GSM02 | GSM02 GND | ||||||
GSM05 | GSM05 MIC- | ||||||
GSM04 | GSM04 MIC+ | ||||||
GSM08 | GSM08 SPK- | ||||||
GSM09 | GSM09 SPK+ | ||||||
GSM07 | GSM07 VRTC | ||||||
Mappa di memoria
EEPROM seriale – Mappa di memoria | |||||||||||
Gruppo | Variabile | Tipo | Adr Ini | Len | Adr Fin | Valore Predefinito | Descrizione | ||||
dec | hex | dec | x | totale | dec | hex | |||||
Generale | AVV | boolean | 0 | 0000 | 1 | 1 | 1 | 0 | 0000 | true | Invio SMS all’avvio |
FIL | boolean | 1 | 0001 | 1 | 1 | 1 | 1 | 0001 | false | Filtra chiamate entranti | |
PRE | String | 2 | 0002 | 5 | 1 | 5 | 6 | 0006 | +39 | Prefisso internazionale | |
PWD | String | 7 | 0007 | 5 | 1 | 5 | 11 | 000B | 12345 | Password | |
RISP | boolean | 12 | 000C | 1 | 1 | 1 | 12 | 000C | true | Invia SMS di risposta | |
TSU | String | 13 | 000D | 30 | 1 | 30 | 42 | 002A | System startup | Testo messaggio Accensione | |
TTP[] | byte[] | 43 | 002B | 1 | 8 | 8 | 50 | 0032 | 3 | Trattamento numeri telefonici primari | |
51 | 0033 | 205 | 1 | 205 | 255 | 00FF | <area libera> | ||||
Ingressi | ALI | boolean | 256 | 0100 | 1 | 1 | 1 | 256 | 0100 | true | Allarme ingressi |
INI1 | byte | 257 | 0101 | 1 | 1 | 1 | 257 | 0101 | 5 | Minuti inibizione ingresso 1 | |
INI2 | byte | 258 | 0102 | 1 | 1 | 1 | 258 | 0102 | 5 | Minuti inibizione ingresso 2 | |
LIV1 | String | 259 | 0103 | 1 | 1 | 1 | 259 | 0103 | A | Livello allarme ingresso 1 (A, B, V) | |
LIV2 | String | 260 | 0104 | 1 | 1 | 1 | 260 | 0104 | A | Livello allarme ingresso 2 (A, B, V) | |
OSS1 | byte | 261 | 0105 | 1 | 1 | 1 | 261 | 0105 | 1 | Secondi osservazione ingresso 1 | |
OSS2 | byte | 262 | 0106 | 1 | 1 | 1 | 262 | 0106 | 1 | Secondi osservazione ingresso 2 | |
TIN1A | String | 263 | 0107 | 30 | 1 | 30 | 292 | 0124 | Ingresso 1 alto | Testo allarme Alto ingresso 1 | |
TIN1B | String | 293 | 0125 | 30 | 1 | 30 | 322 | 0142 | Ingresso 1 basso | Testo allarme Basso ingresso 1 | |
TIN2A | String | 323 | 0143 | 30 | 1 | 30 | 352 | 0160 | Ingresso 2 alto | Testo allarme Alto ingresso 2 | |
TIN2B | String | 353 | 0161 | 30 | 1 | 30 | 382 | 017E | Ingresso 2 basso | Testo allarme Basso ingresso 2 | |
TIZ1 | boolean | 383 | 017F | 1 | 1 | 1 | 383 | 017F | false | Azzera tempo inibizione ingresso 1 | |
TIZ2 | boolean | 384 | 0180 | 1 | 1 | 1 | 384 | 0180 | false | Azzera tempo inibizione ingresso 2 | |
385 | 0181 | 127 | 1 | 127 | 511 | 01FF | <area libera> | ||||
Temperatura | ALL | boolean | 512 | 0200 | 1 | 1 | 1 | 512 | 0200 | false | Allarmi temperatura attivi |
ALLMAX | char | 513 | 0201 | 1 | 1 | 1 | 513 | 0201 | 25 | Temperatura allarme massima | |
ALLMIN | char | 514 | 0202 | 1 | 1 | 1 | 514 | 0202 | 15 | Temperatura allarme minima | |
FUN | String | 515 | 0203 | 1 | 1 | 1 | 515 | 0203 | A | Funzionamento (A, M, T) | |
IST | byte | 516 | 0204 | 1 | 1 | 1 | 516 | 0204 | 2 | Isteresi (decimi di grado) | |
NOR | char | 517 | 0205 | 1 | 1 | 1 | 517 | 0205 | 21 | Temperatura normale | |
THI | char | 518 | 0206 | 30 | 1 | 30 | 547 | 0223 | Allarme temperatura massima | Testo allarme temperatura massima | |
TIN | char | 548 | 0224 | 30 | 1 | 30 | 577 | 0241 | Allarme caldaia | Testo allarme caldaia | |
TLO | char | 578 | 0242 | 30 | 1 | 30 | 607 | 025F | Allarme temperatura minima | Testo allarme temperatura minima | |
608 | 0260 | 160 | 1 | 160 | 767 | 02FF | <area libera> | ||||
Uscite | OUT1 | byte | 768 | 0300 | 1 | 1 | 1 | 768 | 0300 | 3 | Secondi attivazione uscita 1 |
OUT2 | byte | 769 | 0301 | 1 | 1 | 1 | 769 | 0301 | 3 | Secondi attivazione uscita 2 | |
RIP | boolean | 770 | 0302 | 1 | 1 | 1 | 770 | 0302 | true | Ripristino Relé dopo blackout | |
TAC | byte | 771 | 0303 | 1 | 1 | 1 | 771 | 0303 | 5 | Secondi attivazione apricancello | |
TIM1 | byte | 772 | 0304 | 1 | 1 | 1 | 772 | 0304 | 3 | Secondi inversione momentanea uscita 1 | |
TIM2 | byte | 773 | 0305 | 1 | 1 | 1 | 773 | 0305 | 3 | Secondi inversione momentanea uscita 2 | |
RelayVal[] | boolean | 774 | 0306 | 1 | 1 | 1 | 774 | 0306 | false | Stato relé 1 | |
RelayVal[] | boolean | 775 | 0307 | 1 | 1 | 1 | 775 | 0307 | false | Stato relé 2 | |
776 | 0308 | 248 | 1 | 248 | 1023 | 03FF | <area libera> | ||||
Gap | 1024 | 0400 | 16 | 192 | 3072 | 4095 | 0FFF | <non utilizzata> | |||
Rubrica | char | 4096 | 1000 | 16 | 256 | 4096 | 8191 | 1FFF | Numeri telefonici | ||
8192 | 2000 | 16 | 1536 | 24576 | 32767 | 7FFF | <area libera> |
Comandi
TiDiGino – Comandi | ||||
Gruppo | Funzione | Sintassi | Variabile Collegata | Valore Predefinito |
Generale | Invio SMS o squilli all’avvio | AVV:<ON/OFF> | AVV | true |
Filtro chiamate entranti (accetta solo numeri autorizzati) |
FIL:<ON/OFF> | FIL | false | |
Prefisso internazionale
(max 5 caratteri) |
PRE:<prefix> | PRE | +39 | |
Cambio Password (numero di 5 cifre) |
PWD:<psw>;<newpsw> | PWD | 12345 | |
Reset (ricarica impostazioni personalizzate) |
RES;<psw> | |||
Invia SMS di risposta | RISP:<ON/OFF> | RISP | true | |
Salva impostazioni personalizzate | SAV;<psw> | |||
Visualizza stato Ingressi e Uscite | STA? | |||
Comandi DTMF con password | SIC:<ON/OFF> | false | ||
Testo startup (max 30 caratteri) |
TSU:<testo> | TSU | System startup | |
Ingressi Optoisolati | Visualizza tempi di inibizione ingressi | INI? | INI1, INI2 | |
Visualizza allarme ingressi | ALI? | ALI | ||
Allarme ingressi | ALI:<ON/OFF> | ALI | false | |
Tempo inibizione ingresso 1/2 (0÷59 minuti per evitare dopo allarme altri SMS o squilli) |
INI<1/2>:<0÷59> | INI1, INI2 | 5 | |
Visualizza livelli allarme | LIV? | |||
Livello allarme ingresso Alto/Basso/Variazione (presenza tensione in ingresso) |
LIV<1/2>:<A/B/V> | LIV1, LIV2 | A | |
Visualizza tempi osservazione ingressi (tempo di preallarme) |
OSS? | OSS1, OSS2 | ||
Tempo di osservazione Ingresso 1/2 (0÷59 secondi – tempo di preallarme) |
OSS<1/2>:<0÷59> | OSS1, OSS2 | 1 | |
Testo allarme alto ingresso ½
(max 30 caratteri) |
TIN<1/2>A:<testo> | TIN1A, TIN2A | Ingresso 1 alto | |
Testo allarme basso ingresso ½ (max 30 caratteri) |
TIN<1/2>B:<testo> | TIN1B, TIN2B | Ingresso 1 basso | |
Azzera tempo di inibizione ingresso x a fine allarme | TIZ<1/2>:<ON/OFF> | TIZ1, TIZ2 | false | |
Temperatura | Visualizza le temperature di allarme | ALL? | NOR, ALLMAX, ALLMIN | |
Allarmi temperatura | ALL:<ON/OFF> | ALL | false | |
Temperatura allarme massima (-10 ÷ +85 °C) |
ALLMAX:<±><0÷99> | ALLMAX | 25 | |
Temperatura allarme minima (-10 ÷ +85 °C) |
ALLMIN:<±><0÷99> | ALLMIN | 17 | |
Visualizza tipo funzionamento | FUN? | FUN | ||
Tipo di funzionamento (A=Automatico, M=Manuale, T=Termostato) |
FUN:<A/M/T> | FUN | A | |
Isteresi (decimi di grado) |
IST:<0÷20> | IST | 5 | |
Temperatura normale (-10 ÷ +85 °C) |
NOR:<±><0÷99> | NOR | 21 | |
Richiedere la temperatura | TEMP? | TempVal, TempMax, TempMin | ||
Testo allarme temperatura massima
(max 30 caratteri) |
THI:<testo> | THI | Allarme Temperatura Massima | |
Testo allarme caldaia (max 30 caratteri) |
TIN:<testo> | TIN | Allarme Caldaia | |
Testo allarme temperatura minima (max 30 caratteri) |
TLO:<testo> | TLO | Allarme Temperatura Minima | |
Azzera temperature minima e massima | TRES | TempMax, TempMin | -55, 125 | |
Uscite a Relè | Attiva/Disattiva Relé x | OUT<1/2>:<ON/OFF> | RelayVal[] | false |
Tempo di attivazione Relé x (0=Bistabile) |
OUT<1/2>:<0÷59> | OUT1, OUT2 | 0 | |
Visualizza stato Ripristino | RIP? | |||
Ripristino Relé dopo blackout | RIP:<ON/OFF> | RIP | true | |
Tempo di attivazione apricancello (0=Bistabile) |
TAC:<0÷59> | TAC | 3 | |
Tempo di inversione momentanea stato Relé x (1÷9 secondi) | TIM<1/2>:<1÷9> | TIM1, TIM2 | 3 | |
Rubrica | Cancellazione totale lista apricancello (tranne i primi 8 numeri) |
DAC;<psw> | ||
Cancella numero da lista apricancello | DAC:<num>;<psw> | |||
Visualizza numeri apricancello
(pagina gruppi di 8) |
MAC?:<2÷32>;<psw> | |||
Memorizza numero lista apricancello (max 16 caratteri) | MAC:<num>;<psw> | |||
Visualizza numeri preferenziali (prime 8 posizioni) |
NUM?;<psw> | |||
Cancella numero preferenziale in posizione <1÷8> | NUM<1÷8>;<psw> | |||
Memorizza numero preferenziale in posizione <1÷8> (max 16 caratteri) | NUM<1÷8>:<num>;<psw> | |||
Numeri preferenziali a cui verranno inviati gli SMS | SMS<123…8>:<ON/OFF>;<psw> | TTP[] | 3 | |
Numeri preferenziali a cui verrà fatto uno squillo | VOC<123…8>:<ON/OFF>;<psw> | TTP[] | 3 | |
Aggiuntivi | Visualizza ingressi analogici | AIN? | AnaInVal[] | |
Visualizza ingressi digitali | DIN? | DigInVal[] | ||
Visualizza uscite digitali | DOUT? | DigOutVal[] | ||
Imposta uscita digitale | DOUT<4÷13>:<0/1> | DigOutVal[] | 0 | |
Visualizza uscite PWM | PWM? | PWMVal[] | ||
Imposta uscita PWM | PWM<4÷13>:<0÷255> | PWMVal[] | 0 | |
Visualizza contenuto memoria EEPROM seriale | PEEK<adr>;<size> | |||
Scrive valore nella memoria EEPROM seriale | POKE<adr>;<size>:<val> | |||
Note: – è possibile usare indifferentemente il maiuscolo o il minuscolo; – i caratteri di separazione “:” e “;” possono essere sostituiti da un semplice spazio (unica eccezione sono i comandi PEEK e POKE), ma attenzione a non inserirne più di uno! – il comando FIL:<ON/OFF>, pur essendo presente e funzionante, non viene gestito (non riesco a comprenderne l’utilità); – il comando SIC:<ON/OFF> non viene gestito poiché i comandi DTMF sono tutti condizionati dall’inserimento della password (una tantum); |
Comandi DTMF
TiDiGino – Comandi DTMF | |||||
Tipo | Tasto | Funzione Normale | Risposta | Funzione Programmazione | Risposta |
Uscite
|
1 | Cambia stato relè 1 (modalità bistabile) |
1 beep relè ON 2 beep relè OFF |
Tempo monostabile relè 1 (tra 1 e 9) |
1 beep comando accettato 2 beep comando non accettato |
2 | Cambia stato relè 2 (modalità bistabile) |
Tempo monostabile relè 2 (tra 1 e 9) |
|||
3 | Cambia stato relè 1 (modalità monostabile) |
||||
4 | Cambia stato relè 2 (modalità monostabile) |
||||
5 | Stato del relè 1 | ||||
6 | Stato del relè 2 | ||||
Ingressi | 7 | Stato dell’ingresso 1 | 1 beep presenza di tensione 2 beep assenza di tensione |
||
8 | Stato dell’ingresso 2 | ||||
Generale | 9 | ||||
0 | Termina telefonata | ||||
Programma | * | Entra nella modalità di programmazione | |||
# | Esci dalla modalità di programmazione | ||||
Note: durante la fase di connessione e riconoscimento, il sistema inviando tre beep consecutivi comunica che per procedere è richiesta la password; una volta che la password inserita è stata riconosciuta, il sistema emette un beep, che indica che la password è stata accettata. |
Download
Dalla pagina http://code.google.com/p/tidigino potete scaricare le ultime release del firmware
Lo Sketch FACTOTUM | |
Librerie | |
Definizione PIN |
1 Commento