Подписываемся на VK

Ежедневные новости, видео и приколы...

YouTube канал

Подбор моторов

TOP статьи

Вход




RC Магазины





Для удобства пользования форумом и поиска информации прошу придерживаться правила: 1 тема = 1 вопрос.

К примеру, если обсуждается настройка передатчика, а у вас вопрос про подключение такого же передатчика к симулятору или вопрос про другую модель передатчика - создавайте новую тему. Если вы новичок в авиамоделизме, рекомендуется прочитать статью Новичку и ссылки с нее.

Исключение только в разделе Вопросы и обсуждения по статьям

Как выложить фото, Как опубликовать видео

С уважением,

Константин.

Стабилизатор для новичков

Re: Стабилизатор для новичков

Почитал теорию, оказывается данные берутся с акселерометра. Изначально использовали только акселерометр, а потом уже стали добавлять и гироскоп, а для оси Z лучше добавить компас.
Из расчета что надо стабилизировать только элероны, достаточно одной оси. (Если я не прав, поправьте меня.)
Слишком много математики, поэтому решил оставить исходный код, лишь не много поправил его. Убрал одну ось, убрал Serial он  замедляет работу стабилизатора.
Добавил параметр gorizont, по умолчанию равно 90гр, это значение будет меняться в зависимости от сигнала с приемника, подключаем на вход А2.
Собрал на макетной плате, и понял что для стабильной работы нужно всё паять, это факт.
Проверить смогу в начале мая wink

fortekom
Владимир (СПБ)
Пилот
ranks
useravatar
Offline
621 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Re: Стабилизатор для новичков

// Вот такой код получился
#include <Wire.h>
#include "Kalman.h"
#include <Servo.h>
Servo myservoX;
const int CH2 = A2; // Элерон, второй канал на А2
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
double accXangle; // Angle calculate using the accelerometer
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double compAngleX = 180; // Calculate the angle using a Kalman filter
double kalAngleX; // Calculate the angle using a Kalman filter
uint32_t timer;
int gorizont = 90; //

void setup() {
  Wire.begin();
  pinMode(CH2, INPUT);
  myservoX.attach(8); 
  i2cWrite(0x6B,0x00); // Disable sleep mode     
  kalmanX.setAngle(180); // Set starting angle
  timer = micros();
}
void loop() {
  /* Update all the values */
  uint8_t* data = i2cRead(0x3B,14);
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]);
  tempRaw = ((data[6] << 8) | data[7]);
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
  /* Calculate the angls based on the different sensors and algorithm */
  accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG; 
  double gyroXrate = (double)gyroX/131.0;
  gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
  kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
  timer = micros();
    int xx=(int)kalAngleX-gorizont;
//    if ( xx<1 ) xx=0;
//    if ( xx>179 ) xx=179;
myservoX.write(xx);
int chVal2 = pulseIn(CH2, true, 25000); //считываем из приемника
if (chVal2 > 500){
gorizont = map(chVal2,1000,2000,0,179); //изменяем диапазон
}
//  timer = micros();
  // The accelerometer's maximum samples rate is 1kHz
}
void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i++)
    data [i]= Wire.read();
  return data;
}

fortekom
Владимир (СПБ)
Пилот
ranks
useravatar
Offline
621 Сообщений
Мужчина  Дата рождения 
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
9948
Всего опросов:
79
Всего сообщений:
183174
Всего сообщений сегодня:
1
Пользователи форума:
 
Всего пользователей:
10173
Последним зарегистрировался:
urus_vp
Пользователи онлайн:
0
Гостей онлайн:
776

Самые активные пользователи: 
konst, carpenter, kompmen, cnyx, Dragony, maks_dg, Goby, Student, alldn, nikolaypet
Онлайн: 
Нет пользователей онлайн
Последние сообщения форумаПоследние созданные темы
1) Полетник Matek MATEKSYS F405-SE не выдает сигнал на Vbat
2) Чертежи плосколетов
3) Акб для Pilotage Junior Fighter
4) DroneDrive - ModelDrive
5) Гироскопический момент
6) Стабильность полета крыла без вертикальных стабилизаторов
7) Подскажите, подойдет ли пульт от коптера для самолета?
8) Чертежи скоростных авиамоделей
9) Крыло без элеронов, но с 2Д поворотом мотора
10) Чертежи планеров и мотопланеров
1) Полетник Matek MATEKSYS F405-SE не выдает сигнал на Vbat
2) Акб для Pilotage Junior Fighter
3) Подскажите, подойдет ли пульт от коптера для самолета?
4) Чертежи скоростных авиамоделей - радиоуправляемые самолеты для скоростных полетов
5) Гироскопический момент
6) Стабильность полета крыла без вертикальных стабилизаторов - а так можно?
7) Здравствуйте, вопрос про настройку пульта.
8) DroneDrive - ModelDrive - Техническая секция для детей (авто/авиа/дроны)
9) Крыло без элеронов, но с 2Д поворотом мотора - Хочу сделать такое, и хотел бы почитать кто уже такое делал
10) Требуются программисты и мастера. - Поиск умельцев.