Материал: Аппаратура для электроэнцефалографических исследований. Журавлев Д.В

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

5.2.9. Выбор “Adafruit Huzzah ESP8266” в качестве платы

После выполнения вышеперечисленных действий необходимо в выпадающем меню “Tools=>Board” выбрать строку “Adafruit Huzzah ESP8266” из подраздела “ESP8266” Modules”. Затем из меню “Tools=>Flash Size” выбрать 4M (1M SPIFFS) (рис. 5.28).

Рис. 5.28. Выбор “Adafruit Huzzah ESP8266”

5.2.10.Выбор DefaultWifiShield.ino из примеров

Впрограмме Arduino IDE необходимо перейти по следующему меню

File=>Examples=>OpenBCI_Wifi=>DefaultWifiShield для запуска прошивки Wifi Shield по умолчанию. Необходимо загрузить только DefaultWifiShield скетч.

5.2.11.Компиляция исходного кода в Arduino

Если вышеперечисленные шаги выполнялись только что, то необходимо перезапустить Arduino. Далее надо выбрать “Verify” в строке меню Sketch=> Verify/Compile.

145

5.2.12. Компиляция исходного кода с помощью make

Для компиляции исходного кода удобнее использовать makeESPArduino - инструмент командной строки для сборки и компиляции прошивки без необходимости использования Arduino IDE Для этого необходимо использовать файл makeESPWifiDefault.mk (https://github.com/plerup/makeEspArduino) в репозитории github WiFi (https://github.com/OpenBCI/OpenBCI_WIFI).

5.2.13. Получение последовательного порта для программирования

Необходимо выбрать правильный последовательный порт для OpenBCI Dongle или FTDI Friend. На компьютерах с MacOS это будет называться

**/dev/tty.usbserial-DN00nnnn**, где nnnn - это комбинация цифр и букв,

специфичная для выбранного порта. В Windows последовательный порт будет указан как пронумерованный COM-порт.

Далее надо выполнить действия, указанные выше, а именно. Сначала необходимо подключить FTDI Friend, OpenBCI Dongle или другой программатор UART-USB к Wifi Shield. Wifi Shield необходимо запитать от аккумулятора, а не через FTDI Friend. Отсоединить WiFi Shield от платы Cyton или Ganglion, если это еще не сделано. Далее подключить аккумулятор к WiFi Shield. Для перевода WiFi Shield в режим загрузчика нажать и удерживать кнопку “PROG”. Затем нажать и отпустить кнопку “RESET”, удерживая кнопку “PROG”. Потом отпустить кнопку “PROG”. После этого светодиодный индикатор на плате WiFi Shield должен погаснуть, и плата окажется в режиме загрузки.

5.2.14. Загрузка кода

Для загрузки скомпилированного кода надо нажать кнопку загрузки в

Arduino IDE или выполнить команду “make -f makeESPDefault.mk flash”.

5.3. API для платы WiFi Shield

Одна из важных особенностей WiFi Shield - это возможность организации веб-сервера HTTP. Разработчикам, желающим получить данные из OpenBCI с помощью WiFi Shield, эти HTTP-команды позволяют передавать данные в сторонние приложения через TCP или MQTT.

5.3.1. Подключение Wifi Shield к локальной беспроводной сети

Подключение Wifi Shield для потоковой передачи по TCP: 1. Получить IP-адрес Wifi Shield.

146

2.Открыть сокет TCP на главном компьютере.

3.Отправить http-запрос POST “/tcp” с открытым сокетом “IP/номер порта” (т. е. формат вывода JSON или RAW с использованием разделителей между пакетами и настройкой задержки).

4.Отправить запрос GET “/stream/start” или GET “/stream/stop”.

Шаги для подключения к Wifi Shield и потоковой передачи через MQTT:

1)получить IP-адрес Wifi Shield;

2)настроить MQTT broker;

3)отправить http-запрос POST “/mqtt” с адресом брокера и необязательным именем пользователя и паролем;

4)отправить http-запрос GET “/stream/start” или GET “/stream/stop”.

5.3.2. Получение IP-адреса Wifi Shield

