ArduCopter Mega: порт на обычную Arduino (тестим)
вроде там ничего особого не надо менять.
там имхо вообще ничего не надо менять, только вот не факт что всякие int gyro|baro подведены
только вот не факт что всякие int gyro|baro подведены
Посмотрел код, опрос датчиков не изменился, как и у нас. Только в dcm.cpp delta_time передается внутри каждой функции в виде dcm.function (float _G_dt). Время G_dt = время быстрого цикла. А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла. Было неудобно менять.
А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла. Было неудобно менять.
Наоборот, G_dt было в предыдущих прошивках, а начиная с 2.0.43 убрали и время выдается теперь в adc.Ch6. Так что, у него самая обычная прошивка, только параметры заданы по умолчанию, под BV.
А раньше время интегрирования запрашивалось из IMU при вызове массива датчиков и не зависело от времени основного цикла
Кстати, я так и не понял, какое время должна возвращать Ch6? Время за которое у нас есть показания с датчиков (Частота опроса гиры * количество опросов) или все же время между вызовами этой функции?
А когда уже альфа3 выйдет для аллиноне, с новым кодом для барометра и акселя, чтоб висел коптер как на новых китайских мозгах 😃 . Хотя в принципе чего-то особенного при полетах на них я не увидел. Все полеты без ветра. Я думаю, что если пирата нормально отстроить, отбалансировать моторы-винты летать будет не хуже. А на видео, где он по корридору летает, думаю мой квадр на 40 прошивке с отстроеными пидами по сонару пролетел бы так же. При полете над грунтовой дорогой в ветер колебения по высоте были не более 10 см. Высота над дорогой примерно 1м
Кстати, я так и не понял, какое время должна возвращать 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 гиры, отдельно (реже) аксели.
там имхо вообще ничего не надо менять, только вот не факт что всякие int gyro|baro подведены
Я заливал и alpha2 себе на BV. Работало все, кроме GPS. Причем все, что говорил Александр перепробовал - не помогло. Надо будет разобраться что тут такого в этой версии, потому что в ней GPS работает.
GPS работает.
выставить UBLOX (или nmea) в качестве протокола и скорость 9600 вроде, хотя еще есть вариант что там в гпс коде чето хитрое отсылается
косяк с гпс должен быть такой же как у владельцев allinone2 с GPS подключенным через uart(tx rx)
Хотя в принципе чего-то особенного при полетах на них я не увидел. Все полеты без ветра.
[ИМХО] главное не как работает, а то что цена большая - простая логика обычного народа: если дороже, значит лучше
продавали бы пирата за 2-3k$ - про китайца и не заговорили бы =)[/ИМХО]
Время накопления данных с датчиков = 4000 мкс (fast_loop) = время между двумя вызовами Ch6 из fast_loop.
Далеко не факт, может оказаться и 5 и 6 и 7мс, скажем в момент, когда выполняется медленный код на 50Гц.
выставить UBLOX (или nmea) в качестве протокола и скорость 9600 вроде, хотя еще есть вариант что там в гпс коде чето хитрое отсылается
косяк с гпс должен быть такой же как у владельцев allinone2 с GPS подключенным через uart(tx rx)
Ставил и UBLOX, и NMEA, и скорость 9600 ставил - без толку.
продавали бы пирата за 2-3k$ - про китайца и не заговорили бы
+100 😃
скорость 9600 ставил
У меня с хобей только не 4800 работает
Сократил 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
Далеко не факт, может оказаться и 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;
Добрый день всем!
Поскольку у нас сегодня Новый Год, который Рош Ашана, то и с Новым Годом!
Закончил установку на монстрика все приблуды, и теперь имеем на борту 2 Ардуины Меги, GPS, АРС220, Allinon, видеокамеру 650 строк, БАНО из светодиодных лент RGB, сонар. Теперь осталось все это заставить работать. Вес получился приличный с батареей 5000 маЧас 45С, но все тяжелое разместил намного ниже центра тяжести пепелаца. Надеюсь, что устойчивости добавится. У кого нить есть светлые мысли насчет разделения кода по двум Мегам? Хочу перенести на вторую управление БАНО, сонары (в проекте еще 3 сонара для бокового обзора. Чтоб не таранить припятствия), FPV и прочее. Связь между Ардуинами темный лес для меня, поэтому просьба к продвинутым программерам подсказать, в какую сторону копать.
вязь между Ардуинами темный лес для меня, поэтому просьба к продвинутым программерам подсказать, в какую сторону копать.
Для связи можно задействовать Serial (TX,RX) или SPI интерфейс… правда я так понимаю, он занят под i2c шину и датчики.
А мегу ставить не крутовато для этого? Может проще какую нить Nano?
Ставлю, что есть. С запасом. Есть еще Дуемиланове, но там не хватает портов под БАНО. Планирую использовать эту платку для прошивки G-OSD. Вроде, если правильно понял, стоит разделить медленные и быстрые процессы между Ардуинами. SPI это самый скоростной интерфейс?
Хочу перенести на вторую
Хочу сделать быстродействующее IMU на мелкой Ардуинке 328. А по шине гнать готовые значения гиры, акселя, компаса, барометра в DCM.
Планирую приспособить лэптоп под наземную станциюю. Есть распоторошеный передатчик на 6 команд. 2.4 Гигагерц с сателлитом. Если организовать кодирование команд на лэптопе и передавать кодированный сигнал с модуля от передатчика, то можно, в принципе, получить нужное количество каналов. Есть пара джойстиков, довольно продвинутых, с сателлита получать сумму и декодировать во второй Ардуине.
Хочу сделать быстродействующее IMU на мелкой Ардуинке 328. А по шине гнать готовые значения гиры, акселя, компаса, барометра в DCM.
А если развести плату с датчиками и 328 процессором отдельно?
А если развести плату с датчиками и 328 процессором отдельно?
Стоит денег. А Фридуинка 328 мини и датчики уже есть, только соединить. Тем более, сейчас BMP085 хочу\планирую\мечтаю заменить на MS5611, а itg3200 на 3 штуки ADXRS620. Если сделать плату, то уже не выпаять-впаять новые. Конечно, она будет легче, чем бутерброды из отдельных датчиков.
Кстати, как цеплять аналоговые датчики к Ардуинке? У нее АЦП 10 бит, всего 1024 значения. Значит, по 512 единиц влево-вправо. Внешний АЦП городить… эх… У ITG3200 16 битный АЦП внутри…
Я планирую своего монстрика нашпиговать под завязку всем, что есть под рукой сейчас. Погонять на привязи, отрегулировать аппаратуру управления, подогнать параметры. Потом на природе то же самое. В процессе устаканится, что нужно, а что нет. Когда начнет летать это чудо, собираюсь развести платы с мозгами в программе и заказать парочку для пробы. У нас с этим проблем нет, только мелкие партии дороговато получаются. Есть одна местная конторка на примете, у них маленький аппаратик есть, платы травят для всоих проектов. Примитивная штука, нельзя многослойные делать, но для мозгов и двухсторонней за глаза. Хотел себе такую бандуру прикупить, не дорогая и места занимает, как посудомоечная машина. Передумал. Проще договорится, чтобы сделали на заказ. Расходные материалы для этой штуковины дороже обходятся, чем сама машина. А у изготовителей в Китае заказывать, тоже самое, с учетом пересылки.
А если развести плату с датчиками и 328 процессором отдельно?
Вуаля www.ebay.com/itm/…/260782395748 😃
150 баксов? Не дорого, но хочется развести свой. Чипы россыпью можно заказать через знакомую контору. Копейки получается. Я им делал дизайн корпуса их прибора с деталировкой. На Солиде, так, что не откажут в мелкой услуге. Это у них машинка для мелкосерийного изготовления плат. Можно несколько вариантов под назные чипы изготовить. Там ребята не работают с Атмеловскими чипами. Пики в ходу. И хочется развести такую плату под Мегу. Хочу проверить, можно ли использовать видеокамеру для бездрейфового висения над точкой.
150 баксов? Не дорого, но хочется развести свой. Чипы россыпью можно заказать через знакомую контору. Копейки получается. Я им делал дизайн корпуса их прибора с деталировкой. На Солиде, так, что не откажут в мелкой услуге. Это у них машинка для мелкосерийного изготовления плат. Можно несколько вариантов под назные чипы изготовить. Там ребята не работают с Атмеловскими чипами. Пики в ходу. И хочется развести такую плату под Мегу. Хочу проверить, можно ли использовать видеокамеру для бездрейфового висения над точкой.
Не проще ли тогда уже подождать Arduino Due (Которая на ARM будет)? А по камере сделать стабилизацию наверное не получится, на AVR так точно. (Наработки которые есть у ArduCopter’ов, работают на базе датчика из мышки)