int interpret24bitAsInt32(byte[] byteArray) { int newInt = (
((0xFF & byteArray[0]) << 16) | ((0xFF & byteArray[1]) << 8) | (0xFF & byteArray[2])
);
if ((newInt & 0x00800000) > 0) { newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
return newInt;
}
2.7.11. 16-битные значения данных
Данные акселерометра, если они используются, отправляются как 16битное значение со знаком. Используется аналогичная схема для преобразования этих значений в 32-битные целые числа при обработке.
int interpret16bitAsInt32(byte[] byteArray) { int newInt = (
((0xFF & byteArray[0]) << 8) | (0xFF & byteArray[1])
);
if ((newInt & 0x00008000) > 0) { newInt |= 0xFFFF0000;
} else {
newInt &= 0x0000FFFF;
}
return newInt;
}
2.7.12. 32-битная временная метка без знака
Данные метки времени, если они используются, отправляются в виде 32разрядного целого числа без знака, представляющего время с момента запуска платы (в мс). Используется другая схема для преобразования этих значений в 32-битные целые числа при обработке.
2.7.13. Интерпретация данных ЭЭГ
После получения и анализа пакетов данных важно знать, как интерпретировать данные, чтобы значения ЭЭГ были полезны в количественном отношении. Две важные части информации: (1) частота дискретизации и (2) коэффициент масштабирования.
Для частоты дискретизации устанавливается частота по умолчанию 250 Гц. Более высокие скорости поддерживаются ADS1299, но беспроводная
40
линия RFDuino и ограничения последовательного порта могут не справиться с более высокими частотами дискретизации.
Для коэффициента масштабирования это множитель, который используется для преобразования значений ЭЭГ из «счетчиков» (число “int32”, которое анализируется из двоичного потока) в единицы измерения, такие как «вольт». По умолчанию скетч Arduino, работающий на плате OpenBCI, устанавливает максимальный коэффициент усиления микросхемы ADS1299 (24x), что приводит к масштабному коэффициенту 0,02235 мкВ на счетчик. Поскольку коэффициент усиления настраивается пользователем (24x, 12x, 8x, 6x, 4x, 2x, 1x), коэффициент масштабирования будет другим. Если коэффициент усиления изменяется, уравнение, которое необходимо использовать для определения масштабного коэффициента:
Scale Factor (Volts/count) = 4.5 Volts / gain / (2^23 - 1).
Необходимо обратить внимание, что “2^23” может быть некорректным числом в этом уравнении, учитывая, что ADS1299 является 24-разрядным устройством. Это связано с тем, что значение 24-битного необработанного счетчика находится в формате дополнения до 2-х. Этот масштабный коэффициент также был подтвержден экспериментально с использованием известных калибровочных сигналов.
Данные акселерометра также должны быть масштабированы, прежде чем их можно будет правильно интерпретировать. Уравнение, используемое для масштабирования данных акселерометра, выглядит следующим образом (здесь принимается 4G, то есть 2 мг на цифру):
Accelerometer Scale Factor = 0.002 / 2^4.
2.7.14. 16-канальные данные при использовании платы Daisy
16-канальная система регистрации ЭЭГ позволяет управлять индивидуальными настройками для всех 16 каналов, а данные извлекаются из обеих микросхем ADS1299 со скоростью 250 циклов в секунду. Текущие ограничения полосы пропускания радиоканала с последовательной передачей данных ограничивают количество пакетов, которые можно отправлять. Чтобы решить эту проблему, пакеты данных отправляются с той же скоростью (250 циклов в секунду), но пакеты со встроенной в плату Cyton микросхемы ADS1299 и ADS1299 на плате Daisy чередуются. Метод основан на принятии средних значений текущих и самых последних значений канала перед отправкой на радиоканал. Первый отправленный образец (пакет) будет недействительным, потому что не существует предыдущего образца для его усреднения. После этого под нечетными номерами пакетов отправляются значения с платы Cyton, а под четными номерами пакетов значения с платы Daisy. При работе системы с 16 каналами настоятельно рекомендуется
41
использовать SD-карту для хранения необработанных (не усредненных) данных для последующей обработки. Данная рекомендация вызвана низкой пропускной способностью радиоканала.
Пример формата передаваемых пакетов:
|sample#| recorded | sent | sent | |-------:|:-------:|:-------:|---------------------:|:------------------:| | 0|board(0),daisy(0)| |an invalid sample | | 1|board(1),daisy(1)|avg(board(0),board(1))| | | 2|board(2),daisy(2)| |avg(daisy(1),daisy(2))| | 3|board(3),daisy(3)|avg(board(2),board(3))| | | 4|board(4),daisy(4)| |avg(daisy(3),daisy(4))| | 5|board(5),daisy(5)|avg(board(4),board(5))| | | 6|board(6),daisy(6)| |avg(daisy(5),daisy(6))|
Полученные средние значения могут быть переданы со скоростью 250 циклов в секунду следующим простым способом, указанным в табл. 2.4.
|
|
|
Таблица 2.4 |
Полученные |
|
Данные платы |
Данные с повышением |
данные |
|
с повышенной частотой |
частоты выборки |
|
|
дискретизацией |
|
|
|
|
|
sample(3) |
|
avg(sample(1),sample(3) |
sample(2) |
|
|
|
|
|
sample(4) |
sample(3) |
avg(sample(2),sample(4) |
|
|
|
|
sample(5) |
|
avg(sample(3),sample(5) |
sample(4) |
|
|
|
|
|
sample(6) |
sample(5) |
avg(sample(4),sample(6) |
|
|
|
|
sample(7) |
|
avg(sample(5),sample(7) |
sample(6) |
|
|
|
|
|
sample(8) |
sample(7) |
avg(sample(6),sample(8) |
|
|
|
|
Время повышенных значений задерживается на 1 выборку по сравнению с полученными значениями.
2.7.15. Перспективы улучшения протокола передачи
Протокол передачи можно изменить для того, чтобы он соответствовал другим стандартам. Данные в эфир передаются в пакетах (или кадрах, в зависимости от предпочтительного слова). Максимально допустимое число байтов на пакет - 32. Первый байт резервируется для использования в качестве контрольной суммы пакета в нашем протоколе. Таким образом, доступное число байтов на пакет равно 31. Протокол беспроводной передачи, который получает хост Dongle/RFduino:
Байт 1: счетчик пакетов Байт 2: номер образца
Байты 3-5: значение данных для канала ЭЭГ №1
42
Байты 6-8: значение данных для канала ЭЭГ №2 Байты 9-11: значение данных для канала ЭЭГ №3 Байты 12-14: значение данных для канала ЭЭГ №4 Байты 15-17: значение данных для канала ЭЭГ №5 Байты 18-20: значение данных для канала ЭЭГ №6 Байты 21-23: значение данных для канала ЭЭГ №6 Байты 24-26: значение данных для канала ЭЭГ №8
Байты 27-28: значение данных для канала акселерометра X Байты 29-30: значение данных для канала акселерометра Y Байты 31-32: значение данных для канала акселерометра Z
Код хоста удаляет счетчик пакетов и добавляет верхний и нижний колонтитулы. Он может быть модифицирован для работы с другими спецификациями протокола для других программ обработки сигналов.
В ситуациях, когда требуется увеличение частоты дискретизации или большее количество каналов, может быть реализована схема сжатия данных. Как отмечено выше, при отправке только значений с ADS1299 для 8 каналов в радиопакете есть шесть неиспользуемых байтов. Может быть возможным, например, увеличить частоту дискретизации и сжать данные АЦП на две выборки в один радиопакет. Или поместить все 16 каналов данных в один пакет без усреднения, которое используется в настоящее время.
2.8. SDK для платы Cyton
Платы OpenBCI Cyton взаимодействуют с помощью командного протокола байтовой строки (в основном ASCII). Далее описано использование команд для 8-ми битных плат OpenBCI Cyton. Некоторые команды относятся к конкретным платам, если это указано. Кроме того, далее описаны команды, необходимые для изменения системы радиосвязи “v0”. Прошло несколько итераций прошивки 8-битной платы.
2.8.1. Обзор протокола Cyton Command
На платах Cyton есть два мощных микроконтроллера. Радиомодуль RFduino использует стек и библиотеку Nordic Gazelle. Монтируемая на плате микросхема RFduino настроена как отдельное устройство. Микроконтроллер
(PIC32MX250F128B или ATmega328P) программируется с помощью микропрограммы, которая взаимодействует между ADS1299 (аналоговый интерфейс и АЦП), LIS3DH (акселерометр), micro SD (если установлена) и RFduino (радиомодуль). Пользователь, или приложение, управляет платой, отправляя команды через беспроводное последовательное соединение. Для соединения платы Cyton с ПК используется плата Dongle. Плата Dongle также имеет микросхему RFduino, на которой работает библиотека Gazelle, настроенная как HOST, и подключается к компьютеру через виртуальный
COM-порт (FTDI).
43
При запуске 8-битная плата OpenBCI (v0) отправляет по радиоканалу следующий текст:
OpenBCI V3 8bit Board
Setting ADS1299 Channel Values ADS1299 Device ID: 0x3E LIS3DH Device ID: 0x33
$$$
Плата OpenBCI Cyton с прошивкой (v1) отправляет по радио следующий текст:
OpenBCI V3 16 channel ADS1299 Device ID: 0x3E LIS3DH Device ID: 0x33
$$$
Плата OpenBCI Cyton с прошивкой v2.0.0 отправляет по радио следующий текст:
OpenBCI V3 8-16 channel ADS1299 Device ID: 0x3E LIS3DH Device ID: 0x33 Firmware: v2.0.0
$$$
Информация об идентификаторе устройства нужна для общего подтверждения работоспособности платы. Знак $$$ - это четкое указание управляющему приложению, что сообщение завершено и плата Cyton готова к приему команд. В прошивке v2.0.0 реализована дополнительная опция для указания точной версии прошивки.
Необходимо обратить внимание на время при отправке команд при использовании прошивок v0 и v1. Должна быть некоторая задержка до и после отправки командного символа с ПК (для нормальной работы управляющей программы или пользователя, использующего терминал). В версии прошивки v2.0.0 эта функция исключена.
2.9.Набор команд
2.9.1.Выключение каналов
Символы “1 2 3 4 5 6 7 8” в формате ASCII отключают соответствующие каналы [1-8]. Каждый канал будет считывать значение “0,00,” когда он выключен в режиме “streamData”. Данные команды работают в режиме “streamData” и без него. Подтверждающие символы не возвращаются.
Символы “**! @ # $% ^ & * **” в формате ASCII включают соответствующие каналы [1-8]. Канал будет читать выходные значения АЦП в
44