Привет, Пикабу.
Хочу рассказать в этот раз как можно использовать разработанный и производимый мной нейроинтерфейс . Кроме очевидного снятия ЭЭГ его можно подключать к периферийным устройствам через блитуз .
Одной из самой нетривиальной задачей с нейроинтерфейсом является его подключение к низкоуровневому устройству. Например, реле или сервоприводу. Сложность заключается и в анализе и в самой реализации.
План организации управления сервом через нейроинтерфейс такой: Нейроинтерфейс ms-04b / NeuroSky 2 распознает мозговые волны и передает их на микроконтроллер Arduino через Bluetooth. Arduino управляет серводвигателем.
Инструменты и материалы:
-Нейроинтерфейс ms-04b// NeuroSky 2;
-Батарейка AAA;
-Компьютер;
-Arduino Uno;
-Модуль Bluetooth HC-05;
-Макетная плата;
-Макетные провода;
-Зеленый светодиод и желтый светодиод;
-2 резистора по 330 Ом;
-2 резистора по 1 кОм;
-2 резистора по 2 кОм;
-Держатель АА на три батареи;
-Напильник (он всегда нужен когда чего то делаешь);
Шаг 1: подключение HC-05 Ардуино
Установите HC-05 на макетную плату и подключите его к Arduino, как описано ниже и показано на фотографии. RXD HC-05 к контакту 11 через делитель напряжения из 2 резисторов, TXD к контакту 10, GND к GND, EN к выводу 9 через делитель напряжения из 2 резисторов.
Пока не подключайте VCC HC-05.
Причина использования делителей напряжения заключается в том, что RXD и EN HC-05 имеют тенденцию к выходу из строя после получения 5 вольт в течение некоторого времени, и напряжение должно быть уменьшено до 3,3 вольт. Делитель напряжения состоит из резистора на 1 кОм, один конец которого подключен к 5 вольтам Arduino, а второй конец - к резистору 2 кОм. В свою очередь другой конец этого резистора подключен к заземлению. Требуются два делителя напряжения: один для RXD, а другой для EN.
Шаг 2: код для HC-05
Нам нужно определить мас адрес устройства. Это можно сделать по инструкции тут
http://developer.neurosky.com/docs/doku.php?id=mindwave_mobile_and_arduino
Или же через иные проги. Я делал это через прогу nRF connect с гугл плея.
Далее:
1. Запустите приложение Arduino на компьютере.
2. Подключите USB-кабель Arduino к компьютеру. На Arduino должен гореть зеленый свет.
3. Загрузите файл .ino скетча, расположенный в конце этого шага, или скопируйте следующий код, который передает данные между Serial Monitor Arduino и модулем Bluetooth, и вставьте его в новый скетч Arduino.
#include<SoftwareSerial.h>
SoftwareSerial BT(10,11);
void setup() { pinMode(9,OUTPUT);
digitalWrite(9,HIGH);
Serial.begin(38400);
BT.begin(38400);
Serial.println("Bluetooth AT command mode");
}
void loop()
{
if(BT.available()) Serial.write(BT.read());
if(Serial.available()) BT.write(Serial.read());
}
4. Загрузите скетч.
5. Удерживая нажатой маленькую кнопку над контактом EN на HC-05, подключите VCC HC-05 к + 5 В Arduino и удерживайте кнопку нажатой в течение нескольких секунд, пока красный свет на HC-05 не начнет мигать в течение 2 секунд.
6. Откройте монитор последовательного порта Arduino (правый верхний угол окна приложения Arduino) на компьютере и установите для параметров в правом нижнем углу значения “Both NL & CR” и скорость передачи данных “38400”.
7. Откройте внутри строки ввода окна Serial Monitor. Введите AT на клавиатуре компьютера и нажмите Return. Если ответ «ОК», продолжайте. Если не «ОК», попробуйте еще раз. Иногда с первого раза не получается.
8. Включите нейроинтерфейс. Индикатор на нем должен гореть постоянно синим.
9. Введите AT-команды, как прописано ниже. Ответ должен быть «ОК» после каждой команды.
AT + UART = 57600,0,0 Определяет скорость передачи, она такая и в ms-04b и в neyrosky.
AT + ROLE = 1 Устанавливает HC-05 в качестве ведущего устройства, а не ведомого.
AT + PSWD = 0000 Устанавливает пароль, используемый интерфейсе. Он такой и и в ms-04b и в neyrosky.
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.
Шаг 4: подключение Arduino
Подключается Ардуино (начиная с пункта 11 предыдущего шага) следующим образом: Один контакт резистора 330 Ом к контакту 2, а другой провод к длинной ножки зеленого светодиода. Короткая ножка зеленого светодиода идет к GND на макетной плате. Один контакт резистора 330 Ом к контакту 4, а другой контакт к длинной ножке желтого светодиода. Короткая ножка желтого светодиода идет к GND на макетной плате. Контакт 9 идет к сигнальному (желтому) проводу сервопривода. Оранжевый провод сервопривода идет к плюсовому разъему отдельного источника питания. Коричневый провод сервопривода идет к GND на макетной плате. Минус отдельного источника питания идет на GND на макетной плате. Для проверки, следующие части должны быть подключены к GND макетной платы: оба светодиода, сервопривод, GND Arduino и HC-05. Следующие компоненты должны быть подключены к плюсовому источнику питания макетной платы: GND Arduino и HC-05.
Шаг 5: загрузка кода
1.Запустите приложение Arduino на компьютере.
2. Подключите USB-кабель Arduino к компьютеру. Светодиод HC-05 должен быстро мигать.
3. Подключите провода питания сервопривода к отдельному источнику питания и подключите минус этого источника питания к земле Arduino или макета.
4. Загрузите файл .ino скетча (находится в самом конце этого шага) или скопируйте следующий код и вставьте его в новый скетч Arduino.
//
// LEDs on and servo moving when Attention is high
// Yellow LED on when Attn more than 50
// Green LED on when Attn more than 70
// Servo moves 90 degrees when Attn is more than 50
#include<Servo.h>
#define BAUDRATE 57600
#define YLED 4
#define GLED 2
////////// Variables Servo myservo;
byte payloadData[32] = {0};
byte Attention[5]={0};
byte checksum=0;
byte generatedchecksum=0;
int Plength,Temp;
int Att_Avg=0;
int k=0;
signed int j=0;
////////// Arduino setup void setup()
{
Serial.begin(BAUDRATE);
pinMode(YLED, OUTPUT);
pinMode(GLED, OUTPUT);
Serial.println("Average Attention Values");
myservo.attach(9);
myservo.write(0);
delay(15);
}
////////// Read data byte ReadOneByte()
{
int ByteRead;
while(!Serial.available());
ByteRead = Serial.read();
return ByteRead;
}
////////// Main program void loop()
{
////// Look for sync bytes and read data while (1)
{
if(ReadOneByte() == 170)
{ if(ReadOneByte() == 170)
{ Plength = ReadOneByte();
if(Plength == 32) {
generatedchecksum = 0;
for(int i = 0; i < Plength; i++)
{ payloadData[i] = ReadOneByte();
generatedchecksum += payloadData[i] ;
}
generatedchecksum = 255 - generatedchecksum;
checksum = ReadOneByte();
////// Obtain Attention data and calculate an average
if(checksum == generatedchecksum)
{
if (payloadData[28]==4)
{
if (j<4)
{
Attention [k] = payloadData[29];
Temp += Attention [k]; j++;
}
else { Att_Avg = Temp/4;
////// Display average Attention in Serial Monitor, move servo, and light LEDs Serial.println(Att_Avg, DEC);
// The next 2 statements would move the servo based on average Attention level. // Attention level is between 0 and 100, moving servo between 0 and 100 degrees. // But they are now comments because I decided to move the servo 90 degrees // when average Attention is higher than 50. //
myservo.write(Att_Avg);
//
delay(15);
if (Att_Avg>50)
{
digitalWrite(YLED, HIGH); myservo.write(90);
delay(15);
}
else { digitalWrite(YLED, LOW);
myservo.write(0);
delay(15);
}
if(Att_Avg>70)
{
digitalWrite(GLED, HIGH);
}
else { digitalWrite(GLED, LOW); } j=0;
Temp=0;
}
}
}
}
}
}
}
}
5. Отсоедините провод TXD HC-05 от RX (контакт 0) Arduino, загрузите эскиз и снова подключите этот провод RX.
6. Откройте Serial Monitor. Убедитесь, что скорость передачи составляет 57600.
7. Включите интерфейс. Через несколько секунд светодиод HC-05 должен сделать 2 быстрых мигания каждые 3-4 секунды, показывая, что устройства сопряжены.
8. Оденьте интерфейс на голову. Теперь устройство должно отправлять данные в Arduino. Последовательный монитор должен показывать уровень внимания каждые несколько секунд, желтый светодиод должен включаться, а вилка сгибаться, когда внимание больше 50, а зеленый светодиод загораться, когда внимание больше 70.
9. По окончании закройте Serial Monitor.
10. Отключите интерфейс.
11. Отсоедините USB-кабель от Arduino или компьютера.
12. Закройте приложение Arduino.
13. Отсоедините провода питания сервопривода от отдельного источника питания.
Шаг 6: использование устройства
Чтобы управлять устройством нужно сконцентрировать внимание. Это куда сложнее чем кажется и требуется тренировка.
Если прошивка HC-05 имеет версию 2 или 3, команда AT + INIT необходима перед командой AT + INQ. Чтобы проверить версию HC-05, введите эту команду: AT + VERSION
Если вы нажмете кнопку сброса Arduino, это вернет настройки HC-05 к заводским значениям по умолчанию. Все шаги по сопряжению придется повторить. Если TXD HC-05 не отключен от RX Arduino перед загрузкой скетча, в нижней части окна приложения Arduino на экране компьютера появится сообщение об ошибке. Если используется сервопривод, ему нужен отдельный источник питания, например, 3 батареи по 1,5 В. GND Arduino необходимо подключить к минусу внешнего источника питания. Без внешнего источника питания, недостаточно энергии от источника USB, и модуль HC-05 теряет сопряжение. Он соединяется через несколько секунд, а затем отключается при следующем срабатывании сервопривода.
Теперь вы можете управлять мыслями сервоприводами и иной низкоуровневой техникой.
Спасибо за внимание. Подробнее про такие устройства как обычно тут
https://vk.com/exomech
https://www.facebook.com/Exomech
https://www.instagram.com/exomech_official
Кроме того есть специальный бионическо-экзоскелетный дискорд канал
https://discord.gg/pMZN7TM