viernes, 25 de enero de 2013

Control PWM por software

¡¡BIEN!!

Bien bien bien bien hoy me siento eufórico, por fin un grupo de grandes electrofrikygeeks se ha currado un control de PWM por software para controlar hasta 8 GPIOs de forma independiente, sin necesitad de python ni cosas complicadas. Como ya sabiamos, solo uno de los GPIOs del RaspberryPi tenia control de PWM, gracias a el podemos darle más o menos velocidad a un motor DC, más o menos intensidad a un led y demás cosas que veremos en los siguientes posts. Veámos el resultado.

Tal y como vimos en este post, RaspberryPi tenía la deventaja de un único GPIO controlable en PWM (modulación por duración de impulso). Por lo que electrónicamente, esta muy limitado. Yo intenté en vano, hacer que otro de los GPIO funcionase vía software de esta forma, pero no conseguí nada. Y hace un par de días me encontré esta web, con precisamente las instrucciones para tener hasta 8 GPIO modulados PWM por software, lo cual me viene de perlas para el ardu-quad-raspbi-copter, porque podré transformarlo en el quad-raspbi-copter.
Para instalarlo es demasiado fácil:
cd /usr/src/
wget https://github.com/richardghirst/PiBits/archive/master.zip -O PiBits.zip
unzip PiBits.zip
cd PiBits-master/ServoBlaster
make
make install
make install_autostart
cat /dev/servoblaster
dependiendo de la versión del kernel tendrás que compilar más o menos, prometo hacer un paso a paso para los distintos kérneles cuando tenga tiempo. A mi me salia este fallo:
Error: could not insert module servoblaster.ko: Invalid module format
Lo solucioné machacando el archivo servoblaster.ko por este otro.
La idea del servoblaster es controlar servomotores, estos se diferencian de los motores DC en la forma en la que reciben las ordenes. Funcionan por PWM normalmente a 50Hz con una aplitud entre 1 y 2 milisegundos. Si le envías un tren de impulsos de 2 ms se moverá en un sentido y si lo envías de 1 ms, se moverá en el otro.
Ahora mismo no tengo ningún servo, así que lo pruebo con leds, este es el esquema:
Pido perdón de nuevo por mis escasísimos conocimientos de Fritzing. El orden de los GPIOs (que por ahora no consigo localizar el 3) se puede ajustar según las instrucciones que dan en la web, si no lo cambias, el orden es:

Ahora para usar PWM en el pin 7:
echo 7=120 > /dev/servoblaster
si queremos más brillo:
echo 7=220 > /dev/servoblaster
Si queremos fiesta:
while ((1)); do for n in $(seq 1 220); do echo 7=$n > /dev/servoblaster; done; for n in $(seq 220 -1 1);  do echo 7=$n > /dev/servoblaster; done; done

Como es PWM a 50 hz, coincide con la cámara y se ve algo feo, al natural es mucho más bonito. Si no ponemos pausas, la carga del micro es considerable, pero con pausas muy cortas, la carga disminuye considerablemente.

No hay comentarios:

Publicar un comentario