Нейроуправляемое колесное шасси своими руками
В этой статье опишу очень простой, но тем не менее важный и интересный проект - колесное шасси на нейроуправлении. Этим шасси может быть как машинка, так и большой робот на колесах так и инвалидная каталка. Разницы не будет вообще.
В отличии от дрона тут не нужно долго тренировать и порог входа в тему очень низок.
План будет простой. Возьмем самую дешевую машинку с радиоуправлением, добавим ардуино с блитузм модулем и будем управлять этим всем с помощью нейроинтефейса ms-04d.
Что что нам понадобится мы будем брать с озона:
Нейроинтефейс ms-04d
Ну интерефейс ещё можно прямо с группы (https://vk.com/exomech?w=product-112940624_9878158/query )
2. Машинка на радио управлении
3. Arduino nano
4. HC-05 Bluetooth модуль для Arduino
Для того чтобы заставить это всё работать вместе нужно будет сделать несколько простых шагов. Инструкция будет максимально подробная.
Разборка пульта. Нам нужно разобрать пульт управления машинкой и вытащить из него схему
В пульте будет 2 схемы: с кнопками и с переключателем и светодиодом. Вторую удаляем.
Нам нужна только с кнопками и микросхемой RF2175.
Микросхема не должна быть повреждена.
Отключаем схему от пульта и платы с светодиодом.
К микросхеме RF2175 на схеме подключены 4 кнопки: вперед, назад, повороты вправо и влево. В общем виде всё подключено вот так:
Нажимая на кнопки мы подаем минус на отдельные порты микросхемы. Ардино нано может выдавать на порты как минус так и положительный сигнал и если мы заменим кнопки на порты ардуино то мы сможем программно задавать направление движения.
или же сделать как описано ниже.
Нам нужно определить мас адрес нейроинтерфейса. Это можно сделать по инструкции тут http://developer.neurosky.com/docs/doku.php?id=mindwave_mobile_and_arduino .Или же через иные проги. Я делал это через прогу nRF connect с гугл плея. Схема подключения модуля. Можно без резисторов сразу RX к выводу D9. И не трогать пин 34 если есть маленькая кнопочка рядом с выводами.
Далее:
Запустите приложение Arduino на компьютере.
Подключите USB-кабель Arduino к компьютеру. На Arduino должен гореть зеленый свет.
Загрузите файл .ino скетча, расположенный в конце этого шага, или скопируйте следующий код, который передает данные между Serial Monitor Arduino и модулем Bluetooth, и вставьте его в новый скетч Arduino.
#include SoftwareSerial.h // подключаем библиотеку
SoftwareSerial mySerial(8,9); // указываем пины tx и rx
void setup() {
pinMode(8,INPUT);
pinMode(9,OUTPUT);
Serial.begin(9600); // включаем hardware-порт
mySerial.begin(38400); // включаем software-порт
Serial.println("start setting");
}
void loop() {
if (mySerial.available()) {
char c = mySerial.read(); // читаем из software-порта
Serial.print(c); // пишем в hardware-порт
}
if (Serial.available()) {
char c = Serial.read(); // читаем из hardware-порта
mySerial.write(c); // пишем в software-порт
}
}
4. Загрузите скетч.
5. Удерживая нажатой маленькую кнопку над контактом EN на HC-05, подключите VCC HC-05 к + 5 В Arduino и удерживайте кнопку нажатой в течение нескольких секунд, пока красный свет на HC-05 не начнет мигать в течение 2 секунд.
6. Откройте монитор последовательного порта Arduino (правый верхний угол окна приложения Arduino) на компьютере и установите для параметров в правом нижнем углу значения “Both NL & CR” и скорость передачи данных “9600”.
7. Откройте внутри строки ввода окна Serial Monitor. Введите AT на клавиатуре компьютера и нажмите Return. Если ответ «ОК», продолжайте. Если не «ОК», попробуйте еще раз. Иногда с первого раза не получается.
8. Включите нейроинтерфейс. Индикатор на нем должен гореть постоянно синим.
9. Введите AT-команды, как прописано ниже. Ответ должен быть «ОК» после каждой команды.
AT + UART = 57600,0,0 Определяет скорость передачи, она такая и в ms-04b и в neyrosky.
AT + ROLE = 1 Устанавливает HC-05 в качестве ведущего устройства, а не ведомого.
AT + PSWD = 1234 Устанавливает пароль, используемый интерфейсе.
AT + CMODE = 0 Для подключения HC-05 к определенному устройству.
AT + CLASS = 0 Определяет класс устройства.
AT + INQM = 1,9,48 Устанавливает параметры для сопряжения.
AT + INQ, команда чтобы узнать, распознает ли HC-05 интерфейс. Поиск интерфейса может занять 15-20 секунд. Одно из отображаемых устройств должно иметь тот же адрес, что и интерфейс, в формате xxxx: xx: xxxxxx. Этот адрес используется в следующих 3 командах (показаны как addr), за исключением того, что двоеточия должны быть заменены запятыми.
AT + PAIR = addr, 30 (здесь не было ответа «ОК».)
AT + BIND = addr (красный свет на HC-05 мигает каждые 2 секунды)
AT + LINK = addr
10. Красный индикатор HC-05 должен мигать 2 раза каждые 3-4 секунды. В первый раз, когда мастер прописал команды частота моргания не изменилась. Поэтому он дважды проверил, правильно ли установлены контакты проводов на Arduino и макетной плате, вытащил провод + 5В из HC-05, выполнил снова шаг 5 и набрал команды PAIR, BIND и LINK. На этот раз красный индикатор изменился на 2 быстрых мигания каждые 3-4 секунды. Это значит, что устройства сопряжены. В следующий раз, при пользовании устройствами, они автоматически подключатся к ним в течение нескольких секунд.
11. Отсоедините провод TXD HC-05 от вывода 10 Arduino и подключите его к RX (вывод 0) Arduino. Отсоедините провода HC-05 от делителей напряжения и снимите их, а также снимите резисторы, используемые в качестве делителей напряжения. Теперь проводка должна быть такой, как показано на фото.
12. Закройте Serial Monitor.
13.Отключите интерфейс.
14. Отсоедините USB-кабель от Arduino или компьютера.
15. Закройте приложение Arduino.
! Модуль может не отзываться на команды и скорее всего были просто перепутаны выводы RX и TX. Достаточно просто поменять и будет работать !
После того как модуль HC-05 прошился мы его никуда не переносим. Так же оставляем как он и есть.
Далее нам нужно припаять ардуино нано к плате управления машинкой с rf2175. Схема соединения очень простая. Мы подключаем цифровые порты 2,3,4,5 вперед кнопок и будет подавать минус с ардуино.
А вот так оно будет выглядеть в живую.
На этом пайка почти завершена. Осталось впаять готовы блок в машинку и запитать от аккумулятора.
Но перед запайкой и конечным монтажом нам нужно сделать самое важное - написать код управления.
Нейроинтерфейс MS-04D довольно функциональное устройство и может выдавать большой спектр данных:
1.Исходная электроэнцефалограмма
2.Определяются следующие мозговые волны: Дельта, Тета, Низкие Альфа, Высокие Альфа, Низкие Бета, Высокие Бета, Гамма
3.Данные с гироскопа: Ускорение по трем осям и угловая скорость по трем осям.
4.Данные о концентрации и расслаблении человека.
Любые их этих наборов данных мы можем взять как данные для управления, но генерировать нужные ритмы будет куда сложнее чем концентрироваться и расслабляться.
Сделаем оба варианта. Почему и нет?
1.Вариант с концентрацией и расслаблением.
Алгоритм следующий:
Если концентрация выше расслабления то машинка едет вперед
Если концентрация меньше расслабления то машинка едет назад
Если концентрация нулевая то машинка поворачивает вправо
Если расслабление нулевое то машинка поворачивает влево
Анализ будет происходить в самом нейроинтефейсе, а машинка будет только принимать сигнал управления.
2.Вариант с ритмами.
Алгоритм следующий:
Если альфа выше бета то машинка едет вперед
Если альфа меньше бета то машинка едет назад
Теперь код. Его мы будет прошивать в ардуино.
Сначала код с ритмами
float alf;
float bet;
#include <Mindwave.h>
#include <SoftwareSerial.h>
Mindwave mindwave;
SoftwareSerial softSerial(8, 9);
void setup() {
pinMode(9,INPUT);
pinMode(10,OUTPUT);
Serial.begin(57600);
softSerial.begin(57600);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
digitalWrite(2, HIGH); // вперед
digitalWrite(3, HIGH); // вперед
digitalWrite(4, HIGH); // вперед
digitalWrite(5, HIGH); // вперед
}
void onMindwaveData() {
Serial.print(mindwave.lowAlpha());
alf=mindwave.lowAlpha();
Serial.print(", ");
Serial.print(mindwave.lowBeta());
bet=mindwave.lowBeta();
Serial.print(", ");
Serial.println();
if (alf > bet)
{
digitalWrite(2, LOW); // вперед
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
if (alf < bet)
{
digitalWrite(3, LOW);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
}
void loop() {
mindwave.update(softSerial, onMindwaveData);
}
Вариант с концентрацией и расслаблением:
float att;
float med;
#include <Mindwave.h>
#include <SoftwareSerial.h>
Mindwave mindwave;
SoftwareSerial softSerial(8, 9);
void setup() {
pinMode(9,INPUT);
pinMode(10,OUTPUT);
Serial.begin(57600);
softSerial.begin(57600);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
digitalWrite(2, HIGH); // вперед
digitalWrite(3, HIGH); // вперед
digitalWrite(4, HIGH); // вперед
digitalWrite(5, HIGH); // вперед
}
void onMindwaveData() {
Serial.print(mindwave.attention());
Serial.print(mindwave.meditation());
att=mindwave.attention();
med=mindwave.meditation();
Serial.print(", ");
Serial.println();
if (att > med)
{
digitalWrite(2, LOW); // вперед
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
if (att < med)
{
digitalWrite(3, LOW);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
if (att <= 10)
{
digitalWrite(4, LOW);
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(5, HIGH);
}
if (med <= 10)
{
digitalWrite(5, LOW);
digitalWrite(2, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
}
}
void loop() {
mindwave.update(softSerial, onMindwaveData);
}
В обоих вариантах кода используется библиотека с архива ПО для нейроинтерфейса https://vk.com/@-112940624-programmy-skripty-i-dokumentaciya-dlya-ms-04d
Если точнее то она будет вот тут https://disk.yandex.ru/d/1yKKOvkZQWb7hA
Теперь мы можем интегрировать эту схему в машинку. Вся система управления будет там.
Теперь приступаем к самой машинке. Это будет самая быстрая часть. Аккуратно снимает верхнюю крышку.
Снизу будут болты и зажимы.
Вскрываем ей до конца.
Можем увидеть маленькую схемку, 2 мотора, выключатель питания и штекер для аккумулятора.
Далее берем платку пульта с ардуино нано и припаиваем к питанию этой схемы. Питание идет через красный и черный провод.
Черный идет напрямую от аккумулятора, а красный от переключателя. Мы припаиваемся красный к красному,а черный к черному
Ну и собственно всё. Теперь аккуратно запаковываем всё обратно в машинку и сворачиваем болтики. Аккумулятора в 3.7в хватит для питания машинки и всей системы.
Для запуска всей системы мы должны включить нейроинтерфейс, подождать секунд 10 и запустить машинку. Опять же подождать пока будет соединение. Если все сделали правильно то машинка поедет в зависимости от залитого кода и уровней ритмов/показателей концентрации . Ну и видео с тестом.
Чуть потренироваться и можно будет направлять куда нужно. Теперь точно всё. Проект простой и делается за пару дней, но дает огромный опыт в нейропроектах.
Спасибо за внимание. Подписываемся и всё такое.
И наш дискорд где можно про все это поговорить и спросить!
https://discord.gg/pMZN7TM
Лига Биоников
74 поста570 подписчиков
Правила сообщества
Стандартные правила
Оскорбления, провокации, токсичное общение, слишком частый флуд, наезды, жирный троллинг - выдаем 2 предупреждения, на третий раз бан.