jueves, 29 de diciembre de 2011

Leer radio PPM desde un emisor RC y Arduino. Tutorial

¿Qué diferencias hay entre leer la radio mediante PPM o mediante las señales de los servos?
           Según Jordi Muñoz, Rendimiento y simplicidad en el código son los motivos para leer en PPM y no en PWM.
           Una señal PPM (Pulse Position Modulation) integra todos los canales del receptor/emisor en una sola línea. Así usando sólamente un pin podemos leer los 8 canales de la radio. (Menos cables=menos problemas.)
           La idea es leer las señales de radio con un Arduino auxiliar y mandar los datos de radio ya leídos e interpretados por SPI o i2C al Arduino principal.
           Si desmontamos el receptor, desechando la carcasa y los pines (10x3= 30 pines) ahorramos alrededor del 70 % del peso. Que no es mucho en este caso,además también ahorra espacio.

click en la imagen para agrandar.
       Los transmisores de radio suelen tener dos modos: PPM (Pulse Position Modulation) y PCM (Pulse Code Modulation). Ponerla en modo ACRO (sin mezclas),  sin TRIM,  no DUAL-RATE y tampoco EXPONENCIAL. Esto es para que las lecturas del equipo no se vean distorsionadas por el software de la emisora.


               En el receptor Turnigy 9X 8CH V2 no se puede obtener en ningun sitio de su placa la señal PPM. Ya que este cuenta con dos micros, uno receptor y el otro decodificador, los cuales se comunican por SPI. Aquí una lista de como hackear receptores para sacar la señal PPM enlace.


              Aquí otra solución alternativa para obtener la salida PPM mediante un Chip extra, pero si puedes acceder a esta señal mucho más fácil, ¿no?
           Si no sabemos donde está nuestra señal PPM podemos cargar este programa (de Jordi) e ir comprobando todos los pines con el Serial Monitor hasta ver valores aleatorios de entre 300 y 9000, lo que significará que ya hemos encontrado el pin PPM. No olvidar interconectar las tierras del receptor y arduino!!

void setup()
{
Serial.begin(57600);
pinMode(3, INPUT);
}
void loop()
{
Serial.println(pulseIn(3, LOW));
}


           Los programas usados fueron creados por Jordi Muñoz y subidos al blog de Arduino el 1 de Enero de 2008.

Lector PPM básico Arduino
#define channumber 6 //Cuantos canales tiene tu radio?/How many channels have your radio?
int channel[channumber]; //Valores de canales leidos/ readed Channel values
int PPMin = 4;

void setup()
{
  Serial.begin(9600); //Iniciamos com serial/
  pinMode(PPMin, INPUT); //Patita 4 como entrada / Pin 4 as input
}

void loop()
{
  //Espera hasta que la senal de sincronizacion llegue, debe ser > 4 milisegundos
  //waits ultil synchronize arrives > 4 miliseconds
  if(pulseIn(PPMin , HIGH) > 4000); //Si el pulso del pin 4 es > que 4 msegundos continua /If pulse > 4 miliseconds, continues
  {
    for(int i = 1; i <= channumber; i++) //lee los pulsos de los demas canales / Read the pulses of the remainig channels
    {
 channel[i-1]=pulseIn(PPMin, HIGH);
    }
    for(int i = 1; i <= channumber; i++) //Imprime los valores de todos los canales / Prints all the values readed
    {
 Serial.print("CH"); //Canal/Channel
 Serial.print(i); // Numero del canal / Channel number
 Serial.print(": "); // que te importa
 Serial.println(channel[i-1]); // Imprime el valor/ Print the value
    }
    delay(200);//Le da tiempo para imprimir los valores en el puerto/ Give time to print values.
  }
}


Lector PPM básico con filtro Antisalto:

