Принцип действия разрабатываемых в настоящем проекте бюджетных автономных портативных приборов для самостоятельного оперативного мониторинга активности головного мозга основан на беспроводном нейроинтерфейсе – системе взаимодействия головного мозга с различными электронными устройствами.
В результате протекающих в головном мозге физико-химических процессов на поверхности головы возникает слабая электрическая активность от 1 до 100 Мв. В основе нейроинтерфейса лежит электроэнцефалографический датчик (ЭЭГ-датчик), измеряющий электрическую активность мозга, отводимую с кожного покрова головы.
В электроэнцефалограмме человека выделяют ритмы – составляющие спектра электрических колебаний разной частоты и амплитуды: альфа ритм (8-13 Гц) – состояние покоя, бета-ритм (14-30 Гц) – концентрация внимания и др.
В настоящем проекте используется сухой ЭЭГ-датчик в составе нейрогарнитуры Neurosky Mindwave Mobile (рис. 1).

Рис.1. Нейрогарнитура Neurosky Mindwave Mobile
Нейрогарнитура одевается на голову и с помощью ЭЭГ-датчика измеряет электрические сигналы с левой лобной доли головы. Для создания разности потенциалов предусмотрена клипса с референтным датчиком для крепления к мочке уха.
Полученные электрические сигналы преобразуются встроенным в гарнитуру процессором в три цифровых показателя: Attention (Внимание, 1-100), Mediation (Расслабление, 1-100) и Eye Blinks (Моргание, 1-255). Например, при концентрации внимания (счет в уме, смотреть в одну точку и т. п.) показатель Attention увеличивается от 1 до 100, а при расслаблении (а также при моргании) – уменьшается. При этом показатели Mediation и Eye Blinks по сравнению с Attention ведут с себя с точностью до наоборот. В этой связи, для практического использования мы ограничились одним показателем – Attention.
Учитывая вышесказанное, основная задача, которую решает данный проект, – создание недорогих портативных приборов для беспроводной регистрации нейросигнала Attention, позволяющего определять активность головного мозга (АГМ) в виде концентрации внимания или расслабления.
В данном проекте разработаны четыре прибора со световой, звуковой и цифровой индикацией уровня АГМ, взаимодействующих c нейрогарнитурой Neurosky Mindwave Mobile по беспроводному Bluetooth-соединению. Основой этих приборов является плата Arduino UNO, или, непосредственно, сам контроллер ATmega 328P-PU.
Для обеспечения беспроводного соединения использовался Bluetooth-модуль HC-05. Конфигурирование модуля HC-05 проводилось по схеме электрических соединений, представленной на рис. 2, согласно скетчу (рис. 3) и AT-командам (рис. 4).

Рис.2. Схема электрических соединений для конфигурирования Bluetooth-модуля HC-05
// Конфигурирование блютуз-модуля HC-05 (Model ZS-040):
// 1. Соедините вывод TX блютуз-модуля с портом 10 Arduino, RX – 11, VCC – 3,3v, GND - GND:
// светодиод блютуз-модуля начнет часто мигать
// 2. Загрузите этот скетч
// 3. На HC-05 нажмите и не отпускайте кнопку перевода блютуз-модуля в командный AT-режим
// 4. Отсоедините от блютуз-модуля контакт VCC и присоедините его обратно
// 5. Отпустите кнопку перевода блютуз-модуля в командный режим: светодиод модуля станет
// мигать реже
// 6. Перезегрузите Arduino кнопкой Reset
// 7. Запустите Monitor Serial (Монитор последовательного порта) из меню Инструменты
// и выберите параметры: Both NL & CR (Оба NL & CR) и 9600 baud (бод)
// 8. На экране монитора должно появиться:
// AT
// OK
// 9. Введите команды конфигурирования блютуз-модуля
#include <SoftwareSerial. h>
#define rxPin 10
#define txPin 11
SoftwareSerial mySerial(rxPin, txPin); // RX, TX
char myChar;
void setup() {
Serial. begin(9600);
Serial. println("AT");
mySerial. begin(38400);
mySerial. println("AT");
}
void loop() {
while (mySerial. available()) {
myChar = mySerial. read();
Serial. print(myChar);
}
while (Serial. available()) {
myChar = Serial. read();
Serial. print(myChar); //echo
mySerial. print(myChar);
}
}
Рис.3. Листинг скетча конфигурирования Bluetooth-модуля HC-05

Рис.4. AT-команды на мониторе последовательного порта COM10 до ввода (слева) и после ввода (справа)
Далее приведены фото (рис.5) разработанного нами автономного прибора №1 со световой и звуковой индикацией 10-ти уровней АГМ на основе платы Arduino UNO, Bluetooth-модуля HC-05, разноцветных светодиодов и пъезодинамика, а также схема соединений (рис. 6).

