ARDUINO Перевод ЭКГ модуля (ad8232) в ЭМГ

29.12.2018
15
13
3
#1
Сап всем! Сегодня я расскажу про то как я перевёл ЭКГ модуль (ad8232) в ЭМГ. Первое что нам надо это ЭКГ модуль, купил я его на али (так дешевле). На глаза попался модуль ad8232, купил его с (офигенными, силиконовыми) электродами за 480 руб. Покупал здесь. Подключил по первой попавшейся схеме (ардуино/электроды) :
----------------------------------------------
GND
- подключается к выводу GND
3,3V
- подключается к выводу 3,3V
OUTPUT
- подключается к выводу A0
L0-
- подключается к выводу 11
L0+
- подключается к выводу 10
----------------------------------------------
R
в начало мышцы
COM в середину мышцы
L в конец мышцы
Особенности : расстояние между краями электродов должно быть минимальным (у меня примерно 10 мм) но они не должны касаться.
----------------------------------------------
Как датчик сердечного пульса он ничего, но как ЭМГ отстой т.к люто шумит. Поэтому я решил написать код с алгоритмом очистки. Первое что я заметил, это то что при холостом ходе (мышечная активность не зарегистрирована) датчик выдаёт треугольный сигнал в районе + - 10 единиц (каких хз)))). А при мышечной активности примерно + - 30-45 единиц. Это довольно ноесно т.к поиск мышечной активности сводится в одну строчку кода (пока что))). Потом я заметил что датчик выдаёт не равный треугольный сигнал. Т.к иногда датчик меняет значение "Ступеньками". Поэтому я написал алгоритм очистки на основе запоминания 3-х последних значений, записывая их в массив. Стало лучше, но не до конца. Сигнал стал довольно ровным, но не до конца. И я написал ещё один алгоритм очистки на основе первого, но используя только 2 последних значения. В конце концов, ОНО ЗАРАБОТАЛО!! P.S спасибо за прочтение. P.P.S Код ниже.
Код:
#define korector 12

int val[3]; // Первый этап очистки (Массив)
byte index; // Первый этап очистки (Индекс)

int val_2[2]; // Второй этап очистки (Массив)
byte index_2; // Второй этап очистки (Индекс)


int X; // Первое
int Y; // Второе
boolean ismenilos; // Корректирующий флаг
boolean flex;
boolean flex_2;

void setup() {
  Serial.begin(9600);
  pinMode(10, INPUT);
  pinMode(11, INPUT);
}

void loop() {
  proverka();
  logika();
  chistka_1();
  Serial.println(flex_2);
}
void proverka() {
  if ((digitalRead(10) == 1) || (digitalRead(11) == 1)) {
    Serial.println('Opa! Ne podkluchil elektrodi');
  }
}
void chistka_1() {
  if (index > 2) index = 0; // переключаем индекс с 0 до 2 (0, 1, 2, 0, 1, 2…)
  val[index] = ismenilos; // записываем значение с датчика в массив
  index = index + 1;
  if (index_2 > 1) index_2 = 0; // переключаем индекс с 0 до 1 (0, 1, 0, 1…)
  val_2[index_2] = flex; // записываем значение с датчика в массив
  index_2 = index_2 + 1;
  X = Y;
  Y = analogRead(A0);

}
void logika() {
  if ((X >= Y + korector) || (X <= Y - korector)) {
    ismenilos = true;
    if ((val[0] + val[1] + val[2] >= 1)) {
      flex = true;
      if (val_2[0] + val_2[1] >= 1) {
        flex_2 = true;
      }
      else {
        flex_2 = false;
      }
    }
    else {
      flex = false;
    }
  }
  else {
    ismenilos = false;
  }
}
 
Симпатии: Понравилось NikOdn
29.05.2019
4
0
1
#2
Здравствуйте, вы еще занимаетесь разработкой подобного ? У меня есть парочку вопросов, хотелось бы услышать ответ)
 
29.05.2019
4
0
1
#4
К сожалению, ваш код не работает. Значения либо 1, либо 25705. И, кстати, не ясно, почему в массив нужно записывать значения TRUE или FALSE
Всё работает, но правда есть небольшие проблемы. Нужно ноги держать под собой, желательно не касаясь ничего другого помимо стула. провода не везде одинаковые, так как платы с китая, цвета бывают разные
 
#5
Всё работает, но правда есть небольшие проблемы. Нужно ноги держать под собой, желательно не касаясь ничего другого помимо стула. провода не везде одинаковые, так как платы с китая, цвета бывают разные
Не совсем понимаю, как оно должно работать, если в Serial выводится переменная boolean. Данные с A0 записываются в переменную Y, и больше никаких действий не происходит.
Можете показать, как оно у вас работало?

UPD: понял, программа работает, как переключатель вкл/выкл. Переключение по сокращению мышцы. Я-то думал, она аналоговый сигнал фильтрует и переваривает в удобный вид, например, для пропорционального управления сервой
 
Последнее редактирование:
29.05.2019
4
0
1
#6
Не совсем понимаю, как оно должно работать, если в Serial выводится переменная boolean. Данные с A0 записываются в переменную Y, и больше никаких действий не происходит.
Можете показать, как оно у вас работало?

UPD: понял, программа работает, как переключатель вкл/выкл. Переключение по сокращению мышцы. Я-то думал, она аналоговый сигнал фильтрует и переваривает в удобный вид, например, для пропорционального управления сервой
увы, но нет. Я бы лично мог попробовать сделать такое, но всё же, там так же по типу булевых, ибо это же ЭКГ датчик, у него на плате фильтрация совсем другая и считывает он то что ему нужно
 
#7
увы, но нет. Я бы лично мог попробовать сделать такое, но всё же, там так же по типу булевых, ибо это же ЭКГ датчик, у него на плате фильтрация совсем другая и считывает он то что ему нужно
Ну, насчёт ЭКГ-не ЭКГ: я тут купил Grove EMG Detector. Вроде специализированный датчик для EMG, стоит 3к с лишним. А по факту - то же самое, даже хуже. Сигнал с мышцы я получить не смог, зато прекрасно считывает кардиограмму. Или, может, я чего не понимаю.
 
29.05.2019
4
0
1
#8
Ну, насчёт ЭКГ-не ЭКГ: я тут купил Grove EMG Detector. Вроде специализированный датчик для EMG, стоит 3к с лишним. А по факту - то же самое, даже хуже. Сигнал с мышцы я получить не смог, зато прекрасно считывает кардиограмму. Или, может, я чего не понимаю.
Мне пришлось вручную писать код для триггера по экг, так же можешь попробовать, нужно всего лишь провести небольшую фильтрацию аналогового сигнала и сам заметишь что да как где меняется
 
29.12.2018
15
13
3
#9
Здравствуйте, вы еще занимаетесь разработкой подобного ? У меня есть парочку вопросов, хотелось бы услышать ответ)
Здравствуйте! Данный проект находится в заморозке т.к он малорентабелен, но я с радостью сделал OpenSourse для всех.
P.s этот код предназначался для этого проекта.