ArduCopter Mega: порт на обычную Arduino (тестим)
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” - народ с этой библиотекой успешно летает уже много-много версий
Скачал и загрузил тест8. Планнер 66. Поднимаю коптер - зеленая полоска высоты справа падает вниз на OSD, а в Терминале - значения высоты ползут вверх, как и должно быть. У кого так??
зелена полоска - это не высота, а земля
Облетал тест8 😃 Уряя, первый раз пришел домой с целым дроном, это знак 😃
Высоту держит, лойт держит, правда сегодня почти штиль, возможно причина в этом, но все равно уже радует 😃
Не очень понравилось как держит высоту, моторы всегда на подгазовке, не пытается найти оптимальный газ, а постоянно подгазовывает… Пиды крутил от 0.1 до 5, разницы не заметил… Случаем в нашей прошивке они вообще не отключены?
Сразу скажу, сонара у меня нет, еще в пути, квадрик плавает от 4 метров до 1 метра, но держится, больше удручает эта перегазовка постоянная. Я понимаю резко газовать для удержания горизонта это одно, но для удержания высоты так дрючить реги…
К стати кто может расписать по пидам по высоте, при каких условиях что надо крутить? Может я просто не то крутил…
Значение тока в ручном режиме после взлета, и в режиме удержания высоты…
зелена полоска - это не высота, а земля
от -10 до +10 ? Когда летал с В8 и 2.0.38, то зеленая метка справа поднималась вверх до +5 +10 и выше. Это, я так понимаю, альтиметр. А в тест8 у меня при подъеме коптера зеленая метка ползет вниз к -5 и ниже.
поиграйте в авиасимуляторы с самолетам типа F-16 (даже древняя досовая игра), чтобы поменять что и как должно отображаться (наклоны горизонта, высота и прочие вещи)
Ерунда какая-то с барометром 😦
Baro: -26cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -17cm, Sonar: 6cm
Baro: -17cm, Sonar: 6cm
Baro: -17cm, Sonar: 6cm
Baro: -17cm, Sonar: 6cm
Baro: -17cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -44cm, Sonar: 6cm
Baro: -44cm, Sonar: 6cm
Baro: -52cm, Sonar: 6cm
Baro: -44cm, Sonar: 6cm
Baro: -44cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 17cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 17cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 7cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 17cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 17cm, Sonar: 7cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 44cm, Sonar: 6cm
Baro: 44cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 61cm, Sonar: 6cm
Baro: 52cm, Sonar: 7cm
Baro: 52cm, Sonar: 6cm
Baro: 61cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 7cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 44cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 44cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 52cm, Sonar: 6cm
Baro: 61cm, Sonar: 6cm
Baro: 61cm, Sonar: 6cm
Baro: 35cm, Sonar: 6cm
Baro: 35cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 26cm, Sonar: 6cm
Baro: 17cm, Sonar: 6cm
Baro: 17cm, Sonar: 6cm
Baro: 17cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 8cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: 0cm, Sonar: 6cm
Baro: -8cm, Sonar: 6cm
Baro: -17cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 7cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -26cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 6cm
Baro: -35cm, Sonar: 5cm
Baro: -26cm, Sonar: 5cm
Baro: -26cm, Sonar: 5cm
Baro: -35cm, Sonar: 5cm
Ауу, может кто расписать какая цифера в пидах за что отвечает?
Ауу, может кто расписать какая цифера в пидах за что отвечает?
Ерунда какая-то с барометром
барометр ±50см скакать может… уже 100500 раз обсуждалось
Баро всегда будет плавать, любое дуновение ветерка его уже понесло, для этого и ставят сонар 😃
SovGVD так он же должен показывать высоту над уровнем моря, разве не так?
Высота над уровнем моря по GPS - 110м, над землей 20м.
Баро всегда будет плавать, любое дуновение ветерка его уже понесло, для этого и ставят сонар
В квартире?
Итак, в 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;
tmp_float = (float)abs_pressure /(float)ground_pressure; //станд. формула рассчета высоты относительно исходного давления
Угую Только поясните,плз, почему нужно делить давление на высоте на давление у земли, в качестве стандартной формулы вычисления? Вроде логичнее вычитать? Или я чего то не врубаюсь?