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

Sir_Alex
iBat:

Кстати он там представил еще платки для дальнобойной телеметрии (не реклама) www.rcgroups.com/forums/showp...&postcount=460

120 ойро за комплект… ммм… дороговато однако. Коптероводам наверное не нужна такая дальность (5-10км).
Вот что более интересно для нас, так это AllInOne и FreeIMU с новым барометром 😃

SovGVD
iBat:

По просьбе Александра (ака CSG_EU) выкладываю версию 2.0.42

а чего он сам не выложит? у его теперь же есть доступ к проеут MegaPirateNG на гуглокоде

Sir_Alex
SovGVD:

а чего он сам не выложит? у его теперь же есть доступ к проеут MegaPirateNG на гуглокоде

Что то он так и не добавил информацию в вики по BV…
Кстати, было бы неплохо, встроить поддержку BV в текущие наши прошивки… вроде там ничего особого не надо менять.

SovGVD
Sir_Alex:

вроде там ничего особого не надо менять.

там имхо вообще ничего не надо менять, только вот не факт что всякие int gyro|baro подведены

Musgravehill
SovGVD:

только вот не факт что всякие int gyro|baro подведены

Посмотрел код, опрос датчиков не изменился, как и у нас. Только в dcm.cpp delta_time передается внутри каждой функции в виде dcm.function (float _G_dt). Время G_dt = время быстрого цикла. А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла. Было неудобно менять.

Sir_Alex
Musgravehill:

А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла. Было неудобно менять.

Наоборот, G_dt было в предыдущих прошивках, а начиная с 2.0.43 убрали и время выдается теперь в adc.Ch6. Так что, у него самая обычная прошивка, только параметры заданы по умолчанию, под BV.

Musgravehill:

А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла

Кстати, я так и не понял, какое время должна возвращать Ch6? Время за которое у нас есть показания с датчиков (Частота опроса гиры * количество опросов) или все же время между вызовами этой функции?

tusik

А когда уже альфа3 выйдет для аллиноне, с новым кодом для барометра и акселя, чтоб висел коптер как на новых китайских мозгах 😃 . Хотя в принципе чего-то особенного при полетах на них я не увидел. Все полеты без ветра. Я думаю, что если пирата нормально отстроить, отбалансировать моторы-винты летать будет не хуже. А на видео, где он по корридору летает, думаю мой квадр на 40 прошивке с отстроеными пидами по сонару пролетел бы так же. При полете над грунтовой дорогой в ветер колебения по высоте были не более 10 см. Высота над дорогой примерно 1м

Musgravehill
Sir_Alex:

Кстати, я так и не понял, какое время должна возвращать Ch6? Время за которое у нас есть показания с датчиков (Частота опроса гиры * количество опросов) или все же время между вызовами этой функции?

_цепочка = fast_loop -> readAHRS() -> dcm.fast_update() -> imu.update(): sample_time = _adc->Ch6 чтобы шпионы не догадались)
Время накопления данных с датчиков = 4000 мкс (fast_loop) = время между двумя вызовами Ch6 из fast_loop.

Поэтому я стал отдавать в dcm.fast_update(yaw, pitch, roll, G_dt);
G_dt вычисляется как разность в fast_loop и равно 4000мкс.
yaw, pitch, roll = град\с, которые успеваю накопить за 4000мкс и отдать, потом они обнуляются, и все начинается сначала.

adc.Ch3(sen, adc_val); //моя функция, которая возврщает только ГИРЫ
y += adc_val[0];
r += adc_val[1];
p += adc_val[2];

ADC_ADS7844.cpp


//вспомогательная функция, которая вызывается из моей AP_ADC_ADS7844::Ch3 и возвращает ТОЛЬКО ГИРЫ
void i2c_ACC_getGR() { // ITG3200 read data
static uint8_t i;

  i2c_rep_start(0XD0);     // I2C write direction ITG3200
  i2c_write(0X1D);         // Start multiple read
  i2c_rep_start(0XD0 +1);  // I2C read direction => 1
  for(i = 0; i< 5; i++) {
  rawADC_ITG3200[i]= i2c_readAck();}
  rawADC_ITG3200[5]= i2c_readNak();
#ifdef ALLINONE
  adc_value[0] =  ((rawADC_ITG3200[4]<<8) | rawADC_ITG3200[5]); //g yaw
  adc_value[1] =  ((rawADC_ITG3200[2]<<8) | rawADC_ITG3200[3]); //g roll
  adc_value[2] =- ((rawADC_ITG3200[0]<<8) | rawADC_ITG3200[1]); //g pitch
#endif
#ifdef FFIMU
  adc_value[0] =  ((rawADC_ITG3200[4]<<8) | rawADC_ITG3200[5]); //g yaw
  adc_value[2] =  ((rawADC_ITG3200[2]<<8) | rawADC_ITG3200[3]); //g roll
  adc_value[1] =  ((rawADC_ITG3200[0]<<8) | rawADC_ITG3200[1]); //g pitch
#endif
}

