Cómo construir un Drone con Windows 10 IoT

El 24 de febrero tuvo lugar la .NET Conference 2016 Spain, el mayor evento .NET realizado en España hasta la fecha. Aparte de la multitud de sesiones técnicas que tuvieron lugar a lo largo del día, los patrocinadores realizaron actividades variadas en sus stands. Una de ellas, organizada por DevsDNA consistía en la construcción de un Drone con Raspberry Pi.

Los drones han llegado para quedarse y convivir con nosotros. Forman parte de nuestras vidas y cada vez tienen más aplicaciones tanto a nivel personal como profesional.  Lo mismo ocurre con el Internet de las cosas, ha llegado para abrir nuevas posibilidades de interacción y automatización. Microsoft, con la última versión de su sistema operativo Windows 10, está apostando muy fuerte por IoT.

Si juntamos ambos factores, una pregunta aparece: ¿Se podría crear un Drone, con Windows 10 IoT como cerebro? La respuesta, es este artículo.

Juntando las piezas

Para el desarrollo de nuestra idea, hemos tenido que adquirir conocimientos de cómo se comporta en el aire un drone y qué componentes son necesarios. Existen multitud de tipos de drones, pero el más sencillo de desarrollar es el tipo de los cuadricópteros, con 4 rotores independientes.

Pasemos a conocer un poco más sobre este tipo de drone, para luego poder entrar en detalle al software y hardware usado.?

¿Cómo vuela un cuadricóptero?

Un multirotor usa tanto la fuerza de propulsión de los rotores como el torque de giro de estos para mantenerse en un vuelo estable.

A continuación podemos ver cómo se configuran y se deben accionar los rotores en nuestro cuadricóptero.

 

1 El objetivo final de todo drone es conseguir un vuelo lo más estable posible y sin giros aleatorios. Para conseguirlo estos deben colocarse como en la imagen. Consiguiendo así que los torques de los rotores se contrarresten. Unos rotores giran en sentido horario y otros en sentido anti horario
2 Para realizar un giro de alabeo (roll) a la derecha, deben acelerarse los rotores señalados en verde.
3 Para realizar un giro de alabeo (roll) a la izquierda, deben acelerarse los rotores señalados en verde.
4 Para realizar una inclinación (pitch) hacía atrás, debemos acelerar los rotores señalados en verde.
5 Para realizar una inclinación (pitch) hacía adelante, debemos acelerar los rotores señalados en verde.
6 Para hacer un giro sobre sí mismo (yaw) hacía la izquierda, se deben acelerar los rotores señalados en verde y desacelerar los rotores marcados en rojo.
7 Para hacer un giro sobre sí mismo (yaw) hacía la derecha, se deben acelerar los rotores señalados en verde y desacelerar los rotores marcados en rojo.

Todos estos movimientos, en un vuelo estable, ocurren a la vez para corregir la posición del cuadricóptero en el espacio. La siguiente cuestión es, ¿cómo conocemos la posición del cuadricóptero en el espacio?

IMU, unidad de medición inercial

La unidad de medición inercial es una colección de sensores que nos ayudan a conocer la posición espacial de nuestro cuadricóptero. Esta información se envía a un tercer componente, encargado de que los rotores actúen de la forma oportuna.

Este componente es la controladora de vuelo. Encargada de leer los datos de la IMU y dar las órdenes a los rotores para mantener el cuadricóptero estable.

Controladora de vuelo

La controladora de vuelo hace uso de un algoritmo genérico de robótica para estabilizar nuestro drone en vuelo. Este algoritmo es el control PID.

Básicamente se trata de un control por retroalimentación. Debemos indicarle tres parámetros diferentes: posición deseada, posición actual y potencia actual de los motores. El algoritmo se encargará de devolvernos la potencia necesaria para obtener la posición solicitada.

Para más información sobre el controlador PID, recomiendo este enlace https://es.wikipedia.org/wiki/Controlador_PID.

Ahora ya conocemos cómo funciona un multirotor y cuáles son sus partes. Vamos a identificar los componentes que hemos usado en nuestro Proyecto.

No vamos a hablar mucho sobre el chasis ya que es una parte que podríamos denominar secundaria. En nuestro caso hemos usado un viejo chasis comercial, el TBS Discovery, pero se podría usar o construir cualquier chasis y extrapolar la controladora de vuelo.

Componentes

1 x Raspberry Pi 2 con Windows 10 IoT.Como instalar Windows 10 IoThttps://ms-iot.github.io/content/en-US/win10/IoTDashboardTroubleshooting.htm
9 1 x Adafruit 10 DOFhttps://www.adafruit.com/products/1604
10 1 x Adafruit PCA9685https://www.adafruit.com/product/815
11 4 x Motores de 920Kv y 4 x reguladores (ESC) de 30Amphttps://www.dji.com/product/e300
12 1 x Lipo Battery  3S(12V) 3300mahhttps://www.banggood.com/ZOP-Power-11_1V-3300MAH-35C-Lipo-Battery-XT60-Plug-p-955392.html

 

