![]() |
![]() |
|||||||||||||||
Электронный педометр
Автор: Сергей Безруков (aka Ser60), Joshua Letter, sergeilb60@mail.ru Рынок носимой электроники сегодня просто изобилует всякого рода промышленными гаджетами, с которыми любителю зачастую трудно соревноваться, скажем, в плане цены, функционала, или дезайна. Данный проект с самого начала предполагался мной и моим студентом, Joshua, как обучающий. Это был в то время его первый микроконтроллерный проект, и когда мы его начинали, то мы оба не имели никакого представления как работают педометры. Я имею в виду какие алгоритмы используются для распознавания шагов. Ясно было только, что педометр можно собрать на основе акселерометра, микроконтроллера и дисплея. В условиях батарейного питания следует добавить повышающий DC-DC конвертер для сохранения работоспособности прибора при разряде батарей. Таким образом, родилась следующая схема. В качестве акселерометра IC2 мы выбрали имеющуюся в лабе модель фирмы Freescale (сейчас NXP), а в качестве микроконтроллера IC1 – также имеющийся 16-битный МК семейства RL78/G12 фирмы Renesas. Я уже здесь рассказывал несколько раз про это семейство, см., например, [1] и программаторы для них [2,3]. Графический дисплей фирмы Newhaven был выбран из соображений экономичности (потребляемый им ток в статическом режиме всего около 100 мкА) и возможности отображения достаточно больших символов. Число шагов показывается в верхней строке дисплея, а пройденный путь – в нижней с одним знаком после десятичной точки. Путь определяется по числу шагов пользователя в единице расстояния, что заложено в алгоритм как константа. Схема питается от двух пальчиковых батарей через DC-DC преобразователь IC3, повышающий их напряжение до 3.3В. После примерно 5 минут неактивности, т.е. когда счётчик числа шагов не изменяется, схема переходит в дежурный режим с отключением дисплея и переводом акселерометра в более экономный режим. Выход из этого режима осуществляется автоматически после лёгкого встряхивания устройства, например после следующего шага. Для повышения экономичности в активном режиме предусмотрена возможность включения и отключения дисплея с помощью кнопки. Среднее токопотребление схемы в активном режиме с включённым дисплеем 260 мкА и около 160 мкА с выключенным. В дежурном режиме потребление от батарей 65 мкА. Для ещё большего снижения токопотребления в этом режиме рекомендуется полностью снимать питание с дисплея. Светодиод использовался при отладке для индикации распознанного шага. Число шагов и пройденный путь обнуляются при выключении питания. Схема собрана на печатной плате размером 66×26 мм. Плата смонтирована на задней панели такого-же размера на стойках высотой 12 мм. На разных сторонах задней панели установлены держатель батарей и металлическая скоба для подвески устройства на одежде пользователя. Общение МК с акселерометром производится через аппаратный интерфейс I2C при тактовой частоте 125 кгц, а с дисплеем – через аппаратный интерфейс SPI на частоте 2 мгц при тактировании ядра на частоте 8 мгц. На фото ниже к плате временно припаяны провода для программирования и отладки. Реализовать hardware и заставить его дышать особого труда не составило, но как определить, что сделан шаг? Понятно, что тело человека при совершении шага несколько приподнимается и опускается, и акселерометр должен быть способен это зафиксировать. Иными словами, во время хотьбы ускорение платы, при её расположении на теле показанном выше, должно изменяться в вертикальном направлении. Казалось-бы следует лишь подобрать порог ускорения и дело в шляпе. Именно так мы по наивности и думали в начале. Однако, подобрать порог никак не удавалось – показания прибора сильно расходились с реальностью. После провала первой быстрой попытки мы решили подойти к делу основательнее и посмотреть на графике какие данные предоставляет нам акселерометр. Для этого на монтажке была собрана следующая тестовая схема загрузки данных в компьютер через USB-UART конвертер. Схема питается от USB порта через стабилизатор 3.3В в конвертере IC1. Макетку мы подвесили на скобе на ремень и для минимизации влияния кабеля на измерения использовали самый мягкий USB кабель, который только смогли найти. Данные с вертикальной оси акселерометра были обработаны в Excel спредшите, в результате чего после 16 шагов марша по коридору с лаптопом в руках мы получили следующий график для периода измерений 10 мс. Данные акселерометра снимались в режиме с разрешением 14 бит при полной шкале ±2g и трактовались как беззнаковые числа. Кто-нибудь видит здесь 16 шагов? При трактовке данных как знаковые числа картина получается ненамного яснее. Если мы сами не можем толком распознать шаги на графике, как это может сделать наша программа? После второй неудачи мы стали смотреть на аналогичные любительские проекты в Интернете [3 - 6]. В каком-то из источников был дан совет задействовать данные X,Y,Z со всех трёх осей акселерометра и следить за изменением длины вектора ускорения, т.е. величины А=Sqrt(X2+Y2+Z2), где Sqrt – квадратный корень. Воодушевившись новой для нас идеей, мы получили следующие данные за 20 шагов. Вопрос тот-же: кто-нибудь видит здесь 20 шагов? Частые колебания графика происходят, видимо, вследствии того, что тестовая плата достаточно тяжёлая и сама трясётся по инерции при движении. Кроме того, она расположена сбоку на ремне и поэтому ведёт себя по разному при совершении шагов левой и правой ногами. Следовало-бы, конечно, снимать данные с реального устройства. Копнув ещё глубже любительские проекты, мы обнаружили, что некоторые авторы пытаются исправить ситуацию, использовав наряду с пороговыми более тонкие методы, основанные на анализе всплесков и последующих впадин на графике [5,6] и на некоторой фильтрации данных [7]. Ни один из этих методов, частично опробованный, доверия нам не внушил и мы поняли, что без серьёзного DSP не обойтись. Однако, это несколько выходило за рамки первого студенческого проекта, поэтому мы на время оставили его как есть. Но Josh не собирался сдаваться и мы вернулись к проекту годом позже после посещения серии семинаров Freescale (тогда ещё) по сенсорам. Первое, что нам посоветовали на семинаре, это обратиться к документам фирмы [8,9]. К сожалению, детальное описание применённых фирмой алгоритмов и их исходники широкой публике недоступны. Краткое описание алгоритма педометра в этих документах занимает всего один параграф. Цитирую: “The algorithm operates by keeping track of momentary acceleration vector А (см. мою формулу выше) where X, Y, and Z represent a single accelerometer reading, normalized by dividing by 1g. The values of A are accumulated over a fixed period of time (0.19 seconds). At every reading, the average A for that period is calculated and saved. The algorithm detects steps by analyzing the spread of the accumulated average A values. The spread is the difference between minimum and maximum of the calculated values”. Это показалось нам достаточно просто реализуемым. Для разработки и отладки алгоритма мы использовали полученную на семинарах плату FRDM-FXS-MULT2-B. На плате имеется несколько сенсоров и даже Bluetooth модуль для дистанционного съёма данных системой Sensor Fusion. На другой стороне платы укреплён небольшой аккумулятор для автономного питания (снимок справа). Эта плата ставится сендвичем на другую демо-плату FRDM-K64F с процессором семейства Kinetis на борту (снимок слева). На обоих платах имеются слоты для Micro-SD карт, которые мы и использовали для записи данных с периодом 10 мс. Сбор данных со всех сенсоров платы производится МК на протяжении 30 секунд.
Помимо этого оборудования на семинарах нам была представлена разработанная лекторами система с графическим интерфейсом для обработки данных сенсоров. Система написана на языке Java и пока не имеет названия, находится в стадии разработки, и недоступна для загрузки с сайта фирмы. Однако, уже сейчас она позволяет дополнить себя алгоритмами пользователя. На трёх верхних графиках скриншота ниже показаны данные с трёх осей акселерометра на этой плате, носимой на поясе, а нижний график соответствует длине вектора ускорения А. Вертикальные розовые полосы в данном случае соответствуют результатам обработки шагов «нашим» алгоритмом. Полоса управляется переменной res в алгоритме пользователя и появляется в результате обнаружения шага при res=1. Как следует из графика, алгоритм успешно распознал все 21 сделанных шагов. А вот, собственно, и наша Java-реализация упомянутого выше алгоритма. Акселерометр работает в режиме 2048 отсчётов на 1g (полная шкала ±4g). В массиве А хранятся последние 20 значений величины sqrt, а массив B нужен для хранения скользящих средних и вычисления их максимума за последние 20 отсчётов. Алгоритм адаптирован под использование целочисленных вычислений с прицелом на реализацию на МК. В частности, вместо нормированных к 1g ускорений xa, ya, za используются сырые данные акселерометра, а для исключения операции деления вместо средних значений в переменной avg и массиве B хранятся суммы элементов в массиве А. Переменная run нужна для индикации заполнения массивов данными в начале работы алгоритма. Наилучшего результата удалось добиться модифицировав определение величины spread в оригинальном описании. Именно, вместо разности между скользящими максимальным и минимальным значениями длины вектора А за период 200 мс (A.length * 10 мс) нами использована разность между максимальным и текущем средним значением. Для регистрации шага эта разница должна быть на протяжении 70 мс не менее 0.1g при максимумe за период не менее 1.1g. Все эти константы подобраны экспериментально с учётом рекомендаций в [8,9]. При портировании этого алгоритма на 16-битный МК он подвергся некоторой коррекции. Именно, из 14 бит данных акселерометра по каждой оси для простоты реализации использовались лишь 8 старших. Это привело к замене констант 205 и 2253 в if-условии на 8 и 35, соответственно. Все переменные в алгоритме 8-битные за исключением avg, max и буфера B, которые 16-битные. Переменная run обнуляется каждый раз после выхода системы из дежурного режима и её максимальное значение программно ограничено на уровне 255 с целью предотвращения обнуления при инкрементации. Целочисленный квадратный корень вычисляется по алгоритму представленному в секции Binary numeral system (base 2) статьи [10] из Википедии. Несмотря на такую адаптацию и простоту, алгоритм обеспечивает достаточно надёжное распознавание шагов в нашей конструкции при креплении педометра на ремне брюк во время ходьбы (другие способы крепления не испытывались). Исходный код программы микроконтроллера для системы IAR и файл платы для Eagle прилагаются. Литература
Файлы: Все вопросы в Форум.
|
|
|||||||||||||||
![]() |
![]() |
![](/templates/radiokot_classic_neew/images/datasheet.png)
![](/templates/radiokot_classic_neew/images/dorogi.png)
![]() |
![]() |
|||
|
||||
![]() |
![]() |