Рис.5. Автономный прибор №1 со световой и звуковой индикацией 10-ти уровней АГМ на основе платы Arduino UNO, Bluetooth-модуля HC-05, разноцветных светодиодов и пъезодинамика

Рис.6. Схема электрических соединений прибора №1
Принцип работы прибора №1 следующий. Нейросигнал от головной гарнитуры передается по Bluetooth-модулю на Arduino UNO. Согласно разработанному нами скетчу (рис. 7), каждому из десяти уровней нейросигнала соответствует определенное количество зажигаемых разноцветных светодиодов (общим числом – 10), подключенных через порты Arduino UNO. При концентрации внимания уровень нейросигнала повышается, увеличивая тем самым число загоревшихся светодиодов, и, наоборот, при расслаблении их число уменьшается.
// ПРИБОР ДЛЯ ИЗМЕРЕНИЯ НЕЙРОАКТИВНОСТИ ГОЛОВНОГО МОЗГА
// НА ОCНОВЕ НЕЙРОГАРНИТУРЫ NEUROSKY MINDWAVE MOBILE, ПЛАТЫ
// ARDUINO UNO, РАЗНОЦВЕТНЫХ СВЕТОДИОДОВ, ПЪЕЗОДИНАМИКА
// И БЛЮТУЗ-МОДУЛЯ HC-05
// Соединение блютуз-модуля с портами Arduino:
// VCC – 3.3V или 5V
// GND – GND
// после загрузки скетча:
// TXD – RX
// Определяем порты:
#define LED 13 // подключения контрольного светодиода – индикатора отсутствия шумов (помех)
// при устойчивой связи с MINDWAVE MOBILE
#define DEBUGOUTPUT 0 // отладки
// Определяем порты подключения светодиодов
#define LED1 3
#define LED2 4
#define LED3 5
#define LED4 6
#define LED5 7
#define LED6 8
#define LED7 9
#define LED8 10
#define LED9 11
#define LED10 12
// Инициализируем переменные:
// контрольной суммы передаваемых данных
byte generatedChecksum = 0;
byte checksum = 0;
// длины полезной нагрузки передаваемых данных
int payloadLength = 0;
byte payloadData[64] = {0};
// уровня шума (помех)
byte poorQuality = 0;
// уровня нейросигнала (концентрации внимания)
byte attention = 0;
// уровня нейросигнала (расслабления)
byte meditation = 0;
// Инициализируем переменные пакета передачи данных
long lastReceivedPacket = 0;
boolean bigPacket = false;
// Настройки Arduino
void setup() {
// определяем подключения светодиодов как порты вывода
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(LED8, OUTPUT);
pinMode(LED9, OUTPUT);
pinMode(LED10, OUTPUT);
// Определяем подключение контрольного светодиода как порт вывода
pinMode(LED, OUTPUT);
// Настраиваем последовательный порт на передачу данных
Serial. begin(57600);
}
// Читаем данные (байты) из последовательного порта (UART)
byte ReadOneByte() {
int ByteRead;
while(!Serial. available());
ByteRead = Serial. read();
#if DEBUGOUTPUT
Serial. print((char)ByteRead); // эхо того же байта из последовательного порта (для отладки)
#endif
return ByteRead;
}
// Бесконечный цикл
void loop() {
// Ищем байты синхронизации
if(ReadOneByte() == 170) {
if(ReadOneByte() == 170) {
payloadLength = ReadOneByte();
if(payloadLength > 169) // длина полезной нагрузки не может быть больше 169
return;
generatedChecksum = 0;
for(int i = 0; i < payloadLength; i++) {
payloadData[i] = ReadOneByte(); // cчитываем длину полезной нагрузки в память
generatedChecksum += payloadData[i];
}
checksum = ReadOneByte(); // cчитываем контрольную сумму байта из потока
generatedChecksum = 255 - generatedChecksum; // возвращаем значение сгенерированной
// контрольной суммы
if(checksum == generatedChecksum) {
poorQuality = 200;
attention = 0;
meditation = 0;
for(int i = 0; i < payloadLength; i++) {// обрабатываем полезную нагрузку
switch (payloadData[i]) {
case 2:
i++;
poorQuality = payloadData[i];
bigPacket = true;
break;
case 4:
i++;
attention = payloadData[i];
break;
case 5:
i++;
meditation = payloadData[i];
break;
case 0x80:
i = i + 3;
break;
case 0x83:
i = i + 25;
break;
default:
break;
} // switch
} // for loop
#if! DEBUGOUTPUT // если это не эхо
// Код индикации внимания и расслабления
// если пакет данных получен
if(bigPacket) {
// если уровень помех нулевой
if(poorQuality == 0)
digitalWrite(LED, HIGH); // зажигаем контрольный светодиод
else
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


