ArduCopter Mega: порт на обычную Arduino (тестим)

SovGVD
Aven:

пины Trig и Echo для сонара перепутаны местами.

почему?

Alex_from_Israel
tusik:

А планер-то только что до 70 обновился. Фишечки какие-то новые, но тормозит жутко даже без коптера.

Решил я на свой коптер огоньки повесить. Деже ленту нашел пыле-водонепроницаемую. Подскажите какого цвета с какой стороны стоять должны по ГОСТу. Где-то писали, но не помню

Справа зеленый, слева красный сзади белый. Или под брюхом белый, моргающий.

У меня так сделано. С программой Олегова секвенсора.

Aven
SovGVD:

почему?

Потому, что работает только если их перевернуть.
у меня сонар HC-SR04 ($5.49)

Musgravehill

что-то проясняется…идем дальше


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);
}
Musgravehill

Итак, в 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;

SovGVD

когда delay исполнится по время полета - будет полный писец в виде повисания пепелаца на 80 милисекунд

Musgravehill
SovGVD:

в виде повисания пепелаца на 80 милисекунд

даже больше - еще пока байты туда-сюда перешлются. В даташите на ВМР085 написано про задержки. Он отдает информацию с частотой 25 мс.

Глеб, до этого как работала функция void APM_BMP085_Class::ReadPress() ? Если ее вызвать, то она может не вернуть давление и температуру if (BMP085_State == 1). Она за два раза высчитывала?

Похоже, придется оставить APM_BMP085.cpp как раньше. Фильтр там хитрый, со смещениями. Он гасит высокую скорость нарастания значения.

SovGVD

понятия не имею как она работала - это библиотека ардукоптера, там только закоменчено слежение за каким то пином (может он и есть прерывание), т.е. практически “as is” - народ с этой библиотекой успешно летает уже много-много версий

Musgravehill

Скачал и загрузил тест8. Планнер 66. Поднимаю коптер - зеленая полоска высоты справа падает вниз на OSD, а в Терминале - значения высоты ползут вверх, как и должно быть. У кого так??

SovGVD

зелена полоска - это не высота, а земля

LeonVS

Облетал тест8 😃 Уряя, первый раз пришел домой с целым дроном, это знак 😃
Высоту держит, лойт держит, правда сегодня почти штиль, возможно причина в этом, но все равно уже радует 😃
Не очень понравилось как держит высоту, моторы всегда на подгазовке, не пытается найти оптимальный газ, а постоянно подгазовывает… Пиды крутил от 0.1 до 5, разницы не заметил… Случаем в нашей прошивке они вообще не отключены?
Сразу скажу, сонара у меня нет, еще в пути, квадрик плавает от 4 метров до 1 метра, но держится, больше удручает эта перегазовка постоянная. Я понимаю резко газовать для удержания горизонта это одно, но для удержания высоты так дрючить реги…
К стати кто может расписать по пидам по высоте, при каких условиях что надо крутить? Может я просто не то крутил…

Значение тока в ручном режиме после взлета, и в режиме удержания высоты…

Musgravehill
SovGVD:

зелена полоска - это не высота, а земля

от -10 до +10 ? Когда летал с В8 и 2.0.38, то зеленая метка справа поднималась вверх до +5 +10 и выше. Это, я так понимаю, альтиметр. А в тест8 у меня при подъеме коптера зеленая метка ползет вниз к -5 и ниже.

SovGVD

поиграйте в авиасимуляторы с самолетам типа F-16 (даже древняя досовая игра), чтобы поменять что и как должно отображаться (наклоны горизонта, высота и прочие вещи)

Aven

Ерунда какая-то с барометром 😦

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
LeonVS

Ауу, может кто расписать какая цифера в пидах за что отвечает?

SovGVD
Aven:

Ерунда какая-то с барометром

барометр ±50см скакать может… уже 100500 раз обсуждалось

LeonVS

Баро всегда будет плавать, любое дуновение ветерка его уже понесло, для этого и ставят сонар 😃

Aven

SovGVD так он же должен показывать высоту над уровнем моря, разве не так?
Высота над уровнем моря по GPS - 110м, над землей 20м.

Баро всегда будет плавать, любое дуновение ветерка его уже понесло, для этого и ставят сонар

В квартире?

Alex_from_Israel
Musgravehill:

Итак, в 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; //станд. формула рассчета высоты относительно исходного давления

Угую Только поясните,плз, почему нужно делить давление на высоте на давление у земли, в качестве стандартной формулы вычисления? Вроде логичнее вычитать? Или я чего то не врубаюсь?

tusik
Aven:

разве не так

Не так. Нулевую высоту он берет при включении

SovGVD
Aven:

показывать высоту над уровнем моря, разве не так?

зачем ему высота над уровнем моря… ему высота вообще не нужна по сути, нужно некое мифическое значение в попугаях, которое надо удерживать (но так как надо прировняться к сонару и к заданию высоты в AUTO режиме, то и попугаев переводят в сантиметры)

забейте на барометр и сонар уже =) они работают (спасибо всем кто учавствовал), если у вас коптер держит высоту 2-4метра - это уже хорошо, если 1-2 метра то вам несказанно повезло
сам бамеротр надо закрывать от внешних воздействий (накрыть колпако или закрыть ватой/паралоном… но тут тоже надо не перестараться, а то замуруете и будет всегда одно давление)

аналогично с LOITER, точность GPS ±5метров (±3 метра, смотря сколько спутников, какой приемник и какие условия), поэтому коптер НУ НИКАК четко не встанет как вкопаный в воздухе, а будет плавать в плоскости (паралельно земле) согласно показаниям неточного GPS и по высоте согласно показаниям неточного барометра

Alex_from_Israel
Aven:

SovGVD так он же должен показывать высоту над уровнем моря, разве не так?
Высота над уровнем моря по GPS - 110м, над землей 20м.

В квартире?

От винтов в квартире ветерок похлеще, чем на улице!

Aven

tusik, SovGVD, теперь все ясно! Такую вот информацию в вики надо писать! 😃
Alex_from_Israel, логично, только у меня кроме Ардуины, allinone2 и сонара пока ничего нет 😃