sábado, 2 de febrero de 2013

lectura analógica con un único GPIO

controlando un RaspberryPi en el espacio

Uno de las grandes faltas (como ya he comentado) del RaspberryPi, comparándolo con un Arduino, es la carencia absoluta de entradas analógicas. Para el Cuad-Raspbi-Coptero, CRC a partir de ahora, necesito saber la posición espacial en la que se encuentra, para ello necesito leer datos de un giroscopio, lo que viene a ser, leer datos de 3 sensores analógicos. Veamos como se hace.
Hace unas semanas, recibí mi giroscopio, un adxl335 que compré en Miniinthebox, es este:
Lo compré pensando en que lo conectaría al Arduino, pero me he lanzado a la búsqueda de información sobre el tema y he llegado a esta web. La idea es cargar el condensador y calcular el tiempo que tarda en recibir un 1 un GPIOa mitad de camino. Mi explicación es pésima y mis conocimientos en electrónica muy cortitos, así que leed toda la información en la web. Esto es lo que se me ha ocurrido:
Básicamente es multiplicar por 3 el esquema de la web. Para el ejemplo usan un script en python:
#!/usr/local/bin/python

# Reading an analogue sensor with
# a single GPIO pin

# Author : Matt Hawkins
# Distribution : Raspbian
# Python : 2.7
# GPIO   : RPi.GPIO v3.1.0a

import RPi.GPIO as GPIO, time

# Tell the GPIO library to use
# Broadcom GPIO references
GPIO.setmode(GPIO.BCM)

# Define function to measure charge time
def RCtime (PiPin):
  measurement = 0
  # Discharge capacitor
  GPIO.setup(PiPin, GPIO.OUT)
  GPIO.output(PiPin, GPIO.LOW)
  time.sleep(0.1)

  GPIO.setup(PiPin, GPIO.IN)
  # Count loops until voltage across
  # capacitor reads high on GPIO
  while (GPIO.input(PiPin) == GPIO.LOW):
    measurement += 1

  return measurement

# Main program loop
while True:
  print RCtime(4) # Measure timing using GPIO4
personalmente, python no es mi preferido, pero no he conseguido hacer lo mismo en bash (por ahora). El GPIO se indica en la última línea, en mi caso usare el 4, 17 y 22. Os pongo un par de fotos:
... he usado esos pedazos de condensadores ... porque no tenia otros, son de 1 uF, y en lugar de diodos rectificadores, he usado leds porque ... porque no tenía diodos rectificadores.
Bueno ahora solo queda lanzar 3 veces el script en python, modificando el GPIO de la última línea. Y ya está, tenemos lectura analógica de 3 sensores (x y z) usando sólo 3 GPIOs. Ahora ya puedo estabilizar el vuelo del CRC por poco menos de 8€. Estos son un par de resultados, en reposo:
Este otro es inclinando el sensor en una sola dimensión:
He marcado en rojo la diferencia. Las oscilaciones se deben a que el Raspberry es algo inestable en el GPIO de 3'3V, tendré que ir haciendo una media cada medio segundo o algo por el estilo, pero bueno ... FUNCIONA!!.
Ahora hago una petición:
si alguien consigue hacer esto mismo usando bash, por favor que lo comparta con todos ;)
Y una vez más...
gracias Chuck.

Edición 24/03/2013

He vuelto a rehacer el circuito con los componentes que he comprado en Electan, tengo el mismo resultado que antes, pero ahora el circuito es más simple, claro y pequeño:


6 comentarios:

  1. Creo que te puede interesar http://raffaello.name/dynamic-works/flying-machine-arena, todo lo que se puede hacer con un copter

    ResponderEliminar
  2. El cacharro me parece que no es un giróscopo sino un acelerómetro

    ResponderEliminar
  3. Hola, eh leido tu blog y esta parte me ah parecido muy interesante finalmente estamos aun año vos ah logrado hacer el copter? de ser asi os apreciaria su respuesta

    ResponderEliminar
  4. hola buenas noches, en que programa haces el diagrama de conexiones de la Raspberry?

    ResponderEliminar
  5. Quiza esto les ayude!

    http://kikeremiau.blogspot.mx/2016/02/lectura-adc-raspberry-pi-gpio-con-un.html

    ResponderEliminar