Control del ventilador RPi3 (RPM según temperatura)

¿Has creado algún proyecto genial con una Raspberry Pi? Este es tu lugar.
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

Holiiii

hace tiempo estoy detrás de controlar las revoluciones del ventilador que le tengo puesto a mi raspberry pi 3, porque al conectarlo directamente a los GPIO va al máximo de revoluciones y es un zumbido de fondo bastante molesto...

Estuve investigando por varios sitios y no he encontrado absolutamente nada para las nuevas, sólo para la primera RPi, al final sirve para todas igual, lo único es que en vez de usar el código en C que he encontrado por ahí (un poco lioso, había que compilarlo, generaba un archivo de configuración...) y que creo que consume un poco más de recursos (si me equivoco, ¡corregidme!), encontré un script que diseñó un chaval, lo he probado y funciona a la perfección, lo personalizas a tu gusto (en qué rango de temperatura quieres que se encienda, se apague...).

En este tutorial voy a partir desde cero (bueno, desde cero cero no, tendréis que tener las herramientas apropiadas, no voy a pasar por la parte de la fabricación de las mismas 8-) )
  • Componentes necesarios para realizar este proyecto:
    1. - Raspberry Pi 1, 2 o 3
    • - Un ventilador para la misma (si puede ser, que no supere los 0.20A)
    • - Soldador de estaño, el estaño, algunos cablecitos o conexiones para los GPIO
    • - Transistor npn (2N3904 es el que he cogido yo para probar, no sé si es el más indicado pero funciona... me recomendaron este porque era para carácter general)
    • - Y cómo no, el script.
Procedemos a ir cortando cables, soldando y demases:

Imagen

Este es el esquema del transistor, hay que tener en cuenta el cómo conectar las patillas, ya que podemos hacer un estropicio si no las conectamos bien.
  1. 1. En la patilla E debemos conectar el GPIO tierra o GND.
  • 2. En la patilla B debemos conectar el GPIO 18 (es el único que tiene control PWM) con el cual excitaremos la base del transistor para ponerlo en corte y establecer una frecuencia determinada para así hacer que el ventilador varíe sus RPM basándonos en la temperatura interna medida en el procesador.
  • 3. En la patilla C debemos conectar el polo negativo de nuestro ventilador (o cable negro).
  • 4. Y ¿qué hacemos con nuestro polo positivo del ventilador? Pues conectarlo directamente al puerto GPIO de +5V
Con todo esto preparado, ya podremos conectar el ventilador a los correspondientes puertos GPIO:

Imagen

Los cables ya soldados al transistor quedarían de la siguiente forma:

Imagen

Ya sólo queda enchufar nuestra RPi y mediante SSH o cómo uno quiera, copiar el siguiente script:

Código: Seleccionar todo

#!/bin/bash

#Define GPIO pin 18 as PWM
gpio -g mode 18 pwm

#Always num = 0
num=0
while [ $num = 0 ]; do

# What's the CPU temp?
temp=$(cat /sys/class/thermal/thermal_zone0/temp)
temp=$(($temp/1000))

#Show the temperature
clear
printf "Temperatura: $tempºC\nVentilador activado."

# Variable temperature control
if

[ $temp -gt 40  ] && [ $temp -lt 69 ];
then
vartemp=$(echo $[temp * 13])
gpio -g pwm 18 $vartemp

# Maximum fan RPM
elif
[ $temp -ge 69 ];
then
gpio -g pwm 18 1024

# Switch off the fan
else
gpio -g pwm 18 0
clear
printf "Temperatura: $tempºC\nVentilador parado."
sleep 60
fi

#Pause 1 second
sleep 1

done
exit 0
Yo mediante SSH, para probarlo lo he puesto en la misma carpeta del usuario simplemente haciendo:

Código: Seleccionar todo

nano
(copiamos todo el código)
Ctrl+X
S
(Y le damos el nombre) fancontroller
Tras esto, comprobamos que tenemos el archivo creado en la carpeta del usuario mediante