// возвращает 3 оси по ГИРЕ
uint32_t AP_ADC_ADS7844::Ch3(const uint8_t *channel_numbers, int *result)
{
	i2c_ACC_getGR();

	for (uint8_t i=0; i<3; i++) {
		result[i] = adc_value[channel_numbers[i]];
	}

	return 0;
}

Так же можно и с акселями. Избавиться от массивной Ch6, отдельно запрашивать из IMU или ADC гиры, отдельно (реже) аксели.

iBat
SovGVD:

там имхо вообще ничего не надо менять, только вот не факт что всякие int gyro|baro подведены

Я заливал и alpha2 себе на BV. Работало все, кроме GPS. Причем все, что говорил Александр перепробовал - не помогло. Надо будет разобраться что тут такого в этой версии, потому что в ней GPS работает.

SovGVD
iBat:

GPS работает.

выставить UBLOX (или nmea) в качестве протокола и скорость 9600 вроде, хотя еще есть вариант что там в гпс коде чето хитрое отсылается
косяк с гпс должен быть такой же как у владельцев allinone2 с GPS подключенным через uart(tx rx)

tusik:

Хотя в принципе чего-то особенного при полетах на них я не увидел. Все полеты без ветра.

[ИМХО] главное не как работает, а то что цена большая - простая логика обычного народа: если дороже, значит лучше
продавали бы пирата за 2-3k$ - про китайца и не заговорили бы =)[/ИМХО]

Sir_Alex
Musgravehill:

Время накопления данных с датчиков = 4000 мкс (fast_loop) = время между двумя вызовами Ch6 из fast_loop.

Далеко не факт, может оказаться и 5 и 6 и 7мс, скажем в момент, когда выполняется медленный код на 50Гц.

iBat
SovGVD:

выставить UBLOX (или nmea) в качестве протокола и скорость 9600 вроде, хотя еще есть вариант что там в гпс коде чето хитрое отсылается
косяк с гпс должен быть такой же как у владельцев allinone2 с GPS подключенным через uart(tx rx)

Ставил и UBLOX, и NMEA, и скорость 9600 ставил - без толку.

tusik
SovGVD:

продавали бы пирата за 2-3k$ - про китайца и не заговорили бы

+100 😃

iBat:

скорость 9600 ставил

У меня с хобей только не 4800 работает

Musgravehill
Musgravehill:

Сократил super_fast_loop до 960 мкс, задал ему частоту 1 кГц. Гира тоже на 1кГц.

Только ДУС ITG3200. Видно, что система распознает быстрый поворот (крутил, как только позволяла скорость руки). Ближе к концу ролика совершал плавные круговые движения. Медленное уплывание горизонта - естественное явление для ДУС + интегратор.

www.youtube.com/watch?v=YiD1gTeZbiI

