Creiamo un monitor analogico per gestire le risorse del computer utilizzando nuove funzionalità di Arduino UNO R4 ed un grazioso look retrò.
Questo progetto mira a dare la possibilità di monitorare l’utilizzo dell’hardware senza la necessità di aprire il task manager.
Il concetto è davvero semplice, lo script python verrà eseguito sul nostro computer, raccoglierà i dati, li invierà all’arduino che li visualizzerà attraverso i voltmetri utilizzando PWM, via via che arrivano.
Il programma monitora 6 risorse:
- Utilizzo della CPU in%
- Carico del pistone in %
- Utilizzo della GPU in%
- Temperatura GPU, visualizzazione tra 10° e 90° C
- Carico della memoria della GPU in%
- Utilizzo della ventola della GPU in%
Sarà sufficiente utilizzare voltmetri analogici da 5 V CC poiché è la soluzione più semplice con il PWM. In tal modo sarà possibile misurare la tensione in uscita in percentuale, già calcolata da Arduino (ricordiamo che le uscite PWM digitali di Arduino variano tra 0V e 5V).
Setup
Per prima cosa configureremo lo script Python sul nostro PC.
Installiamo Python sul computer (se non è già presente), Aggiungiamo alcune librerie necessarie:
- psutil
- Pythonnet
- pyserial
Un’altra cosa da impostare nello script Python è il percorso di openHardwareMonitorKib.dll assolutamente necessario affinché funzioni.
Anduamo sul sito web di Open Hardware Monitor e scarichiamo l’utility. Navigando nel file zip troveremo un file chiamato “OpenHardwareMonitoreLib.dll”. Posizioniamolo in una cartella qualsiasi del computer (presumibilmente quella in cui è salvato lo script Python, vedi oltre).
È quindi necessario aggiungere il percorso della libreria nello script sostituendo “C:\path\to\library.dll” nel codice Python riportato di seguito, con il percorso effettivo della libreria sul nostro computer. Ora occorre impostare la porta com corretta a cui è collegato Arduino. Ricordiamo che lIDE di Arduino la fornisce in automatico.
Per comodità, è possibile impostare lo script Python in modo che venga avviato con la tua sessione e senza una console visibile con questi passaggi:
- Cambia l’estensione dello script Python da .py a .pyw
- Premi Windows + r, digita “shell:startup”, premi invio e crea un collegamento al tuo script
Per Arduino basta caricare il codice e collegare i voltmetri ai pin PWM corrispondenti. Dal numero di pin più basso a quello più alto. i pin corrispondono alle seguenti metriche:
- Utilizzo della CPU
- Carico della RAM
- Utilizzo della GPU
- Ttemperature della GPU
- Carico della memoria della GPU
- Utilizzo della ventola della GPU
I numeri dei pin PWM per Arduino UNO R4 Minima sono 3; 5; 6; 9; 10 e 11. E’ possibile utilizzare un differente modello di Arduino (con alimentazione a 5V) e mappare i pin PWM di conseguenza. Colleghiamo poi ciascun voltmetro a terra (gnd) sulla scheda, quindi colleghiamo l’arduino al computer.
Ora dovrebbe essere tutto a posto.
Estensioni
Possiamo stampare alcune scale personalizzate per i voltmetri, per mostrare la percentuale e non i semplici valori di tensione tensione, e dare al monitor un aspetto più professionale. Nei link utili riportiamo un file PDF creato dall’autore del progetto, che contiene le scale utilizzate. Ovviamente ogni voltmetro ha sensibilità (e potrebbe avere dimensioni) differenti, quindi anche in questo caso occorre un minimo di controllo e misura prima di applicare le modifiche sui voltmetri.
Per monitorare altri o più valori, potremo modificare i programmi. La documentazione di psutil offre alcune funzioni aggiuntive.
Di seguito una lista che elenca i diversi sensori GPU e cosa stanno monitorando per la libreria Open Hardware Monitor.
1 2 3 4 5 6 7 8 9 |
sensor 0 : Core Temp sensor 1 : Hot Spot sensor 2 : Fan RPM sensor 3 : Core Clock sensor 4 : Mem Clock sensor 5 : Core Volt sensor 6 : Core Load sensor 7 : Memory Load sensor 8 : Fan % |
Per quanto riguarda il supporto per voltmetro, si parte da un semplice pezzo di legno, ma l’appetito vien mangiando… e già mi aspetto decine di monitor contenuti in teche di plexiglass, o stampate in 3D, o in graziosi contenitori in alluminio.
Infine, ricordiamo che il monitor lavora su una tensione variabile tra 0 e 5V: i più audaci tra voi potranno senza problemi sostituire gli strumenti analogici con una fila di LED pilotati da un integrato 74HC95 (ne parleremo in un prossimo articolo).
Codice sorgente
Il codice è abbastanza semplice. COme anticipato, abbiamo un listato in Python per il PC ed uno in C per Arduino. Vediamoli assieme.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
int ValArray[6]; int PWM[6]={3,5,6,9,10,11}; unsigned long T = 0; void setup() { Serial.begin(9600); } void loop(){ if(Serial.available()>5){ for(int i=0; i<6; i++){ ValArray[i] = Serial.read(); analogWrite(PWM[i], ValArray[i]); } T = millis(); } if(millis()-T>5000){ for(int i=0; i<6; i++){ analogWrite(PWM[i], 0); } while(Serial.available()>0){ ValArray[0] = Serial.read(); } T = millis(); } } |
Il codice su Arduino sei valori posti sul buffer seriale, e scrive il valore direttamente sul relativo pin PWM; come descritto nell’articolo. Le operazioni di lettura e scrittura sono temporizzate con un timer non bloccante ogni 5 secondi.
Vediamo ora il codice Python:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import psutil import time import clr clr.AddReference(r'C:\path\to\lib.dll') import serial ser = serial.Serial() ser.baudrate = 9600 ser.port = 'COM3' ser.timeout = 0 from OpenHardwareMonitor.Hardware import Computer c = Computer() c.GPUEnabled = True c.Open() ser.open() ser.reset_input_buffer() ser.reset_output_buffer() while True: cpuL = int(psutil.cpu_percent()*255/100) ramL = int(psutil.virtual_memory().percent*255/100) c.Hardware[0].Update() gpuL = int(c.Hardware[0].Sensors[6].get_Value()*255/100) c.Hardware[0].Update() gpuT = int(c.Hardware[0].Sensors[0].get_Value()*2.83-28.3) c.Hardware[0].Update() gpuM = int(c.Hardware[0].Sensors[7].get_Value()*255/100) c.Hardware[0].Update() gpuF = int(c.Hardware[0].Sensors[8].get_Value()*255/100) a = (cpuL, ramL, gpuL, gpuT, gpuM, gpuF) for i in a: if i >= 0: val = i.to_bytes(1) ser.write(val) else: ipos = abs(i) val = ipos.to_bytes(1) ser.write(val) time.sleep(.1) |
RIcordiamo che occorre modificare le linee che fanno riferimento alla libreria utilizzata, e alla scelta della porta COM (seriale).
Creiamo l’oggetto c di tipo Computer(), e interroghiamo attraverso il metodo psutil della nostra libreria i valori relativi alle risorse.
Ciacun elemento verrà quindi trasferito ad Arduino attraverso la porta seriale un byte alla volta
Nota: dal momento che ciascuna risorsa restituisce un valore secondo la propria scala, occorrerà eseguire una opportuna conversione per avere un risultato che sia compatibile con la scala scelta sullo strumento analogico.
Link utili:
- Arduino Uno R4
- Custodia Arduino UNO R4
- Arduino UNO R3
- Clone Arduino UNO R3
- Voltmetro analogico 5V 2.5%
- Voltmetro analogico 5 V 1.5%
- Scelta diversi strumenti analogici
- Connettori Dupont M-F
Join our groups on Telegram…