NOTA Questo articolo è molto vecchio in quanto ora si possono avere a disposizione estensioni di Scratch che fanno uso di dispositivi come microbit capaci di captare segnali di ambiente adatti ad un data logging. Lo lascio perché adatto a mostrare il funzionamento di un data logger.
Un data logger con Scratch? Ma un data logger non è un registratore di dati variabili? quali dati raccoglie Scratch?
In effetti costruire con il software di Scratch un data logger non è scontato: Scratch non possiede veri e propri sensori che prelevano segnali dall'esterno ad esclusione del microfono (a meno che non si usi la scheda Picoboard o qualcosa di simile).
(Per realizzare un'esercitazione con Scratch si potrebbero attivare i sensori disponibili (quelli in blu) utilizzando il mouse o il microfono. Non li ritengo adatti perchè ci vuole attività da parte di qualcuno per spostare il mouse o per variare il suono e il data logger è un apparecchio utile proprio perchè registra in assenza di persone addette al compito).
Propongo allora di usare un trucco: usare tra gli operatori disponibili dal pannello dei comandi di Scratch, una funzione adatta allo scopo in modo che col passare del tempo si modifichi un valore di una variabile in uscita che sarà letto ed elaborato dal data logger. La proposta non è così strampalata, con pochissime modifiche il programma sarà adattato per funzionare con Picoboard o con Arduino usando S4A.
La figura sopra mostra il risultato di questa idea:
- viene prodotto un grafico sinusoidale a partire dal tempo scandito da un cronometro (nel piccolo riquadro blu in alto a sinistra si notano i secondi contati),
- si vedono, in due riquadri arancione in alto a sinistra, i valori assunti dal segnale generato e dalla misura, un valore correlato al segnale
- a destra si vedono i valori assunti dalla variabile tempo, dal periodo di campionamento e dall'ascissa x (in arancio a destra al centro),
- ed una lista dei record, cioè dei valori campionati (in alto a destra).
Per realizzare un data logger usando Scratch occorrono:
- un generatore di segnale per produrre in qualche modo, entro Scratch, segnali lentamente variabili che simulano la grandezza ambientale che si vuole misurare
- una sonda per captare il segnale, essa provvede anche ad amplificare il segnale per renderlo trattabile dal registratore
- un registratore per conservare i valori misurati nella memoria ad intervalli regolari di tempo
- un plotter per disegnare il grafico del segnale come output del data logger
- un controllore per coordinare tutte le funzioni
Il segnale di ambiente deve essere lentamente variabile perchè viene misurato, e memorizzato, solo "ogni tanto" a seconda del periodo di campionamento scelto che può essere di pochi secondi ma anche di parecchi minuti o ore.... Il grafico, poi, viene disegnato facendo delle approssimazioni per gli istanti intermedi fra due campionamenti sucessivi in quanto si userà un'interpolazione lineare.
Il generatore di segnale f(t).
- creare un nuovo sprite che viene denominato generatore di segnale (il disegno non ha importanza, serve per illustrare ma non preclude il corretto funzionamento e si può nascondere)
- il tempo viene introdotto con l'uso di cronometro, elencato fra i sensori (il cronometro parte da 0 ogni volta che si apre Scratch o quando viene appositamente azzerato, e prosegue indefinitamente fino a quando si chiude l'applicazione); cronometro scandisce i secondi con la precisione del decimo, con la spunta se ne osserva il valore nell'area dello stage.
- realizzare il generatore di funzione con sin(x) che è una grandezza trigonometrica periodica che ha bisogno di un argomento che sarà proprio il cronometro; sin si preleva dall'elenco degli operatori
- in Scratch l'argomento di sin è in gradi; se si usa "cronometro" come argomento, la funzione sin completa un periodo dopo 360 gradi, quindi dopo 360 secondi: cioè ci vogliono 6 minuti per vedere la funzione seno completare il ciclo .... per il nostro caso va bene, non mi pare utile fare durare troppo tempo questo esercizio anche se i data logger sono fatti per periodi molto più lunghi.
- il valore generato sarà una variabile che viene creata tra le variabili e denominata "segnale"; il suo valore oscilla tra -1 e +1;
- con un ciclo "per sempre" si aggiorna continuamente il valore del segnale
- si può osservare il valore assunto dal segnale attivando la sua casella di spunta
Video dimostrativo.
- creare un nuovo sprite che viene denominato "sonda"
- creare la variabile denominata "misura" e spuntare la casella per renderla visibile nello stage
- realizzare la "cattura" del segnale e fare in modo che il segnale di ambiente diventi la misura da usare per le registrazioni. La sonda, così facendo, capta il segnale, lo "aggancia", lo elabora e lo mette a disposizione del registratore come dato per essere a sua volta catturato dal generatore (nota 1)
- amplificare il segnale di 100 volte (e arrotondare per non registrare troppi decimali)
- usare un ciclo "per sempre" in modo che sia sempre disponibile un valore aggiornato in uscita dalla sonda e quindi all'ingresso del registratore, come è stato fatto per il generatore.
video dimostrativo
Per registrare i dati usa la variabile lista. Una lista è un elenco di valori che vengono registrati con il comando "nuova lista"
- creare un nuovo sprite denominato "registratore"
- creare una nuova lista denominata "record"; appena viene creata diviene subito visibile sullo stage pronta a registrare i dati uno dopo l'altro, basta "dirglielo"
- quando è il momento, prelevare il dato misurato e aggiungerlo nella lista
video dimostrativo
In aggiunta possiamo subito mostrare i valori "catturati" in un grafico disegnato sullo stage.
- creare un nuovo sprite denominato "plotter"
- assegnare la posizione iniziale in modo che il disegno parta dall'estremità sinistra dello stage (x=-220)
- scrivere lo script per il disegno di un segmento ed un avanzamento progressivo lungo l'asse x che è il passo con cui procede il disegno del grafico che qui è rappresentato dalla variabile tempo ed è fissato a 1; con altri valori, cambia la scala lungo l'asse x, che è poi l'asse dei tempi
Al termine del lavoro compare il quadro degli strumenti così composto:
uno sprite per produrre il segnale,
uno sprite per catturare il segnale ed elaborarlo,
uno sprite per registrare i dati in una mamoria
uno sprite per disegnare il grafico
video dimostrativo
Il tutto funziona solo se c'è un coordinamento delle funzioni, ovvero degli strumenti che devono essere sincronizzate da un orologio (clock) unico
a partire da un setup di inizializzazione
ed un loop di ripetizione dei comandi
Quesa funzoine viene esercitata dal controllore.
Infatti occorre impostare il coordinamento di tutti gli sprite affinchè provvedano a
- inizializzare le variabili, il grafico e gli strumenti: invia a tutti (inizio)
pulire lo schermo e azzerare la lista
mostrare lo schema degli strumenti sullo stage
- attivare gli strumenti generatore e sonda affinchè siano pronti invia a tutti (pronto)
eliminare lo schema degli strumenti
portare il plotter all'inizio del quadro
disegnare gli assi di riperimento
impostare il periodo di campionamento
- ripetere (loop)
una sequenza di comandi inviati a tutti gli sprite
per campionare e registrare il dato
per disegnare il nuovo segmento
e per attendere il tempo previsto prima di ripetere la registrazione (periodo di campionamento)
Nello script viene impostato il numero di ripetizioni di alcune istruzioni con ripeti 440 volte
(lo spazio grafico prevede 480 valori di x (da -240 a +240); è stato scelto di inziare a disegnare il grafico a partire da x=-220 e di finirlo a x=+220 per essere sicuri che non ci siano valori finiti fuori schermo)
Fissato il numero di dati da raccogliere (440) ed utilizzando il passo di disegno o scansione, cioè l'incremento della variabile x, con valore=1, il disegno occuperà tutta l'area.
(attenzione perciò a cambiare passo e numero di ripetizioni; per sfruttare sempre tutta l'area, il prodotto scansione*ripetizioni deve sempre valere 440)
La variabile periodo, invece, influisce sulla scala del grafico; aumentando il periodo si avrà un grafico più compresso nel tempo. Se si tratta di un segnale periodico, verranno disegnati più periodi.
Lo script invia diversi comandi "invia a tutti" che vengono ricevuti dagli sprite con la funzione "quando ricevi" ed eseguiti; in questo modo i compiti sono sincronizzati ed assicurano il funzionamento ordinato di tutto l'apparato
Lo script contiene il tempo di ritardo (nota 2) che rappresenta il periodo fra due misurazioni successive che è contenuto nella variabile "periodo" che viene fissato prima di fare girare il programma; così si realizza il campionamento della misura come desiderato.
Il progetto intero è qui con la scheda descrittiva.
Esperimenti
Con questo progetto sono possibili molti esperimenti di valore didattico:
- modificare la scansione per vedere parti di grafico o per esaminare più periodi consecutivi
- modificare la durata del periodo di campionamento per ottenere lo stesso effetto
- modificare il fattore di amplificazione
- modificare l'espressione di calcolo della misura usando altre funzioni
- usare altre funzioni periodiche o loro combinazione (somma, potenza, prodotto, prodotto con sfasamento ... )
- inventare nuove funzioni periodiche
Sviluppi
Il progetto può essere migliorato in diversi modi:
- mostrare o nascondere i valori e gli sprite a seconda della fase di lavoro
- modificare la posizione dell'origine degli assi per adattarlo ad altri tipi di misure (per esempio nel caso ci siano valori sempre positivi così da sfruttare tutta l'altezza dello stage
- inserire all'avvio una serie di dialoghi per scegliere alcuni valori come: il periodo di campionamento, il passo di avanzamento del plotter, la posizione dell'origine degli assi
- modificare lo script dello stage per sovrapporre più grafici (con colori diversi) per il caso in cui ci siano tempi molto lunghi da monitorare
- modificare il progetto per il caso di più segnali da monitorare contemporaneamente o in tempi diversi
- utilizzare il cronometro per assicurare il periodo a valori esatti anzichè affidarsi al ritardo (che è un'attesa che si aggiunge ai tempi di elaborazione delle altre istruzioni producendo un errore nel periodo con un ritardo che si accumula)
- aggiungere il calcolo di valori medi e altre statistiche
Lo schema sarà utilizzato per un vero data logger realizzato con Picoboard ed S4A.
Nota
1) si usa catturare ed agganciare perchè la conversione da analogico a digitale dello ADC impiega sempre del tempo, magari molto poco, ma mai infinitesimo o nullo per cui i valori analogici non sono mai rappresentabili con continuità. Anzi sarebbero in numero infinito e quindi non sarebbero nemmeno memorizzabili a causa della quantità eccessiva di memoria necessaria (appunto infinita). Il periodo di campionamento della sonda è indipendente dal periodo di campionamento del data logger.
2) In questo esempio non ci curiamo della precisione della cadenza di misura e dell'elaborazione dei dati.