Для удобства пользования форумом и поиска информации прошу придерживаться правила: 1 тема = 1 вопрос.
К примеру, если обсуждается настройка передатчика, а у вас вопрос про подключение такого же передатчика к симулятору или вопрос про другую модель передатчика - создавайте новую тему. Если вы новичок в авиамоделизме, рекомендуется прочитать статью Новичку и ссылки с нее.
Исключение только в разделе Вопросы и обсуждения по статьям
Как выложить фото, Как опубликовать видео
С уважением,
Константин.
- Начало
- » Авиационный моделизм
- » Системы стабилизации
- » Стабилизатор для новичков
Стабилизатор для новичков
Re: Стабилизатор для новичков
Почитал теорию, оказывается данные берутся с акселерометра. Изначально использовали только акселерометр, а потом уже стали добавлять и гироскоп, а для оси Z лучше добавить компас.
Из расчета что надо стабилизировать только элероны, достаточно одной оси. (Если я не прав, поправьте меня.)
Слишком много математики, поэтому решил оставить исходный код, лишь не много поправил его. Убрал одну ось, убрал Serial он замедляет работу стабилизатора.
Добавил параметр gorizont, по умолчанию равно 90гр, это значение будет меняться в зависимости от сигнала с приемника, подключаем на вход А2.
Собрал на макетной плате, и понял что для стабильной работы нужно всё паять, это факт.
Проверить смогу в начале мая
- fortekom
- Владимир (СПБ)
- Пилот
- 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
- Владимир (СПБ)
- Пилот
- 621 Сообщений
-
- Начало
- » Авиационный моделизм
- » Системы стабилизации
- » Стабилизатор для новичков
Информация
- Статистика форума:
- Всего тем:
- 9948
- Всего опросов:
- 79
- Всего сообщений:
- 183174
- Всего сообщений сегодня:
- 1
- Пользователи форума:
- Всего пользователей:
- 10173
- Последним зарегистрировался:
- urus_vp
- Пользователи онлайн:
- 0
- Гостей онлайн:
- 776
- Самые активные пользователи:
- konst, carpenter, kompmen, cnyx, Dragony, maks_dg, Goby, Student, alldn, nikolaypet
- Онлайн:
- Нет пользователей онлайн