Archivo de la categoría: nunchuk

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