ESEMPIO DI STRUTTURA DI ACQUISIZIONE, ELABORAZIONE E CONTROLLO. L'esempio molto semplice prevede un controllo automatico e manuale di temperatura.

Documenti analoghi
Nella parte sx dello schema abbiamo gli input del microcontrollore il quale ha la funzione di elaborare dei dati che acquisisce in tempo reale.

SMD 2018 HACKATHON SECONDARIA DI PRIMO GRADO PRIMI PASSI CON MBLOCK

CORSO ARDUINO. Jacopo Belli Giulio Fieramosca Luca Mattii GOLEM Jacopo Belli Giulio Fieramosca Luca Mattii

SMD 2018 HACKATHON PRIMARIA PRIMI PASSI CON SNAP4ARDUINO

Corso di programmazione Arduino DI MALVEZZI DAVIDE

INTERAZIONE ELETTRONICA

ACCENDERE E SPEGNERE UN DIODO LED

COME UTILIZZARE IL SENSORE DI TEMPERATURA TMP36

SCHEDA SPERIMENTALE ARDUINO UNO

CORSO ARDUINO. Corso ASEV Giulio Fieramosca Stefano Panichi. Stefano Panichi e Giulio Fieramosca

Tipologie dei dati nell SDK di Arduino come in un vero LP ad alto livello :

Detta così sembra una faccenda semplice ma, nella pratica, occorre una notevole precisione e tanta tanta pazienza.

Corso Professionale di Arduino Avanzato

MD 2018 HACKATHON SECONDARIA DI PRIMO GRADO

MOTORE PASSO-PASSO CON VELOCITÀ REGOLABILE

Uno scenario IoT Maker Faire Rome, ott Internet of Things Duilio Peroni Alessandro Saracino

SENSORI OTTICI - FOTORESISTENZE

ARDUINO. Colleghiamolo al PC/MAC - FUNZIONA?

ARDUINO. workshop base

SOLUZIONE Soluzione: Schema a blocchi

CTU Presenta. Contest Automation con Arduino. IK0XBX - Francesco

Circuiti antirimbalzo

Macchina con Arduino Uno comandata tramite dispositivo Android e sensore ultrasuoni per fermarsi istantaneamente di fronte ad un ostacolo

ELETTRONICA CON ARDUINO

Display numerico con i LED

Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione

SMD 2018 HACKATHON SECONDARIA DI PRIMO GRADO FACCIAMO UN TELECOMANDO CON UNO SMARTPHONE

Interruttore singolo per comandi ON/OFF Tipo: x, EC 16x x

I SENSORI DI PROSSIMITA


CORSO ARDUINO. Corso ASEV Giulio Fieramosca Stefano Panichi. Lezione 3 PWM e motori. Stefano Panichi e Giulio Fieramosca

DISPOSITIVO PER LA LETTURA DI UN ENCODER INCREMENTALE

CORSO ARDUINO. Jacopo Belli Giulio Fieramosca Luca Mattii GOLEM Jacopo Belli Giulio Fieramosca Luca Mattii

Strutture di controllo e cicli

MD 2018 HACKATHON SECONDARIA DI PRIMO GRADO

Introduzione alla Robo0ca

Arduino per l automazione dei modelli navali. Federico Davanteri e Albino Benedetto

6^ parte : Acquisizione della temperatura con LM35. Author: Ing. Sebastiano Giannitto (ITIS M.BARTOLO PACHINO)

Wiring quick reference

Arduino: Programmazione

INFORMATICA. Strutture iterative

Controllo di una soglia analogica

TCP - TIMER CICLICO PROGRAMMABILE

Facciamo lampeggiare un led

Salvare i dati rilevati dai sensori di Arduino

Manuale tecnico. Rivelatore movimento IR con crepuscolare Easy GW GW GW

KeyPad LCD Shield ( blue )

Arduino/Raspberry Board and GSM Library