#define channumber 6 //Cuantos canales tiene tu radio???????/How many channels have your radio???
#define filter 10 // Filtro anti salto/ Glitch Filter
int channel[channumber]; //Valores de canales leidos/ readed Channel values
int lastReadChannel[channumber]; //Ultima lectura obtenida/ Last  values readed
int conta=0; //Contador/couter


void setup()
{
  Serial.begin(9600); //Iniciamos com serial/ Serial Begin
  pinMode(4, INPUT); //Patita 4 como entrada / Pin 4 as input
  pinMode(13, OUTPUT); // Led pin 13
}

void loop()
{

  if(pulseIn(4, HIGH) > 3000) //Si el pulso del pin 4 es > 3000 usegundos continua /If pulse > 3000 useconds, continues
  {
    for(int i = 0; i <= channumber-1; i++) //lee los pulsos de los canales / Read the pulses of the channels
    {
 channel[i]=pulseIn(4, HIGH);
    }
    for(int i = 0; i <= channumber-1; i++) //Promedia los pulsos/Average the pulses
    {
 if((channel[i] > 2000) || (channel[i] <100))//Si se pasa del rango envia ultimo pulso/ If channel > max range, chage the value to the last pulse
 {
  channel[i]= lastReadChannel[i];
 }
 else
 {
 channel[i]=(lastReadChannel[i]+channel[i])/2; //Promedio el pulso pasado con el nuevo pulso/Average the last pulse eith the current pulse
 conta++; //Incrementa el contador/ increment counter
 }
    }

    }
    if(conta > filter)//Si el contador es mayor al filtro imprime valores/ If counter is > than filter, then prints values
    {
 for(int i = 0; i <= channumber-1; i++) //Ciclo para imprimir valores/Cycle to print values
 {
   Serial.print("CH"); //Canal/Channel
   Serial.print(i+1); // Numero del canal / Channel number
   Serial.print(": "); // que te importa
   Serial.println(channel[i]);
   lastReadChannel[i]=channel[i];
 }
 if(channel[4] > 1000) //si el canal 5 tiene un rango mayor a 500 enciende el LED/ If channel 5 is > than 500 turn on the led
 {
   digitalWrite(13, HIGH);
 }
 else
 {
   digitalWrite(13, LOW);//Si no lo apaga/If not turn it off
 }
 delay(400); //Delay
 conta=0;//Reinicia el contador/ Restart couter.
    }
  } 










PPM Vs PWM
PPM and PWM are two different protocols for radio information. The PPM has the advantage that you can get all the channels information through one port only. Some call it PPM sum since it’s the sum of all channels. That helps a lot when you have limit number of connectors to your flightcontroller. So I will use PPM into my flight controller, and then the flight controller will use PWM outputs to the ESCs and to the servos for the camera mount.
By using the PPM input, I can now use 10 PWM outputs from my Open Pilot Copter Control instead of 6 PWM outputs. That is for obvious reasons essential for me, because my camera mount needs two servo outputs plus the 6 ESC outputs.

miércoles, 28 de diciembre de 2011

Como controlar un motor Brushless con Arduino. Tutorial

            A continuación explico con un pequeño tutorial, como controlar un motor Brushless con un variador de velocidad (ESC) y una placa Arduino o en mi caso, ArduPilotMega.



Necesitamos un batería LiPo, un ESC, un motor Brushless y un Arduino.

