Dron Controlado por la Mente: Usando EEG para Volar un Micro Drone de Carreras
Componentes y Suministros
| Arduino MKR1000 | 1 |
| Micro Drone de Carreras | 1 |
| Condensador 100 µF | 4 |
| Resistencia 221 ohm | 4 |
| Cables Dupont (genéricos) | 12 |
| Protoboard (genérica) | 1 |
| Mindwave Neurosky | 1 |
Herramientas Necesarias
- Soldador (genérico)
- Destornillador Digilent
Aplicaciones y Servicios Online
- Processing 3
- Arduino IDE
Sobre el Proyecto
Antecedentes
Me fascinan los drones, esas pequeñas máquinas voladoras que pueden hacer casi cualquier cosa. Cuando tuve la oportunidad de hacer un proyecto con tecnología genial, decidí hacer realidad el sueño de un niño: controlar un dron con la mente.
En mi investigación para este proyecto no encontré tutoriales que cubrieran cómo hackear un controlador de dron fácilmente. La mayoría tratan sobre cómo crear tu propio dron con Arduino o cómo hackear el protocolo de transmisión.
Este tutorial cubre el concepto más básico de hackear una PCB para controlarla digitalmente. El objetivo es enseñarte los conceptos básicos que te permitirán experimentar por tu cuenta con un dron y crear algo divertido.
Avisos
- Puedes dañar irreversiblemente tu dron o el controlador.
- Este proyecto solo cubre despegue y aterrizaje, no el pilotaje completo.
- No necesitas necesariamente un sensor MindWave/EEG; puedes usar cualquier entrada. ¡Pero controlar un dron con la mente es pura genialidad!
Habilidades Necesarias
Este tutorial asume que tienes alguna experiencia con soldadura y desoldadura.
Lista de Piezas
- Dron + controlador
- Estación de soldadura + accesorios (cable de cobre trenzado, bomba de desoldar, tercera mano, cables de núcleo sólido, estaño)
- Multímetro
- Sensor MindWave
- Arduino MKR1000
- Protoboard
- 4x Condensadores 100uF
- 4x Resistencias 220Ω
- 12x Cables Dupont
- 6x Cables con pinza cocodrilo (opcional)
También necesitas 4 resistencias con un valor de resistencia aún desconocido.
Fase 1: PCB del Dron
Puedes usar casi cualquier dron. La mayoría de los controladores usan joysticks de dos ejes. Esos joysticks es lo que vamos a saltar (bypass).
Primero, abre la carcasa del controlador. Este usa dos pilas de 1.5V que suman aprox. 3.3V. Este valor es el mismo que la salida del Arduino MKR1000.
Es posible usar otro Arduino, pero ten cuidado: puedes romper la placa si le das más voltaje del que la PCB puede manejar (hablo por experiencia).

Mide con un multímetro los voltajes medio, alto y bajo de los joysticks una vez alimentados. Anótalos para después.

Desolda los componentes del joystick de la PCB.


En realidad, estos componentes de joystick son solo potenciómetros. Un potenciómetro es una resistencia variable analógica. Puedes medir la resistencia máxima con un multímetro. Conecta el multímetro a + y - para leer la resistencia.

Suolda 4 resistencias (en este caso 10Ω) en los agujeros de + y - de los joysticks para completar el circuito.

También suelda cables de núcleo sólido a los puertos + (B+ en esta placa) y - (B- en esta placa) en la PCB. Y suelda cables de núcleo sólido a los puertos de señal de los joysticks.
Ahora tienes tu controlador preparado para el siguiente paso.

Fase 2: Digital a Analógico
Cuando usas AnalogWrite en tu Arduino, la salida será una señal PWM (Modulación por Ancho de Pulso). El pin pondrá su valor HIGH y LOW a una frecuencia determinada.
Nuestra PCB preparada no admite PWM, espera un voltaje estable.

