MultiWii
Я тут подумываю попробовать 6axis DMP заюзать в пирате… Тот код который сперли с демок Invensense
www.i2cdevlib.com/devices/mpu6050 пишут “The register info shown below is for a revision B1 chip. The newest “C” revision may not be fully compatible with these addresses or bit arrangements. I am working on updating the library to use the latest information available.”
Если что, на аналоге ФриИМУ4 от CSG_EU стоит чип с ревизией D (11-48 YY-WW)
Сейчас попробую на ардуинке проверить код. Конечно, жалко, что магнетометр не подмешивается (он подключен к MPU6050) для 9DOF DMP. Но можно потом добавлять магнетометр:
if((mx != 0.0f) && (my != 0.0f) && (mz != 0.0f) {
// Normalise magnetometer measurement
recipNorm = invSqrt(mx * mx + my * my + mz * mz);
mx *= recipNorm;
my *= recipNorm;
mz *= recipNorm;
// compute reference direction of flux
hx = 2.0f*mx*(0.5f - q2q2 - q3q3) + 2.0f*my*(q1q2 - q0q3) + 2.0f*mz*(q1q3 + q0q2);
hy = 2.0f*mx*(q1q2 + q0q3) + 2.0f*my*(0.5f - q1q1 - q3q3) + 2.0f*mz*(q2q3 - q0q1);
hz = 2.0f*mx*(q1q3 - q0q2) + 2.0f*my*(q2q3 + q0q1) + 2.0f*mz*(0.5f - q1q1 - q2q2);
bx = invSqrt((hx*hx) + (hy*hy));
bz = hz;
// estimated direction of gravity and flux (w)
wx = 2.0f*bx*(0.5f - q2q2 - q3q3) + 2.0f*bz*(q1q3 - q0q2);
wy = 2.0f*bx*(q1q2 - q0q3) + 2.0f*bz*(q0q1 + q2q3);
wz = 2.0f*bx*(q0q2 + q1q3) + 2.0f*bz*(0.5f - q1q1 - q2q2);
// error is sum of cross product between reference direction of fields and direction measured by sensors
ex = (my*wz - mz*wy);
ey = (mz*wx - mx*wz);
ez = (mx*wy - my*wx);
}
#endif
// integral error scaled integral gain
exInt = exInt + ex*Ki;
eyInt = eyInt + ey*Ki;
ezInt = ezInt + ez*Ki;
// adjusted gyroscope measurements
gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;
// integrate quaternion rate and normalise
qa = q0;
qb = q1;
qc = q2;
qd = q3;
q0 += (-qb*gx - qc*gy - qd*gz)*halfT;
q1 += (qa*gx + qc*gz - qd*gy)*halfT;
q2 += (qa*gy - qb*gz + qd*gx)*halfT;
q3 += (qa*gz + qb*gy - qc*gx)*halfT;
// Normalise quaternion
recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
q0 *= recipNorm;
q1 *= recipNorm;
q2 *= recipNorm;
q3 *= recipNorm;
гм, а тупо по rx tx?
Тоже пробовал,так же без результатно.
Бутлоудер соответственно заливал,правда не знаю тот или не тот,но другого вроде нет,называется DiskLoader-Leonardo.hex.
Испытал аналог freeimu4 на Multiwii 2 pre3
Как там кстати компас? На него не оказывают сильное влияние близкорасположенные детальки?
Как там кстати компас? На него не оказывают сильное влияние близкорасположенные детальки?
Залил свой модифицированный код FreeIMU_lib - все идеально. Тестовый кубик на экране повторяет движения платы (поворот на 90 по транспортиру дает 90 градусов приращения по YAW).
В Мультивии 2 пре3 при крене “компас” отклоняется, при тангаже - стоит на месте. Думаю, это связано с реализацией IMU в этой версии прошивки. Сам компас работает хорошо.
а чего это за страшная такая петля из медного провода?
Греется как кипятильник этот макс,это его особенность.На esyosd до 70 градусов,как вы думаете как ему живется…
Готов поверить, что это суперпупер ядреная земля с экраном, но никак не радиатор ))))
Попробуйте собрать потом посмотрим кокое ядерное заземление вы придумаете 😃😃😃
Радиатор
Прямо в точку 😃
2.0 рк3 вопрос, автор ввел переменную Д для акселя чего не было в предыдущих прошивках, выставив Д=0 получил равномерное качание коптера во все стороны. Изначально автор по стандарту поставил Д = 100, За что может отвечать этот параметр
это давний энхансмент от Шикры… полезен для ФПВ… “для полетать” мне не нравится, т.к. соот-е сила-наклон в стаб моде становится нелинейной…
www.multiwii.com/forum/viewtopic.php?f=8&t=1290
The term D of the PID LEVEL settings is now used to limit the effect of the level correction thanks to the suggestion of Shikra (see viewtopic.php?f=7&t=905 ).
By default (D=100), the behaviour of the stable mode is unchanged.
With a lower D, effects are:
- a smoothing level change
- should prevent some wobbles of death
…
Не смог понять одного - можно ли подключить этот модифицированный E_OSD к плате MWii на меге 328? Или нужен отдельных хардверный (mega 1280(2560))/софтверный uart для передачи данных с IMU? Надо будет код глянуть…
Я подключал к Arduino Nano. OSD подключаеться к пин TX мозга. Если хочеться LCD то ему надо подключить к RX arduino. Передача данньiх к OSD неперерьiвная. Если нужно подключить GPS то он должен бьiть на I2C - я далеко от етого. Подключил сонар DIY007v2 и он работает вместе с баро, но т.к. у меня баро нету то OSD отображает только вьiсота из сонара. У меня ОСД с мега168 и т.к. у ней в 2 раза больше память запихнул еще 2 линии для будущих разработок - данньi из GPS-a: Latitude, Longitude, Distnce to Home и углах ROLL, PITCH, YAW. Думаю не очен сложно добавить ето в коде МултиВии как только код а ля GPS-a будеть без багов. Flash заполнена на 60%.
MULTIWII_V1_DIMM168PIN.rar
файл можно смело править заменяя компоненты и изменяя конфигурацию ног, это полноценный мультивии, только вход с приемника 1, ppm sum, обычными приемниками пользоваться не планирую по этому убрал, но если нужно, дорисовать не трудно.
Проверил, подправил, все работает, глюков не замечено, поставил пока на подвес в качестве независимых мозгов .
Схему не выкладываю, ибо ее нет, все как на картинке, оно по даташиту ардуины и pca9306
вход приемника 1, ppm sum
Дмитрий, что это значит? Как я понимаю, обычный приемник не подключить? На пример, для управления сервами в ручную.
Дмитрий, что это значит? Как я понимаю, обычный приемник не подключить? На пример, для управления сервами в ручную.
по идее можно, указав ардуине нужные ноги , любые из 6ти которые разведены для моторок и d2 который вверху слева
всётаки нашел часок чтобы разобраться как подключить OSD от Syberian для мегапирата к Multiwii
пока сделал только горизонт, но разобрался чего ды как и остальное добавить не проблема
итак
- меняем скорость порта на 9600
- в Serial под конец SerialCom должно получиться
case 'E': //GUI to arduino MAG calibration request
calibratingM=1;
break;
}
} else {
#if defined(SYBERIAN_OSD)
byte j=0;
static int8_t dcmr,dcmp,hom;
osd_pak++;
if (osd_pak>2) osd_pak=0; // from 0 to 3
switch(osd_pak)
{
case 0:
dcmr=(angle[ROLL])*0.06;
dcmp=(angle[PITCH])*0.03;
if(dcmp<-31) dcmp=-31;
if(dcmp>31) dcmp=31;
dcmr=-dcmr; // или не надо переворачивать ось... не помню =)
serialize8(osd_sync);
serialize8(osd_pak);
serialize8(osd_pak);
serialize8((char)dcmr);
serialize8((char)dcmp);
serialize8(j);
serialize8(j);
serialize8(j);
serialize8(j);
serialize8(j);
UartSendData();
break;
}
// end txing packet
osd_sync^=255;
#endif
}
- в config.h добавляем
#define SYBERIAN_OSD - в MultiWii_2_0_preтраляля
добавляем где куча переменных определяется
byte osd_pak=0;
byte osd_sync=0xcb;
вот собственно и всё =) горизонт будет работать, остальное можно добавить:
/*buffer format:
0-sync word changed (0xcb, 0x34)
1 packet type (0 - ahi,bat,cur,mah, 1 - nav, 2 - maintenance
2 0 1 2
3 roll gpslat1 gpsSPD
4 pitch gpslat2 gpsALTH
5 homeset gpslat3 gpaALTL
6 homeL gpslat4 gpsDISH
7 control_mode gpslon1 gpsDISL
8 BATl gpslon2 status
9 Ih gpslon3 config (1 - OSD off)
10 IL (up 80.0A) gpslon4 emerg
по этой табличке добавлено в пакете 0 только roll и pitch, себе добавлю еще батарейку (подскажет кто может - делитель напряжения нужен, если я не всю батарейку цеплять собираюсь, а только одну ячейку, т.е. от 3 до 4.2в по идее, а ардуинка хочет от 0 до 5в) и режим (код править лениво, если точнее лениво разбираться как hex получить в linux, поэтому выберу чего нибудь из этой табличке):
{case 0: print(30,"MANUAL");break;
case 1: print(30,"CIRCLE");break;
case 2: print(30,"STABLE");break;
case 5: print(30,"WIRE A");break;
case 6: print(30,"WIRE B");break;
case 10: print(30,"AUTOPILOT");break;
case 11: print(30,"RTL");break;
case 12: print(30,"LOITER");break;
case 13: print(30,"TAKEOFF");break;
case 14: print(30,"LANDING");break;
default: print(30,"UNKNOWN");break;
скриншотик для затравки (делался давно, но сейчас то ничего не поменялось)
еще может кто подскажет в каких попугаях высота измеряется, чтобы тоже её в OSD добавить?
кстатии посмотрел код - туда же можно без проблем налепить GPS на обычную ардуинку, сделав включение порта на слушание GPS приемника (пассивного! а то есть приемники, которые не отдают, пока не попросишь, но можно и их, но тогда в пролете OSD) каким нибудь хитрым стик-жестом (для LCD вроде так)
i2c-gps-nav давно уже есть, тем более интегрировано с мультивии
Рекомендую все вместе совместить
i2c-gps-nav давно уже есть
оно как то поможет с UART GPS приемником?
Ессно. данные по уарту, обмен с основными мозгами - по i2c
Ессно. данные по уарту, обмен с основными мозгами - по i2c
т.е. юзая эту либу на обычной Arduino Mini/pro/328p с одним UART можно не писать свои костыли, а уже работает?
ы, в гугле же написано.
[gps]-[uart arduino]-[i2c]-[multiwii]
судя по коду там про mega и про i2c в основном, а я говорю про односторонний UART на обычной ардуинке, где только ОДИН хардверный UART есть
Так, стоп. Задача подключить e-osd (как железку) к мультивию и запихнуть туда же гпс датчик?
Через softwareserial на мультивие я подключал гпс, хоть и криво