Цифровий акселерометр MMA7260Q та ATmega8, вимірювання кутів крену та тангажу бонус, AVR Lab пристрою

Форум з AVR

Цифровий акселерометр MMA7260Q та ATmega8, вимірювання кутів крену та тангажу +бонус

При підборі модуля цифрового компаса натрапив на акселерометри, датчики прискорення, точніше MMA7260Q відFreescale. Акселерометри, як не дивно, реагують на прискорення (у тому числі і на прискорення всесвітнього тяжіння) і, як наслідок, з другого закону Ньютона на рівнодіючу силу, прикладену до датчика.

Тобто, за його допомогою можна вимірювати вібрації, рух, удари, кути крену та тангажу.MMA7260Q є 3-х осьовим датчиком з аналоговим виходом, тобто він перекриває весь 3-х мірний простір. Вимірювальним елементом усередині датчика, як не дивно звучить, є змінні конденсатори, обкладки яких рухаються під впливом зовнішньої сили.MMA7260Q має регульований діапазон чутливості, вибрати який можна комбінацією логічних рівнів на пінахg-Select1, g-Select2.

Подумавши, що нудно спостерігати миготливі циферки на дисплеї, вирішив переписати трохи прошивку так, щоб пристрій міг вимірювати кути нахилу в 2 перпендикулярних площинах, так звані куни крену і тангажу. Кут крену розраховуватимемо якarctg(y/z) а тангажу -arctg(x/z). Для цього підключимо стандартний модульmath.h з потрібною нам функцієюdouble atan2(double x,double z), яка повертаєarctg(x/z), що лежить у межах[-Pi,+Pi]. І не забудемо перевести радіани в градуси, тому остаточно кут крену дорівнюєb=atan2(y,z)*180/M_PI, а тангажуa=atan2(x,z)*180/M_PI. Для того, щоб показання не деренчали, взяв середнє арифметичне по 30 вимірювань. Також при кутах крену більше +-70 градусів, показаннятангажу скачуть з боку на бік і брешуть, з тангажем ситуація аналогічно. Тому було запроваджено перевірку коректності. Тобто якщо кут тангажу більше 60 градусів, то показання крену на екран не виводяться, і навпаки.

Після всього цього я пошукав у Google схожі проекти і побачив ідею простенької іграшки: по дисплею катається кулька залишаючи за собою слід, управляти яким можна за допомогою нахилу макетки з акселерометром, як тільки кулька вріжеться в бортик - гра закінчена, можна звичайно і виграти, набравши 9999 очок. Окуляри нараховуються за тривалістю гри. Можна, звичайно, схитрувати, покласти хустку на рівний майданчик, щоб кулька не рухалася, і дочекатися виграшу, але це не спортивно :). Оскільки на символьному РКІ кульку не покатаєш, то підключив графічний РКІ WG12864A.

atmega8
Джерело тактування - внутрішній RC генератор на 1 МГц. КонденсаториС1,С2,С3,С4,С6,С9,С11 - керамічні на 0,1мкФ,С10 - керамічний на 1мкФ,С8 - танталовий на 68мкФ ,С5,С7 - електроліти, на 100 і 200мкФ відповідно. РезисториR4,R5,R6,R7,R9 по 1кОм,R1 - 10кОм,R10 - 17Ом, потенціометрVR2 - на 10кОм .D2 - слаботочний світлодіод для індикації роботи схеми. Код іграшки кривуватий через те, що некривий код не вліз у пам'ять mega8, як з використання пам'яті програм, так і з оперативної пам'яті (я не використовував оптимізацію). Його можна легко зачесати, якщо використовувати контролер з великою кількістю пам'яті на борту, наприклад, мікроконтролер ATmega16 або включивши оптимізацію, але доведеться переробити підпрограму генерації затримки. Поспостерігати за процесом гри можна тут: