g0l (g0l) wrote,
g0l
g0l

Categories:

Arduino + MMA7260 = Автогоризонт для самолётика

Засел тут на одной очень нужной мелочи, дабы отвлечь мозги решил с недавно купленным акселерометром поиграться.

Те кто видел недавно снятые видеоролики с борта самолёта, стопудово испытывали приступы тошноты из-за дикого расколбаса картинки. При наблюдении с земли трудно самолёт удержать ровно, особенно при сильном ветре. Так что нужно что-нибудь, автоматически удерживающее самолёт ровно. Вроде бы такая штука называется "автогоризонт", но у меня её нету. Но зато есть аксель и валяется лишняя Ардуина (которая Nano). Единственная из подаренного SysCat, чему ещё не нашлось применения. А, не, вру. Ещё экранчик есть, его я тож пока нигде не задействовал.

Arduino Nano хороша тем что она очень нано. В смысле, маленькая по габаритам. Так что на самолёте место для неё всегда найдётся.

Floater-Jet решил пока не трогать, а поэкспериментировать на подаренном Дядей Васей летающем крыле конструкции "Вжик". "Вжик" сейчас слегка в полуубитом состоянии, так что как раз для экспериментов сойдёт.

Принцип простой - подключить акселерометр к ардуине и заставить её постоянно считывать значения осей X и Y, ответственных за крен и тангаж. После считывания значений (в случае ухода из нормы) - выдавать на рулевые сервы компенсирующее значение. Чтоб крыло вернулось в плоскость горизонта.

Проблем со считыванием осей не было, но у акселя довольно сильная погрешность, значения скачут как блохи в неприлично большом диапазоне. Соответственно, рули колбасятся нипадецки. Тут на помощь пришёл Low-pass фильтр. И в результате простейшей обработки простейшим вариантом этого фильтра стало всё отлично - показания акселя сглаживаются и рули ведут себя пристойно.

Результат см. на видео.



Скорость реакции рулей можно и пошустрей сделать, сейчас стоит задержка 50мс.

По задумке, данная фича (которая "автогоризонт") будет включаться с пульта управления. Т.е. взлетаешь в обычном режиме, поднимаешься на высоту. Когда надо лететь ровно и горизонтально - на пульте переключаешь тумблер (благо свободных каналов на моей турниге пока хватает) и бац - врубается автогоризонт. Самолёт летит ровно, снимает окрестности. Ветер пытается его колбасить - а самолёт сам сопротивляется и возвращается на горизонт. Правда, курс удерживать не будет - эт надо ещё гироскоп добавлять да магнитометр. Пока хватит и акселя.

Собссно, пока всё. Как будет лётная погодка - попробую испытать в действии. Только вот переставлю с крыла на более спокойнолетающий флоатер.

P.S. Кстати низкочастотный фильтр оказался мегаклёвой штукой. Для градусника он очень пригодится, показания сглаживать, ибо там тож скачет нехило.

UPD> Хорошая инфа по акселям и гироскопам
Фильтр Калмана в IMU

UPD> Ну и скетч, на всяк случай.




#include <Servo.h>

#define SERVA1_PIN 6
#define SERVA2_PIN 7

#define K 0.1

#define PIN_X 4
#define PIN_Y 5
#define PIN_Z 6

int x, y, z;

int dx=330;
int dy=455; //калибровка датчика
int dz=0;

int newX, oldX;
int newY, oldY;
int newZ, oldZ;

int kren;
int tangaj;

Servo myservo1;
Servo myservo2;


void setup()
{
Serial.begin(115200);
pinMode(SERVA1_PIN , OUTPUT);
pinMode(SERVA2_PIN , OUTPUT);
myservo1.attach(SERVA1_PIN); // подключаем нашу серву
myservo2.attach(SERVA2_PIN); // подключаем нашу серву
}

void loop()
{
x=analogRead(PIN_X) - dx;
y=analogRead(PIN_Y) - dy;
z=analogRead(PIN_Z) - dz;

// low-pass filter
newX = (x * K) + (oldX * (1.0 - K));
newY = (y * K) + (oldY * (1.0 - K));
newZ = (z * K) + (oldZ * (1.0 - K));

// high-pass filter
//newX = x - (x * K) + (oldX * (1.0 - K));
//newY = y - (y * K) + (oldY * (1.0 - K));
//newZ = z - (z * K) + (oldZ * (1.0 - K));

oldX = newX;
oldY = newY;
oldZ = newZ;

kren = newY;
tangaj = newX;

myservo1.write(10 + tangaj - kren);
myservo2.write(180 - tangaj - kren);

delay(50);
}


Ну и схема подключения


UPD> На Хабре хороший топик про фильтр Калмана

Заметка закросспостена с блога www.g0l.ru
Tags: arduino, ардуино, видео, железки, самолёт
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments