domingo, 5 de mayo de 2013

Control de vuelo

y aumentando el nivel de frikismo, ya que estamos

Buenas tardes, hace bastantes días escribí este post, donde explicaba como hacer lecturas analógicas de GPIOs. La idea era conectar un giroscopio para hacer el control de vuelo. Es perfectamente válido, pero hace un par de días pensé que podía simplificar un poco el circuito, si usaba un giroscopio con conexión serie, y por lo tanto solo dos hilos (más dos de alimentación). Así que cogí uno de mis 4 giroscopios con conexión serie, que tenía por casa y ...

y aquí esta mi giroscopio superpreciso, barato y con puerto serie:

¿qué os parece? Tal vez el color despista un poco. Necesito un adaptador, como este otro:

El adaptador no tiene circuitería, es solo una plaquita que saca cómodamente las conexiones, así que si no tienes mucho aprecio a tu Nunchuck, puedes cortarle el conecto.
He seguido varias páginas para configurar el RaspberryPi para que lea la información que le llega del Nunchuck y la mejor combinación que he encontrado ha sido:
apt-get install i2c-tools python-pip python-smbus

en el archivo /etc/modules tiene que aparecer:
i2c-bcm2708
i2c-dev
En el archivo /etc/modprobe.d/raspi_blacklist.conf comentamos (una # al comienzo de la línea) las líneas:
blacklist spi-bcm2708
blacklist i2c-bcm2708
Conectamos el adaptador al RaspberryPi:

  • Pi pin 1 es 3.3V lo conectamos al + del adaptador
  • Pi pin 6 es Ground y lo conectamos al - del adaptador
  • Pi pin 3 es el I2C Data Line y va conectado al D del adaptador
  • Pi pin 5 es el I2C Clock Line y va conectado al C del adaptador.

Ahora hay que bajar y compilar la última versión de WiringPi, con las mismas instrucciones del post anterior.
y probamos con:
i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

si no tenemos ese resultado, probamos con:
i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- 52 -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

con eso ya sabemos que tenemos que usar el bus 1. Ahora creamos el script de ejemplo /usr/local/bin/control_de_vuelo.py
import smbus
import time
bus = smbus.SMBus(1)
 
bus.write_byte_data(0x52,0x40,0x00)
time.sleep(0.1)
while True:
  try:
    bus.write_byte(0x52,0x00)
    time.sleep(0.1)
    data0 =  bus.read_byte(0x52)
    data1 =  bus.read_byte(0x52)
    data2 =  bus.read_byte(0x52)
    data3 =  bus.read_byte(0x52)
    data4 =  bus.read_byte(0x52)
    data5 =  bus.read_byte(0x52)
    joy_x = data0
    joy_y = data1
    accel_x = (data2 << 2) + ((data5 & 0x0c) >> 2)
    accel_y = (data3 << 2) + ((data5 & 0x30) >> 4)
    accel_z = (data4 << 2) + ((data5 & 0xc0) >> 6)
    buttons = data5 & 0x03
    button_c = (buttons == 1) or (buttons == 2)
    button_z = (buttons == 0) or (buttons == 2)
    print 'Jx: %s Jy: %s Ax: %s Ay: %s Az: %s Bc: %s Bz: %s' % (joy_x, joy_y, accel_x, accel_y, accel_z, button_c, button_z)
  except IOError as e:
    print e

y lo ejecutamos con:
python /usr/local/bin/control_de_vuelo.py

en la salida podemos ver la información que se recibe del Nunchuk. Ahora nos quedamos sólo con la parte del giroscopio y sólo los ejes X e Y:
import smbus
import time
bus = smbus.SMBus(1)
 
bus.write_byte_data(0x52,0x40,0x00)
time.sleep(0.1)
bus.write_byte(0x52,0x00)
time.sleep(0.1)
data0 =  bus.read_byte(0x52)
data1 =  bus.read_byte(0x52)
data2 =  bus.read_byte(0x52)
data3 =  bus.read_byte(0x52)
data4 =  bus.read_byte(0x52)
data5 =  bus.read_byte(0x52)
accel_x = (data2 << 2) + ((data5 & 0x0c) >> 2)
accel_y = (data3 << 2) + ((data5 & 0x30) >> 4)
print 'Jx: %s Jy: %s Ax: %s Ay: %s Az: %s Bc: %s Bz: %s' % (joy_x, joy_y, accel_x, accel_y, accel_z, button_c, button_z)
Tambien aprovechamos y quitamos el bucle. Probamos:
python /usr/local/bin/control_de_vuelo.py
403 567

el primer valor es el de X y el 2º el de Y. Ahora sólo nos queda comprobar ese dato cada vez que queramos dejar el Quad-Raspbi-Coptero parado en el aire, combinarlo con la velocidad actual de los motores y listo :) ¡control de vuelo!
¡¡ya mismo estamos volando!!

8 comentarios:

  1. Fácil, rápido y para toda la familia!

    Solo con leerlo, parece que pudiese hacerlo yo mismo.

    Genial!

    ResponderEliminar
  2. Hey Juan Mol, muy bueno tu blog! Estoy deseando probar algunas cosas desde hace tiempo.

    Sabes cual es el sitio mas economico donde comprar una Raspberry Pi? Un saludo!

    ResponderEliminar
    Respuestas
    1. mas economico en algun distribuidor oficial como Farnel, tendras que pagar gastos de envio y esperar. Si tienes prisa, puedes tener tu Raspberry comprada en España en menos de 24 horas en raspipc.es , tu decides.

      Eliminar
  3. Hola Juan Mol, muy buen trabajo como siempre!! ¿Algun email para poder contactar contigo de manera privada?

    ResponderEliminar
  4. Joder, que cracks!!, Estoy flipando!!

    Esta genial este proyecto que estáis desarrollando.
    Me gustaría montarme también un arducopter, tengo una RSPI y un arduino, me gusta la electrónica pero no controlo mucho el arduino (Siempre he programado PICs de Microchip) y tampoco tengo mucho tiempo...
    Me podríais decir que componentes serian necesarios, y donde encontrarlos para montar este arducopter??

    Os seguiré de cerca que esto es interesantísimo!!
    Un saludo, David.

    ResponderEliminar
    Respuestas
    1. pronto pondré la lista completa. Anímate y usa sólo el Raspberry, sin arduino.

      Eliminar
    2. Ok, intentaré trastear con la Rpi, aunque necesito ponerme primero con linux..., que eso si que estoy perdido, alguna recomendación de por donde empezar?
      Un saludo!!!

      Eliminar