Para crear un valor analógico podemos usar varios convertidores digital-analógico como un chip DAC o un filtro escalera R-2R.
Como quiero mantener este proyecto lo más simple posible, te enseñaré cómo usar un Filtro Pasa-Bajos, que nos dará la salida deseada.
Para crear un filtro pasa-bajos necesitas un condensador y una resistencia.

Una de las características de un filtro pasa-bajos es que el voltaje analógico cambiará gradualmente (tarda un tiempo). Este circuito funciona mejor para mí porque da el resultado deseado y usa pocos componentes.

Fase 3: El Circuito Arduino
La parte principal de nuestro circuito es el filtro pasa-bajos que creamos recientemente. Haz cuatro en fila y tendremos un voltaje analógico para las cuatro entradas del controlador.


Conecta las salidas correctas a las entradas correctas en la PCB del controlador. Asegúrate de tenerlo correcto antes de subir el sketch al Arduino.

La disposición estándar del dron es la siguiente:
- Throttle (Acelerador) => arriba/abajo en el lado izquierdo del controlador
- Yaw (Guiñada) => izquierda/derecha en el lado izquierdo
- Pitch (Cabeceo) => arriba/abajo en el lado derecho
- Roll (Alabeo) => izquierda/derecha en el lado derecho
Una vez todo conectado, puedes subir tu sketch al Arduino MKR1000. Puedes encontrar el sketch al final de este tutorial.
El Arduino reemplazará las pilas y enviará señales (como voltajes) a los joysticks bypassados. En este momento puedes crear tus propios programas y experimentos para controlar el dron con PWM.

Ahora te mostraré cómo usar Processing y un sensor MindWave para hacer despegar el dron.
Fase 4: Control Mental
Instala todos los drivers en tu computadora. Este sensor MindWave viene con un CD.

Empareja el sensor MindWave a tu computadora por Bluetooth. Mantén el botón pulsado 3 segundos y el LED azul parpadeará dos veces; ahora es detectable.

Una vez conectado, inicia Processing.
Instala la librería MindSet creada por Jorge C. S Cardoso para Processing desde https://jorgecardoso.eu/processing/MindSetProcessing/#download
Descomprime la librería en tu carpeta libraries (la encontrarás en tu carpeta de Processing).
Asegúrate de que los puertos COM sean correctos en el setup, o terminarás con un error. Puedes encontrar los puertos COM en el Administrador de Dispositivos.
También puedes encontrar el puerto COM del Arduino en "Herramientas" en el Arduino IDE en "Puerto".
Y el puerto COM del sensor MindWave en las Preferencias de ThinkGear Connector (obtienes este programa al instalar los drivers) en "Opciones".
receiver = new Serial(this, "COM10", 115200);
mindSet = new MindSet(this, "COM5");
Processing se comunica con tu Arduino vía Serial. Puedes alterar el código de Processing a tu gusto; lee los comentarios en el sketch para entender qué ocurre.
Ejecuta tu sketch de Processing y concéntrate en tu dron. Cuando tu nivel de concentración supere el 40%, el dron despegará. Cuanto más te concentres, más agresivo será el dron. Puedes aterrizar el dron dejando divagar tu mente y dejando de concentrarte.

