MultiWii
всётаки нашел часок чтобы разобраться как подключить 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; - так что видимо меняю =)
Вернулся к вию после долгого перерыва, сделал очередную плату. Датчики L3G4200D, BMP085, LSM303DLHC и мега2560. Странно, но работает. Основное отличие от всего виденного мной - наличие 2-х слотов расширения. Сейчас занимаюсь ОСД. будет ставиться вторым этажом. ГПС тоже будет
Эх. Сюда бы еще поддержку немецких I2C контроллеров двигателей.
Вернулся к вию после долгого перерыва, сделал очередную плату. Датчики L3G4200D, BMP085, LSM303DLHC и мега2560. Странно, но работает. Основное отличие от всего виденного мной - наличие 2-х слотов расширения. Сейчас занимаюсь ОСД. будет ставиться вторым этажом. ГПС тоже будет
классная штуковина, можно плавно переходить на stm32 )))))
классная штуковина, можно плавно переходить на stm32 )))))
Хочу эксперимента ради перейти на xmega