Нужна помощь в понимании скетча
- Войдите на сайт для отправки комментариев
Втр, 14/05/2019 - 22:59
Здравствуйте!
У меня есть задача - измерить колебания руки с помощью акселерометра.
у меня аксель mpu6050. нашел для него и библиотеку и код для просмотра работы.
так же нашел по сути готовый теоретический алгоритм "как измерить частоту". Но я не пойму как мне сделать пару вещей в коде.
Это код с одного из сайтов на просторах интернета:
#include <I2Cdev.h>
#include <MPU6050.h>
#define T_OUT 20
MPU6050 accel;
unsigned long int t_next;
void setup() {
Serial.begin(9600);
accel.initialize();
Serial.println(accel.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
}
void loop() {
long int t = millis();
if( t_next < t ){
int16_t ax_raw, ay_raw, az_raw, gx_raw, gy_raw, gz_raw;
t_next = t + T_OUT;
accel.getMotion6(&ax_raw, &ay_raw, &az_raw, &gx_raw, &gy_raw, &gz_raw);
Serial.println(ax_raw); // вывод в порт проекции ускорения на ось Y
}
}
Это то, что я нашел по своей теме


не пойму вот что: как мне написать кодом а1 и а2?
В голове не укладывается как два последовательных ускорения получить в коде.
Скорее всего ответ достаточно простой, но я ,к сожалению, не частый пользователь ардуино.
А эту фиговину мне нужно сделать для одного отчета. (я студент-медик)
Заранее благодарю за конструктивную критику и ответы)
Мне кажется, приведенный текст тоже писал студент-медик.
Да нет, медику писать ещё кто то помогал, вот только не разберусь кто - физик или матаматик.
Ну и стандартная рекомендация ТС прочитать в песочнице правила форума и вставить скетч правильно.
По программе. В терминал что либо выводится?
В статье описано что а1 и а2 это два последовавательно полученных ускорения, а получаете и выводите только одно. Присвойте этому значению имя а1. Добавте строчек со вторым вызовом функии получения ускорения с необходимой задержкой. Это будет а2. Дальше в статье описано как считать.
nik182, еще раз посмотрите на (1.2). Какие физики с математиками!
Ну с точки зрения что внутри модуля все члены положительные и изначальная формула подверглась принудительной модификации для ухода от плагиата путем внесения дельты под модуль с нарушением некоторых правил математики все ж склоняюсь к физику.
Здравствуйте!
Прошу прощения за нарушение правил форума! Исправлюсь
Про терминал немного непонятно, т.к. не в курсе что это)
Ок, понял на счет вызова а1 и а2, а вот задержку через что расписать?
Здравствуйте!
Вроде понял, выше прислал написанный код.
Скорее всего там ошибки (уверен, что они есть).
В чем я теперь неправ в данном случае?
ua6em, я тут вот собрал что-то похожее на код, на какие строки обратить мне внимание? естественно код не работает)))
Мы с коллегой аndriano пытались донести, что формула расчета несколько бредовая. Иначальная формула приводит к условию if(abs(a1-a2 ) > da) . Её и надо использовать для выбора.
Ваш датчик выдает три проекции ускорения, как он прикреплен и в каком направлении будет происходить перемещение не известно, поэтому необходимо расчитывать ускорение при перемещение по трём осям, то есть добавить ещё 4 переменные и повторить расчет ускорения с ними. Что делать дальше не знаю. Можно из трёх полученных ускорений выбирать максимальное. Можно геометрически просуммировать и получить полное ускорение датчика и его исползовать в расчетах выходных величин.
Думаю, что если пациента колотит, то хватит измерения и по одной оси ))
nik182 ,можно с Вами связаться в вконтакте?
Ну да, а если расчётная ось перпендикулярна основному направлению колебаний колочения. Мир устроен так, что колочение чаще всего двухмерное. Подергайте рукой и постарайтесь одной мышцей, что чаше всего происходит при треморе, сделать трехмерное движение. Всегда найдется плоскость где ускорение ноль. Вот если датчик осью измерения попадёт в эту плоскость то и результат будет нулевой.
У меня нет вконтакте. Только здесь. Помочь могу советами. Я разлучен с компами ещё на неделю. Только телефон с лимитом интернета.
Надо бы у студента-медика спросить чего он там фиксировать собрался. Боюсь, что будет как всегда: вы тут теорий настроите, а ему нужно просто мотания крышечки на кипящем чайнике померять.
sadman41, мерять я собрался колебания руки (тремор). на счет сложения ускорений я задумался. но я врядли смогу это реализовать..
Ну то что я писал про полное ускорение датчика и на крышечке будет работать правильно. Нет никаких препятствий.
как сложить ускорения из курса физики через формулы я возможно вспомню. а вот как тут это сделать, учитывая, что здесь выдаются голые данные с акселерометра.
Как я понял, нужно их еще делить на 16384 из-за частоты дискретизации
хотя нет, по сути тремор в двух осях. например по Z и Х
Мне вот какой вопрос интересен: есть какой-то стандартный тремор, чтобы на нем откалиброваться? Т.е. в чем прикладное значение этой петрушки - автоматически определять пациента с белой горячкой?
sadman41, нет. стандартного тремора нет. их несколько подвидов.
значение моей петрушки состоит в том, чтобы просто узнать частоту колебаний руки.
мне не важна большая точность. мне нужно, чтобы я получил частоту, по таблице определил примерный вид тремора.
по поводу ускорений - да, возможно стоит по теореме пифагора находить общее из двух.
так же я хочу подцепить на 4 пина вибромоторчики. И когда я буду знать примерный вид тремора (частоту) я буду их врубать через шим (тут я надеюсь уж справлюсь, там как светодиоды программировать).
Поэтому у меня сейчас самая главная проблема - измерение частоты
если только откалиброваться на известном пациенте. Но такие найдутся после того, как я запущу шайтан петрушку)
sadman41, мерять я собрался колебания руки (тремор). на счет сложения ускорений я задумался. но я врядли смогу это реализовать..
Самое трудное сделали - получили данные с датчика. Осталось суммы квадратов по каждой оси каждого датчика просуммировать и разность вывести. Пока без всяких формул. Первый шаг посмотреть на полученые данные при колебаниях датчика, потом будем постепенно подключать обработку.
Т.е. придётся не просто два измерения делать, а постоянно измерять и на некий экстремум опираться. В противном случае дельта может ничего и не дать. На сколько там за 8мс рука передвинется, к примеру?
такие данные получаю с помощью скетча-примера
sadman41 ,с Вами можно связаться помимо этого форума?
А что вы хотите узнать там, чего не можете спросить тут? Я таких задач не решал, поэтому мне тоже интересно узнать как можно частоту колебаний сложной механической системы вычислить.
sadman41, хотел уточнить вопрос про данные с акселерометра.
они голые, не стандартизированные. я нашел пар формул, там вроде люди переводят в человеч. вид
(((float)ax/(float)16384)*9.8*0.05*0.05)
и просто деление на 16384.
Думаю, что если пациента колотит, то хватит измерения и по одной оси ))
о чём и речь...да и дельта с датчика закреплённого на столе и на руке будет совсем разная
В данном случае получить частоту достаточно просто. Не нужно даже второго измерения. В цикле считаем полное ускорение по сумме квадратов трёх осей. Ищем и запоминаем максимальное значение и его время. Одновременно ищем и запоминаем минимальное время. Разница времени максимума и минимума равна четверти периода частоты. Делим 4 на период и получаем частоту. Выводим.
Обнуляем все и ищем снова.
А что вы хотите узнать там, чего не можете спросить тут? Я таких задач не решал, поэтому мне тоже интересно узнать как можно частоту колебаний сложной механической системы вычислить.
теорема Котельникова она универсальная )))
Вам не нужно абсолютное значение ускорения. Забудьте о нем. Вам нужны максимумы и минимумы. Их время, от того вы их будете умножать на коэффициенты не изменится.
Можно искать два раза максимум и это будет полпериода колебаний и однообразие в вычислениях.
В данном случае получить частоту достаточно просто. Не нужно даже второго измерения. В цикле считаем полное ускорение по сумме квадратов трёх осей. Ищем и запоминаем максимальное значение и его время. Одновременно ищем и запоминаем минимальное время. Разница времени максимума и минимума равна четверти периода частоты. Делим 4 на период и получаем частоту. Выводим.
Обнуляем все и ищем снова.
пол периода, умножать надо на два
В идеальном случае да - есть и монотонность нарастания значения и максимумы более-менее близки по значению. Но тут же тремор - т.е. даже монотонности может не быть. Как это обойти?
А что вы хотите узнать там, чего не можете спросить тут? Я таких задач не решал, поэтому мне тоже интересно узнать как можно частоту колебаний сложной механической системы вычислить.
теорема Котельникова она универсальная )))
Простите ещё раз. Объясните пожалуйста какую конкретно информацию Вы хотели донести в рамках обсуждения текущего вопроса? В отвлеченных темах есть про шутки. Может быть лучше было написать туда? Судя по представленному выводу данных до критерия Котельникова ещё настолько далеко, что упоминание его теореммы больше как попытку пошуть больше ни как не воспринимается.
В данном случае получить частоту достаточно просто. Не нужно даже второго измерения. В цикле считаем полное ускорение по сумме квадратов трёх осей. Ищем и запоминаем максимальное значение и его время. Одновременно ищем и запоминаем минимальное время. Разница времени максимума и минимума равна четверти периода частоты. Делим 4 на период и получаем частоту. Выводим.
Обнуляем все и ищем снова.
пол периода, умножать надо на два
И снова мимо. Это ускорение. Производная. Квадрат. Максимум и минимум в нулях и максимумах амплитуды. 4 раза за период.
я датчик не сильно пытал, если действительно выдаёт ускорения, тогда да, но всё равно умножить на 4 и далее 1/тау будет частота...
а по теореме, в скетче задержка в 50 миллисекунд, а тремор он разный, частотный диапазон мы не услышали, в идеале частота измерений должна быть выше хотя бы на порядок, а по ускорению, то минимум в 8 раз
Посмотрите на свою руку при попытке подрожать. Сотни милисекнд. Вы даже кистью потрясти быстрее 200 мс на период не сможете. В скетче нет задержки. Я еще не смотрел датчик, но в приведенном выводе 20 точет на пол периода. Хватит ещё и верхние гармоники.
P.S. Вот скажите, зачем умножать и делить, если можно один раз разделить четверку?
по задержке - строка 45 скетча...
на ручном ключе я передавал со скоростью до 170 знаков в минуту, 170/60 = около 3 знаков в секунду, если это цифра то это 10 полных колебаний маятникового типа всей кисти руки, то есть период около 35 миллисекунд, и замечу, это не на мандраже )))
Это так - к слову, первый разряд это 120 знаков всего )))
Прошу прощения, что не озвучил диапазон частот. Для моих целей диапазон от 1 до 15Гц
nik182, каким образом мне посчитать макс и мин значения и еще времена их? Я просто сейчас ищу в интернете и не могу найти. Скорее всего неправильно забиваю ключевые слова. Может быть посоветуете какой-нибудь скетч или как найти такой?
не знаю как nik182, а я для надёжного определения пиковых значений измеряю их на четверть периоде 16 раз, то-есть для вашей пороговой частоты делал бы это с частотой 15*16*4 раз как - зацепил бы за таймер работающий с ткой периодичностью, вопрос только в том, способна ли эта гира отдавать значения с такой частотой, вроде бы должна, так сдедующее поколение гир работает на частоте аж 32 килогерца
nik182, каким образом мне посчитать макс и мин значения и еще времена их?
Если я идею правильно понял, то вот так:
Исправил вставку половины текста ниже.
Во блин! В сообщение пердало только половину текста. Обидно.
SADMAN41 почти точное попадание!
Зачем скетч. Напишите сам, а поправлю. Буду писать словами, а Вы просто постарайтесь это в программе.
Обьявляем 3 перемные типа int a amax amin, 2 переменные типа unsigned long tmax tmin, типа byte nmax nmin, типа bool fmax fmin. Ну и float частоту с любым именем.
В сетапе amin присваиваем 32000, остальным нули.
В лупе
Вызываем п.п. акселерометра и расчитываем амплитуду а как сумму квадратов трёх измерений ускорения.
Проверяем (if) флаг fmax, если false то делаем кучу работы: проверяем (if) amax, если а больше то присваиваем amax значение а, запоминаем через микрос значени tmax, обнуляем nmax. Иначе (else) величиваем nmax на 1 и проверяем. Если больше 50 (это чило в последствии уточним посмотрев на работу) то fmax=true;
Все тоже делаем с переменными с индексом min, только проверка а должа быть меньше аmin.
Проверяем флаги fmax и fmin. Если оба true, то мы нашли все что надо, расчитываем и выводим частоту как 4. 0/(tmax-tmin), обнуляем все переменные, amin снова 32000
Это собственно все, в выводе будет частота максимальных колебаний.
У меня на телефоне плохо масштабируется окно ввода кода. Увы, нормально могу писать тлько текст.
Ещё, частота будет в мегагерцах. Чтобы получалось в герцах надо 4000000.0 делить ;-)
nik182, проверьте, пожалуйста! еще раз прошу прощения, если вдруг там много глупых на Ваш взгляд ошибок
Ошибки в строках: 38, 50, 61, 45, 57... Это безотносительно алгоритма.
Ошибки в строках: 38, 50, 61, 45, 57... Это безотносительно алгоритма.
Уважаемый ТС, чтобы избежать подобных ошибок стоит запомнить, что !true==false и наоборот !false==true и правильно записывать:
не if(fmin=false){ , а if(!fmin){