didattica, make, outreach

Uno studio sperimentale della fisica dei gas

In uno dei miei ultimi post, mostro come ottenere dati sperimentali da Arduino tramite BLE. Come promesso, discuto ora la raccolta e l’interpretazione di questi dati, nel caso di un esperimento in cui un gas è soggetto a una trasformazione isòcora: un processo in cui la pressione p e la temperatura T possono cambiare, mentre il volume V rimane costante.

L’esperimento è, in effetti, molto semplice. Serve soltanto una scheda Arduino con capacità di connessione Bluetooth, un sensore di pressione e temperatura, una sorgente per alimentare il tutto e un barattolo. Io ho usato un Arduino MKR 1010 WiFi collegato a un sensore BME180. Come fonte di alimentazione ho usato un power bank.

La quantità di gas all’interno del barattolo, una volta chiuso ermeticamente, si può considerare ragionevolmente costante, almeno in un intervallo relativamente ampio di pressioni e temperature. Il contenitore non è, in realtà, del tutto stagno, quindi, quando la pressione interna è troppo alta o troppo bassa, la quantità di gas può variare. Lo stesso può avvenire quando la temperatura diventa troppo bassa o troppo alta. Il significato di basso e alto, qui, come al solito, dipende dal tipo di barattolo (o meglio dall’efficacia della sua chiusura). Anche il volume del contenitore può cambiare, a causa della dilatazione termica. Tuttavia, se l’esperimento è fatto non lontano dalle condizioni normali (p=101,325 kPa e T=20 °C), un barattolo come quello nella foto funziona perfettamente, specialmente se il processo è abbastanza lento.

Nell’esperimento che ho fatto, ho semplicemente messo il barattolo nel frigorifero per un po’, poi l’ho estratto e ho aspettato che termalizzasse con la temperatura ambiente. Il calore, oltre che dall’esterno, è rilasciato anche all’interno del barattolo dall’elettronica. Il che non guasta.

Leggere il BLE
Utilizzando un qualsiasi scanner BLE (ci sono App sia per smartphone che per computer), si può facilmente individuare l’indirizzo del dispositivo, di solito nella forma simile a quella di un indirizzo MAC (ad esempio A5:B3:C2:24:15:16) o a quella di un UUID (ad esempio A8D7A4F1-3D94-4A7D-9D3C-3D17607C3515).

Il codice che segue è stato adattato da un esempio fornito da James Lewis. Dico subito che non sono un esperto di processi asincroni, quindi quanto segue potrebbe non essere del tutto corretto. Se trovate qualcosa di inadeguato, fatemi sapere via e-mail o nei commenti.

Prima di tutto, dobbiamo creare un oggetto che resta in attesa di un evento asincrono (l’evento in questione consiste nella disponibilità di dati da una fonte BLE). Se rilevato, l’oggetto deve procedere ad acquisire i dati disponibili e a registrarli su file. Vediamo come creare quest’oggetto e fare in modo che si attivi all’occorrenza.

import asyncio
address = ("A8D7A4F1-3D94-4A7D-9D3C-3D17607C3515")
if __name__ == “__main__”:
  loop = asyncio.get_event_loop()
  loop.run_until_complete(run(address))

Qui, loop è un oggetto che si può pensare come un ciclo infinito in attesa di un evento. Il ciclo è istruito, nell’ultima riga, a chiamare una funzione che ha l’indirizzo della sorgente dei dati come argomento. Quest’ultimo è una stringa il cui formato è illustrato sopra (in formato UUID se si esegue su MAC o Linux; in formato indirizzo MAC se si esegue su Windows). A sua volta, run() è definita come

from bleak import BleakClient
CH_UUID = "555a0002-0020-467a-9538-01f0652c74e8"
async def run(address):
    async with BleakClient(address) as client:
        x = await client.is_connected()
        await client.start_notify(CH_UUID, notification_handler)
        await asyncio.sleep(600)
        await client.stop_notify(CH_UUID)

Il blocco “async with EXPR as VAR” si può leggere come segue: BleakClient(address) cerca di connettersi all’indirizzo dato. Se ci riesce, le istruzioni del blocco sono eseguite con il client BLE rappresentato dalla variabile client. Le istruzioni chiedono al client di fornire notifiche relative ai dati che hanno CH_UUID come UUID; trascorsi 600 secondi, s’interrompe la ricezione delle notifiche. Ogni volta che sono disponibili nuovi dati s’invoca notification_handler, definita come segue.