Conclusión
Espero que este tutorial te dé una idea de lo simple que puede ser hackear un controlador de dron (o cualquier PCB) y darle otra entrada. Puedes descubrir con experimentación cómo obtener otras entradas para controlar y cómo hacer otros movimientos además de despegar y aterrizar.
¡Estoy emocionado de ver qué cosas geniales haréis!
Código
Processing Master (Processing)
/*
* Drone mind control
* This sketch sends Serial values to a receiver
* The input is generated via a Neurosky MindSet Mobile headset
* Created 21 March 2018
* By Wesley Hartogs
* Communication and Multimedia Design
* Avans University of Applied Sciences
*/
import processing.serial.*;
Serial receiver;
import pt.citar.diablu.processing.mindset.*;
MindSet mindSet;
int throttle = 0;
int yaw = 127;
int pitch = 127;
int roll = 127;
void setup() {
size(150, 500);
receiver = new Serial(this, "COM10", 115200);
mindSet = new MindSet(this, "COM5");
smooth();
strokeWeight(5);
stroke(255);
strokeCap(SQUARE);
fill(255);
}
void draw() {
background(0);
line(0, height*0.60, width, height*.60);
line(width*.5, height, width*.5, height*map(float(attentionLevel)/100, 0, 1, 1, 0));
throttle = int(map(attentionLevel, 40, 100, 30, 255));
throttle = constrain(throttle, 0, 255);
pitch = constrain(pitch, 0, 255);
roll = constrain(roll, 0, 255);
yaw = constrain(yaw, 0, 255);
if (receiver.available() > 0) {
println("attentionLevel: "+attentionLevel+" throttle: "+throttle+" yaw: "+yaw+" pitch: "+pitch+" roll: "+roll);
receiver.write("throttle: "+throttle+" yaw: "+yaw+" pitch: "+pitch+" roll: "+roll);
}
}
void keyPressed() {
if (key == 'k' || key == ESC) {
if (receiver.available() > 0) {
receiver.write("throttle: "+0+" yaw: "+127+" pitch: "+127+" roll: "+127);
exit();
}
}
}
int signalStrenght = 0;
int attentionLevel = 0;
public void attentionEvent(int attentionLevel_val) { attentionLevel = attentionLevel_val; }
public void poorSignalEvent(int signalNoise) {
if (signalNoise == 200) { println("Mindset is not touching your skin!"); }
signalStrenght = int(map((200-signalNoise), 200, 0, 100, 0));
println("Signal strength: " + signalStrenght + "%");
}
Drone Control (Arduino)
/*
* Drone control
* This sketch receives Serial input values (from processing) and sends these values to the hacked controller.
* Use this program only with the Arduino MKR1000 (or another 3.3 volt output based Arduino)
* The circuit:
* - 4 Low Pass filters with 100 µF capacitors and 220Ω resistors
* - Hacked drone controller
* Created 21 March 2018
* By Wesley Hartogs
* Use this sketch at your own risk.
*/
int throttle = 0;
int yaw = 255/2;
int pitch = 255/2;
int roll = 255/2;
int throttlePin = 2;
int yawPin = 3;
int pitchPin = 4;
int rollPin = 5;
void setup() {
Serial.begin(115200);
pinMode(throttlePin, OUTPUT);
pinMode(yawPin, OUTPUT);
pinMode(pitchPin, OUTPUT);
pinMode(rollPin, OUTPUT);
}
void loop() {
if (Serial.available() > 0) {
throttle = Serial.parseInt();
yaw = Serial.parseInt();
pitch = Serial.parseInt();
roll = Serial.parseInt();
}
analogWrite(throttlePin, throttle);
analogWrite(yawPin, yaw);
analogWrite(pitchPin, pitch);
analogWrite(rollPin, roll);
}
Esquemáticos
Convertir señal PWM a voltaje analógico
Circuito para conectar Arduino MKR1000 al controlador hackeado
Proceso de manufactura
- Detector de idiomas TinyML con Edge Impulse en Arduino Nano 33 BLE Sense
- Construye un Juego Giroscópico en Tiempo Real con Arduino Nano y Sensor MPU-6050
- Proyecto Dados Digitales Arduino: Construye tu Propio Generador de Números Aleatorios con LCD
- Construye tu Propio Juego de Ruleta de 37 LEDs con Arduino Nano
- ATtiny85 Mini Arcade: Snake – Construye una Consola Portátil OLED
- Detector de Rango Portátil – Kit DIY Arduino Nano con HC-SR04, Batería 18650 y Carcasa Impresa en 3D
- Controlador de Humidificador DIY con Arduino y Relé: Configuración Segura de Alto Voltaje
- Robot pinza controlado remotamente para manipulación de precisión
- Proyecto de electroplacado de cobre: Construye un sistema inteligente con Arduino UNO
- Pong Neón en Matriz NeoPixel con Arduino Nano
- Crea Secuencias de Luz Impactantes con Arduino y Registro de Desplazamiento