Управление дроном силой мысли: EEG (MindWave) и Arduino MKR1000
Компоненты и материалы
| Arduino MKR1000 | × | 1 |
| Микро-гоночный дрон (с пультом) | × | 1 |
| Конденсатор 100 мкФ | × | 4 |
| Резистор 220 Ом | × | 4 |
| Перемычки (набор) | × | 12 |
| Макетная плата | × | 1 |
| NeuroSky MindWave Mobile (EEG) | × | 1 |
Инструменты
- Паяльная станция (припой, отсасыватель, оправка, медная оплетка, монтажные провода)
- Мультиметр
- Отвертка
Приложения и сервисы
- Processing 3
- Arduino IDE
О проекте
Предыстория
Дроны меня фокусируют. Когда появилась возможность сделать проект с крутой технологией, решил осуществить мальчишкую мечту — управлять дроном силой мысли.
В поисках туториалов не нашел ни одного, как просто взломать пульт дрона. Большинство руководств — как собрать дрон на Arduino или как взломать протокол передачи. Этот туториал покрывает базовую концепцию цифрового взлома печатной платы для управления ею. Цель — дать базу для собственных экспериментов.
Важные замечания
- Вы можете сжечь дрон или пульт — риск есть.
- Проект охватывает только взлет и посадку, не полноценное пилотирование.
- MindWave/EEG не обязателен — можно использовать любой вход. Но управление умом — это просто великолепно!
Видео-туториал
(Ссылка на видео в оригинале)
Необходимые навыки
Опыт пайки и распайки компонентов.
Список деталей
- Дрон + пульт
- Паяльная станция + расходники
- Мультиметр
- Датчик MindWave
- Arduino MKR1000
- Макетная плата
- 4× конденсатор 100 мкФ
- 4× резистор 220 Ом
- 12× перемычки
- 6× крокодиловые зажимы (опционально)
- 4 резистора с пока неизвестным номиналом (подбираются экспериментально)
Этап 1: Плата пульта дрона
Подойдет почти любой дрон с двумя осевыми джойстиками. Мы их обойдем.
- Разберите корпус пульта. Этот пульт питется от двух элементов 1,5 В (≈3,3 В) — совпадает с логикой Arduino MKR1000. Важно: другой Arduino с 5 В логикой может сжечь плату пульта (говорию по опыту).
- Подайте питание на пульт, измерьте мультиметром среднее, максимальное и минимальное напряжения на выходе каждого джойстика. Запишите значения.
- Распаяйте оба джойстика с платы.
- Джойстики — это по сути потенциометры. Измерьте максимальное сопротивление между внешними выводами (+ и -) мультиметром.
- Припаяйте 4 резистора (в примере 10 Ом) на места внешних выводов джойстиков, замыкая цепь питания.
- Припаяйте монтажные провода к питанию платы (B+ и B-) и к сигнальным выводам джойстиков (4 провода). Пульт готов к следующему этапу.







Этап 2: ЦАП — преобразование PWM в аналог
analogWrite() на Arduino выдает ШИМ (PWM). Плата пульта ждет стабильное аналоговое напряжение. Нужно преобразовать ШИМ в постоянное напряжение.
Вместо специализированных ЦАП или R-2R лестниц используем простой ФНЧ (фильтр низких частот) из резистора и конденсатора. Он плавно сглаживает ШИМ в аналоговое значение — идеально для нашей задачи и требует минимум деталей.



Этап 3: Схема с Arduino
Собираем 4 ФНЧ в ряд — по одному на каждый вход пульта (газ, рысканье, тангаж, крен).


Подключаем выходы ФНЧ к соответствующим входам платы пульта. Тщательно проверьте соответствие перед загрузкой скетча.

Стандартная раскладка каналов пульта:
- Throttle (газ) — вверх/вниз левого стика
- Yaw (рысканье) — влево/вправо левого стика
- Pitch (тангаж) — вверх/вниз правого стика
- Roll (крен) — влево/вправо правого стика
Загружаем скетч в Arduino MKR1000 (код ниже). Теперь Arduino заменяет батарейки пульта и посылает напряжения на обойденные джойстики. Можно писать свои программы управления дроном через ШИМ.

Этап 4: Ментальное управление
- Установите драйверы MindWave (идут на диске).
- Сопрягите MindWave с компьютером по Bluetooth: держите кнопку 3 сек — синий индикатор мигнет дважды, устройство доступно для связывания.
- Запустите Processing.
- Установите библиотеку MindSet для Processing от Jorge C. S Cardoso: скачать. Распакуйте в папку libraries внутри папки Processing.
- Проверьте COM-порты в диспетчере устройств:
- Arduino — в Arduino IDE: Tools → Port
- MindWave — в ThinkGear Connector Preferences → Options
- В скетче Processing укажите правильные порты:
receiver = new Serial(this, "COM10", 115200); // Arduino mindSet = new MindSet(this, "COM5"); // MindWave - Запустите скетч Processing. Сосредоточьтесь на дроне. При уровне концентрации (attention) выше 40% дрон взлетит. Чем сильнее концентрация — тем агрессивнее полет. Расслабьте ум — дрон посадится.



Заключение
Надеюсь, туториал показал, как просто можно взломать пульт дрона (или любую плату) и подать альтернативный вход. Экспериментируйте с другими входами и движениями!
С нетерпением жду ваших крутых проектов!
Код
Processing master (Processing)
Подключается к MindWave по Bluetooth Serial, отправляет значение attention как 8-битное целое в Arduino.
/* Drone mind control
* Отправляет Serial-значения в Arduino
* Вход: Neurosky MindSet Mobile headset
* Created 21 March 2018 by Wesley Hartogs
* Communication and Multimedia Design, Avans University of Applied Sciences */
import processing.serial.*;
import pt.citar.diablu.processing.mindset.*;
Serial receiver;
MindSet mindSet;
int throttle = 0, yaw = 127, pitch = 127, 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*0.60); // линия 40% от низа
line(width*0.5, height, width*0.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, 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)
Принимает Serial-значения от Processing и выдает их на взломанный пульт через 4 ФНЧ.
/* Drone control
* Принимает Serial от Processing, выводит на пульт через 4 ФНЧ (100 мкФ + 220 Ом)
* Только для Arduino MKR1000 (или другой 3,3 В Arduino)
* Created 21 March 2018 by Wesley Hartogs */
int throttle = 0, yaw = 127, pitch = 127, roll = 127;
int throttlePin = 2, yawPin = 3, pitchPin = 4, 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);
}
Схемы


Производственный процесс
- TinyML-детектор языка на Arduino Nano 33 BLE Sense с Edge Impulse
- Создание игры в реальном времени на Arduino Nano с гироскопом MPU-6050 и OLED-дисплеем
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- Создание рулетки на 37 светодиодов с Arduino Nano
- Мини-аркада на ATtiny85: Snake — ручная OLED-консоль своими руками
- Портативный дальномер на Arduino Nano: HC-SR04, питание 18650, 3D-корпус
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Продвинутый дистанционно управляемый манипулятор-робот для точной работы
- Медное гальваническое покрытие: умная система на Arduino UNO
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10