El esquema de conexión utilizado es el siguiente:


              Para controlar un motor de este tipo hay que mandar al ESC señales como si quisiéramos controlar un servo normal. Estas señales son cuadradas con un tiempo en alto que varían entre 1 y 2 milisegundos, que correspondería a un águlo de entre 0 y 180 grados. Podemos probar primero con un servo: Si un servo no se mueve, el motor brushless nunca lo hará.



          Para la conexión con el microcontrolador usaremos un pin de salida, en nuestro caso usaremos el pin 8. Si usamos ArduPilot Mega, este pin número 8 equivale al canal número 5 (CH_5). Conectamos el cable blanco al pin, el cable rojo, alimentación, queda libre y las tierras las unimos. (cable negro a GND del arduino)

          Para conectar el ESC, le conectamos los cables de alimentación a la batería LiPo mediante un conector tipo banana de 4mm.(también podemos utilizar un fuente de alimentación externa, pero debemos de asegurarnos que tenga la potencia que el motor requiera.. que por lo general suele ser alta) Y para las conexiones del motor, en mi caso he soldado unas pinzas como se muestra en la figura. Importante amarrar bien el motor a una madera, ya que al arrancar puede ser peligroso y más si es un motor outrunner.


      Para el código,importante armar el motor antes de arrancarlo, ya que si no lo hacemos no arrancará nunca. Para inicializar un motor basta con enviar señales de ángulo 0 hasta que el motor emita pitidos. Consiste en recibir un pulso de 1 milisegundo cada 20 milisegundos por un tiempo aproximado de 4 o 5 segundos.
        El proceso es:


  • Alimentar el ESC y escuchar la música de confirmación.
  • Armar: 

          myservo.write(0);   // Aramado

  • Esperar pitidos  "Ready".
  • Mover el motor:

           myservo.write(pulsoMotor); //pulsoMotor lo variamos desde alrededor de 70 a 180 (máximo)


          Notas:

  • Cada motor arranca con una señal de ángulo diferente, en mi caso está en 65º.
  • Si despues de armarlo envío señal de 70 directamente no arranca, hay que subir progresivamente. Basta con mandar un 30º y ya pasar a 70º.
  • Si queremos cambiar el sentido de giro al motor, intercambiando 2 de los 3 cables de motor es suficiente.



Descargar aquí el archivo con el CÓDIGO.

Para cualquier duda, sugerencia o opinión no dude en comentar. 

domingo, 18 de septiembre de 2011

Ventajas e inconvenintes: Tri, cuad, hexa y octo -cóptero.

       Según el uso que le queramos dar elegiremos el número de motores. En este caso la finalidad es la fotografía/vídeo aérea con cierta calidad. Las propiedades que queremos conseguir son:

  • Simplicidad y bajo peso en la estructura.
  • Capacidad de transportar una cámara de fotos reflex.
  • Fácilmente transportable y manejable.
  • Autonomía de unos 10 min.. 

            Las posiblidades son:     (todas la configuraciones de mikrokopter)
Tricopter: Barato y fácil de construir, menos estable, partes móviles en la estructura (cola móvil por un servo), bajo empuje y menos tiempo de vuelo (porque los motores tienen que girar más rápido para mantenerlo en el aire).

Cuadricopter: Más simple mecánicamente que el tricopter. Posee 1/3 más de empuje pesando casi lo mismo y suelen ser más estables ya que no  tienen partes móviles en la cola accionadas por un servo. Tienen más tiempo en vuelo debido a que pueden llevar baterías más grandes y a que los motores trabajan a menos revoluciones. Todavía no contamos con redundancia: Si un motor falla... cae.

lunes, 4 de julio de 2011

Cuadricópteros

Intro:

          UAV (Unmanned Aerial Vehicle) como dicen sus siglas, es un vehículo aéreo no tripulado, ya sea totalmente autónomo, por control remoto, RPA (Remote Piloted Aircraft) o sistemas mixtos. Tradicionalmente se han usado con fines militares, pero  actualmente se están desarrollando muchos otros usos civiles. Particularmente el uso con fines fotográficos me produce más interés.

Producción e investigación global: (UAV) (wikipedia)
             The United States and Israel were initial pioneers in this technology, and U.S. manufacturers have a market share of over 60% in 2006, with U.S. market share due to increase by 5–10% through 2016. Israeli and European manufacturers form a second tier due to lower indigenous investments, and the governments of those nations have initiatives to acquire U.S. systems due to higher levels of capability. European market share represented just 4% of global revenue in 2006.
