martes, 13 de agosto de 2013

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á!.

16 comentarios:

  1. Hola felicidades un proyecto genial, yo estoy intentado hacerlo tambien, pero tengo un problema cuando los conecto empiezan a temblar de una forma extraña como si tuviesen parquinson o algo raro... te ha pasado? creo que tengo los mismos servos que tu de dealextreme tpwer pro 9g sg90
    como solucionaste eso? en arduino funcionan bien
    gracias

    ResponderEliminar
  2. Hola buenas, ten cuidado con las pilas que añades yo he hecho ese mismo circuito y me he cargado la raspberry por sobrevoltaje si lo montas asi mejor poner un diodo para que la bateria no entre a alimentar la raspi o te pasará como a mi...

    ResponderEliminar
    Respuestas
    1. una de las grandísimas pegas que tiene el raspberry, precisamente es que no tiene limitador de intensidad/voltaje a la entrada. En mi opinión es una cagada, ya que otras plaquitas como el arduino si que lo tienen y encarece el producto pocos céntimos. Yo uso una fuente de alimentación mini-itx para estos menesteres.
      Que tu raspberry descanse en paz ...

      Eliminar
    2. ya he comprado otra nueva raspberry para volver al ataque con los servos, que me recomiendas hacer para que no me muera otra?
      he intentado volver a hacerlo pero me he dado cuenta que aparte de la raspberry se funció un servo, asi que solo me queda uno pero ese tampoco se menea con el script...
      desde arduino funciona asi que vivo me queda un servo pero no quiere funcionar con raspi, jejeje que me aconsejas??

      Eliminar
    3. te aconsejo tener cuidado, alimentar servo y raspberry desde la misma fuente, sobre todo con estos servos chungos, yo uso una mini itx para estos menesteres.

      Eliminar
  3. Hola que tal? estoy siguiendo tu tutorial para montar la camara pi oficial con el pan tilt por ahora tengo los servos que funcionan y tal pero tengo una duda dices que hay que graduarlos los tuyos a 30... no entiendo bien eso me lo puedes explicar??? gracias yo me compre los servos y y pan tilt en un pack del dealextreme.
    Por otro lado he intentado hacer la guia de mjpg-stremer pero la url ha cambiado y los paquetes tambien por lo que al seguir esa guia no llego a buen puerto, supongo que es por que ha cambiado todo el escenario del mjpg no?
    gracias y a ver si me puedes tirar un cable que estoy a medias :)

    ResponderEliminar
    Respuestas
    1. Hola, no veo eso de "graduar los mios a 30" ¿te refieres a este mismo post?

      Eliminar
    2. hay no perdona es que tengo todos los post tuyos abiertos para seguir el orden
      es de este Videocámara de seguridad motorizada

      Eliminar
    3. te parecerá una tontería pero ... te importa preguntarmelo en el otro post? Por si a alguien le surge la misma duda.

      Eliminar
    4. claro no te preocupes ya lo tienes en el otro :)

      Eliminar
  4. Hola que tal Juanmol ya voy por la modulación de los servos, estoy en este punto
    echo "0=0.045" > /dev/pi-blaster
    echo "1=0.25" > /dev/pi-blaster
    pero no se exactamente como graduar los mios, no entiendo a que corresponde los valores he hecho pruebas desde que dejan de hacer ruido (no se si se hace asi...)
    pero me salen estos valores, a ver que opinas...
    0=0.26 --- 0.099
    1=0.050 -- 0.25 y para que deje de hacer ruido 0.0
    me podrias explicar un poco por favor ando un poco liado y el script de abajo que haces no los hace rular, supongo que será por los valores
    gracias compañero

    ResponderEliminar
    Respuestas
    1. simplemente tienes que encontrar los valores minimos y maximos de tus servos, vas dando valores hasta que deje de moverse. En realidad le estas indicando una posicion a la que moverse, un angulo. Llegará un punto en el que servo no se mueva más, pues justo antes tienes uno de los limites.
      En el script tienes que trasladar los valores que te ha dado, si no no te funcionará. Es fácil, no mas de un minuto de pruebas.

      Eliminar
  5. Buenas Juan Mol, he hecho todo el proceso pero no consigo hacer mover el servo alguna idea de que hago mal? muchas gracias

    ResponderEliminar
    Respuestas
    1. me imagino que cuando ejecutas:

      echo "0=0.045" > /dev/pi-blaster
      echo "1=0.25" > /dev/pi-blaster

      no te sale ningún fallo ¿verdad? Has probado otros valores? puede ser que le llegue poca alimentación al raspberry? Si vas a usar una fuente externa, ten mucho cuidado con meterle voltios de más al rasp!

      Eliminar
  6. correcto, no me da ningun fallo, he probado con otros valores y nada, la raspberry la alimento con el usb, y el servo con alimentacion externa con un transformador para cargar baterias del mismo voltaje
    que rango de valores puedo probar?
    Gracias

    ResponderEliminar
    Respuestas
    1. no se, ve probando valores enteros, o incluso hazte un for:
      for n in $(seq 1 100);
      do
      echo "0=$n" > /dev/pi-blaster
      done
      o algo por el estilo ;)

      Eliminar