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; //станд. формула рассчета высоты относительно исходного давления
Угую Только поясните,плз, почему нужно делить давление на высоте на давление у земли, в качестве стандартной формулы вычисления? Вроде логичнее вычитать? Или я чего то не врубаюсь?
разве не так
Не так. Нулевую высоту он берет при включении
показывать высоту над уровнем моря, разве не так?
зачем ему высота над уровнем моря… ему высота вообще не нужна по сути, нужно некое мифическое значение в попугаях, которое надо удерживать (но так как надо прировняться к сонару и к заданию высоты в AUTO режиме, то и попугаев переводят в сантиметры)
забейте на барометр и сонар уже =) они работают (спасибо всем кто учавствовал), если у вас коптер держит высоту 2-4метра - это уже хорошо, если 1-2 метра то вам несказанно повезло
сам бамеротр надо закрывать от внешних воздействий (накрыть колпако или закрыть ватой/паралоном… но тут тоже надо не перестараться, а то замуруете и будет всегда одно давление)
аналогично с LOITER, точность GPS ±5метров (±3 метра, смотря сколько спутников, какой приемник и какие условия), поэтому коптер НУ НИКАК четко не встанет как вкопаный в воздухе, а будет плавать в плоскости (паралельно земле) согласно показаниям неточного GPS и по высоте согласно показаниям неточного барометра
SovGVD так он же должен показывать высоту над уровнем моря, разве не так?
Высота над уровнем моря по GPS - 110м, над землей 20м.В квартире?
От винтов в квартире ветерок похлеще, чем на улице!
tusik, SovGVD, теперь все ясно! Такую вот информацию в вики надо писать! 😃
Alex_from_Israel, логично, только у меня кроме Ардуины, allinone2 и сонара пока ничего нет 😃