Multicóteros:
       Un multicóptero es basicamente un helicótero pero con varios ejes y motores independientes. Existen tricópteros, cuadricópteros, hexacopteros, octocópteros... Tienen buena estabilidad y capacidad de carga.  Las hélices giran en sentidos contraopuestos para evitar que  gire sobre su propio eje de forma continuada debido a la inercia de las hélices. El control se lleva a cabo con una placa electrónica central que varía la velocidad de giro de cada motor independientemente, así se consiguen todos los movimientos posibles.


Usos no militares: 
  • Vigilancia aérea de grandes superficies mediante sistemas UAV low cost.
  • Trasporte de bienes.
  • Investigación científica: Sensado remoto, vehículos equipados con sensores de cualquier tipo: espectro electromagnético, sensores biológicos, químicos... 
  • Búsqueda y rescate en catástrofes naturales.
  • Otros fines comerciales como la fotografía y video aéreo. Como es el caso de Jeff Scholl, un americano que se dedica a la fotografia aérea profesionalmente. Su facebook. Tiene fotos y videos realmente impresionantes.
www.gravityshots.com

Algunos de los aparatos que usa Jeff Scholl para sus grabaciones son:



    Alguno de sus videos:


            Para poder grabar con estabilidad necesitamos un estabilizador Nick and Roll compensation:



              Con dos servos y unos amortiguadores del tipo rubber dampeners, dampeners2 reduciremos las vibraciones procedentes de los motores.



                Desde la universidad de Pennsylvania, el  GRASP Lab està trabajando en movimientos avanzados para quadricópeteros autónomos, aqui muestro algunos de sus videos:


    :



             En el siguiente video podemos ver un equipo de cuadricópteros cooperando para construir el marco de una pequeña estructura, un pequeño ejemplo del gran potencial que pueden llegar a tener estos ingeniosos aparatos en diversas tareas:



    viernes, 1 de julio de 2011

    Presupuesto aproximado Cuadricóptero y hexacóptero

                 Para hacernos una idea de cuánto puede costar un cuadricóptero básico voy a elaborar una lista de componentes inprescindibles: 
    • Motores
    • Hélices (Propellers)
    • Variadores de velocidad (ESC)
    • Electrónica 
    • Recepctor y emisor de radio
    • Chasis (Frame)


    Motores: 

    Variador de velocidad (ESC):
    Se encargan de convertir la corriente continua de las baterías a una trifásica alterna, que es la que necesitan nuestros motores.
    Emisor-receptor:
    Recibe ordenes desde el control remoto.

    Hélices:
    Importante elegir las hélices y motores correctos. Se puede ver aquí los pasos a seguir para cómo dimensionarlos.

    Quadricopter:
    Los precios unitarios a continuación son precios medios de productos de gama media-baja. Aunque suficientes para empezar.
    Elemento
    Cantidad
    Precio unitario
    Precio Total
    Motores
    4
    20$
    80$
    ESC
    4
    12$
    48$
    Hélices
    4+4 Repuesto
    3$
    24$
    Reciver y emisor
    1
    53$
    53$
    Baterias
    2
    25$
    50$
    Electrónica
    1
    250$
    250$
    chasis
    1
    ¿? $
    ¿? $
    TOTAL
    TOTAL
    500$

    Hexacopter: Descarga aquí el Archivo excel.

    Elemento
    Cantidad
    Precio unitario
    Precio Total
    Motores
    6 +1
    20$
    140$
    ESC
    6
    12$
    72$
    Hélices
    6+6 Repuesto
    3$
    36$
    Reciver y emisor
    1
    53$
    53$
    Baterias
    2
    25$
    50$
    Electrónica
    1
    250$
    250$
    chasis
    1
    ¿? $
    ¿? $
    TOTAL
    TOTAL
    601$

           Faltaría por añadir la electrónica y el chasis. Para la electrónica existe un proyecto Open Source con  mucha información en la su página web,DIYdrones, (versión en español) que está basado en Arduino. Consiste en una placa llamada ArduPilot (placa roja) y otra de sensores IMU shield (azul) que controlan todo tipo de aeronaves no tripuladas, ya sean helicopteros, multicopteros o aeroplanos. Está equipada con casi todos los sensores necesarios para controlar este tipo de aparatos.

          

             Es muy modulable y posee bastantes pines libres, de forma que puedes ir añadiéndole sensores u otros elementos como estabilizadores para cámaras, accionadores... Tiene conexión para el receptor de radio, es posible añadir telemetría, conexión USB para programar el micro 1280 y dispone de un relé para accionar periféricos.

    El hardware incluido es:
    • 3-axis gyros
    • 3-axis accelerometers
    • Barometric pressure sensor for altitude
    • 10Hz GPS module
    • Voltage sensors for battery status
    • 16Mb of onboard datalogging memory. Missions are automatically datalogged and can be exported to KML
    • Built-in hardware failsafe processor, can return-to-launch on radio loss.
    • Include relay can trigger any device, can be controlled by mission scripts.
    • (Optional) 3-axis magnetometer
    • (Optional) Airspeed sensor
    • (Optional) Current sensor



           El costo de este kit es de casi 250$, el de la imagen, aunque puedes disponer de uno más básico prescindiendo del GPS y magnetometer de 3 ejes, pero no bajaría de los 200$. 

    Actualización: Ya está disponeble la versión 2.5 la cual es más compacta y consta de algunas mejoras respecto a sensores. El precio a bajado a 199$!!


           El chasis galería de imágenes orientativos de chasis, quedaría por definir el diseño en función de los materiales y herramientas para su construcción disponibles.


    Aunque existen muchos chasis disponibles por la web bastante interesantes. Más fácil si no dispones de un taller con las herramientas necesarias.

    Cámaras:
             El objetivo de las cámaras es doble, transmisión en tiempo real y grabar video en alta cálidad o tomar fotos panorámicas. Aunque para nuestro hexacopter en una primera fase de diseño no tendrá cámaras.

              La cámara para la transmisión puede ser de baja resolución y envía las imágenes a tierra para poder llevar a cabo un mejor pilotaje o acceder a zonas donde se pierda la visión directa. También es útil para hacerse una idea de lo que se está grabando aproximadamente con la otra cámara. Tiene un peso aproximado de 16 gramos. OSCS420.  Muchas cámaras tienen salida de video, por lo que no necesitamos doble cámara.


              Como elemento principal de grabación se usan cámaras de fotografía de alta calidad/precio, para obtener buena resolución y nitidez. Estas imágenes/vídeos se almacenan para luego ser descargados por el procedimiento habitual en tierra. Es muy importante tener un estabilizador para la cámara que amortigüe las vibraciones y giros bruscos, de lo contrario el resultado no sería  bueno.


             Existe un modelo llamado GoPro que está especialmente diseñada para grabaciones en primera persona (POV) en deportes extremos como motocross, montainbike, surf, Skateboard, snowboard ... Sólo tiene las prestaciones necesarias para grabar y tomar fotos, así se consigue un peso mínimo con una alta calidad. Además soporta golpes y reduce "un poco" las vibraciones. Su precio oscila sobre 200$ y un peso de 94 gramos. Aquí podemos encontrar una protección bastante útil para la lente, así evitamos usar la carcasa ahorrando casi 100g de peso.

                  Para la transmisión del vídeo necesitaremos un emisor y receptor independiente de este tipo.

                     Su precio está en 100 dólares aproximadamente y puede alcanzar unos 2 o 3 kilómetros. Los pesos y medidas son:

    TX = 80.8 gram
    TX + antenna = 91.4 gram
    Camera = 12.6 gram
    Camera + wires = 19.0 gram
    Camera-TX-wire = 60 cm
    Lipo-TX-wire = 34 cm


    Ver más en Multicópteros!!!