Código: Seleccionar todo

ls
Si está procederemos a ejecutarlo:

Código: Seleccionar todo

bash fancontroller
Si os da error en la línea 24, tal vez no tengáis instaladas las librerías, a mi se me solucionó con:

Código: Seleccionar todo

sudo apt-get purge wiringpi
sudo apt-get install wiringpi

he intentado ejecutarlo en segundo plano para tener el terminal SSH libre pero no he podido :enserio?

Y listo, quiero añadirle que se inicie cuando la RPi se encienda o se reinicie pero es otro tema a investigar, igual que modificar el script a mi gusto para ponerle tramos de temperatura personalizados o incluso optimizar más el script.

Fuente: http://www.retrowiki.es/fororw/viewtopi ... 81&t=31285
Última edición por Haru Ijima el 10 Sep 2017, 19:19, editado 3 veces en total.
Estos usuarios agradecieron al autor Haru Ijima por el mensaje:
masilvad
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

Gran tutorial. Seguramente que en un tiempo necesite montar justo esto que muestras y además siendo los pines de la Orange Pi similares, me vendrá de perlas. :shock:

Una cosa por si te ayuda, para mantener los procesos en segundo plano, usa el comando screen del siguiente modo:

Código: Seleccionar todo

screen -dmSL fancontrol ./fancontroller
Explico por partes:

Código: Seleccionar todo

screen -dmSL [nombre de la sesión] [comando en segundo plano]

Código: Seleccionar todo

-d Inicia un screen y después te saca de este.
-m Inicia sesión de manera forzada.
-S Te permite establecer un nombre de la sesión.
-L Te permitirá conectar mas tarde a esta sesión
Una vez inicie el proceso, aparecerá en la lista de los que están iniciados, podrás verlo con el comando "top" mismamente.

Para ver todas las screen abiertas usa:

Código: Seleccionar todo

screen -ls
Luego para entrar en esta screen, utiliza (sin corchetes):

Código: Seleccionar todo

screen -r [nombre asignado a la screen]
o sino puedes ver el fichero log que va dejando con:

Código: Seleccionar todo

less -r ~/screenlog.0
Un saludo y gran post. :admirar
Avatar de Usuario
Kike
Administrador
Administrador
Mensajes: 2311
Registrado: 13 May 2016, 18:53
Ubicación: Islas Baleares - Menorca
Agradecido: 47 veces
Agradecimiento recibido: 175 veces
Contactar:

Imagen

Sin palabras @Haru Ijima y @Aerz , vaya currazo os estais pegando! Sin gente como vosotros esto no sería posible :love
Si lo puedes soñar, lo puedes hacer
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

Aerz escribió:Gran tutorial. Seguramente que en un tiempo necesite montar justo esto que muestras y además siendo los pines de la Orange Pi similares, me vendrá de perlas. :shock:

Una cosa por si te ayuda, para mantener los procesos en segundo plano, usa el comando screen del siguiente modo:

Código: Seleccionar todo

screen -dmSL fancontrol ./fancontroller
Explico por partes:

Código: Seleccionar todo

screen -dmSL [nombre de la sesión] [comando en segundo plano]

Código: Seleccionar todo

-d Inicia un screen y después te saca de este.
-m Inicia sesión de manera forzada.
-S Te permite establecer un nombre de la sesión.
-L Te permitirá conectar mas tarde a esta sesión
Una vez inicie el proceso, aparecerá en la lista de los que están iniciados, podrás verlo con el comando "top" mismamente.

Para ver todas las screen abiertas usa:

Código: Seleccionar todo

screen -ls
Luego para entrar en esta screen, utiliza (sin corchetes):

Código: Seleccionar todo

screen -r [nombre asignado a la screen]
o sino puedes ver el fichero log que va dejando con:

Código: Seleccionar todo

less -r ~/screenlog.0
Un saludo y gran post. :admirar
Muchas gracias ^^ con el tiempo y según vaya investigando iré actualizando el tema para que en el primer mensaje esté todo recopilado y algo mejor estructurado, lo he hecho así porque lo tengo realmente fresco, pero al fin lo conseguí :claroclaro
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