La Raspberry Pi 2 con Windows 10 IoT actuará como nuestra controladora de vuelo. En nuestro caso para la IMU hemos usado la colección de sensores de Adafruit 10DOF. Esta placa nos ofrece:

  • Acelerómetro.
  • Giroscopio.
  • Magnetómetro.
  • Barómetro.
  • Temperatura.

Con los datos leídos, la Raspberry Pi 2 actúa sobre los motores para mantener el cuadricóptero estable.

Es en este punto nos encontramos un primer obstáculo. En Windows 10 IoT las salidas GPIO son digitales (0/1, encendido/apagado). Pero necesitábamos poder modularlas con una señal PWM. Esto nos permite aplicar distintas potencias a los reguladores (ESC) que controlan los motores. Este mismo caso lo tendríamos para regular los servos de un robot.

Para solucionarlo, hemos tenido que usar una componente externo para modular una señal PWM, el driver Adafruit PCA9685. En próximas versiones de Windows 10 IoT, esperamos que se soporte la modulación con lo que podríamos eliminar este componente del esquema.

Veamos cómo se conectan todos los elementos.

13

Por simplicidad, hemos dibujado un solo conjunto, de los cuatro necesarios, de reguladores (ESC) y motores. Los ESC necesitan ser alimentados con los 12 voltios de la batería de litio y se conectan para la señal a la PCA9685 desde el conector 0 al 3. Esto se corresponde con la posición de los motores en el cuadricóptero. Debemos saber cuáles son para que trabajen juntos a la hora de realizar los movimientos necesarios.

Los dos componentes de Adafruit, tanto el conjunto de sensores como el modulador, van conectados a los pines I2C1 SDA y I2C1 SCL. Esto nos permite conectarnos por medio del bus I2C cómo veremos en las siguientes secciones.

Ya tenemos todo listo para poder crear nuestro proyecto en Visual Studio.

Creando el proyecto Windows 10 IoT

En nuestro caso, ya que queríamos enseñar de forma visual cómo funcionaba nuestra controladora de vuelo, hemos elegido crear un proyecto Windows Universal. El único paso extra a realizar es añadir una referencia a la extension para Windows IoT.

14

De esta forma tenemos la posibilidad de añadir vistas. En un uso normal, lo mejor sería crear un proyecto para una tarea en background y dedicar los recursos de la Raspberry Pi 2 al vuelo del cuadricóptero.

Esta es una de las mayores ventajas de Windows 10 y la plataforma universal de aplicaciones. Con el mismo código que usaríamos para crear una app para Windows 10 o Windows 10 mobile, vamos a desarrollar un drone.

Como conectar a los dispositivos

Como hemos dicho, los componentes que usamos están conectados a la Raspberry Pi 2 a través de los pines I2C. Esto nos permite una conexión rápida y sencilla desde código. Sólo necesitamos conectar la dirección I2C dada por el fabricante para cada uno de los componentes.

Primero obtenemos el identificador para nuestro dispositivo I2C, este siempre será el mismo identificador y será el que nos de la Raspberry Pi 2.

15

Una vez identificado nuestro dispositivo I2C, ya podemos conectarnos a nuestro componente con la dirección del fabricante. Como necesitamos una respuesta muy rápida, vamos a conectarnos usando el FastMode del dispositivo I2C.

16

Con nuestro componente conectado, ya podríamos acceder a sus funcionalidades. En el caso del acelerómetro una lectura de sus valores sería de la siguiente manera. Siempre siguiendo las especificaciones del fabricante del hardware:

17

Lo mismo ocurre en el caso de la moduladora PCA9685. Una vez que tengamos acceso a ella, tendremos que configurarla siguiendo los pasos del fabricante para obtener un pulso que corresponda con la capacidad de nuestro regulador del motor, una medida estándar son los 400Hz.

Cuando esté conectada y configurada, acelerar un motor será tan sencillo como indicar cual queremos acelerar y cambiar la amplitud del pulso. A mayor amplitud, mayor aceleración tendrá el motor.

Para ello el fabricante nos da el siguiente código:

1819

Del cual nosotros haremos uso de la siguiente manera:

20

Una vez que tenemos lo necesario para conocer la posición de nuestro cuadricóptero y actuar sobre los rotores, debemos tener acceso a esta información de la forma más rápida possible.

