Lo schema allegato mostra come accedere al laboratorio di controllo della temperatura utilizzando la libreria TCLab.
Quaderni Jupyter e script Python: Il livello più alto è costituito dal codice che scrivi per implementare gli algoritmi di controllo. Questa operazione può essere eseguita nei notebook Jupyter/Python, direttamente da Python utilizzando un ambiente di sviluppo come Spyder o PyCharm. Questo repository contiene diversi esempi, lezioni e progetti degli studenti.
TCLab:TCLab è costituito da una libreria Python intitolata “tclab” che fornisce accesso di alto livello a sensori, riscaldatori e un orologio pseudo-in tempo reale. Il pacchetto include la classe TCLab() che crea un oggetto per accedere al dispositivo, un iteratore clock per la sincronizzazione con un orologio in tempo reale, la classe Historian() per creare oggetti per la registrazione dei dati e un Plotter( ) per visualizzare i dati in tempo reale.
Schizzo TCLab: Il repository github TCLab-sketch fornisce il firmware per garantire il funzionamento intrinsecamente sicuro della scheda e dello scudo Arduino. Lo schizzo viene scaricato su Arduino utilizzando l’Arduino IDE. Il caricamento del firmware su Arduino è un’operazione che si effettua una sola volta.
Arduino: La piattaforma hardware per il Laboratorio di Termoregolazione. Gli strumenti e le librerie Python sono stati testati con le schede Arduino Uno e Arduino Leonardo.
Il Temperature Control Lab (TCLab) è un sistema integrato composto da diversi componenti chiave, ciascuno dei quali contribuisce in modo significativo alla sua funzionalità:
Microcontrollore Arduino:
Scopo: Serve come unità di elaborazione centrale per TCLab.
Funzionalità: elabora i dati di input dai sensori di temperatura e gestisce il funzionamento dei riscaldatori.
Connettività: utilizza una connessione USB per il trasferimento dei dati e consente il controllo in tempo reale tramite script Python.
Riscaldatori:
Descrizione: TCLab è dotato di due riscaldatori, ciascuno in grado di generare energia termica regolabile.
Ruolo: Agire come principale fonte di calore per gli esperimenti, replicando scenari che richiedono la regolazione della temperatura. Funzionano come gli attuatori del sistema.
Sensori di temperatura:
Tipo: questi sensori sono termistori, un tipo di resistore la cui resistenza varia con le variazioni di temperatura.
Intervallo di misurazione: in grado di misurare temperature comprese tra $ -40^$C e \(150^\circ\)C.
Funzionalità: posizionato vicino a ciascun riscaldatore per misurare con precisione la temperatura, fornendo un feedback essenziale per il controllo della temperatura.
Dissipatori di calore:
Tipo: Composto da dissipatori di calore a transistor.
Scopo: impiegato per dissipare in modo efficiente il calore lontano dai transistor.
LED (diodo a emissione luminosa):
Scopo: Serve come indicatore visivo per vari stati o azioni, come segnalare l’attivazione di un riscaldatore.
Configurazioni operative di TCLab
TCLab può essere configurato in varie modalità a seconda degli obiettivi formativi:
Ingresso singolo Uscita singola (SISO):
Utilizza solo un riscaldatore e un sensore. Ideale per semplici esperimenti di controllo e per apprendere le basi del controllo della temperatura.
Ingresso singolo Uscita singola (SISO) con disturbo:
Utilizza un riscaldatore/sensore come sistema di controllo primario e il secondo riscaldatore come fonte di disturbo esterno. Questa configurazione è utile per comprendere come i fattori esterni influenzano i sistemi di controllo.
Ingressi multipli Uscite multiple (MIMO):
Implica l’utilizzo simultaneo di riscaldatori e sensori. Questa configurazione più avanzata non è trattata qui ma è utile per studi di sistemi di controllo complessi.
Ogni componente del TCLab svolge un ruolo specifico, rendendolo uno strumento versatile per insegnare e sperimentare vari aspetti dell’ingegneria di controllo. Sia per l’apprendimento fondamentale che per l’esplorazione avanzata, TCLab offre una piattaforma pratica per comprendere la dinamica e il controllo dei sistemi basati sulla temperatura.
Come funziona TCLab
Flusso operativo:
Segnale di ingresso: uno script Python invia un comando ad Arduino, impostando il livello di potenza desiderato per i riscaldatori.
Azione di riscaldamento: i riscaldatori generano calore corrispondente ai comandi del livello di potenza ricevuti.
Misurazione della temperatura: i termistori misurano le temperature risultanti vicino ai riscaldatori.
Ciclo di feedback: queste letture della temperatura vengono inviate al computer.
Regolazioni: l’algoritmo di controllo nello script Python regola la potenza del riscaldatore in base al feedback della temperatura, cercando di raggiungere e mantenere una temperatura target.
[Inserisci qui il diagramma di flusso o il diagramma che mostra il ciclo di feedback]
Schemi TCLab
Configurazione di TCLab
Questa guida fornisce istruzioni passo passo per configurare il Laboratorio di Controllo della Temperatura (TCLab), partendo dall’installazione di Python su diversi sistemi operativi fino alla conduzione dei test iniziali con TCLab e il suo simulatore.
Sezione 1: Installazione di Python utilizzando Conda
Esegui programma di installazione: apri Terminale, vai alla directory contenente il file scaricato ed esegui lo script utilizzando bash Anaconda3-XXXX.sh.
Per verificare che l’ambiente sia stato installato correttamente, è possibile utilizzare:
conda env list
Installazione del pacchetto TCLab
Attivazione dell’ambiente:
Assicurati che il tuo ambiente Anaconda sia attivo. Apri il tuo Terminale (o il prompt di Anaconda su Windows) e attiva il tuo ambiente:
conda attiva tclab_env
Installazione di TCLab:
La libreria tclab si interfaccia con l’hardware del Temperature Control Lab. Installalo inserendo il seguente comando da una finestra (MacOS) o da una finestra di comando (PC):
pip installa tclab
Premi Invio per eseguire il comando e completare l’installazione.
In alternativa, l’installazione può essere eseguita da un notebook Jupyter/Python con il comando
!pip installa tclab
Ci sono aggiornamenti occasionali alla libreria. Questi possono essere installati aggiungendo un --upgrade ai comandi precedenti e dimostrati nella cella successiva.
!pip install tclab --upgrade
Requirement already satisfied: tclab in /Users/andreamunafo/opt/anaconda3/envs/tclab/lib/python3.10/site-packages (1.0.0)
Requirement already satisfied: pyserial in /Users/andreamunafo/opt/anaconda3/envs/tclab/lib/python3.10/site-packages (from tclab) (3.5)
Installazione di librerie utili aggiuntive
Per un’esperienza completa con TCLab e per supportare vari aspetti dell’ingegneria di controllo e dell’analisi dei dati, verranno installate anche le seguenti librerie:
insensibile:
Significato: una libreria fondamentale per i calcoli numerici in Python.
Comando di installazione:
pip installa numpy
matplotlib:
Significato: fondamentale per creare rappresentazioni visive dei dati, in particolare per l’analisi degli esperimenti TCLab.
Comando di installazione:
pip installa matplotlib
scipy:
Significato: fornisce un’ampia gamma di strumenti per il calcolo scientifico, compresi metodi per risolvere equazioni differenziali ordinarie, utili nella modellizzazione dei sistemi.
Comando di installazione:
pip installa scipy
panda:
Significato: offre funzionalità estese per la manipolazione e l’analisi dei dati, ideali per la gestione di set di dati complessi.
Comando di installazione:
pip installa panda
geco:
Significatività: pacchetto avanzato per l’ottimizzazione e il controllo, adatto all’implementazione di strategie di controllo predittivo del modello.
Comando di installazione:
pip installa gekko
Test iniziali con TCLab
Passaggio 1: collega TCLab
Connetti TCLab: collega il dispositivo TCLab al computer utilizzando un cavo USB.
Passaggio 2: testare la connessione TCLab
Scrivi script di prova:
Apri il tuo IDE Python o Jupyter Notebook.
Scrivi il seguente codice Python ed esegui lo script. Se stampa la temperatura, TCLab è collegato correttamente.
import tclabwith tclab.TCLab() as lab:print(f"Connected! Heater 1 is at {lab.T1}°C")
Utilizzo del simulatore TCLab
Perché utilizzare un simulatore: il simulatore TCLab è utile quando non si dispone dell’hardware fisico.
Installa simulatore: nel terminale o nel prompt di Anaconda, digita nuovamente pip install tclab (include il simulatore).
Script di prova con simulatore:
from tclab import setup, clockTCLab = setup(connected=False, speedup=5)with TCLab() as lab:for t in clock(200, 2):print(f"Time {t} seconds. T1: {lab.T1}°C")
TCLab version 1.0.0
Simulated TCLab
Time 0 seconds. T1: 20.949499999999997°C
Time 2.01 seconds. T1: 20.949499999999997°C
Time 4.04 seconds. T1: 20.949499999999997°C
Time 6.03 seconds. T1: 20.949499999999997°C
Time 8.06 seconds. T1: 20.949499999999997°C
Time 10.07 seconds. T1: 20.949499999999997°C
Time 12.02 seconds. T1: 20.949499999999997°C
Time 14.03 seconds. T1: 20.949499999999997°C
Time 16.15 seconds. T1: 20.949499999999997°C
Time 18.04 seconds. T1: 20.949499999999997°C
Time 20.2 seconds. T1: 20.949499999999997°C
Time 22.01 seconds. T1: 20.949499999999997°C
Time 24.19 seconds. T1: 20.949499999999997°C
Time 26.24 seconds. T1: 20.949499999999997°C
Time 28.16 seconds. T1: 20.949499999999997°C
Time 30.03 seconds. T1: 20.949499999999997°C
Time 32.12 seconds. T1: 20.949499999999997°C
Time 34.2 seconds. T1: 20.6272°C
Time 36.04 seconds. T1: 20.949499999999997°C
Time 38.02 seconds. T1: 20.6272°C
Time 40.21 seconds. T1: 20.949499999999997°C
Time 42.14 seconds. T1: 20.949499999999997°C
Time 44.01 seconds. T1: 20.6272°C
Time 46.3 seconds. T1: 20.949499999999997°C
Time 48.22 seconds. T1: 20.949499999999997°C
Time 50.07 seconds. T1: 20.949499999999997°C
Time 52.27 seconds. T1: 20.949499999999997°C
Time 54.09 seconds. T1: 20.949499999999997°C
Time 56.28 seconds. T1: 20.949499999999997°C
Time 58.19 seconds. T1: 20.949499999999997°C
Time 60.04 seconds. T1: 20.949499999999997°C
Time 62.2 seconds. T1: 20.949499999999997°C
Time 64.11 seconds. T1: 20.949499999999997°C
Time 66.08 seconds. T1: 20.949499999999997°C
Time 68.23 seconds. T1: 20.6272°C
Time 70.13 seconds. T1: 20.949499999999997°C
Time 72.07 seconds. T1: 20.949499999999997°C
Time 74.05 seconds. T1: 20.949499999999997°C
Time 76.1 seconds. T1: 20.6272°C
Time 78.1 seconds. T1: 20.6272°C
Time 80.22 seconds. T1: 20.949499999999997°C
Time 82.28 seconds. T1: 20.949499999999997°C
Time 84.22 seconds. T1: 20.949499999999997°C
Time 86.16 seconds. T1: 20.949499999999997°C
Time 88.23 seconds. T1: 20.949499999999997°C
Time 90.0 seconds. T1: 20.949499999999997°C
Time 92.27 seconds. T1: 20.949499999999997°C
Time 94.0 seconds. T1: 20.949499999999997°C
Time 96.16 seconds. T1: 20.949499999999997°C
Time 98.02 seconds. T1: 20.949499999999997°C
Time 100.1 seconds. T1: 20.949499999999997°C
Time 102.24 seconds. T1: 20.949499999999997°C
Time 104.0 seconds. T1: 20.6272°C
Time 106.18 seconds. T1: 20.949499999999997°C
Time 108.27 seconds. T1: 20.949499999999997°C
Time 110.27 seconds. T1: 20.949499999999997°C
Time 112.1 seconds. T1: 20.949499999999997°C
Time 114.22 seconds. T1: 20.949499999999997°C
Time 116.24 seconds. T1: 20.949499999999997°C
Time 118.18 seconds. T1: 20.949499999999997°C
Time 120.19 seconds. T1: 20.949499999999997°C
Time 122.06 seconds. T1: 20.949499999999997°C
Time 124.22 seconds. T1: 20.6272°C
Time 126.19 seconds. T1: 20.949499999999997°C
Time 128.18 seconds. T1: 20.949499999999997°C
Time 130.25 seconds. T1: 20.949499999999997°C
Time 132.02 seconds. T1: 20.6272°C
Time 134.2 seconds. T1: 20.949499999999997°C
Time 136.27 seconds. T1: 20.949499999999997°C
Time 138.01 seconds. T1: 20.6272°C
Time 140.2 seconds. T1: 20.949499999999997°C
Time 142.18 seconds. T1: 20.949499999999997°C
Time 144.2 seconds. T1: 20.949499999999997°C
Time 146.23 seconds. T1: 20.949499999999997°C
Time 148.24 seconds. T1: 20.949499999999997°C
Time 150.19 seconds. T1: 20.949499999999997°C
Time 152.28 seconds. T1: 20.949499999999997°C
Time 154.25 seconds. T1: 20.949499999999997°C
Time 156.23 seconds. T1: 20.6272°C
Time 158.04 seconds. T1: 20.949499999999997°C
Time 160.11 seconds. T1: 20.949499999999997°C
Time 162.04 seconds. T1: 20.949499999999997°C
Time 164.05 seconds. T1: 20.949499999999997°C
Time 166.01 seconds. T1: 20.949499999999997°C
Time 168.23 seconds. T1: 20.6272°C
Time 170.08 seconds. T1: 20.949499999999997°C
Time 172.01 seconds. T1: 20.949499999999997°C
Time 174.14 seconds. T1: 20.949499999999997°C
Time 176.01 seconds. T1: 20.949499999999997°C
Time 178.22 seconds. T1: 20.949499999999997°C
Time 180.2 seconds. T1: 20.949499999999997°C
Time 182.2 seconds. T1: 20.949499999999997°C
Time 184.21 seconds. T1: 20.949499999999997°C
Time 186.08 seconds. T1: 20.949499999999997°C
Time 188.29 seconds. T1: 20.949499999999997°C
Time 190.24 seconds. T1: 20.949499999999997°C
Time 192.18 seconds. T1: 20.949499999999997°C
Time 194.09 seconds. T1: 20.949499999999997°C
Time 196.22 seconds. T1: 20.949499999999997°C
Time 198.26 seconds. T1: 20.949499999999997°C
Time 200.02 seconds. T1: 20.6272°C
TCLab Model disconnected successfully.
Importazione
Una volta installato, il pacchetto tclab può essere importato in Python e un’istanza creata con le istruzioni Python
da tclab importa TCLab
laboratorio = TCLab()
TCLab() tenta di trovare un dispositivo connesso a una porta seriale e restituire una connessione. Se non viene trovato alcun dispositivo viene generato un errore. La connessione deve essere chiusa quando non è più in uso.
La cella seguente dimostra questo processo e utilizza la funzione tclab LED() per far lampeggiare il LED sul laboratorio di controllo della temperatura per un periodo di 10 secondi a un livello di luminosità del 100%.
from tclab import TCLablab = TCLab()lab.LED(100)lab.close()
TCLab version 1.0.0
--- Serial Ports ---
/dev/cu.BLTH n/a n/a
/dev/cu.BlueBeatsStudio n/a n/a
/dev/cu.Bluetooth-Incoming-Port n/a n/a
RuntimeError: No Arduino device found.
Utilizzo di TCLab con l’istruzione with di Python
L’istruzione Python with fornisce un mezzo conveniente per impostare e chiudere una connessione al Laboratorio di controllo della temperatura. In particolare, l’istruzione with stabilisce un contesto in cui viene creata un’istanza tclab, assegnata a una variabile e chiusa automaticamente al completamento. L’istruzione “with” è il modo preferito per collegare il laboratorio di controllo della temperatura per la maggior parte degli usi.
from tclab import TCLabwith TCLab() as lab: lab.LED(100)
Lettura delle temperature
Una volta creata e connessa un’istanza tclab a un dispositivo, è possibile accedere ai sensori di temperatura nel laboratorio di controllo della temperatura con gli attributi “.T1” e “.T2”. Ad esempio, data un’istanza “lab”, si accede alle temperature come
T1 = lab.T1
T2 = lab.T2
“lab.T1” e “lab.T2” sono proprietà di sola lettura. Qualsiasi tentativo di impostarli su un valore restituirà un errore Python.
from tclab import TCLabwith TCLab() as a:print("Temperature 1: {0:0.2f} C".format(a.T1))print("Temperature 2: {0:0.2f} C".format(a.T2))
Impostazione dei riscaldatori
Per motivi tradizionali, esistono due modi per impostare i livelli di potenza dei riscaldatori.
Il primo modo è utilizzare le funzioni.Q1() e .Q2() di un’istanza TCLab. Ad esempio, entrambi i riscaldatori possono essere impostati al 100% della potenza tramite le funzioni
laboratorio = TCLab()
lab.Q1(100)
lab.Q2(100)
Il firmware del dispositivo limita i riscaldatori a un intervallo compreso tra 0 e 100%. È possibile accedere al valore corrente degli attributi tramite
Q1 = lab.Q1()
Q2 = lab.Q2()
Note importanti: 1. Il LED sul laboratorio di controllo della temperatura passa da fioco a luminoso quando uno dei riscaldatori è acceso. 2. La chiusura dell’istanza TCLab spegne i riscaldatori. 3. Il livello di potenza dei due riscaldatori potrebbe essere diverso. Le versioni attuali del firmware limitano la potenza massima del primo riscaldatore a 4 watt e la potenza massima del secondo riscaldatore a 2 watt. 4. Oltre ai vincoli imposti dal firmware, l’alimentatore potrebbe non essere in grado di fornire tutta la potenza necessaria per far funzionare entrambi i riscaldatori al 100% 5. I valori recuperati da queste funzioni potrebbero essere diversi dai valori impostati a causa dei limiti di potenza imposti dal firmware del dispositivo.
from tclab import TCLabimport timewith TCLab() as a:print("\nStarting Temperature 1: {0:0.2f} C".format(a.T1),flush=True)print("Starting Temperature 2: {0:0.2f} C".format(a.T2),flush=True) a.Q1(100) a.Q2(100)print("\nSet Heater 1:", a.Q1(), "%",flush=True)print("Set Heater 2:", a.Q2(), "%",flush=True) t_heat =30print("\nHeat for", t_heat, "seconds") time.sleep(t_heat)print("\nTurn Heaters Off") a.Q1(0) a.Q2(0)print("\nSet Heater 1:", a.Q1(), "%",flush=True)print("Set Heater 2:", a.Q2(), "%",flush=True)print("\nFinal Temperature 1: {0:0.2f} C".format(a.T1))print("Final Temperature 2: {0:0.2f} C".format(a.T2))
In alternativa, i riscaldatori possono essere impostati utilizzando gli attributi “.U1” e “.U2” di un’istanza “TCLab”.
lab = TCLab()print('Setting power levels on heaters 1 and 2')lab.U1 =50lab.U2 =25print('Current power level on Heater 1 is: ', lab.U1, '%')print('Current power level on Heater 1 is: ', lab.U2, '%')lab.close()
Sincronizzazione in tempo reale utilizzando clock
Il modulo tclab include clock per sincronizzare i calcoli in tempo reale. “clock(tperiod, tstep)” genera una sequenza di iterazioni su un periodo di “tperiod” secondi in modo uniforme per “tstep” secondi. Se “tstep” viene omesso, il periodo predefinito è impostato su 1 secondo.
from tclab import clocktperiod =6tstep =2for t in clock(tperiod,tstep):print(t, "sec.")
Ci sono alcune considerazioni da tenere a mente quando si usa clock. Ancora più importante, per sua natura Python non è un ambiente in tempo reale. “clock” fa del suo meglio per rimanere sincronizzato con i tick equidistanti dell’orologio in tempo reale. Se, per qualche motivo, il ciclo resta indietro rispetto all’orologio in tempo reale, il generatore salterà l’evento per tornare in sincronia con l’orologio in tempo reale. Pertanto il numero totale di iterazioni potrebbe essere inferiore al previsto. Questo comportamento è illustrato nella cella seguente.
from tclab import TCLab, clockimport timetfinal =12tstep =2for t in clock(tfinal, tstep):print(t, "sec.")# insert a long time out between 3 and 5 seconds into the event loopif (t >3) and (t <5): time.sleep(2.2)
Utilizzo di clock con TCLab
from tclab import TCLab, clocktperiod =20# connect to the temperature control labwith TCLab() as a:# turn heaters on a.Q1(100) a.Q2(100)print("\nSet Heater 1 to {0:f} %".format(a.Q1()))print("Set Heater 2 to {0:f} %".format(a.Q2()))# report temperatures for the next tperiod seconds sfmt =" {0:5.1f} sec: T1 = {1:0.1f} C T2 = {2:0.1f} C"for t in clock(tperiod):print(sfmt.format(t, a.T1, a.T2), flush=True)
Lo Historian di TCLab
La classe “Historian” fornisce mezzi per la registrazione dei dati. Data un’istanza “lab” di un oggetto TCLab, “lab.sources” è un elenco di tutte le origini dati e i metodi per accedere ai dati.
laboratorio = TCLab()
h = Historian(lab.fonti)
Lo storico inizializza un registro dati. Il registro dati viene aggiornato emettendo un comando
h.update(t)
dove “t” indica l’ora corrente. La cella successiva registra 10 secondi di dati con un livello di potenza variabile nel riscaldatore 1, quindi salva i dati in un file.
from tclab import TCLab, clock, Historianwith TCLab() as lab: h = Historian(lab.sources)for t in clock(10): lab.Q1(100if t <=5else0) h.update(t)h.to_csv('data.csv')
import pandas as pddata = pd.read_csv('data.csv')data.index = data['Time']print(data)data[['Q1','Q2']].plot(grid=True)
Il Plotter di TCLab
La classe “Plotter” aggiunge un tracciamento in tempo reale dei dati sperimentali. Un plotter viene creato da un’istanza di uno storico come segue
h = Historian(lab.fonti)
p = Plotter(h)
Aggiornando il plotter si aggiorna anche lo storico associato.
p.update(t)
L’esempio seguente mostra come funziona.
from tclab import TCLab, clock, Historian, Plotterwith TCLab() as lab: h = Historian(lab.sources) p = Plotter(h, 10)for t in clock(10): lab.Q1(100if t <=5else0) p.update(t)h.to_csv('data.csv')
Utilizzo di TCLab offline
from tclab import clock, setup, Historian, PlotterTCLab = setup(connected=False, speedup=20)SP =40with TCLab() as a: h = Historian(a.sources) p = Plotter(h)for t in clock(120,2): PV = a.T1 MV =100if SP > PV else0 a.U1 = MV p.update()
Version = 1.0.0
Checking connection
-------------------
Looking for Arduino on any port...
--- Serial Ports ---
/dev/cu.BLTH n/a n/a
/dev/cu.BlueBeatsStudio n/a n/a
/dev/cu.Bluetooth-Incoming-Port n/a n/a
No known Arduino was found in the ports listed above.