Kike escribió:Imagen

Sin palabras @Haru Ijima y @Aerz , vaya currazo os estais pegando! Sin gente como vosotros esto no sería posible :love
Esto se merece una conmemoración especial, algo dijiste cuando implementaste los me gusta y el ranking... *guiño guiño*
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
wat3r
Pi Omega
Pi Omega
Mensajes: 97
Registrado: 16 Ago 2016, 06:49
Agradecido: 0
Agradecimiento recibido: 1 vez

Muy buen tutorial para gestionar la velocidad del ventilador de la carcasa. Muy bueno si señor, es como la placa base de mi pc de sobremesa hace exactamente lo mismo. Buen trabajo

Enviado desde mi SM-G900F mediante Tapatalk
Avatar de Usuario
xxmonti
Pi Master
Pi Master
Mensajes: 257
Registrado: 19 May 2016, 10:05
Agradecido: 0
Agradecimiento recibido: 0

Mis dies, seguro que me hace falta algún día ;)
Imagen
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

@Aerz Se me olvidó preguntarte, ¿sabrías cómo poner el script para que al arrancar o reiniciar la raspberry se ejecute? Gracias de antebrazo :xd
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

Haru Ijima escribió:@Aerz Se me olvidó preguntarte, ¿sabrías cómo poner el script para que al arrancar o reiniciar la raspberry se ejecute? Gracias de antebrazo :xd
Pues eso en concreto nunca lo he tenido que hacer. Lo más parecido es que en caso de que ese screen haga crash, que levante de nuevo el proceso con un script que se encarga de que este el screen siempre activo. En este caso no es lo mismo, pero he encontrado esto:

1. Creamos un init script (los corchetes significa el nombre que quieras):

Código: Seleccionar todo

sudo nano /etc/init.d/[fancontrol]
2. Añadimos la ruta a el fichero dentro:

Código: Seleccionar todo

#!/bin/sh
/ruta/para/el/script/del/fan/control/script.sh
3. Cambiamos los permisos a ejecutable:

Código: Seleccionar todo

chmod ugo+x /etc/init.d/[fancontrol]
4. Lo marcamos como script que cargar nada mas iniciar el sistema:

Código: Seleccionar todo

update-rc.d [fancontrol] defaults
Avisame si te funciona, yo me voy a poner ahora a montar esto mismo con un ventilador de 12V que tenía por casa, ahora te cuento si funciona todo lo que has puesto y esto que te estoy escribiendo ahora. :ponpon

Fuente: http://askubuntu.com/questions/228304/h ... t-start-up
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

:D

Lo probaré cuando esté por casa, cómo le vas a poner el ventilador de 12V?
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

Haru Ijima escribió::D

Lo probaré cuando esté por casa, cómo le vas a poner el ventilador de 12V?
Ya lo tengo funcionando pero al máximo de rpm. Tenía por casa el ventilador de unas placas antiguas, es de 80x80mm y además tenía su propia base, así que me ha venido perfecto. Además hace tiempo tenía un disco duro externo que dejó de funcionar la placa que llevaba dentro de la carcasa, saqué el disco y lo monte directamente en el ordenador y como ese disco duro externo se alimentaba con un cable que iba a la corriente y era de 12V, lo he aprovechado para soldar y conectarlo al enchufe.

El transformador de corriente:
31dNJNs5QCL._SY355_.jpg
31dNJNs5QCL._SY355_.jpg (8.25 KiB)
Ahora estoy esperando el transistor que has puesto, que espero que tarde poco por correos y voy a intentar bajar el voltaje de ese ventilador en un futuro con otro transistor que he visto (referencia: L7805CV) que permite bajar a 5V todo lo que le enchufes hasta 35V. Porque la verdad prefiero que vaya a la placa directamente, me parece más cómodo. :admirar
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

