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