{"id":240981,"date":"2023-11-27T11:41:18","date_gmt":"2023-11-27T10:41:18","guid":{"rendered":"https:\/\/emariete.com\/?p=240981"},"modified":"2023-12-03T21:47:53","modified_gmt":"2023-12-03T20:47:53","slug":"fan-speed-variable-raspberry-pi","status":"publish","type":"post","link":"https:\/\/emariete.com\/en\/ventilador-velocidad-variable-raspberry-pi\/","title":{"rendered":"Tutorial: Temperature-controlled variable speed fan for Raspberry Pi"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u00bfQuieres, como yo, <strong>reducir el ruido del ventilador de la Raspberry Pi<\/strong> (o incluso eliminarlo)? Si es as\u00ed, aqu\u00ed te traigo la soluci\u00f3n definitiva a nuestros problemas de ruido: el ventilador de velocidad variable para Raspberry Pi. Una soluci\u00f3n f\u00e1cil y barata (un par de euros).<\/p>\n\n\n\n<p class=\"has-global-color-8-background-color has-background wp-block-paragraph\">Este tutorial <strong>va acompa\u00f1ado de un video<\/strong>, que te dejo m\u00e1s adelante, para que te resulte muy sencillo seguirlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siguiendo este tutorial, vas a poder construir, con muy pocos componentes, un peque\u00f1o controlador para que la Raspberry Pi regule la velocidad de su ventilador dependiendo de su temperatura y lo completaremos con un peque\u00f1o programa en Python que haga el trabajo de supervisi\u00f3n y control.<\/p>\n\n\n<div class=\"gb-container gb-container-f70ece6b\">\n\n<p class=\"wp-block-paragraph\">Siempre que escribo un art\u00edculo en el blog mi m\u00e1xima prioridad es <strong>que aporte valor para al lector<\/strong>, que realmente aporte conocimiento. No escribir art\u00edculos vac\u00edos que simplemente tocan un tema por encima con informaci\u00f3n que ya est\u00e1 por todo internet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00bfPor qu\u00e9 he escrito este tutorial sobre c\u00f3mo poner un ventilador de velocidad variable para Raspberry controlado por temperatura, cuando ya hay muchos por internet?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Porque los art\u00edculos que he encontrado me han parecido demasiado parciales, o no me parec\u00eda que explicaran bien las bases, de una forma <em>entendible<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, me he encontrado que la mayor\u00eda de tutoriales para implementar control de velocidad por PWM basado en la temperatura en la Raspberry Pi <strong><span style=\"text-decoration: underline;\">NO LO HACEN BIEN<\/span><\/strong> (m\u00e1s adelante te explicar\u00e9 por qu\u00e9).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este art\u00edculo (y los otros art\u00edculos a los que enlaza, y que he escrito como soporte de este tutorial), intentan abarcar el tema de una forma profunda pero <em>comprensible<\/em>, intentando <strong>que cualquiera pueda entenderlo f\u00e1cilmente solo con leer el blog y sin preparaci\u00f3n previa<\/strong>.<br>\u00a1Espero que lo disfrutes!<\/p>\n\n<\/div>\n\n\n<div class=\"wp-block-group has-global-color-8-background-color has-background\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<p class=\"wp-block-paragraph\">Parece mentira lo mucho que ha costado, tanto el hardware como el software, hasta que ha todo ha funcionado perfectamente. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Que me haya costado m\u00e1s de lo esperado no me ha desanimado en absoluto, todo lo contrario. Esto quiere decir que el tema no es tan sencillo y que este art\u00edculo tendr\u00e1 mucho valor.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La verdad es que he aprendido mucho por el camino. No esperaba que un tema tan, aparentemente, sencillo me fuera a dar tantos quebraderos de cabeza.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tengo varias Raspberry Pi funcionando en casa para diferentes tareas. Son dispositivos peque\u00f1os, con poco consumo de energ\u00eda y muy estables en su funcionamiento (pueden estar meses funcionando continuamente sin necesitar un reinicio).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">He utilizado la Raspberry Pi original (la v1), la Raspberry Pi 2, la Raspberry Pi 3 y sus versiones \u00abintermedias (con la \u00abB\u00bb o el \u00ab+\u00bb a\u00f1adidas) y la temperatura nunca ha sido un problema. Todas han funcionado estupendamente durante a\u00f1os sin problemas de calor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La \u00faltima que a\u00f1ad\u00ed, una Raspberry Pi 4, tiene mucha m\u00e1s potencia y rendimiento que las anteriores y eso conlleva que tenga unos <strong>requerimientos de refrigeraci\u00f3n muy por encima de sus antecesoras<\/strong>. \u00bfSe puede usar una Raspberry Pi 4 sin ventilador? Si, pero <strong>no es recomendable hacer funcionar una Raspberry Pi 4 sin un ventilador<\/strong> que la refrigere.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se supone que si ponemos una Raspberry Pi 4 es porque necesitamos su potencia en algunos momentos (si no, \u00bfpara qu\u00e9 usar una Raspberry Pi 4?, mejor poner uno de los modelos anteriores, que son m\u00e1s baratos y consumen menos) y en este caso dotarla de <strong>un ventilador de refrigeraci\u00f3n es casi imprescindible<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La desventaja de a\u00f1adir un ventilador a la Raspberry Pi 4 es que <strong>deja de ser un dispositivo 100% silencioso<\/strong> para convertirse en una peque\u00f1a molestia (sobre todo en un dormitorio o despacho silencioso).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cuanto-ruido-hace-una-raspberry-pi-4\">\u00bfCu\u00e1nto ruido hace una Raspberry Pi 4?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La Raspberry Pi 4 en s\u00ed, no hace ruido<\/strong>, no tiene partes m\u00f3viles, lo que hace ruido es su <strong>ventilador<\/strong>&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El nivel de ruido de un ventilador de 5V para una Raspberry Pi 4 puede variar seg\u00fan el modelo y la marca del ventilador, as\u00ed como su dise\u00f1o y calidad de construcci\u00f3n. Sin embargo, en general, los ventiladores peque\u00f1os de 5V tienden a ser bastante silenciosos, sobre todo si los alimentamos a 3.3V (si, ventiladores de 5V alimentados a 3.3V para que giren m\u00e1s despacio y hagan menos ruido).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El nivel de ruido de un ventilador generalmente se mide en decibelios (dB), y los ventiladores peque\u00f1os de 5V dise\u00f1ados para Raspberry Pi a menudo tienen un nivel de ruido de alrededor de 20 a 30 dB. Esto es relativamente silencioso y no deber\u00eda ser molesto en la mayor\u00eda de las situaciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es importante tener en cuenta que existen algunos factores que pueden influir en el nivel de ruido, como la velocidad a la que funcione el ventilador y la calidad del rodamiento del mismo. Si necesitas un funcionamiento especialmente silencioso, puedes optar por ventiladores con rodamientos de alta calidad, como los rodamientos de fluido o los rodamientos de bolas, que tienden a generar menos ruido que los rodamientos m\u00e1s simples.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En cualquier caso, si el ruido es una preocupaci\u00f3n para ti, puedes buscar ventiladores dise\u00f1ados espec\u00edficamente para aplicaciones de bajo ruido o aquellos con opciones de control de velocidad para ajustar la velocidad del ventilador seg\u00fan sea necesario, lo que puede ayudarte a mantener un equilibrio entre la temperatura y el ruido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teniendo en cuenta todo lo anterior, podemos decir que el ruido del ventilador de una Raspberry Pi 4, una vez que hemos elegido el ventilador (mejor o peor, de mayor o menor calidad) y lo hemos conectado, <strong>siempre girar\u00e1 a la misma velocidad, refrigerar\u00e1 de la misma forma y har\u00e1 el mismo ruido<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si queremos reducir el ruido, aprovechando el ventilador est\u00e9 siempre funcionando al m\u00e1ximo (de hecho, ni siquiera necesitamos que el ventilador est\u00e9 siembre funcionando) la soluci\u00f3n est\u00e1 en tener un ventilador velocidad variable para Raspberry Pi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 deber\u00eda poner un ventilador a una Raspberry Pi 4?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Es bueno poner un ventilador en una Raspberry Pi 4 u otros dispositivos electr\u00f3nicos similares por varias razones:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Refrigeraci\u00f3n:<\/strong> La Raspberry Pi 4 puede generar calor, especialmente cuando se ejecutan aplicaciones intensivas en t\u00e9rminos de CPU o GPU. Un ventilador ayuda a disipar ese calor de manera m\u00e1s eficiente, lo que evita que la temperatura del dispositivo aumente demasiado. Un funcionamiento a temperaturas m\u00e1s bajas puede ayudar a prevenir el sobrecalentamiento, lo que puede afectar negativamente el rendimiento y la vida \u00fatil de la Raspberry Pi.<\/li>\n\n\n\n<li><strong>Mayor rendimiento y estabilidad:<\/strong> Mantener la temperatura de la CPU y otros componentes a una temperatura m\u00e1s baja puede permitir que la Raspberry Pi funcione de manera m\u00e1s constante y sin ralentizaciones causadas por el sobrecalentamiento.<\/li>\n\n\n\n<li><strong>Prevenci\u00f3n de da\u00f1os:<\/strong> El calor excesivo puede da\u00f1ar los componentes electr\u00f3nicos con el tiempo. Un ventilador puede prolongar la vida \u00fatil de la Raspberry Pi y prevenir da\u00f1os a largo plazo.<\/li>\n\n\n\n<li><strong>Rendimiento constante en cargas de trabajo intensivas:<\/strong> Si planeas utilizar tu Raspberry Pi para tareas intensivas, como emulaci\u00f3n de videojuegos, aprendizaje autom\u00e1tico o transcodificaci\u00f3n de video, un ventilador puede ser esencial para mantener un rendimiento constante y evitar el estrangulamiento t\u00e9rmico.<\/li>\n\n\n\n<li><strong>Reducci\u00f3n de la velocidad del ventilador y el ruido:<\/strong> No necesitas que el ventilador est\u00e9 siempre a m\u00e1xima velocidad. Puedes configurar el ventilador para que funcione solo cuando la temperatura alcance cierto umbral, lo que ayuda a reducir el ruido y el consumo de energ\u00eda.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Todo lo anterior confirma lo que sospech\u00e1bamos, poner un ventilador en una Raspberry Pi 4 es una buena idea si planeas utilizarla en tareas que generen calor o en entornos donde la temperatura ambiente sea alta. Ayudar\u00e1 a mantener la Raspberry Pi funcionando de manera eficiente y prolongar\u00e1 su vida \u00fatil al mantener las temperaturas bajo control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Y ya que ponemos un ventilador, mejor que pongamos un ventilador velocidad variable para Raspberry Pi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfCu\u00e1l es el ventilador para Raspberry Pi 4 m\u00e1s silencioso?<\/h2>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-Raspberry-Pi.png\" alt=\"\" class=\"wp-image-240994 size-full\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-Raspberry-Pi.png 500w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-Raspberry-Pi-300x300.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-Raspberry-Pi-150x150.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">Te puedo decir, sin temor a equivocarme, que <strong>el ventilador m\u00e1s silencioso es el ventilador apagado<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podemos poner ventiladores de mejor calidad, a menor voltaje, de rodamientos de grafeno o Kryptonita, pero todos, sin excepci\u00f3n, hacen ruido.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si queremos que un ventilador no haga ruido, lo mejor es <strong>apagarlo <\/strong>cuando no es necesario y ponerlo a la <strong>m\u00ednima velocidad<\/strong> que permita tener la temperatura de la Raspberry Pi 4 bajo control (tampoco es necesario que est\u00e9 siempre \u00ab<em>lo m\u00e1s fr\u00eda posible<\/em>\u00ab).<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora bien, si tengo algo que comentarte: Por regla general los ventiladores para Raspberry 4 son muy peque\u00f1os (lo normal es que sean de 40mm) y esto significa que, para que den una cantidad de aire importante tienen que girar muy deprisa. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para mover la misma cantidad de aire, un ventilador m\u00e1s peque\u00f1o (como uno de 40 mm) debe girar aproximadamente 9 veces m\u00e1s r\u00e1pido que un ventilador m\u00e1s grande (como uno de 120 mm).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La relaci\u00f3n de velocidad se calcula de la siguiente manera:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"353\" height=\"52\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Formula-relacion-de-velocidad.png\" alt=\"\" class=\"wp-image-240991\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Formula-relacion-de-velocidad.png 353w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Formula-relacion-de-velocidad-300x44.png 300w\" sizes=\"auto, (max-width: 353px) 100vw, 353px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Donde:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em>D<\/em><sub>ventilador&nbsp;grande<\/sub>\u200b es el di\u00e1metro del ventilador grande (en este caso, 120 mm).<\/li>\n\n\n\n<li><em>D<\/em><sub>ventilador&nbsp;peque\u00f1o<\/sub>\u200b es el di\u00e1metro del ventilador peque\u00f1o (en este caso, 40 mm).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Si sustituimos los valores en la f\u00f3rmula:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"390\" height=\"38\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Formula-relacion-de-velocidad-2.png\" alt=\"\" class=\"wp-image-240992\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Formula-relacion-de-velocidad-2.png 390w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Formula-relacion-de-velocidad-2-300x29.png 300w\" sizes=\"auto, (max-width: 390px) 100vw, 390px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">En resumen, si queremos tener el ventilador m\u00e1s silencioso posible, deber\u00edamos fijarnos en:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Apagar <\/strong>el ventilador cuando no sea necesario<\/li>\n\n\n\n<li>Ajustar la <strong>velocidad del ventilador<\/strong> al m\u00ednimo necesario en cada momento<\/li>\n\n\n\n<li>Montar el <strong>ventilador m\u00e1s grande<\/strong> que nos sea posible<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">El ventilador para la Raspberry Pi 4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para nuestro ventilador de velocidad variable vamos a utilizar un peque\u00f1o ventilador de corriente continua de 5V (si tienes curiosidad, <a href=\"https:\/\/emariete.com\/controlar-la-velocidad-de-un-ventilador-con-pwm\/#tipos-ventiladores\" target=\"_blank\" rel=\"noreferrer noopener\">puedes ver pulsando aqu\u00ed los diferentes tipos de ventilador que podemos usar en una Raspberry<\/a>).<\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1000\" height=\"785\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-DC-basico.jpg\" alt=\"\" class=\"wp-image-241004 size-full\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-DC-basico.jpg 1000w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-DC-basico-300x236.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-DC-basico-768x603.jpg 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">Se trata de un ventilador simple que lo \u00fanico que tiene es un motor de motor de corriente continua que mueve las aspas. En este caso, su velocidad depender\u00e1 el voltaje con el que lo alimentamos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tiene solamente dos cables, el positivo y el negativo de alimentaci\u00f3n (que, por cierto, puedes conectar al rev\u00e9s y el ventilador girar\u00e1 en sentido contrario).<\/p>\n\n\n<div class=\"gb-container gb-container-0d0288ec\">\n<span >No products found.<\/span>\n<\/div><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Si quieres m\u00e1s detalles sobre por qu\u00e9 he elegido este tipo de ventilador, por qu\u00e9 he decidido variar su velocidad mediante PWM y muchos m\u00e1s detalles sobre el control de velocidad de ventiladores mediante PWM, el siguiente art\u00edculo del blog te gustar\u00e1:<\/p>\n\n\n<div class=\"gb-container gb-container-14311298\">\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"sUmmfzDVvP\"><a href=\"https:\/\/emariete.com\/controlar-la-velocidad-de-un-ventilador-con-pwm\/\">Controlar la velocidad de un ventilador con PWM<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abControlar la velocidad de un ventilador con PWM\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/controlar-la-velocidad-de-un-ventilador-con-pwm\/embed\/#?secret=rorxVWkHCH#?secret=sUmmfzDVvP\" data-secret=\"sUmmfzDVvP\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Aunque no es obligatorio leer este art\u00edculo, es interesante que lo hagas, ya que sienta las bases para lo que vamos a ver a continuaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si ves que te pierdes en las siguientes explicaciones, vuelve aqu\u00ed y lee el art\u00edculo \u00ab<a href=\"https:\/\/emariete.com\/controlar-la-velocidad-de-un-ventilador-con-pwm\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Controlar la velocidad de un ventilador con PWM<\/em><\/a>\u00ab.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-como-vamos-a-regular-la-velocidad-del-ventilador-de-la-raspberry-pi-4\">\u00bfComo vamos a regular la velocidad del ventilador de la Raspberry Pi 4?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lo vamos a hacer generando una se\u00f1al PWM y amplific\u00e1ndola, con un peque\u00f1o circuito, ya que la Raspberry Pi no puede suministrar directamente una se\u00f1al PWM con la energ\u00eda necesaria para mover un ventilador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello vamos a escribir un peque\u00f1o programa en Python que genere una se\u00f1al de PWM que tenga un <em>Ciclo de trabajo<\/em> variable en funci\u00f3n de lo r\u00e1pido que necesite que gire el ventilador para refrigerar la Raspberry Pi 4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Haremos que la Raspberry Pi 4 ejecute este programa autom\u00e1ticamente y que cada 15 segundos (configurable) el programa modifique, si es necesario, la se\u00f1al PWM para subir o bajar la velocidad del ventilador.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este programa tendr\u00e1 un valor m\u00ednimo de <em>Ciclo de trabajo<\/em> de la se\u00f1al PWM para asegurarnos de que el ventilador siempre se mueva y que nunca se bloquee por no tener energ\u00eda suficiente para vencer la inercia y empezar a moverse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s, vamos a escribir un peque\u00f1o programa auxiliar que nos permitir\u00e1 averiguar cu\u00e1l es el <em>Ciclo de trabajo m\u00ednimo<\/em> para que el ventilador arranque y cu\u00e1l es el <em>Ciclo de trabajo m\u00ednimo<\/em> para que el ventilador no se pare, una vez que est\u00e1 en movimiento (ambos <em>Ciclos de trabajo<\/em> no tienen por qu\u00e9 ser iguales, y no lo ser\u00e1n).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para nuestra se\u00f1al PWM vamos a utilizar los siguientes par\u00e1metros:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Amplitud<\/strong>: 3.3V<\/li>\n\n\n\n<li><strong>Ciclo de trabajo<\/strong>: Ir\u00e1 desde el m\u00ednimo que permita que el ventilador arranque (o no se pare, si ya est\u00e1 en movimiento) hasta el 100%. <\/li>\n\n\n\n<li><strong>Frecuencia<\/strong>: 25Khz<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Solo con alimentar el ventilador con esta se\u00f1al PWM, en vez de conectarlo directamente a 5V (o 3.3V), tendremos un ventilador velocidad variable en la Raspberry Pi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El circuito electr\u00f3nico de amplificaci\u00f3n de se\u00f1al PWM<\/h2>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-con-controlador-futurista-500x500-1.jpg\" alt=\"\" class=\"wp-image-241075 size-full\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-con-controlador-futurista-500x500-1.jpg 500w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-con-controlador-futurista-500x500-1-300x300.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Ventilador-con-controlador-futurista-500x500-1-150x150.jpg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">El consumo normal de los peque\u00f1os ventiladores de 5V de 40x40mm es de aproximadamente 150mA.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La Raspberry Pi solamente puede proporcionar de manera segura 16mA, seg\u00fan la documentaci\u00f3n oficial de la Raspberry Pi (y 50mA simult\u00e1neos, sumando todos sus pines).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a a\u00f1adir a nuestra Raspberry Pi 4 un circuito electr\u00f3nico muy sencillo, con un transistor que, con esa peque\u00f1a se\u00f1al de control, de intensidad limitada, sea capaz de generar una se\u00f1al igual pero que pueda llegar a un m\u00ednimo de 200 o 300mA.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este tipo de circuitos se suelen llamar <em><strong>\u00abdrivers\u00bb<\/strong><\/em>.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Hay dos formas principales de hacerlo (muy similares) y te voy a dejar las dos, para que elijas la que prefieras (aunque mi recomendaci\u00f3n es que utilices la versi\u00f3n con MOSFET).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Driver PWM con transistor BJT<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Este es el esquema de nuestro driver con transistor BJT:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Schematic_Driver-PWM-con-transistor-BJT_2023-11-02.png\" alt=\"\" class=\"wp-image-241076\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Salvo que ya tengas los componentes (especialmente el transistor BJT), <strong>te recomiendo que construyas el driver PWM con transistor MOSFET<\/strong> que te dejo m\u00e1s abajo.<\/p>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Prototype_Driver-PWM_BJT_-transistor-2023-11-02-1024x576.png\" alt=\"\" class=\"wp-image-241084 size-full\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Prototype_Driver-PWM_BJT_-transistor-2023-11-02-1024x576.png 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Prototype_Driver-PWM_BJT_-transistor-2023-11-02-300x169.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Prototype_Driver-PWM_BJT_-transistor-2023-11-02-768x432.png 768w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Prototype_Driver-PWM_BJT_-transistor-2023-11-02.png 1192w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">Este es el prototipo del driver con transistor BJT que constru\u00ed para hacer las pruebas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como ves, la placa est\u00e1 muy sucia (digamos que est\u00e1 muy <em>\u00abtrabajada\u00bb<\/em>), debido al gran n\u00famero de pruebas que hice con diferentes variaciones:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Transistores diferentes en configuraci\u00f3n <em>high-side<\/em> y <em>low-side<\/em>, diferentes valores de resistencias, muchas mediciones, etc&#8230;<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Aun utilizando componentes normales <em>\u00abthrough hole\u00bb<\/em> (no de montaje en superficie), como ves qued\u00f3 un tama\u00f1o muy compacto, para poderlo meter dentro de la caja de la Raspberry Pi 4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el siguiente art\u00edculo tienes toda la informaci\u00f3n sobre el <a href=\"https:\/\/emariete.com\/driver-pwm-transistor-bjt\/\" target=\"_blank\" rel=\"noreferrer noopener\">driver PWM con transistor BJT<\/a>:<\/p>\n\n\n<div class=\"gb-container gb-container-83f81007\">\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"XViJkaKnrP\"><a href=\"https:\/\/emariete.com\/driver-pwm-transistor-bjt\/\">Driver PWM con transistor BJT<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abDriver PWM con transistor BJT\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/driver-pwm-transistor-bjt\/embed\/#?secret=M7V5brnS42#?secret=XViJkaKnrP\" data-secret=\"XViJkaKnrP\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Driver PWM con transistor MOSFET<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Este es el tipo de driver que te recomiendo construir<\/strong>. Entre otras ventajas, su funcionamiento es m\u00e1s eficiente que el driver con transistor BJT y <strong>se calienta menos<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este es el esquema de nuestro driver de se\u00f1al PWM con transistor MOSFET:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"550\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Schematic_Driver-PWM-con-transistor-MOSFET_2023-11-02.png\" alt=\"\" class=\"wp-image-241077\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Schematic_Driver-PWM-con-transistor-MOSFET_2023-11-02.png 550w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Schematic_Driver-PWM-con-transistor-MOSFET_2023-11-02-300x300.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Schematic_Driver-PWM-con-transistor-MOSFET_2023-11-02-150x150.png 150w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Como ves es muy parecido al driver con transistor BJT que vimos antes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En el siguiente art\u00edculo tienes toda la informaci\u00f3n sobre el <a href=\"https:\/\/emariete.com\/driver-pwm-transistor-bjt\/\" target=\"_blank\" rel=\"noreferrer noopener\">driver PWM con transistor <\/a><a href=\"https:\/\/emariete.com\/driver-pwm-transistor-mosfet\/\" target=\"_blank\" rel=\"noreferrer noopener\">BJT<\/a>:<\/p>\n\n\n<div class=\"gb-container gb-container-14320f57\">\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"Rqp7Frfy3t\"><a href=\"https:\/\/emariete.com\/driver-pwm-transistor-mosfet\/\">Driver PWM con transistor MOSFET<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abDriver PWM con transistor MOSFET\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/driver-pwm-transistor-mosfet\/embed\/#?secret=rdb2ABVlPo#?secret=Rqp7Frfy3t\" data-secret=\"Rqp7Frfy3t\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">El software de control del ventilador velocidad variable para la Raspberry Pi 4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Te dejo el video que he preparado para que te resulte m\u00e1s sencillo seguir este tutorial. Te recomiendo que lo veas a medida que lo lees.<\/p>\n\n\n<div class=\"gb-container gb-container-9273ec54\">\n<div class=\"gb-container gb-container-d837ac58\">\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Tutorial: Ventilador de velocidad variable Raspberry Pi controlado por temperatura. \u00a1BIEN EXPLICADO!\" width=\"1200\" height=\"675\" src=\"https:\/\/www.youtube.com\/embed\/8tjSm3EvOCQ?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n<\/div>\n<\/div>\n\n<div class=\"gb-container gb-container-68641a62\">\n\n<p class=\"wp-block-paragraph\"><strong>Hacer estos videos lleva mucho trabajo<\/strong>. Si te gusta el video no te olvides de darle a \u00abMe gusta\u00bb y suscribirte al canal. Eso&nbsp;<strong>me motivar\u00e1 a seguir haciendo m\u00e1s videos como este.<\/strong><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"462\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-1024x462.jpg\" alt=\"\" class=\"wp-image-241245\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-1024x462.jpg 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-300x135.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-768x347.jpg 768w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-1536x693.jpg 1536w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Mesa-laboratorio-2048x924.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n<\/div>\n\n<div class=\"gb-container gb-container-1f704b4a\"><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aunque lo que vamos a hacer es muy sencillo y no deber\u00eda causar ning\u00fan problema, el riesgo siempre est\u00e1 ah\u00ed, por lo que <strong>te recomiendo que hagas una copia de seguridad<\/strong> completa del contenido de tu Raspberry Pi 4 (te sugiero que, directamente, clones tu tarjeta Micro SD antes de tocar nada).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Generaci\u00f3n de una se\u00f1al PWM con la Raspberry Pi 4<\/h3>\n\n\n<div class=\"gb-container gb-container-7e059c3a\">\n\n<p class=\"wp-block-paragraph\">La generaci\u00f3n de se\u00f1al PWM en la Raspberry Pi con Python no es dif\u00edcil en absoluto, pero es importante saber c\u00f3mo, porque, <strong>o yo estoy muy equivocado, o la inmensa mayor\u00eda de la informaci\u00f3n que hay en internet est\u00e1 mal<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed te voy a contar por qu\u00e9 la mayor\u00eda de tutoriales para implementar control de velocidad por PWM basado en la temperatura en la Raspberry Pi que he visto en internet <strong><span style=\"text-decoration: underline;\">NO LO HACEN BIEN<\/span><\/strong>.<\/p>\n\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Inicialmente, hice todo este proyecto con la biblioteca RPi.GPIO (que es la recomendada, y con la que lo hace el 99% de gente en internet) y notaba ciertos ruidos en el ventilador y muy poca suavidad en su funcionamiento. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Atribu\u00eda los ruidos y la poca suavidad en el funcionamiento a que no era un ventilador de buena calidad, pero, haciendo pruebas con el osciloscopio, <strong>vi que algo no estaba bien\u2026<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La se\u00f1al PWM generada era horrorosa, llena de ruido, en una frecuencia que no era la que yo hab\u00eda establecido y tanto los valores de frecuencia como de ciclo de trabajo eran <strong>muy inestables<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo m\u00e1s curioso era que <strong>el sistema funcionaba<\/strong> y si no hubiera hecho pruebas a fondo con el osciloscopio nunca habr\u00eda sabido lo mal que estaba resultando. Seguramente hay millones de sistemas como este <em>&#8216;funcionando&#8217;<\/em> en el mundo sin saber los problemas que tienen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Me puse a investigar y encontr\u00e9 que la biblioteca <em>RPi.GPIO<\/em> <strong>no genera las se\u00f1ales PWM por hardware, sino por software<\/strong> (aunque utilices un pin hardware), y lo peor, es que tiene problemas con las se\u00f1ales de m\u00e1s de unos pocos kilohercios.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Utilizando una se\u00f1al PWM con una frecuencia de 1Khz, por ejemplo, el sistema funcionaba, pero el ventilador hac\u00eda un ruido, perfectamente audible, que era peor que tenerlo funcionando a plena potencia.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una desventaja adicional importante es que cuando la se\u00f1al PWM se genera por software, es la CPU de la Raspberry Pi la que hace todo el trabajo (y es mucho, porque tiene que estar continuamente atendiendo y activando y desactivando el pin) con lo que el consumo de CPU puede ser alto.<\/p>\n\n\n\n<p class=\"has-global-color-8-background-color has-background wp-block-paragraph\">Sigo documentando todo esto, haciendo pruebas, escribiendo y grabando videos para pod\u00e9rtelo explicar bien. En breve incluir\u00e9 la informaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>La soluci\u00f3n estaba en utilizar otra biblioteca, en lugar de la <em>RPi.GPIO<\/em>. Una que soporte la generaci\u00f3n de la se\u00f1al PWM por hardware.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay algunos proyectos (los que menos) que utilizan alg\u00fan tipo de control PWM por hardware, pero la mayor\u00eda tienen problemas o limitaciones.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se basan en proyectos obsoletos, o que por debajo los utilizan, o sin soporte como <em>wiringPi<\/em><\/li>\n\n\n\n<li>Necesitan un demonio corriendo (como <em>pigpio<\/em>), lo que complica la instalaci\u00f3n y arquitectura<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Generaci\u00f3n de una se\u00f1al hardware PWM con la Raspberry Pi 4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes generar una se\u00f1al PWM en un pin de una Raspberry Pi 4, de una forma muy f\u00e1cil, utilizando Python y la biblioteca <em>&#8216;<strong>rpi-hardware-pwm<\/strong>&#8216;<\/em>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo primero es preparar la Raspberry Pi para que sea capaz de utilizar los dos canales PWM hardware de los que dispone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tienes que editar el fichero <em>\/boot\/config.txt<\/em> e incluir la l\u00ednea <em>dtoverlay=pwm-2chan<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello, desde la consola ejecuta:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano \/boot\/config.txt\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Y tras la \u00faltima l\u00ednea que empiece por <em>dtoverlay<\/em> (que posiblemente est\u00e9 comentada, con una almohadilla <em>&#8216;#&#8217;<\/em>), incluye la l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndtoverlay=pwm-2chan\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Esto habilitar\u00e1 el PWM por hardware en los <strong>GPIO por defecto: GPIO_18 para PWM0 y GPIO_19 para PWM1<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si quieres, puedes utilizar (en vez de la l\u00ednea anterior), la l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ndtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Esto habilitar\u00e1 el PWM por hardware en los <strong>GPIO alternativos: GPIO_12 para PWM0 y GPIO_13 para PWM1<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora reinicia la Raspberry Pi, para que los cambios tengan efecto, con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo reboot\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Cuando vuelva a arrancar la Raspberry Pi, entra de nuevo en la consola e instala la biblioteca <em>rpi-hardware-pwm<\/em> con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get update\nsudo pip3 install rpi-hardware-pwm\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"pwm_generator\">Programa de prueba y calibraci\u00f3n de la se\u00f1al PWM para el ventilador concreto<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La Raspberry Pi ya est\u00e1 preparada para generar una se\u00f1al PWM por hardware.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ahora necesitamos un programa, que nos permita:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Probar de una forma f\u00e1cil que, efectivamente, funciona.<\/li>\n\n\n\n<li>Averiguar los ciclos de trabajo m\u00ednimos para que nuestro ventilador no se pare concreto (cada uno es diferente).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello he creado un script muy sencillo, en el lenguaje de programaci\u00f3n Python, <code>hardware_pwm_generator.py<\/code>, que nos permite llamarlo con tres par\u00e1metros en la l\u00ednea de comandos de la Raspberry Pi:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Un 0 para utilizar el canal <strong>PWM0<\/strong> en <strong>GPIO_18 PWM0 y PWM1<\/strong> en <strong>GPIO_19<\/strong> (o PWM0 en GPIO_12 PWM0 y PWM1 en GPIO_13, si has elegido los pines alternativos en el fichero <em>\/boot\/config.txt<\/em>.<\/li>\n\n\n\n<li>La frecuencia en hertzios. Por ejemplo, 25000 para 25Khz.<\/li>\n\n\n\n<li>El ciclo de trabajo (un n\u00famero entre 0 y 100).<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport sys\nfrom rpi_hardware_pwm import HardwarePWM\n\ndef set_pwm(pwm_channel, frequency, duty_cycle):\n    pwm = HardwarePWM(pwm_channel, frequency)\n    pwm.start(duty_cycle)\n    input(&quot;Presiona Enter para detener el PWM...&quot;)\n    pwm.stop()\n\nif __name__ == &quot;__main__&quot;:\n    if len(sys.argv) != 4:\n        print(&quot;Uso: python pwm_generator.py &lt;canal_pwm&gt; &lt;frecuencia&gt; &lt;ciclo_de_trabajo&gt;&quot;)\n        sys.exit(1)\n\n    pwm_channel = int(sys.argv&#x5B;1])\n    frequency = float(sys.argv&#x5B;2])\n    duty_cycle = float(sys.argv&#x5B;3])\n\n    try:\n        set_pwm(pwm_channel, frequency, duty_cycle)\n    except KeyboardInterrupt:\n        pass\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Guarda este programa en un archivo llamado \u00abhardware_pwm_generator.py\u00bb.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes hacerlo ejecutando esta l\u00ednea desde la consola:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano hardware_pwm_generator.py\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes ejecutar el programa con el siguiente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\npython hardware_pwm_generator.py &lt;canal_pwm&gt; &lt;frecuencia&gt; &lt;ciclo_de_trabajo&gt;\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Reemplaza:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>&lt;canal_pwm&gt;<\/em><\/strong> Por el canal PWM que quieres usar (0 o 1). Por ejemplo, un <strong>0 para utilizar el canal PWM0<\/strong> del GPIO_18.<\/li>\n\n\n\n<li><strong><em>&lt;frecuencia&gt;<\/em><\/strong> Por la frecuencia en hertzios que quieres te tenga la se\u00f1al PWM. Por ejemplo, <strong>25000 para 25Khz<\/strong>.<\/li>\n\n\n\n<li><code><em>&lt;<strong>ciclo_de_trabajo<\/strong><\/em>&gt;<\/code> por el ciclo de trabajo que quieres, por ejemplo, \u00ab50\u00bb para un ciclo de trabajo del 50%.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, para generar en el canal 0 de PWM (PWM0) en el GPIO_18 una se\u00f1al a 25Khz con un ciclo de trabajo del 80%, tienes que ejecutar en la consola:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\npython hardware_pwm_generator.py 0 25000 80\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Para salir y detener el PWM, solo tienes que pulsar <em>[Enter]<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tambi\u00e9n puedes interrumpir y salir del programa con <em>Ctrl-C<\/em>. En este caso la se\u00f1al PWM no se detendr\u00e1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo es el siguiente:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lectura de la temperatura de la CPU de la Raspberry Pi<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Vamos a ver qu\u00e9 tenemos que hacer para leer la temperatura de la CPU de la Raspberry Pi de una forma sencilla, para ir poco a poco y que sea entendible. M\u00e1s adelante veremos como modificar la se\u00f1al PWM en base a la temperatura.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para leer la temperatura de la CPU de una Raspberry Pi puedes utilizar la biblioteca <strong><code><em>psutil<\/em><\/code><\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aseg\u00farate de tener la biblioteca <strong><code><em>psutil<\/em><\/code><\/strong> instalada en tu Raspberry Pi. Puedes instalar <strong><em><code>psutil<\/code> <\/em><\/strong>con el siguiente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get update\nsudo pip install psutil\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ahora que tenemos la biblioteca instalada, podemos ver la temperatura ejecutando la siguiente l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nvcgencmd measure_temp\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed tienes un programa simple en Python que utiliza la biblioteca psutil para leer la temperatura de la CPU y la imprime en la consola cada 5 segundos:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport psutil\nimport time\n\ndef get_cpu_temperature():\n    try:\n        temperature = psutil.sensors_temperatures()&#x5B;&#039;cpu_thermal&#039;]&#x5B;0].current\n        return temperature\n    except Exception as e:\n        print(f&quot;Error al obtener la temperatura de la CPU: {e}&quot;)\n        return None\n\ndef main():\n    try:\n        while True:\n            temperature = get_cpu_temperature()\n\n            if temperature is not None:\n                print(f&quot;Temperatura de la CPU: {temperature}\u00b0C&quot;)\n\n            time.sleep(5)\n\n    except KeyboardInterrupt:\n        pass\n\nif __name__ == &quot;__main__&quot;:\n    main()\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes escribirlo en el fichero <em>temperature_reader.py<\/em> (como hicimos antes con hardware_pwm_generator.py), con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano temperature_reader.py\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Diferentes versiones de Raspberry Pi y de Linux pueden llamar al sensor de temperatura con un nombre diferente a <em>&#8216;cpu_thermal&#8217;<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ejec\u00fatalo desde la consola con la l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\npython temperature_reader.py\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Si te da un error parecido a \u00ab<em>Error al obtener la temperatura de la CPU: &#8216;cpu_thermal&#8217;<\/em>\u00bb seguramente sea porque tu sensor no se llama <em>&#8216;cpu_thermal&#8217;<\/em> y tendr\u00e1s que averiguar su nombre.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez sepas el nombre, tendr\u00e1s que sustituir en la l\u00ednea 6 el nombre <em>&#8216;cpu_thermal&#8217;<\/em> por el nombre de tu sensor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por ejemplo, tanto en la Raspberry Pi 3 con la que empec\u00e9 a hacer las pruebas como en la Raspberry Pi, este sensor se llamaba <em>&#8216;cpu_thermal&#8217;<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes utilizar este peque\u00f1o c\u00f3digo para averiguarlo imprimiendo la lista de todos los sensores disponibles para entender qu\u00e9 nombres est\u00e1n presentes en tu sistema:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nimport psutil\nimport time\n\ndef get_cpu_temperature():\n    try:\n        sensors_data = psutil.sensors_temperatures()\n        if &#039;coretemp&#039; in sensors_data:\n            temperature = sensors_data&#x5B;&#039;cpu_thermal&#039;]&#x5B;0].current\n            return temperature\n        else:\n            print(&quot;No se encontraron datos del sensor &#039;cpu_thermal&#039;. Sensores disponibles:&quot;, sensors_data.keys())\n            return None\n    except Exception as e:\n        print(f&quot;Error al obtener la temperatura de la CPU: {e}&quot;)\n        return None\n\ndef main():\n    try:\n        while True:\n            temperature = get_cpu_temperature()\n\n            if temperature is not None:\n                print(f&quot;Temperatura de la CPU: {temperature}\u00b0C&quot;)\n\n            time.sleep(5)\n\n    except KeyboardInterrupt:\n        pass\n\nif __name__ == &quot;__main__&quot;:\n    main()\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Este script imprimir\u00e1 la lista de sensores disponibles en tu sistema si no puede encontrar el sensor <em>&#8216;cpu_thermal&#8217;<\/em>. Al ejecutar el script, podr\u00e1s ver qu\u00e9 nombres de sensores est\u00e1n presentes, y podr\u00e1s ajustar el c\u00f3digo en consecuencia para leer la temperatura desde el sensor correcto.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Programa de lectura de la temperatura y ajuste de la velocidad del ventilador<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Para leer la temperatura de la CPU de una Raspberry Pi 4 y generar una se\u00f1al PWM con un ciclo de trabajo proporcional a la temperatura de la CPU, utilizaremos, como hemos visto antes, la biblioteca <strong><code><em>psutil<\/em><\/code> <\/strong>para obtener la temperatura de la CPU y, de nuevo, la biblioteca <strong><em>rpi-hardware-pwm<\/em><\/strong> para generar la se\u00f1al PWM.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n#!\/usr\/bin\/env python3\n\nimport configparser\nfrom rpi_hardware_pwm import HardwarePWM\nimport psutil\nimport time\nimport sys\nimport atexit\nimport syslog\nimport os\nimport signal\n\n#Inicializa las variables\ncanal_pwm = 0\nfrecuencia = 25000\nciclo_de_trabajo_anterior = 0\ntemperatura_anterior = 0\ntiempo = 6\nciclo_de_trabajo = 0\n\npwm = HardwarePWM(canal_pwm, frecuencia)\n\ndef print_debug(mensaje):\n    if debug and not as_a_service:\n        print(mensaje)\n    if debug and as_a_service:\n        syslog.syslog(syslog.LOG_INFO, mensaje)\n        \ndef inicializar_configuracion():\n    # Valores predeterminados\n    defaults = {\n        &#039;intervalo_de_prueba&#039;: 5,\n        &#039;canal_pwm&#039;: 0,\n        &#039;frecuencia&#039;: 25000,\n        &#039;temp_min&#039;: 45,\n        &#039;temp_max&#039;: 65,\n        &#039;ciclo_min&#039;: 60,\n        &#039;ciclo_max&#039;: 100,\n        &#039;histeresis&#039;: 2,\n        &#039;debug&#039;: False,\n        &#039;as_a_service&#039;: True\n    }\n\n    try:\n        # Cargar configuraci\u00f3n desde el archivo INI\n        config = configparser.ConfigParser()\n        config.read(&quot;temperature_pwm_controller.ini&quot;)\n\n        # Desempaquetar la configuraci\u00f3n o usar valores predeterminados\n        intervalo_de_prueba = config.getint(&quot;config&quot;, &quot;intervalo_de_prueba&quot;, fallback=defaults&#x5B;&#039;intervalo_de_prueba&#039;])\n        canal_pwm = config.getint(&quot;config&quot;, &quot;canal_pwm&quot;, fallback=defaults&#x5B;&#039;canal_pwm&#039;])\n        frecuencia = config.getint(&quot;config&quot;, &quot;frecuencia&quot;, fallback=defaults&#x5B;&#039;frecuencia&#039;])\n        temp_min = config.getint(&quot;config&quot;, &quot;temp_min&quot;, fallback=defaults&#x5B;&#039;temp_min&#039;])\n        temp_max = config.getint(&quot;config&quot;, &quot;temp_max&quot;, fallback=defaults&#x5B;&#039;temp_max&#039;])\n        ciclo_min = config.getint(&quot;config&quot;, &quot;ciclo_min&quot;, fallback=defaults&#x5B;&#039;ciclo_min&#039;])\n        ciclo_max = config.getint(&quot;config&quot;, &quot;ciclo_max&quot;, fallback=defaults&#x5B;&#039;ciclo_max&#039;])\n        histeresis = config.getint(&quot;config&quot;, &quot;histeresis&quot;, fallback=defaults&#x5B;&#039;histeresis&#039;])\n        debug = config.getboolean(&quot;config&quot;, &quot;debug&quot;, fallback=defaults&#x5B;&#039;debug&#039;])\n        as_a_service = config.getboolean(&quot;config&quot;, &quot;as_a_service&quot;, fallback=defaults&#x5B;&#039;as_a_service&#039;])\n\n        return (intervalo_de_prueba, canal_pwm, frecuencia, temp_min, temp_max, ciclo_min, ciclo_max, histeresis, debug, as_a_service)\n\n    except Exception as e:\n        print(f&quot;Error al cargar la configuraci\u00f3n: {str(e)}&quot;)\n        syslog.syslog(syslog.LOG_ERR, f&quot;Error al cargar la configuraci\u00f3n: {str(e)}&quot;)\n        # Utiliza los valores predeterminados si hay un error al cargar la configuraci\u00f3n\n        return tuple(defaults.values())\n\ndef calcular_ciclo_de_trabajo(temp, temp_min, temp_max, ciclo_min, ciclo_max, ciclo_actual, hysteresis):\n    try:\n        if temp &lt; temp_min:\n            return 0\n        elif temp &gt; temp_max:\n            return 100\n        elif temp_min &lt;= temp:\n            if (temp &gt; (temperatura_anterior + hysteresis)) or (temp &lt; (temperatura_anterior - hysteresis)):\n                print_debug(f&quot;***Superada hist\u00e9resis. Nueva temperatura: {temp:.2f}\u00baC. Nuevo ciclo de trabajo: {ciclo_de_trabajo:.0f}%. La temperatura anterior era {temperatura_anterior:.2f} \u00b0C. El ciclo anterior era de  {ciclo_de_trabajo_anterior:.0f}%&quot;)\n                ciclo = (temp - temp_min) * (ciclo_max - ciclo_min) \/ (temp_max - temp_min) + ciclo_min\n                ciclo = max(ciclo_min, min(ciclo, ciclo_max))\n                return round(ciclo)\n        return round(ciclo_actual)\n    except Exception as e:\n        print_debug(f&quot;Error al calcular el ciclo de trabajo: {str(e)}&quot;)\n        return round(ciclo_actual)\n        \ndef parar_ventilador(signum, frame):\n    try:\n        syslog.syslog(syslog.LOG_INFO, &quot;Parando salida PWM&quot;)\n        pwm.stop();\n        time.sleep(1)\n        # Asegurarse de que todos los buffers est\u00e9n vac\u00edos antes de salir\n        sys.stdout.flush()\n        sys.stderr.flush() \n        sys.exit(0)\n    except Exception as e:\n        print_debug(f&quot;Error al parar el servicio: {str(e)}&quot;)\n\ntry:\n    # Llama a la funci\u00f3n para inicializar la configuraci\u00f3n\n    (intervalo_de_prueba, canal_pwm, frecuencia, temp_min, temp_max, ciclo_min, ciclo_max, histeresis, debug, as_a_service) = inicializar_configuracion()\n\n    script_name = os.path.splitext(os.path.basename(sys.argv&#x5B;0]))&#x5B;0]\n    syslog.openlog(ident=script_name, facility=syslog.LOG_USER)\n    syslog.syslog(syslog.LOG_INFO, f&quot;El servicio {script_name} se est\u00e1 ejecutando.&quot;)\n    \n    # Para que se detenga el ventilador al para el script\n    signal.signal(signal.SIGTERM, parar_ventilador)\n\n    pwm.start(100)\n    time.sleep(1)\n    pwm.change_duty_cycle(0)\n\n    while True:\n        temp = psutil.sensors_temperatures()&#x5B;&#039;cpu_thermal&#039;]&#x5B;0].current\n        ciclo_de_trabajo = calcular_ciclo_de_trabajo(temp, temp_min, temp_max, ciclo_min, ciclo_max, ciclo_de_trabajo, histeresis)\n\n        if tiempo &gt;= intervalo_de_prueba and debug is True:\n            mensaje = f&quot;La temperatura de la CPU es {temp:.2f} \u00b0C. El ciclo de trabajo es de {ciclo_de_trabajo:.0f}%&quot;\n            print_debug(mensaje)\n            mensaje = f&quot;La temperatura anterior era {temperatura_anterior:.2f} \u00b0C. El ciclo anterior era de  {ciclo_de_trabajo_anterior:.0f}%&quot;\n            print_debug(mensaje)\n            mensaje = f&quot;--------------------------------------------------------------------------------------------&quot;\n            print_debug(mensaje)\n            tiempo = 0\n        else:\n            tiempo += 1\n\n        if ciclo_de_trabajo_anterior == 0 and ciclo_de_trabajo != 0:\n            print_debug(f&quot;Arrancando ventilador... (temperatura {temp:.2f}\u00baC)&quot;)\n            pwm.change_duty_cycle(100)\n            ciclo_de_trabajo_anterior = 100\n            time.sleep(1)\n\n        if ciclo_de_trabajo != ciclo_de_trabajo_anterior:\n            pwm.change_duty_cycle(ciclo_de_trabajo)\n            print_debug(f&quot;Nueva temperatura: {temp:.2f}\u00baC. Nuevo ciclo de trabajo: {ciclo_de_trabajo:.0f}%&quot;)\n            print_debug(f&quot;Temperatura cambio anterior: {temperatura_anterior:.2f}\u00baC. Ciclo de trabajo anterior: {ciclo_de_trabajo_anterior:.0f}%&quot;)\n            ciclo_de_trabajo_anterior = ciclo_de_trabajo\n            temperatura_anterior = temp\n\n        time.sleep(intervalo_de_prueba)\n\nexcept Exception as e:\n    print(f&quot;Error general: {str(e)}&quot;)\n    syslog.syslog(syslog.LOG_ERR, f&quot;Error general: {str(e)}&quot;)\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes grabar el programa en un fichero con nombre <em>temperature_pwm_controller.py<\/em> mediante:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano temperature_pwm_controller.py\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Este programa lee la temperatura de la CPU cada 5 segundos y ajusta el ciclo de trabajo del PWM de acuerdo con la temperatura. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hay varios par\u00e1metros que puedes ajustar seg\u00fan tus necesidades y preferencias.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em><strong>canal_pwm = 0<\/strong><\/em>: Te permite elegir el canal PWM que quieres utilizar.<\/li>\n\n\n\n<li><em><strong>frecuencia = 25000<\/strong><\/em>: La frecuencia de la se\u00f1al PWM. Ten en cuenta que una se\u00f1al de una frecuencia m\u00e1s baja provocar\u00e1 un ruido audible que puede ser molesto.<\/li>\n\n\n\n<li><em><strong>temp_min = 45<\/strong><\/em>: La temperatura por debajo de la cual el ventilador estar\u00e1 parado.<\/li>\n\n\n\n<li><em><strong>temp_max = 60<\/strong><\/em>: La temperatura que no quieres que se sobrepase. A partir de esta temperatura el ciclo de trabajo de la se\u00f1al PWM ser\u00e1 del 100%.<\/li>\n\n\n\n<li><em><strong>ciclo_min = 55<\/strong><\/em>: Ciclo de la se\u00f1al PWM para tu ventilador y preferencias. No pongas una se\u00f1al demasiado baja que pueda hacer que el ventilador no gire.<\/li>\n\n\n\n<li><em><strong>ciclo_max = 100<\/strong><\/em>: El ciclo de trabajo m\u00e1ximo al que quieres que se genere la se\u00f1al PWM.<\/li>\n\n\n\n<li><strong>histeresis = 2<\/strong>: Para que el ventilador no est\u00e9 continuamente par\u00e1ndose y poni\u00e9ndose en marcha, este es el valor de \u00abzona gris\u00bb. La temperatura tendr\u00e1 que variar m\u00e1s que este valor para que el ventilador cambie entre movimiento y parado.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\npython temperature_pwm_controller.py\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">El script leer\u00e1 la temperatura y ajustar\u00e1 la se\u00f1al PWM peri\u00f3dicamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pulsa <code>Ctrl-C<\/code> para interrumpirlo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-configuracion-del-script\">Configuraci\u00f3n del script<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Si lo deseas puedes crear un fichero de configuraci\u00f3n para que te resulte m\u00e1s f\u00e1cil adaptar el programa a tus preferencias sin tener que modificar el script.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Este fichero es completamente opcional y si no lo creas (o falta cualquier l\u00ednea) el script utilizar\u00e1 los valores por defecto que est\u00e1n definidos en el c\u00f3digo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Solo tienes que crear un fichero de texto, llamado <code>temperature_pwm_controller.ini<\/code> en la misma carpeta donde tengas el script (fichero <code>temperature_pwm_controller.py<\/code>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si quieres, puedes crearlo con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano temperature_pwm_controller.ini\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Dentro del archivo, solo tienes que incluir una primera l\u00ednea, a modo de cabecera, con el texto <code>[config]<\/code> y a continuaci\u00f3n incluir las l\u00edneas que desees de entre las que figuran arriba con los valores que quieras.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;config]\nintervalo_de_prueba = 5\ncanal_pwm = 0\nfrecuencia = 25000\ntemp_min = 46\ntemp_max = 65\nciclo_min = 60\nciclo_max = 100\nhysteresis = 2\ndebug = False\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Instalar el script desde GitHub<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Puedes encontrar todo c\u00f3digo actualizado en <a href=\"https:\/\/github.com\/melkati\/raspberry-fan\/tree\/main\" target=\"_blank\" rel=\"noreferrer noopener\">mi repositorio de GitHub<\/a> y lo puedes descargar a tu Raspberry Pi directamente desde all\u00ed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una vez en la consola te recomiendo que crees un directorio en el que clonar el repositorio, y lo clones:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ngit clone https:\/\/github.com\/melkati\/raspberry-fan.git\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Ten en cuenta que tendr\u00e1s que hacer los ajustes necesarios porque los scripts no estar\u00e1n en <code>\/home\/pi <\/code>sino en <code>\/home\/pi\/raspberry-fan<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El archivo <code>temperature_pwm_controller.service<\/code> estar\u00e1 ya configurado para funcionar desde <code>\/home\/pi\/raspberry-fan<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hacer que se inicie autom\u00e1ticamente al arrancar la Raspberry Pi 4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No tendr\u00eda mucho sentido que cada vez que arranc\u00e1semos la Raspberry Pi tuvi\u00e9ramos que entrar en la consola y ejecutar un programa, de manera que lo vamos a automatizar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para que el script se ejecute autom\u00e1ticamente al arrancar la Raspberry Pi hay varias formas de hacerlo. Aqu\u00ed vamos a ver c\u00f3mo se hace con <em>systemctl<\/em>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ejecuci\u00f3n autom\u00e1tica con systemctl<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Para ejecutar un script de Python en el arranque de una Raspberry Pi utilizando systemd, puedes seguir estos pasos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En este ejemplo el nombre del script es <code>temperature_pwm_controller.py<\/code> y la ruta completa donde est\u00e1 es <code>\/home\/pi\/<\/code>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Aseg\u00farate de que el script sea ejecutable:<\/strong><\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo chmod +x \/home\/pi\/temperature_pwm_controller.py\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Crea un archivo de servicio para systemd:<\/strong><br>Crea un archivo de servicio en la ubicaci\u00f3n <code>\/etc\/systemd\/system\/<\/code>. Puedes nombrarlo, por ejemplo, <code>temperature_pwm_controller.service<\/code>.<br><br><code>sudo nano \/etc\/systemd\/system\/temperature_pwm_controller.service<\/code><br><br>El contenido del archivo debe ser el siguiente:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n# Este es un archivo de servicio para el controlador PWM basado en temperatura\n# que se ejecutar\u00e1 autom\u00e1ticamente al arrancar la Raspberry Pi.\n\n&#x5B;Unit]\nDescription=Controlador de PWM basado en temperatura\nAfter=multi-user.target\n\n&#x5B;Service]\nExecStartPre=sleep 30\nExecStart=\/usr\/bin\/python3 \/home\/pi\/temperature_pwm_controller.py\nWorkingDirectory=\/home\/pi\nStandardOutput=syslog\nStandardError=syslog\nRestart=always\nUser=pi\n\n&#x5B;Install]\nWantedBy=multi-user.target\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes crear el archivo con el siguiente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano \/etc\/systemd\/system\/temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Una vez creado, asegurate de que tiene los permisos correctos. Puedes darle los permisos con la siguiente l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsudo chmod 777 \/etc\/systemd\/system\/temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aseg\u00farate de reemplazar <code>\/home\/pi\/temperature_pwm_controller.py<\/code> con la ruta completa de tu script de Python, si lo has modificado.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"4\">\n<li><strong>Recarga systemd:<\/strong><\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nsudo systemctl daemon-reload\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"5\">\n<li><strong>Habilita e inicia el servicio:<\/strong><\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl enable temperature_pwm_controller.service\nsudo systemctl start temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">El servicio tiene un retraso antes de ejecutarse de 30 segundos para asegurarse de que la Raspberry Pi se haya iniciado por completo antes de poner en marcha el ventilador, por lo que tardar\u00e1 un tiempo en hacerlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si en este punto reinicias la Raspberry Pi, el servicio arrancar\u00e1 autom\u00e1ticamente. Puedes hacerlo desde la consola con la l\u00ednea:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo reboot\n<\/pre><\/div>\n\n\n<ol class=\"wp-block-list\" start=\"6\">\n<li><strong>Verifica el estado del servicio:<\/strong><\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl status temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes <strong>parar <\/strong>el servicio con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl stop temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes <strong>ejecutar <\/strong>el servicio con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl start temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes <strong>ver el estado<\/strong> del servicio con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n   sudo systemctl status temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Puedes <strong>ver el log<\/strong> del servicio con:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo journalctl -f -u temperature_pwm_controller.service\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">F\u00edjate en que no es necesario que ejecutemos el script cada quince segundos ya que realmente est\u00e1 siempre funcionando, realizando su trabajo cada 15 segundos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estos pasos deber\u00edan configurar tu script <code>temperature_pwm_controller.py<\/code> para ejecutarse autom\u00e1ticamente en el arranque de tu Raspberry Pi utilizando systemd. Aseg\u00farate de ajustar las rutas y nombres de archivo seg\u00fan tus necesidades espec\u00edficas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conexi\u00f3n del driver PWM a la Raspberry Pi 4 y puesta en marcha<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ya tenemos todo lo necesario y podemos unir las piezas, hardware y software, y poner en marcha nuestro ventilador de velocidad variable para Raspberry Pi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aunque tienes un tutorial de un driver PWM con MOSFET (y otro de un driver PWM con transistor BJT), he dise\u00f1ado un <strong>driver PWM espec\u00edfico para la Raspberry Pi: <a href=\"https:\/\/emariete.com\/mini-hat-pwm-raspberry-pi\/\">El Mini HAT PWM<\/a><\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-embed aligncenter is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"MDGrDvmPUa\"><a href=\"https:\/\/emariete.com\/mini-hat-pwm-raspberry-pi\/\">Mini Hat PWM de eMariete para Raspberry Pi<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abMini Hat PWM de eMariete para Raspberry Pi\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/mini-hat-pwm-raspberry-pi\/embed\/#?secret=hgJqPHr3Ee#?secret=MDGrDvmPUa\" data-secret=\"MDGrDvmPUa\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Elecci\u00f3n del pin de la Raspberry Pi 4 al que vamos a conectar el driver.<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Todos los pines de salida de la Raspberry Pi 4 pueden sacar una se\u00f1al PWM, pero hay que tener en cuenta que no todos los pines son iguales, a la hora de generar una se\u00f1al PWM.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pines PWM software: Generar\u00e1n la se\u00f1al por software. Ser\u00e1 la CPU de la Raspberry Pi 4 la encargada de generar la se\u00f1al y consumir\u00e1 recursos de CPU, como cualquier otro programa.<\/li>\n\n\n\n<li>Pines<strong> PWM hardware<\/strong>: Generar\u00e1n la se\u00f1al por hardware. La CPU de la Raspberry Pi 4 solo tendr\u00e1 que pedirle a uno de sus \u00abgeneradores hardware PWM\u00bb que genere la se\u00f1al deseada y podr\u00e1 desentenderse. El hardware especializado en generar se\u00f1ales PWM se ocupar\u00e1 de su generaci\u00f3n y la CPU no tendr\u00e1 que hacer nada, por lo que no consumir\u00e1 recursos de la CPU dejando toda su capacidad y potencia para otros programas.<\/li>\n<\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"588\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2-1024x588.png\" alt=\"\" class=\"wp-image-241588\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2-1024x588.png 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2-300x172.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2-768x441.png 768w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2-1536x882.png 1536w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-Pinout-Diagram-2-2048x1176.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Fuente imagen: raspberry.org<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Los pines <strong>12\/13 y 18\/19 generan la se\u00f1al PWM por hardware<\/strong>, mientras que todos los dem\u00e1s pines generan la se\u00f1al PWM por software.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"359\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-1024x359.png\" class=\"wp-image-241587\" alt=\"1. Encabezado de entrada GPIO y pines para Raspberry Pi A+\/B+ y Pi 2\/3\/4.\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-1024x359.png 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-300x105.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO-768x269.png 768w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Raspberry-Pi-GPIO.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/> <\/a><figcaption class=\"wp-element-caption\">Fuente imagen: raspberry.org<\/figcaption><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Te recomiendo que utilices uno de los pines 12\/13 y 18\/19, salvo que tengas un buen motivo para no hacerlo, como el siguiente:<\/p>\n\n\n\n<p class=\"has-global-color-8-background-color has-background wp-block-paragraph\">El hardware PWM y el jack de auriculares utilizan los mismos circuitos de la Raspberry Pi, por lo que <strong>no podr\u00e1s utilizarlos al mismo tiempo<\/strong>. Dicho de otra manera: si usas el jack de auriculares de la Raspberry Pi 4 tendr\u00e1s que utilizar PWM por software, con todas sus limitaciones.<\/p>\n\n\n\n<p class=\"has-text-align-center has-global-color-8-background-color has-background has-medium-font-size wp-block-paragraph\"><strong>IMPORTANTE: Si no utilizas el pin 18, recuerda actualizar el c\u00f3digo con el pin que hayas decidido utilizar<\/strong>. Estos ejemplos est\u00e1n preparados para utilizar el GPIO 18 (pin 12 en el puerto de expansi\u00f3n de la Raspberry Pi 4)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Calibraci\u00f3n de la se\u00f1al PWM para <strong>tu <\/strong>ventilador<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Como vimos en detalle en el art\u00edculo \u00ab<a href=\"https:\/\/emariete.com\/controlar-la-velocidad-de-un-ventilador-con-pwm\/\" target=\"_blank\" rel=\"noreferrer noopener\"><em>Controlar la velocidad de un ventilador con PWM<\/em><\/a>\u00ab, y hemos recordado anteriormente, en este mismo art\u00edculo, cada ventilador responde de una forma diferente a las se\u00f1ales PWM.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada ventilador tiene un Ciclo de trabajo m\u00ednimo para que el ventilador empiece a girar desde que est\u00e1 parado. En unos ventiladores puede ser el 30% y en otros el 90% por lo que es necesario que lo pruebes t\u00fa mismo con <strong>tu ventilador<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada ventilador tiene tambi\u00e9n un Ciclo de trabajo m\u00ednimo para que no se detenga cuando ya est\u00e1 en movimiento. No podr\u00e1s bajar el Ciclo de trabajo a, digamos, un 5%, esperando que as\u00ed el ventilador funcione muy despacio. Con tan poca energ\u00eda se parar\u00e1 mucho antes de bajar hasta ese 5%.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para que te hagas a la idea, el ventilador con el que estoy haciendo las pruebas ahora mismo se para cuando el ciclo de trabajo baja a un 60%, aproximadamente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tienes que tener presente que ambos Ciclos de trabajo no tienen por qu\u00e9 ser iguales (y no lo ser\u00e1n). <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El ventilador necesita m\u00e1s energ\u00eda (un Ciclo de trabajo m\u00e1s alto) para vencer la resistencia para ponerse en marcha y necesitar\u00e1 menos energ\u00eda para mantenerse en movimiento, una vez que ya lo est\u00e1.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo lo anterior significa que tendr\u00e1s que calibrar <strong>tu ventilador concreto<\/strong> para encontrar esos dos valores del Ciclo de trabajo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Podr\u00e1s calibrar tu ventilador f\u00e1cilmente utilizando el programa <a href=\"https:\/\/emariete.com\/ventilador-velocidad-variable-raspberry-pi\/#pwm_generator\">pwm_generator.py<\/a> que te he dejado antes (<a href=\"https:\/\/emariete.com\/ventilador-velocidad-variable-raspberry-pi\/#programa_basico_pwm\">puedes pichar aqu\u00ed para ir a \u00e9l<\/a>). <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tendr\u00e1s que, con el ventilador parado, ir ejecutando el programa varias veces, <strong>subiendo <\/strong>cada vez el Ciclo de trabajo, <strong>hasta que el ventilador se ponga en marcha<\/strong>. Una vez hayas encontrado ese \u00ab<em>Ciclo de trabajo m\u00ednimo desde parado<\/em>\u00bb puedes utilizar ese valor, aument\u00e1ndolo un porcentaje como margen de seguridad (puedes probar con un 10%).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Luego, con el ventilador en marcha, tendr\u00e1s ir ejecutando el programa varias veces, <strong>bajando<\/strong> cada vez el Ciclo de trabajo, <strong>hasta que el ventilador se detenga<\/strong>. Una vez hayas encontrado ese \u00ab<em>Ciclo de trabajo m\u00ednimo desde en movimiento<\/em>\u00bb puedes utilizar ese valor, aument\u00e1ndolo un porcentaje como margen de seguridad (puedes probar con un 10%).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfY si mi Raspberry Pi no es la 4, que pasa con otros modelos?<\/h2>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Cartas-Raspberry-Pi-500x500-1.jpg\" alt=\"\" class=\"wp-image-241066 size-full\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Cartas-Raspberry-Pi-500x500-1.jpg 500w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Cartas-Raspberry-Pi-500x500-1-300x300.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/11\/Cartas-Raspberry-Pi-500x500-1-150x150.jpg 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure><div class=\"wp-block-media-text__content\">\n<p class=\"wp-block-paragraph\">La Raspberry Pi 5 es demasiado nueva y a\u00fan no la he usado, por lo que no te podr\u00e9 decir mucho sobre ella, pero si he tenido todos los modelos anteriores a la 4 y te puedo hablar sobre ellos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Puedo decirte que, en los modelos anteriores de Raspberry Pi, 1, 2 3 y sus variaciones, el consumo de energ\u00eda es mucho m\u00e1s bajo que en la Raspberry Pi 4 y nunca he necesitado utilizar un ventilador y su temperatura siempre se ha mantenido dentro de limites muy razonables.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aun as\u00ed, si quieres o necesitas a\u00f1adir el ventilador en alguno de esos modelos, no te ser\u00e1 dif\u00edcil.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Yo lo he probado (y lo tengo funcionando) en la Raspberry Pi 3 y la Raspberry Pi 4, por lo que en estos modelos est\u00e1 bien probado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si lo quieres probar en otra versi\u00f3n, el software probablemente funcione tal cual, o con cambios m\u00ednimos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tola la investigaci\u00f3n y el desarrollo lo ha hecho con una Raspberry Pi 3, solo cuando lo ten\u00eda terminado lo he instalado en la Raspberry Pi 4. El motivo es, simplemente, que la \u00fanica Raspberry Pi 4 que tengo la ten\u00eda ocupada para cosas de la dom\u00f3tica de la casa, y no pod\u00eda estar quit\u00e1ndola.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si lo pruebas con otras versiones, especialmente si es con la <strong>Raspberry Pi 5<\/strong>, te pido que <strong>dejes un mensaje en los comentarios <\/strong>y as\u00ed podr\u00e9 actualizar el art\u00edculo con esa informaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Raspberry Pi 4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">El software est\u00e1 probado en la Raspberry Pi 4 y funciona sin problema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Por cierto, en la Raspberry Pi 4 he montado una versi\u00f3n especial del <strong>Mini HAT PWM con componentes SMD<\/strong> y unos pines m\u00e1s largos para poderlo poner pegado a la caja por fuera. En mi opini\u00f3n, ha quedado muy bien.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"553\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-Hat-PWM-V2-en-Raspberry-Pi-4-1024x553.png\" alt=\"\" class=\"wp-image-241743\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-Hat-PWM-V2-en-Raspberry-Pi-4-1024x553.png 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-Hat-PWM-V2-en-Raspberry-Pi-4-300x162.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-Hat-PWM-V2-en-Raspberry-Pi-4-768x415.png 768w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-Hat-PWM-V2-en-Raspberry-Pi-4-1536x830.png 1536w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-Hat-PWM-V2-en-Raspberry-Pi-4.png 1616w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"461\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-HAT-PWM-en-Raspberry-Pi-4-1024x461.jpg\" alt=\"\" class=\"wp-image-241740\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-HAT-PWM-en-Raspberry-Pi-4-1024x461.jpg 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-HAT-PWM-en-Raspberry-Pi-4-300x135.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-HAT-PWM-en-Raspberry-Pi-4-768x346.jpg 768w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-HAT-PWM-en-Raspberry-Pi-4-1536x692.jpg 1536w, https:\/\/emariete.com\/wp-content\/uploads\/2023\/12\/Mini-HAT-PWM-en-Raspberry-Pi-4.jpg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Raspberry Pi 3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Es el modelo en el que he hecho la investigaci\u00f3n y el desarrollo por lo que est\u00e1 probado y deber\u00eda funcionar sin problema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Raspberry Pi 2<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando pueda lo probar\u00e9 en esta versi\u00f3n, aunque no tiene mucha utilidad porque no se calienta y no necesita ventilador. No preveo que haya ning\u00fan problema.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">No confundas hardware y software de tu Raspberry Pi<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Lo que acabamos de ver es respecto al <strong>hardware <\/strong>de la Raspberry Pi, pero tambi\u00e9n el <strong>software <\/strong>puede ser diferente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La versi\u00f3n concreta de sistema operativo que ten\u00eda instalada en la Raspberry Pi 3 era: \u00ab<code>Raspbian GNU\/Linux 11 (bullseye) armv71<\/code> (32bit) con user space de 32 bit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El sistema operativo que ten\u00eda instalado en la Raspberry Pi 4 era: \u00ab<code>Raspbian GNU\/Linux 11 (bullseye) aarch64<\/code> (64bit) con user space de 32 bit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si has seguido el tutorial y encuentras algo diferente o que no te funciona no estar\u00eda de m\u00e1s de comprobaras tu versi\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ver la versi\u00f3n del sistema operativo instalada en tu Raspberry Pi, puedes utilizar el siguiente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ncat \/etc\/os-release\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Este comando te mostrar\u00e1 el nombre y la versi\u00f3n del sistema operativo que se est\u00e1 ejecutando en tu dispositivo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si deseas saber si el sistema operativo es de 32 o 64 bits, puedes utilizar el siguiente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nuname -m\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Este comando te mostrar\u00e1 la arquitectura del procesador de tu Raspberry Pi. Si la salida es <code>armv7l<\/code>, entonces est\u00e1s utilizando un sistema operativo de 32 bits. Si la salida es aarch64, entonces est\u00e1s utilizando un sistema operativo de 64 bits 12.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ver si el espacio de usuario de tu Raspberry Pi es de 32 o 64 bits, puedes utilizar el siguiente comando:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\ngetconf LONG_BIT\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Este comando te mostrar\u00e1 la arquitectura del procesador de tu Raspberry Pi. Si la salida es <code>32<\/code>, entonces est\u00e1s utilizando un espacio de usuario de 32 bits, si la salida es 64, entonces est\u00e1s utilizando un espacio de usuario de 64 bits.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfY ahora qu\u00e9?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En este art\u00edculo hemos visto lo que tenemos que hacer para controlar la velocidad del ventilador de la Raspberry Pi dependiendo de la temperatura de su CPU. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Si no lo has hecho, te sugiero que leas los siguientes art\u00edculos, donde se ampl\u00eda la informaci\u00f3n sobre cada uno de los aspectos que hemos visto aqu\u00ed, resumidos:<\/p>\n\n\n<div class=\"gb-container gb-container-0fef7b32\">\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"6VxOuYVBKo\"><a href=\"https:\/\/emariete.com\/senal-pwm-pulse-width-modulation\/\">\u00bfQu\u00e9 es una se\u00f1al PWM (Pulse Width Modulation o Modulaci\u00f3n por Anchura de Pulsos)?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00ab\u00bfQu\u00e9 es una se\u00f1al PWM (Pulse Width Modulation o Modulaci\u00f3n por Anchura de Pulsos)?\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/senal-pwm-pulse-width-modulation\/embed\/#?secret=8uZSwOYfCR#?secret=6VxOuYVBKo\" data-secret=\"6VxOuYVBKo\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"XViJkaKnrP\"><a href=\"https:\/\/emariete.com\/driver-pwm-transistor-bjt\/\">Driver PWM con transistor BJT<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abDriver PWM con transistor BJT\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/driver-pwm-transistor-bjt\/embed\/#?secret=M7V5brnS42#?secret=XViJkaKnrP\" data-secret=\"XViJkaKnrP\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"Rqp7Frfy3t\"><a href=\"https:\/\/emariete.com\/driver-pwm-transistor-mosfet\/\">Driver PWM con transistor MOSFET<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abDriver PWM con transistor MOSFET\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/driver-pwm-transistor-mosfet\/embed\/#?secret=rdb2ABVlPo#?secret=Rqp7Frfy3t\" data-secret=\"Rqp7Frfy3t\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-emariete wp-block-embed-emariete\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"MDGrDvmPUa\"><a href=\"https:\/\/emariete.com\/mini-hat-pwm-raspberry-pi\/\">Mini Hat PWM de eMariete para Raspberry Pi<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"\u00abMini Hat PWM de eMariete para Raspberry Pi\u00bb \u2014 eMariete\" src=\"https:\/\/emariete.com\/mini-hat-pwm-raspberry-pi\/embed\/#?secret=hgJqPHr3Ee#?secret=MDGrDvmPUa\" data-secret=\"MDGrDvmPUa\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n<\/div>\n\n<div class=\"wp-block-uagb-faq uagb-faq__outer-wrap uagb-block-78fab2f7 uagb-faq-icon-row uagb-faq-layout-accordion uagb-faq-expand-first-false uagb-faq-inactive-other-true uagb-faq__wrap uagb-buttons-layout-wrap uagb-faq-equal-height     \" data-faqtoggle=\"true\" role=\"tablist\"><div class=\"wp-block-uagb-faq-child uagb-faq-child__outer-wrap uagb-faq-item uagb-block-e5e47b33 \" role=\"tab\" tabindex=\"0\"><div class=\"uagb-faq-questions-button uagb-faq-questions\">\t\t\t<span class=\"uagb-icon uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t<span class=\"uagb-icon-active uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t<span class=\"uagb-question\">El script no se ejecuta al iniciarse la Raspberry Pi<\/span><\/div><div class=\"uagb-faq-content\"><p>Si tu script no se est\u00e1 ejecutando autom\u00e1ticamente al arrancar la Raspberry Pi como se espera, aqu\u00ed hay algunas cosas que puedes revisar y ajustar:<br><strong>Ubicaci\u00f3n del Archivo de Servicio:<\/strong> Aseg\u00farate de que el archivo de servicio (<code>temperature_pwm_controller.service<\/code>) est\u00e9 ubicado en el directorio correcto, que generalmente es <code>\/etc\/systemd\/system\/<\/code>. Puedes usar <code>ls<\/code> para verificar si el archivo est\u00e1 all\u00ed:<br>bashCopy code<br><code>ls \/etc\/systemd\/system\/temperature_pwm_controller.service<\/code><br>Si no est\u00e1 all\u00ed, mueve el archivo a ese directorio y vuelve a habilitar el servicio.<br><strong>Habilitar y Comenzar el Servicio:<\/strong> Verifica que hayas habilitado el servicio correctamente y que se haya iniciado:<br>bashCopy code<br><code>sudo systemctl enable temperature_pwm_controller.service sudo systemctl start temperature_pwm_controller.service<\/code><br>Aseg\u00farate de que no haya errores al ejecutar estos comandos. Puedes verificar el estado del servicio despu\u00e9s de iniciarlo:<br>bashCopy code<br><code>sudo systemctl status temperature_pwm_controller.service<\/code><br><strong>Verifica el Registro del Sistema:<\/strong> Usa <code>journalctl<\/code> para revisar los registros del sistema y verificar si hay mensajes de error o informaci\u00f3n relacionados con el arranque del servicio:<br>bashCopy code<br><code>sudo journalctl -u temperature_pwm_controller.service<\/code><br>Esto te dar\u00e1 una visi\u00f3n m\u00e1s detallada de lo que est\u00e1 sucediendo con tu servicio.<br><strong>Reinicia la Raspberry Pi:<\/strong> Despu\u00e9s de realizar cambios, reinicia la Raspberry Pi y verifica si el servicio se inicia autom\u00e1ticamente.<br><strong>Revisar Permisos:<\/strong> Aseg\u00farate de que el script y el archivo de configuraci\u00f3n tengan los permisos adecuados para ser ejecutados por el usuario del servicio. Puedes otorgar permisos necesarios utilizando <code>chmod<\/code>.<br>bashCopy code<br><code>chmod +x \/ruta\/a\/tu\/script.py<\/code><br><strong>Revisa el Contenido del Archivo de Servicio:<\/strong> Verifica que el archivo de servicio (<code>temperature_pwm_controller.service<\/code>) tenga la configuraci\u00f3n correcta, especialmente las rutas a tu script y directorio.<br><strong>Errores en el Script:<\/strong> Verifica si hay errores en tu script. Puedes ejecutar tu script manualmente para ver si hay alg\u00fan problema.<br>bashCopy code<br><code>\/usr\/bin\/python3 \/ruta\/a\/tu\/script.py<\/code><br>Aseg\u00farate de que todas las rutas y configuraciones dentro del script sean correctas.<br><strong>Comprueba la Configuraci\u00f3n de Tipo de Servicio:<\/strong> Aseg\u00farate de que la configuraci\u00f3n <code>Type=simple<\/code> sea apropiada para tu script. En algunos casos, <code>Type=simple<\/code> puede ser m\u00e1s adecuado, mientras que en otros casos, puede necesitar <code>Type=forking<\/code> dependiendo de la naturaleza de tu script.<br><strong>Verifica los Permisos del Archivo de Configuraci\u00f3n:<\/strong> Si tu script usa un archivo de configuraci\u00f3n (<code>temperature_pwm_controller.ini<\/code>), aseg\u00farate de que tenga los permisos adecuados y pueda ser le\u00eddo por el usuario del servicio.<br><strong>Logs Adicionales:<\/strong> A\u00f1ade logs adicionales a tu script y al archivo de servicio para obtener m\u00e1s informaci\u00f3n sobre lo que podr\u00eda estar yendo mal. Puedes agregar sentencias de impresi\u00f3n a tu script o utilizar la funci\u00f3n <code>syslog<\/code> para registrar mensajes dentro del script.<br>Dentro del script de Python:<br>pythonCopy code<br><code>print(\"Iniciando el script...\")<\/code><br>En el archivo de servicio (<code>temperature_pwm_controller.service<\/code>), puedes agregar la siguiente l\u00ednea bajo la secci\u00f3n <code>[Service]<\/code>:<br>iniCopy code<br><code>StandardOutput=journal+console<\/code><br>Esto permitir\u00e1 que los mensajes de salida est\u00e1ndar del servicio se env\u00eden tanto al syslog como a la consola, lo que podr\u00eda ayudarte a identificar problemas durante el arranque.<br><strong>Verifica Permisos y Propietarios:<\/strong> Aseg\u00farate de que todos los archivos y directorios relacionados con tu servicio tengan los permisos y propietarios adecuados para que el servicio pueda acceder a ellos.<br><strong>Probar Iniciaci\u00f3n Manual:<\/strong> Intenta iniciar tu script manualmente para asegurarte de que no haya problemas de ejecuci\u00f3n directa. Utiliza la siguiente l\u00ednea de comando:<br>bashCopy code<br><code>\/usr\/bin\/python3 \/ruta\/a\/tu\/script.py<\/code><br>Aseg\u00farate de que esta ejecuci\u00f3n manual no genere errores.<br><strong>Revisa el Log del Kernel:<\/strong> Puedes revisar el log del kernel para obtener informaci\u00f3n adicional. Utiliza el siguiente comando para ver los mensajes del kernel:<br>bashCopy code<br><code>dmesg | grep nombre_del_servicio<\/code><br>Esto podr\u00eda proporcionar informaci\u00f3n adicional si hay problemas a nivel del kernel.<br><strong>Revisa Archivos de Registro:<\/strong> Adem\u00e1s de <code>journalctl<\/code>, verifica otros archivos de registro que puedan contener informaci\u00f3n relevante. Por ejemplo, si tu script escribe en un archivo de log espec\u00edfico, revisa ese archivo para mensajes de error.<br><strong>Verifica Espacios en Blanco en el Archivo de Servicio:<\/strong> Aseg\u00farate de que no haya espacios en blanco adicionales o caracteres no deseados en el archivo de servicio (<code>temperature_pwm_controller.service<\/code>).<br><strong>Revisa Configuraci\u00f3n de Direcci\u00f3n IP:<\/strong> Si tu script depende de la red, verifica que la Raspberry Pi tenga una conexi\u00f3n de red establecida al arrancar. Algunos scripts pueden tener problemas si se ejecutan antes de que se establezca la conexi\u00f3n de red.<br><strong>Revisa Configuraci\u00f3n de Fecha y Hora:<\/strong> Verifica que la fecha y hora de la Raspberry Pi est\u00e9n configuradas correctamente, ya que algunos scripts pueden depender de la hora actual.<br><strong>Revisa Configuraci\u00f3n de Selinux o AppArmor:<\/strong> Si est\u00e1s utilizando Selinux o AppArmor en tu sistema, aseg\u00farate de que no est\u00e9n bloqueando el funcionamiento del servicio.<br><strong>Reinicia Servicio y Verifica Log en Tiempo Real:<\/strong> Reinicia el servicio y verifica el log en tiempo real para observar cualquier mensaje de error al arranque:<br>bashCopy code<br><code>sudo systemctl restart nombre_del_servicio sudo journalctl -fu nombre_del_servicio<\/code><\/p><\/div><\/div><div class=\"wp-block-uagb-faq-child uagb-faq-child__outer-wrap uagb-faq-item uagb-block-38bd00a0 \" role=\"tab\" tabindex=\"0\"><div class=\"uagb-faq-questions-button uagb-faq-questions\">\t\t\t<span class=\"uagb-icon uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t<span class=\"uagb-icon-active uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t<span class=\"uagb-question\">\u00bfPuedo automatizar el arranque del script con <em>rc.local<\/em>?<\/span><\/div><div class=\"uagb-faq-content\"><p>Te\u00f3ricamente tambi\u00e9n es posible hacerlo, pero <strong>yo no he conseguido que me funcione bien con <em>rc.local<\/em><\/strong>. <br><br>Se supone que el archivo <em>rc.local<\/em>, se ejecuta despu\u00e9s de que se inician todos los servicios del sistema.<br>Para usar este m\u00e9todo, tienes que editar el archivo <em>rc.local<\/em> y a\u00f1adir el comando para ejecutar tu script antes de la l\u00ednea \u201cexit 0\u201d.<br><br>Por ejemplo, si tu script se llama <em>temperature_pwm_controller.py<\/em> y est\u00e1 en el directorio \/home\/pi, tendr\u00edas que poner algo as\u00ed:<br><br>python3 \/home\/pi\/temperature_pwm_controller.py &amp;<br><br>Puedes editar el fichero <em>rc.local<\/em> con:<br><br>sudo nano \/etc\/rc.local<br><br>Es importante mencionar que el uso de <code><em>rc.local<\/em><\/code> ha disminuido en los sistemas m\u00e1s modernos, ya que muchas distribuciones de Linux han adoptado sistemas de inicio m\u00e1s avanzados como systemd. Sin embargo, a\u00fan es posible encontrar sistemas que utilicen <code><em>rc.local<\/em><\/code>, especialmente en entornos m\u00e1s antiguos o en configuraciones personalizadas.<\/p><\/div><\/div><div class=\"wp-block-uagb-faq-child uagb-faq-child__outer-wrap uagb-faq-item uagb-block-c7785ad5 \" role=\"tab\" tabindex=\"0\"><div class=\"uagb-faq-questions-button uagb-faq-questions\">\t\t\t<span class=\"uagb-icon uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t<span class=\"uagb-icon-active uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t<span class=\"uagb-question\">\u00bfA qu\u00e9 temperatura es recomendable que se ponga en marcha el ventilador de una Raspberry Pi 4?<\/span><\/div><div class=\"uagb-faq-content\"><p>La temperatura a la cual debes activar el ventilador en una Raspberry Pi 4 puede depender de varios factores, incluidos los componentes espec\u00edficos de tu Raspberry Pi, el entorno en el que se encuentra y la carga de trabajo a la que est\u00e9 sometida.<br><br>En general, la Raspberry Pi 4 tiene mecanismos incorporados para gestionar la temperatura y evitar el sobrecalentamiento. Sin embargo, si deseas utilizar un ventilador para un enfriamiento activo, puedes considerar iniciar el ventilador cuando la temperatura de la CPU alcance alrededor de 50-55 grados Celsius. Esto proporcionar\u00e1 un margen de seguridad y ayudar\u00e1 a mantener la temperatura en un rango seguro.<br><br>Ajustar la temperatura de activaci\u00f3n del ventilador tambi\u00e9n puede depender de tus preferencias y del equilibrio que desees lograr entre el rendimiento y el nivel de ruido del ventilador. Algunas personas prefieren configurar el ventilador para que se active a temperaturas m\u00e1s altas si est\u00e1n dispuestas a tolerar un poco m\u00e1s de calor antes de que se inicie el enfriamiento activo.<br><br>Recuerda monitorear regularmente la temperatura de tu Raspberry Pi y ajustar la configuraci\u00f3n seg\u00fan sea necesario para adaptarse a tus necesidades y al entorno en el que se encuentra.<\/p><\/div><\/div><div class=\"wp-block-uagb-faq-child uagb-faq-child__outer-wrap uagb-faq-item uagb-block-a72b8fd4 \" role=\"tab\" tabindex=\"0\"><div class=\"uagb-faq-questions-button uagb-faq-questions\">\t\t\t<span class=\"uagb-icon uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t<span class=\"uagb-icon-active uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t<span class=\"uagb-question\">Mi ventilador solo arranca desde parado al 100% (o al 90%, por ejemplo)<\/span><\/div><div class=\"uagb-faq-content\"><p>Esto es muy normal, no te preocupes. La mayor\u00eda de ventiladores con los que he hecho las pruebas no arrancaban con garant\u00edas hasta tener un ciclo de trabajo del 100%<\/p><\/div><\/div><div class=\"wp-block-uagb-faq-child uagb-faq-child__outer-wrap uagb-faq-item uagb-block-8aafd923 \" role=\"tab\" tabindex=\"0\"><div class=\"uagb-faq-questions-button uagb-faq-questions\">\t\t\t<span class=\"uagb-icon uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t<span class=\"uagb-icon-active uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t<span class=\"uagb-question\">Mi ventilador hace ruido cuando el ciclo de trabajo baja del x %<\/span><\/div><div class=\"uagb-faq-content\"><p>Es normal que haya ventiladores que, incluso con ciclos de trabajo altos, hagan ruido.<br>No te preocupes y ponle un l\u00edmite inferior ligeramente superior al punto en el que funciona sin ruido, son suavidad y con la garant\u00eda de no pararse.<br>Incluso bajar tan solo del 100% al 90% supone una importante disminuci\u00f3n en el ruido.<\/p><\/div><\/div><div class=\"wp-block-uagb-faq-child uagb-faq-child__outer-wrap uagb-faq-item uagb-block-8081eb10 \" role=\"tab\" tabindex=\"0\"><div class=\"uagb-faq-questions-button uagb-faq-questions\">\t\t\t<span class=\"uagb-icon uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M432 256c0 17.69-14.33 32.01-32 32.01H256v144c0 17.69-14.33 31.99-32 31.99s-32-14.3-32-31.99v-144H48c-17.67 0-32-14.32-32-32.01s14.33-31.99 32-31.99H192v-144c0-17.69 14.33-32.01 32-32.01s32 14.32 32 32.01v144h144C417.7 224 432 238.3 432 256z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t<span class=\"uagb-icon-active uagb-faq-icon-wrap\">\n\t\t\t\t\t\t\t\t<svg xmlns=\"https:\/\/www.w3.org\/2000\/svg\" viewBox= \"0 0 448 512\"><path d=\"M400 288h-352c-17.69 0-32-14.32-32-32.01s14.31-31.99 32-31.99h352c17.69 0 32 14.3 32 31.99S417.7 288 400 288z\"><\/path><\/svg>\n\t\t\t\t\t\t\t<\/span>\n\t\t\t<span class=\"uagb-question\">\u00bfPuedo controlar el ventilador sin todo este software?<\/span><\/div><div class=\"uagb-faq-content\"><p><strong>Puedes, pero no podr\u00e1s controlar su velocidad, solo encenderlo y apagarlo.<br><\/strong><br>La fundaci\u00f3n Raspberry, sabiendo que la Raspberry Pi 4 necesitar\u00eda un ventilador, incluy\u00f3 de forma nativa en su sistema operativo la posibilidad de activar su control mediante temperatura f\u00e1cilmente desde uno de los men\u00fas de configuraci\u00f3n de la Raspberry Pi.<br><br>Las posibilidades de control son bastante reducidas ya que solo se puede indicar una temperatura, por debajo de la cual el ventilador se parar\u00e1 y se pondr\u00e1 en marcha de nuevo, al 100% de velocidad, al superarla. No incluye control de velocidad.<br><br>Es una funcionalidad simple, pero <strong>est\u00e1 disponible de forma nativa, sin tener que instalar ning\u00fan software adicional.<\/strong><br><br>Ten en cuenta que, al no regular la velocidad, sino solamente encender y apagar el ventilador (0 o 100%) puede ser incluso m\u00e1s ruidoso que tener el ventilador a plena potencia si esos cambios se producen a menudo. Si te planteas hacerlo de esta forma, te recomiendo que lo pruebes para ver c\u00f3mo resulta en tu caso particular.<\/p><\/div><\/div><\/div><div class=\"essb_break_scroll\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Do you, like me, want to reduce (or even eliminate) the annoying noise of the Raspberry Pi 4 fan? If so, here is the ultimate solution. Easy and cheap.<\/p>","protected":false},"author":1,"featured_media":240986,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","_lmt_disableupdate":"no","_lmt_disable":"","footnotes":""},"categories":[64,63],"tags":[67,46],"class_list":["post-240981","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-electronica","category-raspberry-pi","tag-pwm","tag-raspberry-pi"],"modified_by":"Mariete","uagb_featured_image_src":{"full":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image.png",1080,608,false],"thumbnail":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image-150x150.png",150,150,true],"medium":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image-300x169.png",300,169,true],"medium_large":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image-768x432.png",768,432,true],"large":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image-1024x576.png",1024,576,true],"1536x1536":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image.png",1080,608,false],"2048x2048":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image.png",1080,608,false],"trp-custom-language-flag":["https:\/\/emariete.com\/wp-content\/uploads\/2023\/10\/Ventilador-velocidad-variable-para-Raspberry-4-Featured-Image.png",18,10,false]},"uagb_author_info":{"display_name":"Mariete","author_link":"https:\/\/emariete.com\/en\/author\/admin_xlyz052h\/"},"uagb_comment_info":4,"uagb_excerpt":"\u00bfQuieres, como yo, reducir (o incluso eliminar) el molesto ruido del ventilador de la Raspberry Pi 4? Si es as\u00ed, aqu\u00ed te traigo la soluci\u00f3n definitiva. F\u00e1cil y barata.","_links":{"self":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts\/240981","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/comments?post=240981"}],"version-history":[{"count":132,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts\/240981\/revisions"}],"predecessor-version":[{"id":241748,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts\/240981\/revisions\/241748"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/media\/240986"}],"wp:attachment":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/media?parent=240981"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/categories?post=240981"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/tags?post=240981"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}