Archivo de la categoría: pwm

Control PWM por software (parte 2)

para controlar 2 servo-motores

Hola de nuevo!. Llevo unos días probando pi-blaster, se trata de otro modulador de PWM por software, para nuestros Raspberrys. Ya había probado servoblaster, que va de maravilla, pero este va igual de bien y consume mucho menos recursos.

Pi-blaster permite controlar el PWM de 8 GPIOs, para nuestro ejemplo vamos a limitarlos a 2 GPIOs, para poder usar el resto de GPIOs para otros menesteres. La instalación es facilísima, primero descargamos:
cd /usr/src
git clone https://github.com/sarfata/pi-blaster.git
cd pi-blaster
si lo dejamos tal cual, tendremos los 8 GPIOs listos para modular PWM. Así que modificamos pi-blaster.c para dejarlo en 2 GPIOs. Esta es la parte del código original:
static uint8_t pin2gpio[] = {
4, // P1-7
17, // P1-11
18, // P1-12
21, // P1-13
22, // P1-15
23, // P1-16
24, // P1-18
25, // P1-22
};
y esta es como lo dejamos para que tenga sólo 2:
static uint8_t pin2gpio[] = {
17, // P1-11
18, // P1-12
};
El GPIO 17 responderá al código 0 y el GPIO 18 responderá al código 1. Después de hacer unas pruebas, veo que la modulación mínima a la que responden estos servos de juguete es 0.045 y como máximo 0.25, con una precisión la mar de aceptable 0.00001. Compilamos con:

make
make install
Para usarlo:
echo "0=0.045" > /dev/pi-blaster
echo "1=0.25" > /dev/pi-blaster
con eso estamos moviendo los servos a esas posiciones. Podemos hacer un bonito script /usr/local/bin/servo.sh:
#!/bin/bash
# prueba de servos
while ((1));
do
for n in $(seq 0.045 0.00001 0.25); do echo "$1=$n" > /dev/pi-blaster ; done
for n in $(seq 0.25 -0.00001 0.045); do echo "$1=$n" > /dev/pi-blaster ; done
done
y lo usamos:
./servo.sh 0 &
./servo.sh 1 &
facilísimo. Nos permitimos el lujo de montar unos brazos pan-tilt, la instalación es bastante provisional, no me acuséis de ser un cutre (al menos no por esto):


Hay miles de vídeos en youtube con esto mismo, mis servos son demasiado baratos/malos y requieren más alimentación eléctrica que la que el Raspberry es capaz de proveer, este es mi esquema eléctrico:


Y un vídeo de ejemplo (lo siento por la calidad del vídeo, prometo mejorarla):
En el siguiente post, configuraré motion para que haga de cámara de seguridad con seguimiento, casi ná!.

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.