Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 2232

.pdf
Скачиваний:
26
Добавлен:
30.04.2022
Размер:
14.85 Mб
Скачать

5.2.2. Обновление прошивки проводным способом

Существует множество устройств и кабелей FTDI, которые могут быть использованы для проводного подключения WiFi Shield к ПК. Далее приведена пара примеров популярных устройств.

Для прошивки можно использовать FTDI Friend из Adafruit. На плате FTDI Friend необходимо удалить перемычки RTS и 5V. Это правильные настройки для загрузки кода в ESP8266 с помощью FTDI Friend (рис. 5.22).

Рис. 5.22. Плата FTDI Friend

Еще одно устройство, позволяющее прошивать WiFi Shield, это FTDI Basic Breakout (рис. 5.23).

Рис. 5.23. Плата FTDI Basic Breakout

Компания Sparkfun производит FTDI Basic Breakout двух видов для питания устройств напряжением 5В и 3В. Для прошивки WiFi Shield необходимо устройство с напряжением 3В. Также, если имеется версия FTDI Basic Breakout с выбором напряжения на задней панели, необходимо убедиться, что к ней подключены площадки 3,3В и обрезаны контактные площадки 5В (рис. 5.24).

140

Рис. 5.24. Плата FTDI Basic Breakout 3,3В

Для загрузки прошивки в ESP8266 можно использовать OpenBCI Cyton Dongle.

Для обновления прошивки проводным способом сначала необходимо установить Python Dependency. Необходимо установить либо Python 2.7, либо Python 3.4, либо более новую версию. Далее загрузить и установить esptool. Последний стабильный esptool.py выпуск может быть установлен из pypi (https://pypi.org/project/esptool/) через pip:

$ pip install esptool

В некоторых установках Python это может не сработать, и будет выдано сообщение об ошибке, поэтому можно попробовать ввести команду python -m pip install esptool или pip2 install esptool.

После установки esptool.py программа будет установлена в каталог исполняемых файлов Python по умолчанию, и можно будет запустить ее с помощью команды esptool.py. В Windows необходимо использовать командную строку.

5.2.3. Загрузка прошивки в WiFi Shield

Сначала необходимо загрузить файл, который вызывается

DefaultWifiShield.bin из последнего выпуска OpenBCI_WiFi Github

репозитория. Затем его сохранить в папку загрузок.

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

Необходимо выбрать правильный последовательный порт для OpenBCI Dongle или FTDI Friend:

*On Macs, this will be named **/dev/tty.usbserial-DN00nnnn** where the nnnn is a combination of numbers and letters specific to your programmer of choice.

*On Windows, the serial port will be listed as a numbered COM port.

*On Linux, it will be different.

141

5.2.5. Подключение WiFi Shield к программатору

Сначала необходимо подключить FTDI Friend (рис. 5.25), OpenBCI Dongle

или другой программатор UART-USB к Wifi Shield. Wifi Shield необходимо запитать от аккумулятора, а не через FTDI Friend. Схема подключения представлена в таблице.

FTDI_Friend

Wifi Shield

 

 

GND

GND

 

 

RX

TX

 

 

TX

RX

 

 

Рис. 5.25. Подключение к FTDI Friend

5.2.6. Изолирование и питание WiFi Shield

Необходимо отсоединить WiFi Shield от платы Cyton или Ganglion, если это еще не сделано. Далее необходимо подключить аккумулятор к WiFi Shield (рис. 5.26).

Рис. 5.26. Подключение аккумулятора к WiFi Shield

142

Для перевода WiFi Shield в режим загрузчика надо нажать и удерживать кнопку “PROG” (рис. 5.27).

Рис. 5.27. Перевод платы в режим загрузчика

Затем надо нажать и отпустить кнопку “RESET”, удерживая кнопку “PROG”. Потом надо отпустить кнопку “PROG”. После этого светодиодный индикатор на плате WiFi Shield должен погаснуть, и плата окажется в режиме загрузки.

Загрузка кода на операционных системах MAC/Linux происходит из терминала с помощью установленного esptool.py. В команде надо заменить “YOURPORT” на имя последовательного порта:

$ esptool.py --port /dev/tty.usbserial-YOURPORT write_flash 0x000000 ~/Downloads/DefaultWifiShield.bin

В операционной системе Windows необходимо ввести командную строку, в которой заменить имя последовательного порта на COM4:

$ esptool.py --port COM4 write_flash 0x000000 Downloads\DefaultWifiShield.bin

5.2.7. Компиляция исходного кода и формирование двоичного кода

Для компиляции исходного кода понадобится:

Компьютер (под управлением Windows, MAC или другой ОС).

Arduino IDE версии 1.8.3 и выше.

Библиотеки ESP8266 с SPISlave (https://github.com/esp8266/Arduino).

143

OpenBCI Dongle или FTDI USB-UART, подключенный к USB-порту.

OpenBCI WiFi Shield с питанием от батареи.

Прошивка OpenBCI WiFi (для загрузки следуйте инструкциям ниже).

Различные другие зависимости WiFi.

Прошивка OpenBCI Cyton SD.

OpenBCI WiFi Master Firmware.

Далее для работы необходимо скачать последнюю версию Arduino. Установить прошивку из Arduino Library Manager. Затем открыть диспетчер библиотек и установить библиотеки:

1.Установить программу OpenBCI и последнюю версию библиотеки

OpenBCI_Wifi (https://www.arduinolibraries.info/libraries/open-bci_wifi).

2.Установить последнюю версию для WiFiManager (https://www.arduinolibraries.info/libraries/wi-fi-manager).

3.Установить последнюю версию ArduinoJson (https://www.arduinolibraries.info/libraries/arduino-json).

4.Установить последнюю версию PubSubClient (https://www.arduinolibraries.info/libraries/pub-sub-client).

5.Установить последнюю версию Time v1.5.0 и выше от Michael Margolis, для этого нужно перейти ниже до раздела “T” ().

6.Найти NTP и установить последнюю версию для NtpClientLib (не NtpClient!) (https://github.com/arduino-libraries/NTPClient).

Для поиска и установки можно использовать “Менеджер библиотек”. Библиотеки надо разархивировать в папки:

OpenBCI_Wifi;

WiFiManager;

ArduinoJson;

PubSubClient;

Time;

NtpClientLib.

Далее надо переместить все папки в директорию:

на MacOS: /Documents/Arduino/libraries;

на Windows: C:\Users\username\Documents\Arduino\libraries.

Если папки libraries нет, то ее надо создать.

5.2.8. Прошивка ядра ESP8266

Для прошивки необходимо следовать инструкциям по загрузке ядра Arduino ESP8266 из Boards Manager (https://github.com/esp8266/Arduino). SPISlave.h

добавлен в официальный SDK. GUI работает только в том случае, если двоичный файл скомпилирован с использованием библиотеки Arduino ESP версии 2.5.0.

144

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