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-devEn el archivo /etc/modprobe.d/raspi_blacklist.conf comentamos (una # al comienzo de la línea) las líneas:
blacklist spi-bcm2708 blacklist i2c-bcm2708Conectamos 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!!
Fácil, rápido y para toda la familia!
ResponderEliminarSolo con leerlo, parece que pudiese hacerlo yo mismo.
Genial!
Hey Juan Mol, muy bueno tu blog! Estoy deseando probar algunas cosas desde hace tiempo.
ResponderEliminarSabes cual es el sitio mas economico donde comprar una Raspberry Pi? Un saludo!
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.
EliminarHola Juan Mol, muy buen trabajo como siempre!! ¿Algun email para poder contactar contigo de manera privada?
ResponderEliminarGracias! apunta rsppi.blog@gmail.com
EliminarJoder, que cracks!!, Estoy flipando!!
ResponderEliminarEsta 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.
pronto pondré la lista completa. Anímate y usa sólo el Raspberry, sin arduino.
EliminarOk, intentaré trastear con la Rpi, aunque necesito ponerme primero con linux..., que eso si que estoy perdido, alguna recomendación de por donde empezar?
EliminarUn saludo!!!