Es conocido que Windows 10 no es un sistema operativo en tiempo real. Pero tenemos acceso a técnicas como ReactiveX (https://reactivex.io). ReactiveX nos permite subscribirnos a la lectura de los datos de nuestra IMU y conocer sus cambios lo antes possible.

La moduladora PCA9685 también ayuda a paliar este problema, ya que es capaz de repetir la última señal que le hayamos enviado mientras la Raspberry Pi 2 sigue procesando las demás variables de nuestro Sistema.

Usando Reactive X y la controladora PID

Reactive X nos permite subscribirnos a los cambios de una variable, detectando cada cambio y lanzando el código que queramos ejecutar a continuación. Es una técnica indispensable para nuestra controladora de vuelo. La parte de código que se ejecuta en cada detección es el sitio ideal donde usar el algoritmo de control PID. Este algoritmo necesita una medida de tiempo entre una lectura y la siguiente de nuestra IMU.

Inicializando la controladora PID

Al principio de este artículo ya hemos visto los movimientos que deben hacerse para mantener un cuadricóptero en vuelo estable: Alabeo (roll), cabeceo (pitch) y guiñada (yaw).

En vuelo, para llegar a la posición de vuelo estable, necesitamos que un algoritmo de control PID se encargue de calcular la potencia necesaria para cada movimiento disponible. Necesitaremos inicializar tres controladoras, una para cada movimiento:

21

Cada controladora PID necesita que le pasemos los siguientes valores para sus cálculos:

  • Valor proporcional: P.
  • Valor de velocidad de respuesta: I.
  • Valor paliativo para el error acumulado: D.

En este ejemplo hemos usado los mismo valores para inicializar las tres controladoras PID. En una aplicación comercial, cada uno de estos valores podría ser independiente.

 

22

 

El afinado de los valores P,I y D de la controladora es un proceso largo y es una parte importante en los multirotores, tanto comerciales como DIY. Hay muchos videos dando las claves para llegar a una configuración ideal. Es un proceso que requiere muchas pruebas de vuelo para una correcta calibración.

Una vez inicializadas nuestras controladoras PID, sólo nos falta subscribirnos con ReactiveX a los cambios de la IMU. Recordemos que las controladoras PID necesitan que le pasemos la posición deseada. Por ello, en un primer momento, leeremos los primeros datos de la IMU como nuestra posición deseada. Esto implica que siempre deberemos encender nuestro cuadricóptero en una posición estable. Lo normal es que esta calibración se guarde y se use en siguientes inicializaciones del drone, pero para nuestro ejemplo lo dejaremos así.23

Con esto, ya tendríamos nuestra controladora preparada para un vuelo estable. Bastaría con realizar pruebas de vuelo para afinar los valores de inicialización P, I y D y conseguir una corrección que funcione correctamente.

Conclusión

Hoy en día existen en el mercado muchas controladores de vuelo, como pueden ser la CC3D o la NAZE. Son controladoras muy buenas, baratas y con la posibilidad de varios tipos de drone y modos de vuelo. No solo vuelo auto nivelado como es el que hemos abordado con este Proyecto.

Este proyecto busca  y ha logrado demostrar que con Windows 10 IoT podemos usar nuestros conocimientos de C# y .NET, incluso para hacer volar un drone. Creemos que por naturaleza, la Raspberry Pi 2 con Windows 10 IoT en un drone, tendría su perfecta aplicación como gestora de la ruta del vuelo y los datos que queramos recopilar con componentes externos, como cámaras térmicas por ejemplo. Estos se podrían enviar a nuestro backend en Azure en pleno vuelo.

Materiales:

Video en el canal de DevsDNA del drone en funcionamiento:

https://youtu.be/fppwwdzYcZA

Código fuente de la demo:

https://github.com/DevsDNA/Win10Drone

Bibliografía

Precedente de experimento para volar un cuadricóptero en .NET

https://microsoft.hackster.io/en-US/Biscuits24_/pilotgadgetry-ead82c?ref=platform&ref_id=4087_trending___&offset=57

Reactive X

https://reactivex.io/documentation/observable.html

Controladora PID

https://en.wikipedia.org/wiki/PID_controller

Sobre Ciani Afonso

Ciani Afonso es Senior Mobile Developer en DevsDNA, empresa de desarrollo móvil con Xamarin y Windows 10.

Apasionado de los drones y el aeromodelismo. Llevo los últimos 10 años trabajando con tecnologías Microsoft. He desarrollado sistemas de seguimiento GPS y aplicaciones móviles. Soy un apasionado de la aviónica y del IoT. Construyo mis propios aviones y drones desde hace más de 15 años con mi propia CNC, construida por mi padre y por mi, y placas propias. Windows 10 ha unido mi pasión y mi trabajo permitiéndome extender mis conocimientos de desarrollo en C# al mundo del aeromodelismo.