Ooooohhh, interesante el transistor ese! (voy a ahorrarme lo de citar por el momento hasta que Kike arregle la etiqueta de hiddenspoiler, así podré ocultar las menciones y es mas cómodo...) Yo el otro día fui al punto limpio a tirar un montón de cosas que había en casa y de paso fui al contenedor de electrónica a desmontar routers y quedarme con los disipadores (acojonante, de 5 que desmonté solo pillé 1, había un router de movistar de los últimos y sólo tenía una placa de metal encima, más plana que una tabla de planchar y yo wtf) y me encontré una carcasa de disco multimedia, le quité el ventilador que va a 12V pero es del mismo tamaño que los que venden para la rpi xD creo que se lo pondré a mi router porque últimamente pega unos calentones... y eso que le puse un disipador más grande y pasta térmica...

Bueno, que me desvío del tema xD Pasa foto cuando lo montes si eso! Yo tengo pendiente poner fotos de mi rpi3, que le hice los disipadores a medida y tal...
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

@Haru Ijima Pues sí, creo que va a ser más cómodo por ahora ir usando las menciones por ejemplo. Es que el anterior mensaje que habías puesto lo he visto un poco de rebote. :xd

Cuando monte el transistor y termine la guía que has puesto con todo subo alguna fotito para hacer album. :victoria :victoria Veamos si alguno más se anima.
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

@Aerz Desde luego es algo super útil, las pocas veces que he encendido la rpi para trastear e ir mirando una imagen que me guste (openelec y libreelec no puedo instalar nada con apt-get o cualquier comando así especial y no me ha gustado) para hacer un media center al poco rato me volvía loco con el ruidito del ventilador a tope de rpm, ahora mucho mejor, se mantiene fresquita cuando lo necesita y todos contentos :P
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
botica
Pi Beta
Pi Beta
Mensajes: 180
Registrado: 28 Jun 2016, 08:29
Agradecido: 0
Agradecimiento recibido: 0

Supongo que lo suyo sería un daemons que se ejecute al inicio como los que saltan al iniciarla (pulsar, quasar, transmission,...)

¿Como? Pues ahí me pierdo. Estudiar ing informática para trabajar de algo que no esté relacionado con la programación hace que me de asco programar.
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

botica escribió:Supongo que lo suyo sería un daemons que se ejecute al inicio como los que saltan al iniciarla (pulsar, quasar, transmission,...)

¿Como? Pues ahí me pierdo. Estudiar ing informática para trabajar de algo que no esté relacionado con la programación hace que me de asco programar.
Pues la verdad es que te entiendo pero desde hace algunos meses me he dado cuenta lo infinitamente útil que puede ser la combinación de electrónica + programación. Dejando a un lado los muchísimos pequeños inventos pequeños para la casa que se te podrían ocurrir (tipo domótica). Se puede llegar a crear proyectos del tipo: https://thewolfe.io/
Un proyecto curioso cuanto menos y que en mi caso porque no tengo pensado jugar con un portatil, pero a mas de una persona le parecerá una buena idea. :mrgreen: :mrgreen:
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

@Haru Ijima Me ha llegado justo hoy la bolsita con los transistores. Sin más, lo he soldado sin pensar y... todo mi gozo en un pozo. :helado :enserio? :tambor :enfadado
Cuento por partes:
  • Lo primero según he mirado (al menos lo que llevo mirado), las Orange Pi tratan de hacer que los pines sean parecidos a las Raspberry Pi, pero no son lo iguales. En concreto se supone que ningún pin admite trabajar con PWM (Pulse width Modulation), es decir que ninguno hace de variador de la tensión.
  • Luego me he dado cuenta de que estoy usando un ventilador de 12V y la placa solamente da salida con un máximo de 5V, estoy tonto definitivamente, aunque con un apaño haciendo que el circuito cerrado vaya de la Orange Pi al cable y retorne, puede que funcione, pero no voy a ponerme con ello por ahora. :fumando
  • Por último me he dado cuenta de que los transistores funcionan obligatoriamente dentro del mismo circuito. En mi caso la base del transistor va a la Orange Pi pero el Emisor y Colector están conectados al enchufe directamente. Al no ser la misma tierra, en principio no debería de funcionar, menudo error por mi parte.