Для программного обнаружения WiFi Shields в локальной сети используется Simple Service Discovery Protocol (SSDP). Протокол SSDP реализуют Node.js OpenBCI WiFi Driver (https://github.com/ajptw/OpenBCI_NodeJS/blob/wifi/examples/getStreamingWifi/getStreamingWifi.js) и Python OpenBCI WiFi Driver (https://github.com/OpenBCI/OpenBCI_Python/pull/5 4).

Можно также использовать графический интерфейс OpenBCI GUI, который будет использовать OpenBCI Electron Hub, чтобы найти IP-адрес WiFi Shields.

Также можно использовать графический интерфейс программы Lan Scan (https://apps.apple.com/us/app/lanscan/id472226235?mt=12) для MacOS.

5.3.3. Открытие сокета TCP на компьютере

Чтобы обеспечить малую задержку и высокую надежность беспроводной передачи данных, необходимо открыть сокет TCP на основном хосткомпьютере. Wifi Shield будет передавать данные на этот сокет.

5.3.4. Режим вывода RAW

Врежиме вывода RAW формат данных соответствует 33 байтному двоичному формату данных OpenBCI. Даже плата Ganglion отправляет на WiFi Shield 33 байта, где первые четыре канала содержат данные, а вторые четыре канала содержат нули.

5.3.5.Режим вывода JSON

Врежиме вывода JSON WiFi Shield преобразует необработанные данные в нановольтах. В программе прошивки v3.0.0 для платы Cyton и программе прошивки v2.0.0 для платы Ganglion значение коэффициента усиления для

147

каждого канала передается на WiFi Shield один раз при первом соединении между устройствами и еще каждый раз, когда плты Ganglion или Cyton получают команды начала потоковой передачи. WiFi Shield единовременно подключается к NTP-серверу и отправляет данные в формате JSON.

JSON по умолчанию придерживается популярного формата потока LSL:

{

"chunk": [

{"data": [<float>, ..., <float>], "timestamp": <float> },

...

{"data": [<float>, ..., <float>], "timestamp": <float> }

]

}

Например, буфер, состоящий из 5 пакетов (каждый пакет содержит 4 канала), будет иметь вид:

[

{"data":[ 7056745022195285, -475495395375, 475495395375, -495395375], "timestamp": 1497479774194733},

{"data":[ 7056745022195285, -475495395375, 475495395375, -495395375], "timestamp": 1497479774195230},

{"data":[ 7056745022195285, -475495395375, 475495395375, -495395375], "timestamp": 1497479774195735},

{"data":[ 7056745022195285, -475495395375, 475495395375, -495395375], "timestamp": 1497479774196209},

{"data":[ 7056745022195285, -475495395375, 475495395375, -495395375], "timestamp": 1497479774196715}

]

5.3.6.Плата WiFi Shield как HTTP сервер

Врежиме HTTP сервера можно отправлять следующие http-запросы:

“/tcp” для настройки TCP;

“/mqtt” для настройки MQTT;

/command запросы на контроль;

/latency запросы на настройку.

Полное описание http-сервера в отношении OpenBCI Wifi Server

представлено по адресу: https://docs.openbci.com/docs/05ThirdParty/03WiFiShield/WiFiAPI. Там есть много опций, таких как “output” в режиме JSON или необработанный вывод, задержка, разделители и другие опции, которые помогают легко обрабатывать данные в драйвере.

Чтобы изменить частоту дискретизации в плате Cyton, необходимо использовать команду “~”, определенную в документации Cyton SDK.

Время задержки между посылками пакетов определяется в микросекундах (us). Чем выше частота дискретизации платы OpenBCI, тем выше требуемая задержка. По умолчанию стоит 1000 мксек., при значении 50 мксек. возникает минимальная стабильность. Для верхних предельных частот дискретизации, таких как 4 кГц / 8 кГц / 16 кГц, задержка составляет около 20 миллисекунд, что значительно стабилизирует систему передачи.

148

5.3.7. Парсинг данных с платы Wifi Shield

Данные могут быть отправлены с Wifi Shield в двух разных форматах: RAW

и JSON.

5.3.8. Формат RAW потока байтов

Первый отправляемый байт - это управляющий байт. Для потоковой передачи данных по сокету TCP необходимо отправить 0xCX в качестве управляющего байта (где X находится в диапазоне 0-F в шестнадцатеричном виде). В базе OpenBCI_32bit_Library код выглядит следующим образом:

/*

*@description Writes channel data and axisData array to serial port in

*the correct stream packet format.

*/

void OpenBCI_32bit_Library::sendChannelDataWifi(void) {

wifiStoreByte(OPENBCI_EOP_STND_ACCEL); // 0xC0 1 byte

wifiStoreByte(sampleCounter); // 1 byte

ADS_writeChannelDataWifi(); // 24 bytes

accelWriteAxisDataWifi(); // 6 bytes

wifiFlushBuffer(); // Flushes the buffer to the SPISlave ESP8266 device!

sampleCounter++;

}

Этот код записывает данные размером 32 байта в правильном формате и, следовательно, как только он поступает на плату Wifi Shield она будет преобразовывать пакет 32 байт в стандартный 33-х байтный двоичный формата. При этом перемещаются управляющие байты 0xCn (где n находится в пределах 0-F в шестнадцатеричном виде) в конечное положение, как байты конца посылки и добавляются 0xA0 в начальное положение, как байты начала. Это обеспечивает бесшовную интеграцию с проверенными и системами синтаксического анализа, уже созданными для платы Cyton. Если необходимо отправлять только 20 байтов данных в пакете, то все равно надо отправлять все 32 байта с правильными байтами начала и конца.

5.3.9. Формат JSON

Далее предлагаются параметры для запроса POST “/tcp” или “/mqtt”:

{

"port": ..., // Enter your local server port

149

Источник: https://studfile.net/preview/16566241/