DMC.34 · Датчики · ATmega328P
Задача
Определить, что аппарат лежит на спине (перевёрнут), по знаку оси Z акселерометра.
Алгоритм
Если проекция g на ось Z отрицательна (az<0) и велика по модулю — аппарат перевёрнут.
Исходный код (C, avr-gcc)
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <util/delay.h>
int main(void){
DDRB|=(1<<PB5);
volatile int16_t az=16384; // сырое значение оси Z
for(;;){
if(az < -8000) PORTB|=(1<<PB5); // перевёрнут
else PORTB&=~(1<<PB5);
_delay_ms(50);
}
}
Сборка: avr-gcc -mmcu=atmega328p -DF_CPU=16000000UL -Os файл.c -o файл.elf
Пояснения
Основа turtle-mode: перевернуться реверсом моторов. Порог по |az| отсекает наклоны.