MegaPirateNG 1kHz ITG3200, 250Hz BMA180 (accel_weight = 3*constrain(1 - 2 * fabs(1 - accel_magnitude), 0, 1); // upped to (<0.66G = 0.0, 1G = 1.0 , >1.33G = 0.0))

www.youtube.com/watch?v=s4V7dDGB5yU

Sir_Alex:

Далеко не факт, может оказаться и 5 и 6 и 7мс, скажем в момент, когда выполняется медленный код на 50Гц.

Значит, нельзя брать константу 4000мкс из Ch6, это значение никогда не меняется! Я сейчас везде использую время интегрирования G_Dt = (float)(timer - fast_loopTimer) / 1000000.f;
------
Кстати, в прошивке для BV используются мс millis(), а у нас - мкс micros():
if ((timer - fast_loopTimer) >= 4) //BV
{
G_Dt = (float)(timer - fast_loopTimer) / 1000.f;

Alex_from_Israel

Добрый день всем!

Поскольку у нас сегодня Новый Год, который Рош Ашана, то и с Новым Годом!

Закончил установку на монстрика все приблуды, и теперь имеем на борту 2 Ардуины Меги, GPS, АРС220, Allinon, видеокамеру 650 строк, БАНО из светодиодных лент RGB, сонар. Теперь осталось все это заставить работать. Вес получился приличный с батареей 5000 маЧас 45С, но все тяжелое разместил намного ниже центра тяжести пепелаца. Надеюсь, что устойчивости добавится. У кого нить есть светлые мысли насчет разделения кода по двум Мегам? Хочу перенести на вторую управление БАНО, сонары (в проекте еще 3 сонара для бокового обзора. Чтоб не таранить припятствия), FPV и прочее. Связь между Ардуинами темный лес для меня, поэтому просьба к продвинутым программерам подсказать, в какую сторону копать.

Sir_Alex
Alex_from_Israel:

вязь между Ардуинами темный лес для меня, поэтому просьба к продвинутым программерам подсказать, в какую сторону копать.

Для связи можно задействовать Serial (TX,RX) или SPI интерфейс… правда я так понимаю, он занят под i2c шину и датчики.
А мегу ставить не крутовато для этого? Может проще какую нить Nano?

Alex_from_Israel

Ставлю, что есть. С запасом. Есть еще Дуемиланове, но там не хватает портов под БАНО. Планирую использовать эту платку для прошивки G-OSD. Вроде, если правильно понял, стоит разделить медленные и быстрые процессы между Ардуинами. SPI это самый скоростной интерфейс?

Musgravehill
Alex_from_Israel:

Хочу перенести на вторую

Хочу сделать быстродействующее IMU на мелкой Ардуинке 328. А по шине гнать готовые значения гиры, акселя, компаса, барометра в DCM.

Alex_from_Israel

Планирую приспособить лэптоп под наземную станциюю. Есть распоторошеный передатчик на 6 команд. 2.4 Гигагерц с сателлитом. Если организовать кодирование команд на лэптопе и передавать кодированный сигнал с модуля от передатчика, то можно, в принципе, получить нужное количество каналов. Есть пара джойстиков, довольно продвинутых, с сателлита получать сумму и декодировать во второй Ардуине.

Musgravehill:

Хочу сделать быстродействующее IMU на мелкой Ардуинке 328. А по шине гнать готовые значения гиры, акселя, компаса, барометра в DCM.

А если развести плату с датчиками и 328 процессором отдельно?

Musgravehill
Alex_from_Israel:

А если развести плату с датчиками и 328 процессором отдельно?

Стоит денег. А Фридуинка 328 мини и датчики уже есть, только соединить. Тем более, сейчас BMP085 хочу\планирую\мечтаю заменить на MS5611, а itg3200 на 3 штуки ADXRS620. Если сделать плату, то уже не выпаять-впаять новые. Конечно, она будет легче, чем бутерброды из отдельных датчиков.

Кстати, как цеплять аналоговые датчики к Ардуинке? У нее АЦП 10 бит, всего 1024 значения. Значит, по 512 единиц влево-вправо. Внешний АЦП городить… эх… У ITG3200 16 битный АЦП внутри…

Alex_from_Israel

Я планирую своего монстрика нашпиговать под завязку всем, что есть под рукой сейчас. Погонять на привязи, отрегулировать аппаратуру управления, подогнать параметры. Потом на природе то же самое. В процессе устаканится, что нужно, а что нет. Когда начнет летать это чудо, собираюсь развести платы с мозгами в программе и заказать парочку для пробы. У нас с этим проблем нет, только мелкие партии дороговато получаются. Есть одна местная конторка на примете, у них маленький аппаратик есть, платы травят для всоих проектов. Примитивная штука, нельзя многослойные делать, но для мозгов и двухсторонней за глаза. Хотел себе такую бандуру прикупить, не дорогая и места занимает, как посудомоечная машина. Передумал. Проще договорится, чтобы сделали на заказ. Расходные материалы для этой штуковины дороже обходятся, чем сама машина. А у изготовителей в Китае заказывать, тоже самое, с учетом пересылки.