MultiWii
…
Не смог понять одного - можно ли подключить этот модифицированный 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 на мультивие я подключал гпс, хоть и криво
задача завести UART GPS на RX0 пин, а TX0 для OSD оставить, т.е. для меги или i2c GPS приемников проблем нет, а на обычной ардуинки уже косяк выходит
- в новом мультивие (а может и раньше, давно не следил) убрали стандартную либу работы с serial портом, поэтому попытки добавить софтверный порт приводят к ошибкам компиляции (ну или avr-gcc снова тупит)
реальная работа OSD с multiwii
нужна помощь кодеров
есть такой код
int tmp_alt=(EstAlt-AltGround)/100;
if(tmp_alt<0) tmp_alt=0;
serialize8((char)(tmp_alt>>8)); // altitude
serialize8((char)(tmp_alt&255)); // altitude
не работает
а вот так работает, т.е. где то косяк с типами данных, может кто подскажет как перевести нормально? =)
int tmp_alt=(EstAlt-AltGround)/100;
if(tmp_alt<0) tmp_alt=0;
tmp_alt=123;
serialize8((char)(tmp_alt>>8)); // altitude
serialize8((char)(tmp_alt&255)); // altitude
попробуй вот так
uint16_t tmp_alt=(max(EstAlt-AltGround,0))/100; serialize16(tmp_alt); // altitude
я правда не понял как не работает, вроде младший и старший байты попутаны.
хотя max давольно увесистый вызов
uint16_t tmp_alt;
if (EstAlt>AltGround)
tmp_alt=(EstAlt-AltGround)/100;
else
tmp_alt=0;
serialize16(tmp_alt);
я правда не понял как не работает, вроде младший и старший байты попутаны.
работает есть int tmp_alt=123; - т.е. выводит эти самые 123, а если int tmp_alt=(EstAlt-AltGround)/100; - то выводит ноль (аналогично если просто BaroAlt поставить или EstAlt)
cast к данным меньшей размерности берет правые байты (тобишь маленькие значения)
может разность меньше 100?
ура, нашел
int tmp_alt=(EstAlt-AltGround)*0.01f;
AltGround ставиться при арминге моторов и значение становить 0 и дальше повышается, но приемник отключен пока, поэтому цифры - высота над уровнем моря в метрах (теоретически)
а вот так работает
Юзай Serial.write(byte) , а для простоты вытащи ответную часть из самолетного пирата 2.24, файл называется eosd.pde.
Еще у тебя прыгает горизонт, не забыл синхрогруппу чередовать надо? 0xcb 0x34
Юзай Serial.write(byte)
в мультивие выпилили serial, там свой костыль теперь, но работает так же.
не забыл синхрогруппу чередовать надо? 0xcb 0x34
не знал, чето было написано про 0xcb 0x34, проигнорил 😉
upd хотя нет, вот в конце osd_sync^=255; - так что видимо меняю =)