def notification_handler(sender, data):
    array = bytearray(data)
    t  = struct.unpack('f', array[0:4])
    p = struct.unpack('f', array[4:8])
    T = struct.unpack('f', array[8:12])
    print(f'{t[0]}, {p[0]}, {T[0]}')
    f = open('pT.csv', 'a')
    f.write(f'{t[0]}, {p[0]}, {T[0]}\n')
    f.flush()
    f.close()

La funzione interpreta i dati, ricevuti dal client BLE, come un array di byte. Estrae i primi quattro byte dall’array e li usa come contenuto della variabile t. Il secondo gruppo di quattro byte è interpretato come un float e assegnato a p, mentre l’ultimo gruppo di quattro byte rappresenta la temperatura T. In effetti, il client, che gira su Arduino, era stato istruito per impacchettare questi tre valori nell’array inviato al dispositivo collegato (vedi il post corrispondente).

Il resto è semplice: i dati sono stampati sullo schermo e registrati in un file chiamato pT.csv, aperto in modalità append.

Analisi dei dati
Una volta raccolti i dati come sopra, possiamo analizzarli leggendo p e V dal file CSV e facendo, per esempio, un grafico della pressione in funzione della temperatura. Il risultato, insieme alla retta che meglio li approssima, è mostrato qui sotto.

Come previsto, la pressione p segue un andamento lineare in funzione del volume V. Trovando la retta che approssima meglio i dati, otteniamo l’intercetta q, che ci permette di stimare lo zero della scala della temperatura assoluta. Infatti, l’equazione di stato di un gas ideale si scrive come pV=nRT, quando T è espressa in kelvin. Se espressa in gradi centigradi (vedi anche questo post per una discussione sulle scale di temperatura), l’equazione si scrive come pV=nR(T+T₀). In questo caso, q=nRT₀/V. Il valore di T₀ si ottiene così da quello di q e dalla pendenza m della retta che è m=nR/V.

Il risultato non è poi così male. Dai nostri dati abbiamo trovato T₀=-265±2 °C, corrispondenti a quattro sigma fuori dal valore noto di -273 °C, ma va detto che l’esperimento è stato fatto con risorse limitate e senza una preliminare calibrazione del sensore. In queste condizioni, una discrepanza di pochi sigma è un ottimo risultato. È tipico degli esperimenti fatti in casa, con mezzi molto semplici e in condizioni poco controllate, che l’incertezza sistematica sia maggiore di quella statistica. Le moderne tecnologie digitali come gli smartphone e Arduino ci permettono infatti di avere dati la cui incertezza statistica è ormai ben al di sotto di quella sistematica (fino a pochi anni fa era l’esatto contrario).

Ulteriori sviluppi
Da qui, si può andare avanti e studiare, per esempio, la reversibilità del processo. A mio avviso questo è un esperimento ancor più interessante di quello presentato, perché il concetto di reversibilità di una trasformazione è spesso malinteso da molti studenti. Se il processo è abbastanza lento, andare avanti e indietro con la temperatura porterà il sistema a seguire la stessa curva (una linea retta) sul piano di Clapeyron (pur in presenza di errori sistematici relativamente grandi, purché non ci siano perdite importanti di gas dal recipiente). Se il cambiamento di temperatura è molto veloce (il che si può ottenere, per esempio, mettendo il barattolo in acqua calda, quando si estrae dal frigorifero), il processo può diventare irreversibile e consistere in una successione di stati che non sono stati di equilibrio. In questo caso la traiettoria sul piano di Clapeyron può essere anche molto diversa.

In un’esperienza del genere diventa chiarissimo che è ancora possibile misurare pressione, temperatura e volume, tuttavia, lontano dall’equilibrio, queste grandezze non soddisfano più l’equazione di stato. Di conseguenza, lo stato del gas non può essere rappresentato da un punto sul piano pV. Questo, infatti, è possibile soltanto perché delle tre grandezze da cui dipende lo stato, una dipende dalle altre due (stiamo supponendo costante la quantità di gas).

2 pensieri su “Uno studio sperimentale della fisica dei gas”

  1. Grazie, molto interessante conoscere queste possibilità odierne utilizzando Arduino ed gli smartphon. Porti pazienza, ma sono uno “studente” pensionato di 71 anni e la fisica mi ha sempre interessato. Cordiali saluti

    Il giorno gio 18 mar 2021 alle ore 12:33 giovanni organtini ha scritto:

    > Giovanni Organtini posted: ” In uno dei miei ultimi post, mostro come > ottenere dati sperimentali da Arduino tramite BLE. Come promesso, discuto > ora la raccolta e l’interpretazione di questi dati, nel caso di un > esperimento in cui un gas è soggetto a una trasformazione isòcora: un pr” >

    "Mi piace"

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...