Обеспечиваем более быстрое и точное обнаружение MindWave Mobile

В настоящее время я пытаюсь заставить устройство Mindwave Mobile работать с Arduino Uno. Я следую руководству здесь.

Однако приведенный пример кода работает не очень хорошо. Я пытался получить более последовательный результат, но безуспешно.

Код MindWave:

#include <SoftwareSerial.h>     // библиотека для последовательного программного обеспечения
SoftwareSerial mySerial(5, 6);  // прием, передача
int BAUDRATE = 57600;

// переменные контрольной суммы
byte payloadChecksum = 0;
byte CalculatedChecksum;
byte checksum = 0;              //байт типа данных хранит 8-битное беззнаковое число от 0 до 255
int payloadLength = 0;
byte payloadData[64] = {0};
byte poorQuality = 0;
byte attention = 0;
byte meditation = 0;

// системные переменные
long lastReceivedPacket = 0;
boolean bigPacket = false;
boolean brainwave = false;

void setup() {
  Serial.begin(57600);       // Bluetooth
  delay(500);
  mySerial.begin(4800);      // серийный номер программного обеспечения
  delay(500);
  Serial.print("Communicating... ");
  mySerial.print("Communicating... ");
  mySerial.println();
}

byte ReadOneByte() {
  int ByteRead;
  // Подождем, пока появятся данные
  while (!Serial.available());
  //Получаем количество байтов (символов), доступных для чтения из последовательного порта.
  //Это данные, которые уже поступили и сохранены в буфере последовательного приема (который содержит 64 байта)
  ByteRead = Serial.read();
  return ByteRead; // читаем входящие последовательные данные
}

unsigned int delta_wave = 0;
unsigned int theta_wave = 0;
unsigned int low_alpha_wave = 0;
unsigned int high_alpha_wave = 0;
unsigned int low_beta_wave = 0;
unsigned int high_beta_wave = 0;
unsigned int low_gamma_wave = 0;
unsigned int mid_gamma_wave = 0;

void read_waves(int i) {
  delta_wave = read_3byte_int(i);
  i += 3;
  theta_wave = read_3byte_int(i);
  i += 3;
  low_alpha_wave = read_3byte_int(i);
  i += 3;
  high_alpha_wave = read_3byte_int(i);
  i += 3;
  low_beta_wave = read_3byte_int(i);
  i += 3;
  high_beta_wave = read_3byte_int(i);
  i += 3;
  low_gamma_wave = read_3byte_int(i);
  i += 3;
  mid_gamma_wave = read_3byte_int(i);
}

int read_3byte_int(int i) {
  return ((payloadData[i] << 16) + (payloadData[i + 1] << 8) + payloadData[i + 2]);
}

void loop() {
  // Ищем байты синхронизации
  // Порядок байтов: 0xAA, 0xAA, payloadLength, payloadData,
  // Контрольная сумма (суммируем все байты полезной нагрузки, берем младшие 8 бит, затем инвертируем младшие байты).
  if (ReadOneByte() == 0xAA) {
    if (ReadOneByte() == 0xAA) {
      payloadLength = ReadOneByte();
      if (payloadLength > 169) //Длина полезных данных не может быть больше 169
        return;
      payloadChecksum = 0;
      for (int i = 0; i < payloadLength; i++) {     //цикл, пока длина полезной нагрузки не будет завершена
        payloadData[i] = ReadOneByte();             //Читаем полезную нагрузку
        payloadChecksum += payloadData[i];
      }
      checksum = ReadOneByte();                     //Читаем байт контрольной суммы из потока
      payloadChecksum = 255 - payloadChecksum;      //Примите во внимание сгенерированную контрольную сумму
      if (checksum == payloadChecksum) {
        poorQuality = 200;
        attention = 0;
        meditation = 0;
      }
      brainwave = false;
      for (int i = 0; i < payloadLength; i++) { // Анализируем полезную нагрузку
        switch (payloadData[i]) {
          case 02:
            i++;
            poorQuality = payloadData[i];
            bigPacket = true;
            break;
          case 04:
            i++;
            attention = payloadData[i];
            break;
          case 05:
            i++;
            meditation = payloadData[i];
            break;
          case 0x80:
            i = i + 3;
            break;
          case 0x83:                         // ASIC EEG POWER INT
            i++;
            brainwave = true;
            byte vlen = payloadData[i];
            //mySerial.print(влен, DEC);
            //mySerial.println();
            read_waves(i + 1);
            i += vlen; // я = я + влен
            break;
        }                                 // выключатель
      }                                   // для цикла

/*
      if (bigPacket) {
        if (poorQuality == 0) {
        }
        else {                            // ничего не делать
        }
      }
*/
      if (brainwave && attention > 0 && attention < 100) {
        mySerial.print(attention, DEC);
        mySerial.println();

        Serial.print(attention, DEC);
        Serial.println();
      }
    }
  }
}

Часто последовательный монитор перестает отображать новые значения, вытекающие из Mindwave. Буду очень признателен за любые предложения о том, как можно изменить код, чтобы он работал более плавно.

, 👍1


2 ответа


0

Я только что заметил этот вопрос, потому что у меня была похожая проблема: блокируется чтение последовательных данных при условии чтения.

Я немного переписал часть синтаксического анализа, которую вы можете увидеть здесь.

Это упрощает параллельную работу, но на сбор большого пакета мозговых данных уходит примерно столько же времени.

,

1

Бесполезно изобретать велосипед!

Brain — это библиотека Arduino для анализа данных ЭЭГ на базе Neurosky. гарнитуры. Среди протестированных моделей — Star Wars Force Trainer и Mattel. МайндФлекс.

Он создан для упрощения отправки строки ASCII значения, разделенные запятыми, в последовательном формате или для доступа к обработанным мозговым волнам информацию прямо в вашем скетче Arduino. Посмотрите примеры кода демонстрация каждого варианта использования.

https://github.com/kitschpatrol/Brain

Установите библиотеку и настройте ее следующим образом:

#include <Brain.h>

// Настройте анализатор мозга, передайте ему последовательный аппаратный объект, который вы хотите прослушивать.
Brain brain(Serial);

void setup() {
// Запускаем серийный номер оборудования.
Serial.begin(9600);
}

void loop() {
// Ожидайте пакеты примерно раз в секунду.
// Функция .readCSV() возвращает строку (ну, char*), содержащую самые последние данные о мозге, в следующем формате:
// "сила сигнала, внимание, медитация, дельта, тета, низкая альфа, высокая альфа, низкая бета, высокая бета, низкая гамма, высокая гамма"
    if (brain.update()) {
    Serial.println(brain.readErrors());
    Serial.println(brain.readCSV());
    }
}

Не могу гарантировать, что это будет работать, но если у вас есть контакт TX Bluetooth, подключенный к контакту RX Arduino, я почти уверен, что это будет работать.

,