photo

Регистратор мышечной активности с беспроводной связью

0

Добавил: MaratIsmagil ()

вставить в блог

Описание

Основным элементом данного проекта является Набор-конструктор «Юный Нейромоделист» BiTronics Lab. Это отличный набор для обучения детей основам нейротехнологий, в нем достаточное разнообразие датчиков для различных физиологических процессов. Датчики подключаются к плате Arduino и программируются в одноименной среде, что сильно упрощает работу с ними. Подробнее можно узнать у производителя: www.bitronicslab.com
В данном случае я буду использовать модуль электромиограммы и плату NodeMCUESP-12e (Lolin) на основе микроконтроллера ESP8266, которая может программироваться через ArduinoIDE. Итогом проекта будет небольшое устройство, которое будет собирать информацию о мышечной активности и отсылать ее на любое доступное по HTTP-протоколу устройство в беспроводной сети. То есть можно будет удаленно отслеживать, находится ли мышца человека в состоянии покоя или активности, что может быть полезно для занятий фитнесом.
Первым делом соберем схему на макетной плате, для этого сначала заглянем в распиновку отладочной платы:
 
Соответственно, данные с датчика идут на аналоговый вход A0. Пины группы D(0-8) цифровые и их можно использовать для подключения светодиода и питания датчика. На Vinмы питаем плату, если верить документации, то на этот вход можно подать до 20 В.
Теперь посмотрим инструкцию к датчику ЭМГ. Подключается он очень просто:

 
С ESPвсе по аналогии с Arduino, OUTсоединить с аналоговым входом контроллера А0. Однако, фиксированного выхода 5В на ESPнет. В этом случае нужно просто заставить один из цифровых выходов (D6) платы выдавать постоянный HIGH и этим сигналом питать сенсор. У меня, в данном случае, отладочная плата NodeMCUEPS-12e (Lolin), в ней уже встроен преобразователь напряжения, поэтому 9 Вольт с кроны вполне допустимы на вход питания платы (VIN). Если же у вас другая плата на этом процессоре, то нужно убедиться в наличии преобразователя. Также, lolinимеет на борту UART-USBпреобразователь и micro-USBпорт, которых может не быть на других платах с esp8266.
Теперь подключаем плату к компьютеру и устанавливаем драйвера микросхемы преобразователя UARTCH340G. Скорее всего система не найдет их по умолчанию:

Установить драйвер CH340G можно со страницы официального производителя WCH — http://www.wch.cn/download/CH341SER_EXE.html
В центре страницы есть синяя кнопка Download, жмем ее и сохраняем в удобное место предлагаемый к скачиванию файл CH341SER.EXE. Обратите внимание на список файлов внизу страницы – там вы можете скачать драйвер CH340G для Linux, для Mac и для Android.

После этого запускаем скачанный файл CH341SER.EXE, который по сути является самораспаковывающимся архивом и видим следующее окошко.

Версия нашей операционной системы должна определиться автоматически, после чего остается только нажать кнопку Install.
После установки драйверов плата привяжется к COM-порту. Нужно запомнить номер порта, чтобы потом его выбрать в ArduinoIDE.
Запускаем среду разработки и тут же идём в Файл/Настройки:



Вставляем ссылку в поле «Дополнительные ссылки для Менеджера плат:» и жмём «OK».
arduino.esp8266.com/stable/package_esp8266com_index.json
Потом идём Инструменты/Плата:/Менеджер плат...:



Перед нами появится окно менеджера плат, листаем его до самого низа, и если всё сделано правильно мы увидим что-то подобно этому:



Кликаем курсором по надписи "esp8266 by ESP8266 Community" после этого, у нас появилась кнопка «Установка», можно просто поставить последнюю версию. Среда разработки закачает нужные ей файлы(около 150 мегабайт) и напротив надписи "esp8266 by ESP8266 Community" появится «INSTALLED», то есть установлено:



Листаем список плат вниз и видим, что в списке у нас появилось много разных ESP, берём «Generic ESP8266 Module»:



Идём в «Инструменты» и выбираем нужный COM порт, потом ставим Upload Speed:«115200»:

 
Теперь у нас развернута среда разработки и мы можем работать с ESPточно также, как и с любой платой Arduino. Для проверки можно подключить светодиод с резистором на один из цифровых выходов и написать скетч перемигивания им.
После сборки схемы на макетной плате можно приступать к программированию. Нам понадобятся возможности веб-сервера, который будет способен выводить в браузер клиента текст, html-код и даже не очень сложную графику. К счастью, все необходимые библиотеки уже написаны, нам достаточно загрузить пример AdvancedWebserver:   
Пример запускает веб-сервер на микроконтроллере, генерирует на нем случайные числа и выводит с ними график в браузер клиента. Прокомментирую несколько важных моментов в коде:


const char *ssid = «YourSSIDHere»;
const char *password = «YourPSKHere»;


Здесь нужно ввести данные wi-fi сети. Сеть должна позволять соединение контроллера с другими устройствами.


