Принцип действия разрабатываемых в настоящем проекте бюджетных автономных портативных приборов для самостоятельного оперативного мониторинга активности головного мозга основан на беспроводном нейроинтерфейсе – системе взаимодействия головного мозга с различными электронными устройствами.

В результате протекающих в головном мозге физико-химических процессов на поверхности головы возникает слабая электрическая активность от 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