Per controllare un motore DC (funzionante in corrente continua) con Arduino, devi utilizzare il circuito integrato Ponte H (nel mio caso un L293NE

STRUTTURE DI CONTROLLO DEL C++

Corso Base Arduino ed Elettronica

ROBOTICA Syllabus Versione 1.0

Corso Arduino Maggio Riccardo Binetti Lezione 2 - Il calore dell analogico

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

CONTASECONDI CON DISPLAY A 7 SEGMENTI ARDUINO LIKE

LabView: Corso Base pag. 7

SMD 2018 HACKATHON SECONDARIA PRIMO GRADO INSTALLAZIONE DELL'AMBIENTE DI SVILUPPO MBLOCK

Fondamenti di Informatica A. A. 2018/19

FONDAMENTI DI ARDUINO

Centro lavanderia. Collegamento mediante radiofrequenza tra la lavatrice e l essiccatore a tamburo

IL NUOVO ORIZZONTE: ARDUINO 1

Eco GSM 2 Interfaccia cellulare GSM

Sistema videoconferenza AVAYA XT4300 Regione Toscana Guida rapida all utilizzo

AUTOMAZIONE CANCELLO SCORREVOLE A MICROCONTROLLORE con ARDUINO

Istruzioni di Ciclo. Unità 4. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

SISTEMI PER L INDUSTRIA E PLC 10/01/18 Teoria, 30minuti, Minimo 4 punti su 12 di Programmazione

Diagramma a blocchi per la selezione, in un mazzo di chiavi, di quella che apre un lucchetto

File: Documento senza titolo 1 Pagina 1 di 12

Prime esperienze con la breadboard

Manualistica 3 Le strutture di controllo

TELEVIVAVOCE VERSIONI. Televivavoce 1 pulsante

Cos'è Arduino? rilasciata con licenza di tipo open source.

Informazioni di dettaglio per l ordinazione Ingressi

ADDon - PIR flush mounting motion sensor

Qualsiasi programma in C++ segue lo schema:

DAC TLC VOLTAGE MODE OPERATION 1

Remotaggio Caricabatterie NG3

12 - timer da cucina display a 4 cifre

Struttura dei programmi e Variabili

LABORATORIO DI SISTEMI OPERATIVI

Matematica - SMID : Programmazione 20 Febbraio 2007 FOGLIO RISPOSTE

L interruttore viene montato su un dispositivo di accoppiamento bus.

Fred Myo 2 Plus. Ricevitore radio a 2 canali impostabili separatamente come monostabili, bistabili o temporizzati. MANUALE DI ISTRUZIONI

Java SE 7. Strutture di programmazione (2)

Dati due punti sul piano calcolare la loro distanza

D sistema d allarme con sensori magnetici

In questo tutorial decodificheremo i segnali provenienti da un telecomando qualsiasi e utilizzeremo gli stessi segnali per comandare Arduino a

Lezione 9: Come associare un modulo RTC ad Arduino

A r c h i t e t t u r a d e g l i E l a b o r a t o r i - UNICA. Laura Ordile. Paper Piano

( ) V è la tensione dell alimentatore. Da questa si ricava (con la condizione iniziale ( ) q t = CV e τ. fem ( 1 t

K-19. Funzioni della vasca idromassaggio

Corso di Fondamenti di Informatica

Iterazione indeterminata

Sistemi Operativi. La gestione delle risorse

Sistemi di Elaborazione: esercizio con il D12

Calcolatori Elettronici T Ingegneria Informatica A3 - Gestione delle interruzioni

Far lampeggiare un led o forse un semaforo?

I.P.S.I.A. BOCCHIGLIERO

Transcript:

SENSORI, ATTUATORI, ELABORAZIONE E CONTROLLO In questo documento viene proposto un semplice ma completo esempio di attività locale di un microcontroller. In genere un microcontroller ha la responsabilità di acquisire informazioni dall'ambiente in cui è inserito attraverso i sensori, deve elaborare i dati grezzi ricevuti per ottenere informazioni signifcative e comunicarle in uscita eventualmente attuando un controllo automatico o manuale. ESEMPIO DI STRUTTURA DI ACQUISIZIONE, ELABORAZIONE E CONTROLLO L'esempio molto semplice prevede un controllo automatico e manuale di temperatura. SENSORE DI TEMPERATURA RELE' VENTOLA MICRO- CONTROLLER PULSANTE DI COMANDO MANUALE LED DI SEGNALAZIONE STATO Il microcontroller acquisisce la temperatura dell'ambiente da un sensore di temperatura ed attua la rotazione di una ventola attraverso un rele' se la temperatura sale oltre una soglia predefnita. La ventola viene fermata automaticamente quando la temperatura scende sotto la soglia. Il microcontroller acquisce anche un pulsante di comando manuale che, operando in modo toggle può accendere incondizionatamente la ventola indipentemente dalla temperatura. Un led di segnalazione indica se il pulsante è stato premuto. 1/8

Nella versione Edison for Arduino + Grove IoT si ottiene il seguente schema di montaggio: ALGORITMO DI ACQUISIZIONE, ELABORAZIONE E CONTROLLO Nell'ambiente di sviluppo di Arduino la struttura del programma si compone di due parti: setup(): funzione eseguita solo una volta all'accensione del dispositivo; qui vanno inserite tutte le operazioni di inizializzazione che vanno eseguite solo una volta come la confgurazione dell'hardware degli I/O, l'inizializzazione di eventuali variabili di stato, la connessione alla rete. loop(): funzione eseguita ripetutamente durante il funzionamento del dispositivo. La frequenza con cui la funzione viene eseguita è variabile e dipende dal tempo impiegato per eseguire tale funzione. L'efcacia della risposta in "tempo reale" del sistema dipende proprio da questa frequenza di ripetizione. E' quindi necessario che nella funzione loop non siano presenti algoritmi che richiedono lunghi tempi di esecuzione o algoritmi "sospensivi" che attendono il verifcarsi di un evento esterno per terminare. Non è quindi possibile inserire nella funzione loop() cicli for con limiti molto elevati, chiamate alla funzione delay() con valori alti, cicli while che attendo il 2/8

verifcarsi di una condizione che potrebbe verifcarsi dopo tempi molto lunghi o anche mai. Al posto di tali algoritmi si deve inserire una struttura del tipo "automa a stati fniti": se una azione non può essere completata con una breve sequenza va spezzata in più sequenze che vengono eseguite in successivi lanci della funzione loop(); per regolare l'esecuzione delle sequenze successive si defnisce una "variabile di stato"; si tratta di una variabile statica (mantiene il suo valore in lanci successivi della funzione loop e può essere una variabile globale oppure un attributo di una classe) che va inizializzata nella funzione setup() e può cambiare il suo valore in successive esecuzioni della funzione loop() infuenzando il comportamento dell'automa. Alcuni esempi di questa tecnica sono: Realizzazione di un ritardo non sospensivo Se si deve realizzare un tempo di attesa molto lungo non è possibile usare la funzione delay() perché questa sospende l'esecuzione della funzione loop() impendendo alle altre parti di programma di funzionare. Si può utilizzare la funzione millis() che restituisce, senza sospensione, il tempo passato a partire dall'ultima accensione espresso in millisecondi. Si crea una variabile di stato statica di tipo long destinata a contenere il valore dell'istante inziale del ritardo: long start; Quando si vuole iniziare il ritardo si inizializza start al valore corrente di millis() start=millis(); In ogni loop si verifca, rileggendo millis() se il tempo passato rispetto a "start" supera il tempo di ritardo desiderato: if( millis()- start > RITARDO) { //azione per ritardo scaduto N.B.: dopo il termine di un ritardo è necessario reinizializzare la variabile di stato (se si vuole fare un altro ritardo) o disabilitare il controllo (se non si vuole fare un altro ritardo) per evitare che nei loop successivi la condizione continui ad essere verifcata. Riconoscimento della pressione di un pulsante Se si deve riconoscere l'evento di pressione di un pulsante, ad esempio per realizzare un contatore o per avviare una azione, non si può leggere semplicemente lo stato "attivo" del segnale perché lo stato attivo viene riletto più volte dal loop durante la pressione del pulsante che, seppur breve dura molto rispetto alla frequenza di ripetizione del loop. 3/8

La soluzione consiste nel confrontare lo stato del segnale in un loop con lo stato nel loop precedente facendo l'azione solo quando si rileva una variazione. E' necessario defnire una variabile di stato statica destinata a contenere il valore del segnale nel loop precedente: int old; La variabile va inizializzata al valore corrente del segnale nella funzione setup(): old=digitalread(ingresso); Ad ogni loop si deve confrontare il valore attuale del segnale con con il valore nel loop precedente; se i due segnali sono diversi si è verifcata una transizione; in questo caso è possibile verifcare se la transizione è positiva (da LOW ad HIGH) o negativa (da HIGH a LOW). L'operazione può essere fatta in un unico test: int new=digitalread(ingresso); if ((new!=old) && (new==high) { //riconosciuta transizione positiva N.B.: ad ogni loop è necessario aggiornare il valore della variabile di stato old con il valore attuale in modo che il sistema sia pronto per riconoscere una successiva transizione: old=new; Molte librerie di supporto di dispositivi sono dotate di strumenti che garantiscono la non sospensione del processo. Ad esempio: Ricezione dal canale seriale Sebbene la funzione read() di Serial non sia sospensiva (restituisce -1 se non ci sono caratteri disponibili in ricezione non è conveniente chiamarla incondizionatamente ad ogni loop perché i tempi di comunicazione seriale sono molto lenti rispetti alla frequenza di loop. La classe Serial è dotata di un metodo available() che restituisce il numero di caratteri disponibili nel bufer di ricezione e consente di chiamare la read() solo quando ci sono caratteri nel bufer. if(serial.available()>0) { rxchar=serial.read(); //azioni sulla ricezione di un carattere 4/8

ESEMPIO DI CODICE Il seguente esempio mostra una implementazione del controller su hardware Intel Edison for Arduino + Grove IoT con ambiente di sviluppo IDE di Arduino Costanti simboliche Le costanti simboliche sono delle defnizioni che consentono di parametrizzare le caratteristiche del sistema come posizioni dei pin di I/O, tipologia dell'hardware, valori da utilizzare nell'algoritmo Definizione delii inleessi Defnisce la posizione del pulsante di comando #define PULSANTE 4 Definizione deiie ssiiee Defnisce la posizione del relay e del led di stato #define RELAY 6 #define STATO 2 Definizione deiiiinleesso anaioliio Una compilazione condizionale consente di commutare rapidamente tra un sensore di temperatura di tipo NTC ed un potenziometro per la simulazione Con la defnzione NTC compila la versione operativa con sensore NTC; commentando la defnizione NTC si compila la versione di test con un potenziometro al posto del sensore. #define NTC #ifdef NTC #define SENSORE A3 //sensore NTC #else #define SENSORE A0 //simulazione con potenziometro su A0 #endif Definizione deiie ioseanei di eiaooeazione Defnisce in modo simbolico le costanti usate dall'algoritmo di elaborazione #define SOGLIA 25.0 #define AUT 0 #define MAN 1 #define INTERVALLO 1000 //soglia di avvio del relay //modo automatico //modo manuale //campionamento diagnostica const float B = 4275.0; //cofficiente moltiplicativo const float R0 = 100000.0; //cofficiente adittivo 5/8

Variabili di stato Le variabili di stato sono variabili statiche che devono mantenere il loro valore in successivi lanci della funzione loop. Queste variabili possono essere defnite variabili globali come in questo esempio oppure possono essere attributi di classi. int oldpuls; //stato precendente del pulsante int stato; //modo automatico (0) o manuale (1) long start; //tempo iniziale dell'intervallo di campionamento int relay; //stato del relay Inizializzazione Nella funzione setup() vengono inserite le azioni da svolgere solo una volta all'avvio del programma come: l'inizializzazione del canale seriale per la diagnostica la confgurazione degli ingressi e delle uscite l'inizializzazione delle variabili di stato Il prompt di diagnostica Iniziaiizzazione dei ianaie seeiaie pee ia dialnoseiia Il canale seriale di default viene aperto per la diagnostica locale Serial.begin(9600); Confilseazione delii inleessi e deiie ssiiee I pin utilizzati dal progetto vengono confgurati in ingresos o uscita pinmode(pulsante,input_pullup); pinmode(relay,output); pinmode(stato,output); Iniziaiizzazione deiie vaeiaoiii di seaeo Le variabili di stato vengono inizializzate al loro valore iniziale oldpuls=digitalread(pulsante); //simula valore prec. Puls. stato=aut; //modo automatico start=millis(); //inizio intervallo di camp. Peompe di dialnoseiia Avvia la diagnostica locale su canale seriale Serial.println("Hackathon SMD18"); 6/8

Ciclo Nella funzione loop() vanno inserite le azioni non sospensive che devono essere ripetute per ottenere l'algoritmo di controllo. Trattandosi di una struttura ciclica non ha importanza l'ordine in cui le varie azioni sono disposte. Aiqsizione deiia eempeeaesea Il valore grezzo (da 0 a 1023) viene acquisito dal canale analogico. In base allo switch di compilazione condizionale può essere applicata la formula di Steinerhart-Hart (proporzionalità inversa dell'ntc) o la mappatura di un potenziometro di simulazione per ottenere il valore di temperatura. Legge di Steinerhart-Hart: inganalog=analogread(sensore); #ifdef NTC float R = 1023.0/((float)ingAnalog)-1.0; R = 100000.0*R; temp=1.0/(log(r/r0)/b+1/298.15)-273.15; #else temp=map(inganalog,0,1023,-100.0,100.0); #endif //sensore NTC //formula //di //Steinerhart-Hart //potenziomatro //mappatura prop. Veeifiia deiia soliia e aeesazione eeia se in aseomaeiio Se lo stato del sistema è in automatico il relay viene pilotato in base al confronto con la soglia. Per evitare indecisioni nello scatto quando la temperatura è intorno alla soglia. Il comando manuale ha la priorità su quello automatico quindi in caso di modo manuale il controllo di soglia non viene efettuato if(stato==aut) { //modo automatico if (temp > SOGLIA + 1.0) { //sopra la soglia relay=high; else if (temp < SOGLIA 1.0){ //sotto la soglia relay=low; digitalwrite(relay,relay); //attiva relay 7/8

Comando mansaie Il comando manuale viene attivato/disattivato in commutazione da successive pressione del pulsante. Se lo stato è automatico una pressione porta il sistema in modo manuale (relay sempre acceso) mentre se lo stato è manuale una pressione porta il sistema in modo automatico (relay comandato dalla soglia). Il riconoscimento della pressione (evento transizione positiva del segnale) viene realizzato confrontando lo stato del segnale nel loop precedente con quello nel loop attuale. Se i due stati sono diversi e se lo stato attuale è HIGH c'è stata una transizione positiva e quindi lo stato viene commutato. int puls=digitalread(pulsante); if((puls!=oldpuls)&&(puls==high)){ if(stato==aut) { stato=man; relay=high; else { stato=aut; relay=low; digitalwrite(relay,relay); digitalwrite(stato,stato); oldpuls=puls; //lettura ingresso attuale //fronte positivo //commuta in MAN //accende //commuta in AUT //spegne //aggiorna stato prec. Dialnoseiia Il loop viene eseguito alla massima velocità possibile ma questo porterebbe ad una presentazione della diagnostica di difcile lettura. I dati diagnostici vengono mandati sulla seriale solo ad intervalli regolari di tempo defniti dalla costante simbolica INTERAALLO (1 secondo nell'esempio) All'inizio di ogni intervallo viene inzializzata la variabile start con il valore corrente di millis(). L'azione di diagnostica viene fatta quando è passato un tempo pari o superiore ad INTERAALLO if(millis()-start> INTERVALLO){ Serial.print("ingr.grezzo: "); Serial.println(ingAnalog); Serial.print("temperatura: "); Serial.println(temp); Serial.print("modo: "); Serial.println(stato); start=millis(); 8/8