Creo que optaré por meterle al circuito o bien un termistor (resistencia varible a la temperatura) que quede bien pegado al procesador. O bien un potenciómetro de los que hay por casa para regular el ventilador al punto de que no haga ruido e ya. :?

En fin, si a alguien se le ocurre alguna idea mejor ¡que avise! :tambor
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

Vaya por dios... lo suyo sería hacer otro tuto para el que consiga hacerlo en una OPi, así todo mejor xD
No he indagado en el tema ya que no tengo OPi, pero a las malas puedes pillarte un ventilador de 5V...

Acabo de ver que el CON3 tiene PWM pero no entiendo mucho ya que le he echado un ojo nada más...

http://www.orangepi.org/Docs/Pindefinition.html
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Haru Ijima
Pi Beta
Pi Beta
Mensajes: 108
Registrado: 14 Jun 2016, 18:29
Ubicación: Granada
Agradecido: 0
Agradecimiento recibido: 1 vez
Contactar:

Aerz escribió:
botica escribió:Supongo que lo suyo sería un daemons que se ejecute al inicio como los que saltan al iniciarla (pulsar, quasar, transmission,...)

¿Como? Pues ahí me pierdo. Estudiar ing informática para trabajar de algo que no esté relacionado con la programación hace que me de asco programar.
Pues la verdad es que te entiendo pero desde hace algunos meses me he dado cuenta lo infinitamente útil que puede ser la combinación de electrónica + programación. Dejando a un lado los muchísimos pequeños inventos pequeños para la casa que se te podrían ocurrir (tipo domótica). Se puede llegar a crear proyectos del tipo: https://thewolfe.io/
Un proyecto curioso cuanto menos y que en mi caso porque no tengo pensado jugar con un portatil, pero a mas de una persona le parecerá una buena idea. :mrgreen: :mrgreen:
T_T Pero es por thunderbolt... me gustaría ponerle algo así a mi portátil pero lo único que he visto es una pieza por 40€ o así que hay que enganchar al puerto PCI-E donde va el wifi...
Haru - Desarrollador de aplicaciones web

Código: Seleccionar todo

while (true) {
    echo 'Holiiiii';
}
[/size]
Avatar de Usuario
Aerz
Pi Omega
Pi Omega
Mensajes: 88
Registrado: 02 Ago 2016, 00:26
Agradecido: 5 veces
Agradecimiento recibido: 1 vez

Haru Ijima escribió:Vaya por dios... lo suyo sería hacer otro tuto para el que consiga hacerlo en una OPi, así todo mejor xD
No he indagado en el tema ya que no tengo OPi, pero a las malas puedes pillarte un ventilador de 5V...

Acabo de ver que el CON3 tiene PWM pero no entiendo mucho ya que le he echado un ojo nada más...

http://www.orangepi.org/Docs/Pindefinition.html
He seguido mirando más a fondo y si existe, solo que está separado de los 40 pines ya que es el mismo pin que se usa para la conexión serial y está separado, según he leido en: http://www.orangepi.org/orangepibbsen/f ... d&tid=1153
El autor del tema comenta que ha probado a usar la función de pwm para unos LED que parpadeaban y además ha hecho un ejemplo práctico en C para hacerlo de funcionar. La parte mala viene cuando comenta que WiringPi no soporta estos pines de forma correcta y que el sistema tampoco configura los pines en la carpeta /dev. Entonces con los valores hexadecimales lo logra hacer y además adjuntan más abajo el documento con toda la información del hardware en: http://linux-sunxi.org/H3 lo cual para el que sepa, podría hacerlo funcionar todo perfectamente. Pero la verdad es que yo a ese nivel no llego por ahora.

Ya veré si me animo a mirarme mas el tema o que, pero bueno... gracias por mirarlo un poquito por encima. :roll:
Responder