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

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

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

разных разработчиков. Для того чтобы внести код в основную библиотеку для использования другими людьми, теперь достаточно просто сделать запрос. Например, код датчика пульса к новой прошивке был адаптирован примерно за 20 минут. Теперь при загрузке новой прошивки на плате код датчика пульса будет там присутствовать. Это избавит от рутинного поиска по всем “OpenBCI” репозиториям.

2.11. Особенности программирования радиомодулей

Совместно с платами OpenBCI Cyton используются USB-ключи, которые обеспечивают связь между платой и вашим компьютером. На плате “OpenBCI Dongle” (USB-ключ) и плате Cyton есть радиомодули BLE (на самом деле радиомодули RFduino 22301), которые обеспечивают связь. Далее приведем некоторые термины:

Радиомодуль на плате “OpenBCI Dongle” называется “Host” (хост).

Радиомодуль на плате Cyton называется “Device” (устройство).

Пары хост-устройств могут быть запрограммированы на передачу до 25 дискретных каналов.

Существуют важные различия в прошивках для 8-битных и 32-битных систем.

Далее будет описано, как работает радиосвязь, как загрузить новую прошивку на радиомодуль платы “OpenBCI Dongle” и радиомодуль платы

Cyton.

2.11.1. Настройка системы для программирования радиомодулей

Для программирования радиомодулей понадобится:

Компьютер с ОС Windows или ОС Mac.

Программа Arduino IDE версии 1.5.8 (бета версия).

Пользовательские библиотеки RFduino для OpenBCI.

Конденсатор 0,1 мкФ.

Для программирования радиомодулей необходимо выполнить следующие

шаги:

