Ultima modifica:
SCOPO DELLA GUIDA
In questa guida installeremo una ventola (12V ma vanno bene anche 5V e 3.3V*) facendo uso di un Raspberry Pi 3 e anche Pi 2* tramite l'uso della GPIO. Inoltre programmeremo la ventola affinchè si attivi solo se necessario, quindi al raggiungimento di alte temperature.
REQUISITI MINIMI
Per una corretta configurazione del sistema ci occorre:
- Raspberry Pi 2/3
- Ventola PC
- Cavi
- Diodo
- Transistor TIP120
- Breadboard (solo per la prototipazione)
SCHEMA
Per una corretta esecuzione della guida si consiglia di seguire lo schema seguente:
Qui lo schema (grazie a @Dr.Wolf_ )
INSTALLAZIONE DEI SOFTWARE NECESSARI
* In questa guida faremo uso di OSMC come OS principale ma basta essere in grado di collegarsi con SSH al dispositivo e si potrà usare in tutte le altre (Libreelec** e non Debian escluse).
** Purtroppo Libreelec non da il supporto all’apt (che permette di installare i programmi) e l’uso della compilazione è difficoltoso a causa delle restringenti politiche di rooting (non potrete lanciare sudo, quindi non potrete compilare i software se non smanettando nei launcher). Per questo motivo si preferisce una distribuzione Debian che non sia Libreelec o Openelec.
Prima di tutto facciamo il login da root:
Codice:
sudo -s
Effettuiamo un update della distro, così da essere sicuri di utilizzare tutti i programmi all’ultima versione
Codice:
sudo apt-get update -y
Dovreste trovare PIP già installato, il manager di estensioni di Python che ci consentirà di installare i moduli GPIO dell’RPI e quindi programmare le uscite digitali del Raspberry.
Se quindi PIP non è installato procedete al lancio di questi comandi:
Codice:
sudo apt-get install python-pip python-dev build-essential
sudo pip install --upgrade pip
sudo pip install --upgrade virtualenv
Codice:
python get-pip.py
Possiamo ora procedere al recupero di RPi.GPIO utilizzando il comando:
Codice:
pip install RPi.GPIO
Attendiamo che il download finisca…
PROGRAMMAZIONE DELLA VENTOLA
Le uscite del Raspberry possono essere comandate grazie a Python, un linguaggio interpretato molto popolare nella community degli sviluppatori di tutto il mondo.
Per creare il nostro script sarà necessario creare un file con estensione .py . Assicuriamoci però di non fare troppo casino tra le folder, quindi prima di tutto creiamo una cartella:
Codice:
mkdir /home/osmc/Apps
Ora rechiamoci dentro la cartella
Codice:
cd /home/osmc/Apps
E usiamo l’editor nano per creare il nostro file
Codice:
nano controlfan.py
Ora ci troviamo di fronte all’editor di Nano. Se non è tua intenzione capire come funziona il tutto, copia il codice qui sotto (modificando se vuoi i parametri commentati) e salva con CTRL+X quindi INVIO.
Python:
#Simple FAN control with transistor for Raspberry Pi 3
#Author: Stefano Novelli
#Email: [email protected]
#Website: www.inforge.net
import RPi.GPIO as GPIO #importo i moduli di GPIO
import time, subprocess, string #importo altri moduli utili
fanPin = 11 #definisco la porta GPIO che userò per attivare il transistor
maxTemp = 46 #definisco la temperatura massima
GPIO.setmode(GPIO.BOARD) #imposto la lettura dello schema della GPIO a BOARD
GPIO.setup(fanPin, GPIO.OUT) #dico al pin della ventola, quindi 11, che deve lavorare in output
try:
while True: #eseguo un ciclo infinito
out = subprocess.check_output(['opt/vc/bin/vcgencmd','measure_temp']) #ottengo la CPU temp dal tool unix
outx = string.split(out, '=') #esplodo il risultato in un array
outy = string.split(outx[1], "'") #esplodo il risultato in secondo array
temp = float(outy[0]) #converto il valore da stringa a float
if temp > maxTemp: #se la temperatura è raggiunta
GPIO.output(fanPin, 1) #chiudo il circuito attivando il transistor
elif temp <= maxTemp: #se la temperatura non è raggiunta
GPIO.output(fanPin, 0) #riapro il circuito disattivando il transistor
print temp # stampo la temperatura
time.sleep(3) #attendo 3 secondi
except KeyboardInterrupt:
GPIO.cleanup() #ripulisco la cache della GPIO
Per verificare che funzioni correttamente, digita:
Codice:
python controlfan.py
Spiegazione del codice (per chi è qui per imparare!)
Grazie all’infrastruttura UNIX siamo in grado di accedere ai sensori interni del Raspberry. Questa operazione viene effettuata direttamente da vcgenmod, un tool integrato nella maggior parte dei sistemi UNIX based.
Con la funzione subprocess siamo in grado di lanciare il comando vcgenmod, passandogli il parametro measure_temp, per conoscere la temperatura della CPU.
Qui possiamo già testare a quale temperatura viaggia la nostra CPU, nel mio caso ci troviamo sui 48°C in Idle. A breve monterò dei mini-dissipatori, quindi è probabile che scenda di 1-2°C. Terrò quindi la temperatura 47°C come accettabile, al di sopra di essa la mia ventola dovrà avviarsi finché la temperatura non scende.
Riguardo la ventola, per comodità abbiamo usato un transistor anziché un ponte H per questioni di spazio e di comodità per l'alloggio interno successivo, tuttavia se conoscete già il loro funzionamento potrete calibrare il codice affinché la ventola viaggi in percentuale di velocità. Nel nostro caso, un transistor comune è in grado solo di aprire e chiudere digitalmente un interruttore, quindi di sparare la ventola al 100% oppure no. Questo processo viene effettuato mediante il controllo in output del pin 11.
AUTO AVVIO
Se tutto è andato per il verso giusto siamo ora pronti ad inserire lo script all'avvio automatico del Raspberry.
Nelle ultime versioni Debian è stato introdotto systemd che va a sostituire il crontab, quindi prima di tutto dobbiamo creare il nuovo servizio dedicato alla fan:
Codice:
nano /lib/systemd/system/fan.service
Codice:
[Unit]
Description=ControllerFan Raspberry
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/sudo /usr/bin/python /home/osmc/Apps/controlfan.py
[Install]
WantedBy=multi-user.target
Per essere sicuri di non aver problemi con i permessi correggiamoli:
Codice:
sudo chmod 644 /lib/systemd/system/fan.service
Riavviamo per sicurezza i servizi:
Codice:
sudo systemctl daemon-reload
sudo systemctl enable fan.service
Quindi riavviamo il Raspberry:
Codice:
reboot
Ad avvio finito possiamo verificare se ci sono problemi lanciando il comando:
Codice:
sudo systemctl status fan.service
Se ci son problemi chiedete pure!