ArduCopter Mega: порт на обычную Arduino (тестим)
А поконкретнее можно? Про кучу ништяков. И ссылочку, ежели есть!
www.youtube.com/user/syberian1980
собстно еше вот rcopen.com/blogs/39391/12024
MegaPirate OSD
Основан на Hobbyking E-OSD $12
Функции (могут меняться):
- Контроль батареи
- Таймер
- Полетный режим
- авиагоризонт
- тангаж (вертикальная шкала от -32 до +32 град)
- компас (горизонтальная шкала)
Графика там не очень.
не загоняйтесь с сонаром так
Сейчас сижу и думаю - а зачем он вообще надо? Автопосадки нет, если только в метре от земли полетать. Но я думаю на горку даже на скорости километров двадцать он не заскочит, а просто влетит в нее
Графика там не очень.
А Вы за 12 баксов 3Д хотите 😃
в оригинальном ардукоптере он до 10 метров пробивает высоту, поэтому на низких высотах вполне хорошо его использовать для висения, например при возврате RTL
в дальшейгем для посадки (коптер же не будет ±10 градусов раскачиватся) и взлета
например на AR.Drone как раз так и взлетает пепелац
Интересно…
А планер-то только что до 70 обновился. Фишечки какие-то новые, но тормозит жутко даже без коптера.
Решил я на свой коптер огоньки повесить. Деже ленту нашел пыле-водонепроницаемую. Подскажите какого цвета с какой стороны стоять должны по ГОСТу. Где-то писали, но не помню
Если взять отдельную ардутну и вот этот модуль.
www.sparkfun.com/products/9168
Дороговато получается.
Хотя, если взять фирменные аналоги, то нормально.
Кто может объяснить, зачем в sensors.pde идет корректировка по температуре?
static long read_barometer(void)
{
float x, scaling, temp;
barometer.Read();
abs_pressure = barometer.Press;
scaling = (float)ground_pressure / (float)abs_pressure;
temp = ((float)ground_temperature / 10.0f) + 273.15f;
x = log(scaling) * temp * 29271.267f;
return (x / 10);
}
Здесь меняется только abs_pressure в зависимости от высоты. После этой корректировки высота просаживается на метр.
code.google.com/p/arducopter/issues/detail?id=138 - тут пишет, что этот кусок кода- полная шляпа. Нужно сделать, как в даташите Бош. Сейчас попробую…
Подскажите какого цвета с какой стороны стоять должны по ГОСТу.
Я запомнил так: слева сердце - там красные огни БАНО =)
корректировка по температуре
Типа барометр точнее показывает, нет дрейфа температурного
барометр точнее показывает, нет дрейфа температурного
Текущая температура не измеряется! Только давление. Правлю код и экспериментирую.
Текущая температура не измеряется!
охлаждение от винтов, нагревание от мозгов/регулей, ветер, солнце
охлаждение от винтов, нагревание от мозгов/регулей, ветер, солнце
В коде baro.read присутствует только ground_temperature! А она измеряется один раз при инициализации.
Тем более, если от платы нагрелся датчик - это не значит, что изменилось давление воздуха и высота.
code.google.com/p/megapirateng/wiki/confighw
тут видимо ошибка, пины Trig и Echo для сонара перепутаны местами.
пины Trig и Echo для сонара перепутаны местами.
почему?
А планер-то только что до 70 обновился. Фишечки какие-то новые, но тормозит жутко даже без коптера.
Решил я на свой коптер огоньки повесить. Деже ленту нашел пыле-водонепроницаемую. Подскажите какого цвета с какой стороны стоять должны по ГОСТу. Где-то писали, но не помню
Справа зеленый, слева красный сзади белый. Или под брюхом белый, моргающий.
У меня так сделано. С программой Олегова секвенсора.
почему?
Потому, что работает только если их перевернуть.
у меня сонар HC-SR04 ($5.49)
что-то проясняется…идем дальше
static long read_barometer(void)
{
float x, tmp_float, altitude_cm;
barometer.Read();
//abs_pressure= ((float)abs_pressure * .85) + ((float)barometer.Press *.15);
tmp_float = (float)barometer.Press/(float)ground_pressure;
tmp_float = pow(tmp_float, 0.190295);
altitude_cm = (44330.000000 * (1.000000 - tmp_float));
Serial.print(altitude_cm);
Serial.println();
x = altitude_cm;
return (x);
}
Итак, в sensors.pde
static void init_barometer(void)
{
#if HIL_MODE == HIL_MODE_SENSORS
hil.update(); // look for inbound hil packets for initialization
#endif
int i;
for(i = 0; i < 20; i++){
delay(50);
barometer.Read(); //просто читаем
}
ground_pressure = 0;
for(i = 0; i < 8; i++){
delay(50);
#if HIL_MODE == HIL_MODE_SENSORS
hil.update(); // look for inbound hil packets
#endif
// Get initial data from absolute pressure sensor
barometer.Read();
ground_pressure += barometer.Press; //8 раз считаем давление у земли и сложим
("init %ld, %d, -, %ld, %ld, -, %d, %ld\n", barometer.RawTemp, barometer.Temp, barometer.RawPress, barometer.Press, ground_temperature, ground_pressure);
}
ground_pressure /=8; //давление у земли
abs_pressure = ground_pressure; //потом пригодится, чтобы не 0
("init %ld\n", abs_pressure);
//SendDebugln("barometer calibration complete.");
}
static long read_barometer(void)
{
float x, tmp_float, altitude_cm;
barometer.Read();
abs_pressure = (float)abs_pressure * .85 + (float)barometer.Press *.15; //фильтруем, не позволяем быстро изменяться
tmp_float = (float)abs_pressure /(float)ground_pressure; //станд. формула рассчета высоты относительно исходного давления
tmp_float = pow(tmp_float, 0.190295);
altitude_cm = 44330.0 * (1.0 - tmp_float); //высота в сантиметрах относительно исходной точки старта
x = altitude_cm*100; //так требует программа
("%ld, %ld, %ld, %ld\n", barometer.Press, ground_pressure, altitude_cm, x); (altitude_cm); /Serial.println();
return (x);
}
В APM_BMP085.cpp
uint8_t APM_BMP085_Class::Read() //сильно упростилась, но добавлены задержки по даташиту. А надо ли читать и считать потом температуру???
{
uint8_t result = 0;
Command_ReadTemp();delay(20);
ReadTemp(); delay(20);
Command_ReadPress();delay(20);
ReadPress();delay(20);
Calculate();
result = 1;
return(result);
}
// Read Raw Pressure values
void APM_BMP085_Class::ReadPress()
{
byte msb;
byte lsb;
byte xlsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.send(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3); // read a byte
while(!Wire.available()) {
// waiting
}
msb = Wire.receive();
while(!Wire.available()) {
// waiting
}
lsb = Wire.receive();
while(!Wire.available()) {
// waiting
}
xlsb = Wire.receive();
RawPress = (((long)msb << 16) | ((long)lsb << 8) | ((long)xlsb)) >> (8 - oss); //фильтры и смещения выпилены
}
// Read Raw Temperature values
void APM_BMP085_Class::ReadTemp()
{
byte tmp;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.send(0xF6);
Wire.endTransmission();
Wire.beginTransmission(BMP085_ADDRESS);
Wire.requestFrom(BMP085_ADDRESS,2);
while(!Wire.available()); // wait
RawTemp = Wire.receive();
while(!Wire.available()); // wait
tmp = Wire.receive();
RawTemp = RawTemp << 8 | tmp;
}
У меня работает все!
Единственное, не понял: в тест8 у меня в Терминале понижение идет с “-”, подъем коптера - с “+”. При этом, на OSD все наоборот! Т.е. Я поднимаю коптер относительно нуля: в ОСД высота идет вниз (зеленая полоска вниз), в Терминале высота идет в плюс 0 -> +100cm.
x = (плюс или минус тут?) altitude_cm*100;
когда delay исполнится по время полета - будет полный писец в виде повисания пепелаца на 80 милисекунд
в виде повисания пепелаца на 80 милисекунд
даже больше - еще пока байты туда-сюда перешлются. В даташите на ВМР085 написано про задержки. Он отдает информацию с частотой 25 мс.
Глеб, до этого как работала функция void APM_BMP085_Class::ReadPress() ? Если ее вызвать, то она может не вернуть давление и температуру if (BMP085_State == 1). Она за два раза высчитывала?
Похоже, придется оставить APM_BMP085.cpp как раньше. Фильтр там хитрый, со смещениями. Он гасит высокую скорость нарастания значения.
понятия не имею как она работала - это библиотека ардукоптера, там только закоменчено слежение за каким то пином (может он и есть прерывание), т.е. практически “as is” - народ с этой библиотекой успешно летает уже много-много версий