1.Загрузить и установить программу Arduino IDE версии 1.5.8 (https://www.arduino.cc/en/Main/OldSoftwareReleases#1.5.x). Для ОС Windows

обязательно надо загрузить файл с пометкой “Windows Installer”. На ОС Mac надо загрузить “MAC OS X” версию, разархивировать приложение и переместить его в папку «Приложения», а затем установить “Java 6”, если будет предложено.

2.Загрузить репозиторий “OpenBCI_RFduino” с сайта github (https://github.com/OpenBCI/OpenBCI_RFduino/archive/master.zip).

70

3.Разархивировать папку.

4.Переместить папку с именем “RFduino” и все, что в ней содержится, на ОС Mac в директорию

“/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino”; на ОС Windows в директорию “C:\Program Files (x86)\Arduino-

1.5.8\hardware\arduino”;

на

ОС

Linux

в

директорию “arduino-

1.5.8/hardware/arduino”.

 

 

 

 

 

Для

 

продолжения

 

работы

пользователям

ОС

Linux

необходимо

 

установить

программу “wine”

(https://www.winehq.org/) . Существует зависимость для продолжения работы кода Arduino, который требует использования “RFDLoader.exe”. Чтобы запустить этот “.exe” файл, необходимо сделать следующее:

Перейти в папку “/hardware/arduino/RFduino”.

Переименовать “RFDLoader” в “RFDLoader.old” (на всякий случай).

Заменить “RFDLoader” на скрипт, который использует “wine” для вызова “RFDLoader.exe”, перенаправляя последовательный порт.

Возможный сценарий находится по адресу https://github.com/OpenBCI/Docs/issues/73#issuecomment-288889646.

Перетащить “RFDLoader” в папку “RFduino”.

Пока программа “wine” установлена нормально, скрипт должен заботиться о любых проблемах, которые могут возникнуть при загрузке.

2.11.2. Использование прошивки радиомодулей версии 2.xx

Для прошивки радиомодулей по радиоканалу необходимо выполнить следующие действия:

1.Загрузить репозиторий прошивки “OpenBCI_Radios” с проекта github. Также можно клонировать репозиторий в свою папку библиотек, указанную после шага 6.

2.Разархивировать папку и, если она называется “OpenBCI_Radios-master”,

переименовать ее в “OpenBCI_Radios”.

3.Переместить папку “OpenBCI_Radios” из папки загрузок в директорию: на ОС Mac “/Linux: Документы/Arduino/библиотеки”; на ОС Windows “C:\Users\имя пользователя\Documents\Arduino\библиотеки”; если в вышеуказанной папке нет папки «библиотеки», то её надо создать.

4.Открыть “Arduino IDE 1.5.8”, перезапустить “Arduino IDE”, если он уже был открыт.

Для того чтобы изменить прошивку на свою, вместо той, которая пришла

с “OpenBCI Dongle”, надо убедиться, что RFduino установлено как “Device” и канал выбран правильно.

71

2.11.3. Загрузка прошивки на плату Cyton

Чтобы загрузить код в модуль RFduino на плате Cyton, необходимо иметь последовательное соединение с компьютером. Традиционно это делается с помощью кабеля и FTDI устройства. Если кабель с устройством FTDI уже имеются, необходимо убедиться, что устройство FTDI питается от напряжения 3 В. Использование FTDI устройства, работающего от напряжения питания 5В, может повредить модуль RFduino на платформе OpenBCI. Также возможна загрузка кода в модуль “RFduino”, смонтированный на плате, используя “ключ OpenBCI” (“OpenBCI Dongle”). Далее рассмотрим способы загрузки прошивки на радиомодуль (Device) платы OpenBCI.

2.11.4. Загрузка прошивки версии 2.xx в радиомодуль платы

Cyton

Для загрузки прошивки в радиомодуль платы Cyton необходимо выполнить следующие шаги:

1.В программе “Arduino IDE 1.5.8” выполнить команду “File-->Examples-- >OpenBCI_Radios-->RadioDevice32bit”, которая запустит прошивку устройства.

2.Перейти к меню “Tools-->Board “ и выбрать “RFduino”.

3.Выполнить один из способов, перечисленных в следующем разделе, чтобы подключить устройство к компьютеру.

4.Перейти в меню “Tools-->Port” и выбрать “COM” порт (в ОС Windows) или

“/dev/tty.usbserial-*” порт (в ОС “Mac/Linux”) для устройства.

5.Нажать «Подтвердить» на панели инструментов (значок в виде галочки) и убедиться, что все готово; Если появилось сообщение “Done Compiling”, то все готово к работе.

6.Выбрать номер канала для прошиваемого устройства. Номер канала может быть установлен в коде “radio.begin(OPENBCI_MODE_DEVICE,20)”.

7.Нажать «Загрузить» на панели инструментов (значок справа от галочки). После этого код загрузится на устройство OpenBCI.

Начиная с версии “2” прошивки, необходимо сначала прошить плату со

строкой “radio.flashNonVolatileMemory();” в функции “setup()” без комментариев, затем закомментировать строку и снова прошить программу. Очень важно перепрограммировать плату с закомментированной строкой. Это делается потому, что во второй версии прошивки номер канала сохраняется в энергонезависимой памяти, поэтому нельзя изменить номер канала системы с ПК/драйвера. И при выключении системы она не запомнит вновь установленный канал.

72

2.11.5. Программирование радиомодуля DEVICE с ключом

OpenBCI

Идея заключается в том, чтобы использовать микросхему FTDI на плате ключа “OpenBCI Dongle” (рис. 2.40), чтобы соединить интерфейсы USB и Serial в процессе загрузки. Для начала необходима специальная подготовка.

Рис. 2.40. Кнопка загрузки

Сначала необходимо припаять разъемы к плате “OpenBCI Dongle”. Затем переместить переключатель в положение RESET и загрузить некоторый фиктивный код на радиомодуль платы “OpenBCI Dongle”, чтобы он не мешал процессу последовательной загрузки.

2.11.6. Загрузка версии прошивки Pass Thru Radio 2.xx

Необходимо открыть программу Arduino IDE 1.5.8 и пройти по кнопкам меню “File-->Examples-->OpenBCI_Radios-->RadioPassThru32bit”. Обязательно надо выбрать “RFDuino” из вкладки “Tools --> Board --> RFDuino”.

Далее необходимо сделать макет с 8-ю перемычками и конденсатор 0,1 мкФ. Конденсатор 0,1 мкФ должен быть последовательно соединен между выводом Dongle GPIO6 и выводом RESET платы OpenBCI (рис. 2.41).

Рис. 2.41. Макет с 8-ю перемычками

73

Далее надо подать питание на плату OpenBCI с помощью прилагаемого батарейного блока, поэтому для загрузки понадобятся только четыре соединения. Также можно запитать плату OpenBCI от 3В с платы Dongle, но это делает следующий шаг немного сложнее. В любом случае ниже приведен перечень основных соединений, которые необходимо выполнить при питании платы от батарейного блока:

FTDI RX -> RF TX

FTDI TX -> RF RX

GPIO6 -> 0.1uF Cap -> RF RST

GND -> GND

На 8-битной плате контакты, к которым нужно подключиться, доступны на верхней стороне платы. Надо вставить перемычки в отверстия в правильном положении и плотно прижать их к боковым сторонам отверстий, чтобы создать прочное соединение. Теперь можно загрузить код устройства в RFduino на 8- битной плате OpenBCI.

На плате Cyton контакты, к которым нужно подключиться, доступны с нижней части платы. Необходимо соединить перемычки с центром контактных площадок, как показано на рис. 2.42, и плотно нажать во время загрузки.

Рис. 2.42. Соединение контактов на плате

74

2.11.7. Загрузка прошивки хоста в ключ OpenBCI

Этот процесс не требует стороннего оборудования. На ключе OpenBCI есть переключатель, который позволяет выбирать между выводами RESET и GPIO6 . Этот коммутатор направляет вывод DTR от чипа FTDI к выводу RESET или GPIO6 на модуле RFduino. Когда коммутатор находится в положении GPIO6, электронный ключ готов к общему обмену данными, загрузке кода и режиму потоковой передачи данных на плату OpenBCI. Когда переключатель находится в положении RESET, то можно загрузить код в

RFduino прямо на ключе Dongle.

2.11.8. Загрузка версии прошивки HOST 2.xx

Для загрузки необходимо выполнить следующие шаги:

В Arduino IDE 1.5.8 надо выбрать “File-->Examples-->OpenBCI_Radios-- >RadioHost32bit” для запустка прошивки Host;

Затем надо перейти в меню “Tools-->Board” и выбрать “RFduino”.

Далее надо подключить ключ к компьютеру. Перевести переключатель в положение Reset, если это еще не сделано.

Далее надо перейти в “Tools-->Port” и выбрать COM порт.

Далее надо нажать «Подтвердить» на панели инструментов (значок галочки), чтобы убедиться, что все готово. Если появится сообщение “Done Compiling”, то все готово к работе.

Далее надо выбрать номер канала для устройства. Номер канала можно установить в прошиваемом коде.

Затем надо нажать «Загрузить» на панели инструментов (значок справа от галочки). После этого код будет загружен в ключ OpenBCI.

Начиная с версии 2 прошивки, необходимо сначала прошить плату со строкой radio.flashNonVolatileMemory(); в функции setup(), затем закомментировать строку и снова запрограммировать. Очень важно заново перепрограммировать плату с закомментированной строкой. Это необходимо делать потому, что во второй версии прошивки номер канала сохраняется в энергонезависимой памяти. Если прошивка второй версии загружается впервые, то можно не прошивать второй раз.

2.11.9. Загрузка прошивок версии 1.xx

Сначала необходимо загрузить репозиторий “OpenBCI_Radios” с сайта

“github” (https://github.com/OpenBCI/OpenBCI_Radios/tree/maint/1.0.0) и

поместить его в нужное место, в зависимости от ОС, установленной на ПК.

На ОС “Mac” папку RFduino и все, что в ней содержится, надо поместить в каталог “/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino”.

75

В ОС Windows папку RFduino и все, что в ней содержится, надо поместить в каталог “C\Program Files (x86)\Arduino-1.5.x\hardware\arduino”.

Для загрузки кода на плату Cyton понадобится программа “Arduino v1.8.0” или более поздняя версия, а для загрузки кода в ключ - программа

“Arduino v1.5.8”. Если программа “Ardiono v1.8.0” уже установлена, то при установке версии “1.5.8” может появиться сообщение об ошибке, о том, что необходимо удалить v1.8.0. Вместо удаления надо просто переместить существующую папку «Arduino» (которая должна быть версии 1.8.0) в другую папку (например, «Документы»). Далее надо зайти в диспетчер программ (называется «Изменить или удалить программу» в Windows), нажать «Удалить Arduino 1.8.0» и подтвердить это. Далее надо установить версию 1.5.8. Затем перенести сохраненную версию 1.8.0 обратно. Данные действия позволят сохранить обе версии.

Файлы, содержащиеся в папке “RFduino”, представляют собой пользовательские сборки для проекта OpenBCI от компании “RFdigital”. Эти сборки позволяют выжать всю скорость, которую можно получить от библиотеки “RFduinoGZLL”.Так же они открывают доступ к 25 дискретным

каналам для работы с платами OpenBCI.

 

 

 

Далее

для

32-битных

плат

OpenBCI

надо

загрузить

скетч “OpenBCI_32bit_Device.ino”,

а

для

8-битных

плат

скетч “OpenBCI_8bit_Device.ino”.

 

 

 

 

2.11.10. Загрузка прошивки Pass Thru Radio версии 1.xx

Для загрузки необходимо открыть для загрузки скетч Arduino под названием “OpenBCI_Dongle_PassThru.ino”.

Далее надо нажать кнопку загрузки. Кнопка находится справа от галочки в левом верхнем углу IDE. После загрузки обязательно необходимо вернуть переключатель в сторону GPIO6.

2.11.11. Загрузка прошивки HOST версии 1.xx

Для того чтобы изменить прошивку, которая находится в OpenBCI Dongle, или прошить свою собственную прошивку, надо убедиться, что RFduino установлен как HOST и канал выбран правильно. Номер канала можно посмотреть в коде следующего вида:

// place this above the setup()

#include <RFduinoGZLL.h> // using the Gazelle Stack device_t role = HOST; // This is the HOST

void setup(){

RFduinoGZLL.channel = 6; // use channels 2-25. 1 is same as 0 and 0-8 in normal GZLL library RFduinoGZLL.begin(role); // start the GZLL stack

// more stuff here

}

76

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

2.12. Внешний триггер на плате Cyton

Иногда при изучении ЭЭГ или других био-сигналов может понадобиться точная синхронизация между внешними событиями и потоком данных. Например, если работа проходит с волнами P300, необходимо знать точное время, когда сигнал был представлен субъекту, чтобы найти контрольную мозговую волну, которая происходит примерно через 300 мс после стимулирования.

Далее рассмотрим несколько способов добавления внешнего триггера в поток данных на 32-битной плате. Обычно плата Cyton считывает данные с акселерометра с частотой 25 Гц. Когда пользователь меняет режим платы на режим “Analog” или “Digital”, то чтение данных с внешних выводов происходит с той же скоростью, с которой работают и сигнальные выводы (например, 250 Гц). Это свойство и используется для учета точного времени, необходимого для внешних триггеров.

Начиная с версии 3.xx платы Cyton, можно переключать режимы платы без загрузки нового кода на плату.

2.12.1. Внешний запуск с прошивкой 3.xx

Сначала необходимо убедиться, что прошивка платы Cyton имеет версию 3.1.0 или более позднюю.

Далее надо запустить графический интерфейс OpenBCI для используемой операционной системы. Затем надо следовать инструкциям по подключению платы. После подключения платы можно выбрать «Digital Read» для одного из виджетов. Затем нажать кнопку запуска режима цифрового чтения в верхнем левом углу. Акселерометр больше не будет включен, поскольку вместо него теперь отправляются данные триггера.

Для проверки, работает ли цифровой виджет чтения, надо нажать кнопку «PROG», которая подключена к выводу D17.

При использовании USB-ключа Cyton получается до 5 цифровых выводов ввода-вывода для чтения: D11, D12, D13, D17 и D18. Если между нажатием кнопки и отображением данных происходит задержка, то можно уменьшить задержку последовательного порта.

Когда используется плата Cyton совместно с платой WiFi Shield, то получается до 3-х цифровых выводов ввода-вывода для чтения: D11, D12 и D17. После настройки порта не должно быть заметной задержки с момента нажатия кнопки и показом нажатой кнопки в виджете цифрового чтения графического интерфейса.

77

Микропрограмма версии 3.xx предоставляет давно запрошенную готовую возможность чтения с аналоговых или цифровых входов по умолчанию. Она позволяет просто читать с аналогового входа (отправив команду “/2” в формате ASCII) или цифрового входа (отправив команду “/3”). Плата по умолчанию активирована и всегда может быть заново доступна после отправки команды

“/0”.

2.12.2. Внешний запуск с прошивкой 2.xx

32-битная плата OpenBCI имеет кнопочный переключатель, подключенный прямо к микроконтроллеру PIC32 и доступный для пользователя. Это кнопка PROG, и она используется для перевода PIC в режим загрузчика при загрузке новой прошивки. В другом положении переключатель подключен к выводу D17 с резистором 470K, поэтому, когда нажата кнопка PROG, то D17 переключается с уровня “LOW” на уровень “HIGH”. Кнопка PROG – отличный способ получить подтверждение пользователя, например, после действия стимуляции в потоке данных. Ниже приведен пример кода, в котором описаны переменные, хранящие значения нажатий кнопки.

int pushButton = 17;

// the button is on pin D17

int pushButtonValue;

// used to hold the latest button reading

int lastPushButtonValue;

// used to remember the last button state

boolean addAuxToSD = false; // use this to write auxiliary data to SD if you like boolean state = HIGH; // used to toggle the on-board LED

Прежде всего, нужно установить переменные, которые необходимы для считывания кнопочного переключателя, и флажок, чтобы остальная часть программы знала, что получены новые данные. Библиотека OpenBCI уже имеет массив переменных для вспомогательных данных, называемый auxData, который используется для регистрации. Также в коде добавлен флаг для записи данных на SD-карту и логическое значение для включения встроенного синего светодиода для обратной связи с пользователем.

В функции настройки надо установить направление вывода и добавить переменные кнопки. Функция startFromScratch () сбрасывает периферийные устройства платы и выполняет некоторые общие действия, а также устанавливает начальный последовательный контакт с любой управляющей программой. Переменные useAccel и useAux находятся внутри библиотеки OpenBCI_32_Daisy, и важно решить и выбрать, какой тип данных необходимо регистрировать. Можно сделать и то и другое, но при этом нужно будет вручную управлять переменными useAux или useAcel:

void setup(){ // stuff here...

pinMode(pushButton, INPUT); // set the button pin direction pushButtonValue = lastPushButtonValue = digitalRead(pushButton); // seed startFromScratch(); // initialize OpenBCI, read device IDS

// you can set EITHER useAccel or useAux to true

78

// if you want both, you MUST set and clear one of the variables every sample OBCI.useAccel = false; // option to add/remove accelerometer data to stream OBCI.useAux = true; // option to add/remove auxiliary data to stream

// more stuff...

}

Затем в цикле надо проверить наличие переднего фронта нажатия кнопки, записать его в массив auxData и установить флаг записи на SD (если необходимо). Наконец, надо получить событие нажатия кнопки в потоке данных. В каждом пакете данных доступно 6 байтов, и формат чтения по умолчанию это три 16-битных целых числа «слова». Необходимо решить, добавлять ли свои флаги в массив auxData? Ниже приведен пример, в котором устанавливается каждое короткое значение на 0x6620. Это происходит потому, что интерфейс OpenBCI GUI преобразует эти переменные в Gs (GUI ожидает данные акселерометра), а 0x6620 - в значение PI (3.14). Частота дискретизации 250 Гц дает разрешение 4 мс на события внешнего запуска, такие как нарастающий фронт нажатия кнопки PROG.

pushButtonValue = digitalRead(pushButton);

// feel the PROG button

if (pushButtonValue != lastPushButtonValue){

// if it's changed,

if (pushButtonValue == HIGH){ // if it's gone from LOW to HIGH // 0x6220 converts to PI in GUI

OBCI.auxData[0] = OBCI.auxData[1] = OBCI.auxData[2] = 0x6220;

addAuxToSD = true;

// add Aux Data to the SD card if it's there

state = !state; // toggle the state variable

digitalWrite(LED,state);

// toggle the LED for user useability

}

lastPushButtonValue = pushButtonValue; // keep track of the changes!

}

Можно создавать событие нажатой кнопки в любой точке функции loop(). В приведенном выше примере кода это событие помещено вне условного условия if (is-running), чтобы видеть переключение светодиода, даже когда плата не передает данные. Это хороший способ узнать, что все настроено и работает хорошо до начала сеанса регистрации данных.

Ниже приведен пример того, как выглядят данные после того, как они были зарегистрированы интерфейсом GUI:

217, -18.08, -23.04, -21.59, -29.86, -23.76, -19.65, -28.79, -19.47, 0.00, 0.00, 0.00 218, -18.17, -22.82, -21.59, -29.93, -23.85, -19.65, -28.72, -19.16, 0.00, 0.00, 0.00 219, -17.97, -23.04, -21.39, -29.97, -23.92, -19.56, -28.74, -19.24, 0.00, 0.00, 0.00 220, -17.99, -23.07, -21.61, -30.00, -23.72, -19.71, -28.52, -19.16, 0.00, 0.00, 0.00 221, -17.90, -23.04, -21.48, -30.09, -23.85, -19.54, -28.43, -19.18, 3.14, 3.14, 3.14 222, -17.90, -22.96, -21.48, -30.20, -23.72, -19.38, -28.57, -18.95, 0.00, 0.00, 0.00 223, -17.93, -22.89, -21.26, -29.97, -23.96, -19.65, -28.54, -18.95, 0.00, 0.00, 0.00

А ниже приведен пример того, как выглядят данные после их записи на SD-карту:

D9,FFFCD7,FFFBF9,FFFC3A,FFFAC8,FFFBD9,FFFC91,FFFAF8,FFFC99

DA,FFFCD3,FFFC03,FFFC3A,FFFAC5,FFFBD5,FFFC91,FFFAFB,FFFCA7

79