Обеспечиваем более быстрое и точное обнаружение 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. Буду очень признателен за любые предложения о том, как можно изменить код, чтобы он работал более плавно.
@user4985, 👍1
2 ответа
Я только что заметил этот вопрос, потому что у меня была похожая проблема: блокируется чтение последовательных данных при условии чтения.
Я немного переписал часть синтаксического анализа, которую вы можете увидеть здесь.
Это упрощает параллельную работу, но на сбор большого пакета мозговых данных уходит примерно столько же времени.
Бесполезно изобретать велосипед!
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, я почти уверен, что это будет работать.
- Код CRC8 не работает должным образом
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Bluetooth-модуль HC-05 не принимает AT-команды
- Как прервать соединение HM10 Bluetooth?
- Акцептант векселей ИКТ
- ПК не может получить доступ к порту HC-06 Bluetooth COM
- Самый прямой способ назначить байты Serial.read() массиву?
- Проблемы с модулем Bluetooth(HC 05)