void handleRoot() {
                digitalWrite ( led, 1 );


В процессе передачи строки с данными к клиенту светодиод будет гореть.


snprintf ( temp, 400,


Необходимо конвертировать весь набор данных, которые мы будет передавать, в строку. Следует помнить, snprintf отрицательно сказывается на быстродействии системы.


                Serial.print ( «IP address: » );
                Serial.println ( WiFi.localIP() );


Контроллер будет выводить локальный IP-адрес устройства на серийный порт. Для того, чтобы узнать IP, нужно будет сначала подключиться по USBи включить монитор порта в ArduinoIDE. Если в локальной сети назначить постоянный IP-адрес и привязать его к mac-адресу ESP, то в дальнейшем эту операцию повторять будет не нужно.
   
void drawGraph() {
                String out = "";
                char temp[100];
                out += "<svg xmlns=\«www.w3.org/2000/svg\» version=\«1.1\» width=\«400\» height=\«150\»>\n";
                out += "<rect width=\«400\» height=\«150\» fill=\«rgb(250, 230, 210)\» stroke-width=\«1\» stroke=\«rgb(0, 0, 0)\» />\n";


Функция рисует график. У нас есть переменная out – строка, к которой мы добавляем необходимые свойства стилей того, что будем выводить в браузер. График будет в окне фиксированных размеров: 400 * 150.  
Теперь нужно будет переписать код так, чтобы он выводил не график со случайными числами, а данные с биосенсора.
Первым делом я объявил два массива:


int bio_array[pases][mil];
int normalize[pases];


Почему два? Это связано с особенностями работы датчика ЭМГ. Дело в том, что информация о конкретном значении сигнала в текущий момент времени нам не нужна. Нам нужно снимать показатели группами и в каждой группе находить максимальный размах сигнала. Поэтому двумерный bio_arrayбудет хранить все снятые значения, а normalize– максимальных размах в группе.


int multiplier = 20;



Целочисленная переменная multiplier служит для удобства представления результатов. График умножается по оси Yна это значение.
Я вывел отдельную функцию, которая занимается сбором и обработкой сигналов:
 
void bio_data () {
for (int i = 0; i < pases; i++) {
  int j = 0;
  while (j < mil) {
    if (millis() % 3 == 0) {
      bio_array[i][j] = analogRead(bio);
      j++;
    }
  }
}
for (int i = 0; i < pases; i++) {
int maxV = bio_array[0][0];
int minV = bio_array[0][0];
  for (int j = 0; j < mil; j++) {
    if (bio_array[i][j] > maxV) maxV = bio_array[i][j];
    if (bio_array[i][j] < minV) minV = bio_array[i][j];
}
normalize[i] = (maxV — minV);
}
}

Массив normalize заполняется и теперь его можно выводить на экран. Выводить можно, например, так:


int i = 0; 
                for (int x = 0; x <= 390; x += 30) {
                               sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\«1\» />\n", x, normalize[i] * multiplier, x + 30, normalize[i + 1] * multiplier);
                               out += temp;
                               i++;
                }


Как можно догадаться, цикл выводит график прямыми с промежутками в 30 точек между значениями из normalize.
Конечно, такой подход, когда и сбор данных и их представление в графической форме выполняются на процессоре микроконтроллера, не позволяет системе полноценно работать в реальном времени. С другой стороны, у нас есть возможность принимать данные с любого устройства без установки какого-либо ПО.
 
Теперь можем перейти к сборке самого устройства. Я построил модель корпуса в Solidworks.
Для того чтобы собрать устройство нам потребуется следующее:
1)       3D-принтер
2)      Несколько винтов и гаек М3
3)      Вышеперечисленная электроника и элемент питания крона
4)      Штекер для подключения кроны
5)      Разъем под штекер с клеммами
6)      Набор проводов «мама-мама»
7)      Коннекторы «папа»


Корпус может быть каким угодно, главное, чтобы он был достаточно компактным и все компоненты внутри надежно в нем крепились. Я предусмотрел в корпусе отверстие для подключения USB-штекера и для кнопки resetна Lolin, это должно помочь с отладкой устройства, но не обязательно. Корпус печатался на FDM-принтере PicasoDesigner, из PLA-пластика, слой 0,2 мм, 210 градусов, без поддержки. После печати на 3D-принтере приступаем к сборке:

Устанавливаем крону и гайки под Lolinв гнезда в корпусе. Лучше заранее воткнуть провода в нужные пины Lolin, потому что они промаркированы только сверху.

Штекер и разъм 2,1 мм будут служить в качестве выключателя, поэтому я решил их вывести наружу корпуса. Нужно разрезать один из «мама-мама» проводов и закрепить оголенные участки проводов в клеммах.

Для общей «земли» можно использовать планку с коннекторами «папа», просто закоротив между собой пины на ней. Подсоединяем все провода на свои места и укладываем их в корпусе. Датчик ЭМГ нужно аккуратно поместить в гнездо, потом он зафиксируется крышкой.
Теперь осталось только прикрутить верхнюю крышку на место и проводить испытания. Для отладки я вставил одну строчку в тело loop ():
Serial.println(normalize[6]);
С ее помощью можно легко оценить работоспособность датчика, не подключаясь к серверу.
Включим наш девайс и подключим его к компьютеру USB-шнуром. Откроем монитор порта. Если схема собрана правильно и нет проблем с беспроводной сетью, то контроллер выведет свой локальный IP-адрес и числовые значения с датчиков. Если числа измеряются сотнями, то электроды датчиков не подключены к телу, если 0-100, то подключены. Подключим электроды к телу, проще будет начать с бицепса.
Для получения электромиограммы необходимо наклеить два электрода на кожу над мышцей вдоль роста мышечных волокон. Расстояние между центрами электродов должно быть около 2 сантиметров, при этом электроды могут немного перехлёстываться. К этим двум электродам необходимо присоединить кнопки одинакового цвета. Третий электрод необходимо наклеить на локоть или запястье — к нему нужно подсоединить кнопку черного цвета.

Для вывода на экран графика достаточно вбить полученный IP в браузер. Мы увидим нечто вроде:

Форма графика реагирует на состояние покоя или напряжения, в котором находится мышца.
Итого, у нас теперь есть беспроводной мобильный регистратор мышечной активности. В представленных файлах сборки я сделал прорези в стенках устройства, в них можно продеть ремешок и с помощью него фиксировать регистратор на теле.   

Файлы

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

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.