MultiWii

SovGVD

всётаки нашел часок чтобы разобраться как подключить OSD от Syberian для мегапирата к Multiwii

пока сделал только горизонт, но разобрался чего ды как и остальное добавить не проблема
итак

  1. меняем скорость порта на 9600
  2. в 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
  }
  1. в config.h добавляем
    #define SYBERIAN_OSD
  2. в 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 добавить?

SovGVD

кстатии посмотрел код - туда же можно без проблем налепить GPS на обычную ардуинку, сделав включение порта на слушание GPS приемника (пассивного! а то есть приемники, которые не отдают, пока не попросишь, но можно и их, но тогда в пролете OSD) каким нибудь хитрым стик-жестом (для LCD вроде так)

leprud

i2c-gps-nav давно уже есть, тем более интегрировано с мультивии
Рекомендую все вместе совместить

SovGVD
leprud:

i2c-gps-nav давно уже есть

оно как то поможет с UART GPS приемником?

leprud

Ессно. данные по уарту, обмен с основными мозгами - по i2c

SovGVD
leprud:

Ессно. данные по уарту, обмен с основными мозгами - по i2c

т.е. юзая эту либу на обычной Arduino Mini/pro/328p с одним UART можно не писать свои костыли, а уже работает?

leprud

ы, в гугле же написано.
[gps]-[uart arduino]-[i2c]-[multiwii]

SovGVD

судя по коду там про mega и про i2c в основном, а я говорю про односторонний UART на обычной ардуинке, где только ОДИН хардверный UART есть

leprud

Так, стоп. Задача подключить e-osd (как железку) к мультивию и запихнуть туда же гпс датчик?
Через softwareserial на мультивие я подключал гпс, хоть и криво

SovGVD

задача завести UART GPS на RX0 пин, а TX0 для OSD оставить, т.е. для меги или i2c GPS приемников проблем нет, а на обычной ардуинки уже косяк выходит

  • в новом мультивие (а может и раньше, давно не следил) убрали стандартную либу работы с serial портом, поэтому попытки добавить софтверный порт приводят к ошибкам компиляции (ну или avr-gcc снова тупит)
SovGVD

реальная работа 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
VitaliyRU

попробуй вот так
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);

SovGVD
VitaliyRU:

я правда не понял как не работает, вроде младший и старший байты попутаны.

работает есть int tmp_alt=123; - т.е. выводит эти самые 123, а если int tmp_alt=(EstAlt-AltGround)/100; - то выводит ноль (аналогично если просто BaroAlt поставить или EstAlt)

VitaliyRU

cast к данным меньшей размерности берет правые байты (тобишь маленькие значения)
может разность меньше 100?

SovGVD

ура, нашел
int tmp_alt=(EstAlt-AltGround)*0.01f;

AltGround ставиться при арминге моторов и значение становить 0 и дальше повышается, но приемник отключен пока, поэтому цифры - высота над уровнем моря в метрах (теоретически)

Syberian
SovGVD:

а вот так работает

Юзай Serial.write(byte) , а для простоты вытащи ответную часть из самолетного пирата 2.24, файл называется eosd.pde.
Еще у тебя прыгает горизонт, не забыл синхрогруппу чередовать надо? 0xcb 0x34

SovGVD
Syberian:

Юзай Serial.write(byte)

в мультивие выпилили serial, там свой костыль теперь, но работает так же.

Syberian:

не забыл синхрогруппу чередовать надо? 0xcb 0x34

не знал, чето было написано про 0xcb 0x34, проигнорил 😉

upd хотя нет, вот в конце osd_sync^=255; - так что видимо меняю =)

adver

Вернулся к вию после долгого перерыва, сделал очередную плату. Датчики L3G4200D, BMP085, LSM303DLHC и мега2560. Странно, но работает. Основное отличие от всего виденного мной - наличие 2-х слотов расширения. Сейчас занимаюсь ОСД. будет ставиться вторым этажом. ГПС тоже будет

Alexey_1811
adver:

Вернулся к вию после долгого перерыва, сделал очередную плату. Датчики L3G4200D, BMP085, LSM303DLHC и мега2560. Странно, но работает. Основное отличие от всего виденного мной - наличие 2-х слотов расширения. Сейчас занимаюсь ОСД. будет ставиться вторым этажом. ГПС тоже будет

Эх. Сюда бы еще поддержку немецких I2C контроллеров двигателей.

Dimm168pin
adver:

Вернулся к вию после долгого перерыва, сделал очередную плату. Датчики L3G4200D, BMP085, LSM303DLHC и мега2560. Странно, но работает. Основное отличие от всего виденного мной - наличие 2-х слотов расширения. Сейчас занимаюсь ОСД. будет ставиться вторым этажом. ГПС тоже будет

классная штуковина, можно плавно переходить на stm32 )))))

adver
Dimm168pin:

классная штуковина, можно плавно переходить на stm32 )))))

Хочу эксперимента ради перейти на xmega