Сап всем! Сегодня я расскажу про то как я перевёл ЭКГ модуль (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 Код ниже.
----------------------------------------------
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 Код ниже.
C++:
#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;
}
}