Skocz do zawartości

SBUS na Arduino Uno


Jacenty

Pomocna odpowiedź

Cześć,

postanowiłem w końcu napisać, szukam rozwiązania już dłuższy czas i póki co nie znalazłem nic, co by rozwiązało mój problem. Może ktoś z Was ma z tym doświadczenie lub naprowadzi mnie na rozwiązanie.

Moim celem jest odczytywanie sygnały z transmitera (FrSky Taranis X Q7) na Arduino Uno przy pomocy odbiornika (FrSky XM+). Wszystko ze sobą powiązane, działa poprawnie, co potwierdziłem za pomocą oscyloskopu. Sygnał do UART ma odwróconą logikę, więc między odbiornik a Arduino bramkę NOT (CD4069). Ostatecznie, sygnał, który podpinam do pinu 0 umieszczone jest w załączniku hantek60_2.png. Jest to pierwszy wysyłany bajt, który w konfiguracji 8E2 pierwszy bit jest bitem startowym, następnie 8 transmitowanych bitów danych, 1 Even parity bit oraz 2 Stop bity.

Widać, że wszystko się zgadza, pierwszy niski stan oznacza bit startowy, następnie 8 bitów danych pierwszego wysyłanego bajtu, które w protokole SBUS mają konfiguracją 00001111b. 

Program, który obecnie mam na Arduino wygląda następująco:

#define sbusStartByte  0x0F
#define sbusPayloadEndByte    0x00

byte RxUART;
byte readSBusData [24];
bool failSafe;
bool frameLost;
bool CH17;
bool CH18;
byte  sbusMemBufPointer;
int channelData[16];
bool ledState = false;

void setup()
{
  Serial.begin(100000, SERIAL_8E2);
  memset(readSBusData, 0, 24); // NULL = 0
  pinMode(13, OUTPUT);
  pinMode(0, INPUT);
}

void loop()
{
  
  do
  {
      RxUART = Serial.read();
  }
  while (RxUART != sbusStartByte);
  
  ledState = !ledState;
  
  sbusMemBufPointer = 0;
  do
  {
    if (Serial.available() > 0)
    {
      RxUART = Serial.read();
      readSBusData[sbusMemBufPointer] = RxUART;
      sbusMemBufPointer++;
    }
  }
  while ((RxUART != sbusPayloadEndByte) || (sbusMemBufPointer < 23));
  

//Opracowanie sygnałów
  channelData[0] = ((readSBusData[0] | readSBusData[1] << 8) & 0x07FF);
  channelData[1] = ((readSBusData[1] >> 3 | readSBusData[2] << 5) & 0x07FF);
  channelData[2] = ((readSBusData[2] >> 6 | readSBusData[3] << 2 | (readSBusData[4] & 0x01) << 10) & 0x07FF);
  channelData[3] = ((readSBusData[4] >> 1 | readSBusData[5] << 7) & 0x07FF);
  channelData[4] = ((readSBusData[5] >> 4 | readSBusData[6] << 4) & 0x07FF);
  channelData[5] = ((readSBusData[6] >> 7 | readSBusData[7] << 1 | readSBusData[8] << 9) & 0x07FF);
  channelData[6] = ((readSBusData[8] >> 2 | readSBusData[9] << 6) & 0x07FF);
  channelData[7] = ((readSBusData[9] >> 5 | readSBusData[10] << 3) & 0x07FF);
  
  channelData[8] = ((readSBusData[11] | readSBusData[12] << 8) & 0x07FF);
  channelData[9] = ((readSBusData[12] >> 3 | readSBusData[13] << 5 | (readSBusData[14] & 0x01) << 10) & 0x07FF);
  channelData[10] = ((readSBusData[13] >> 6 | readSBusData[14] << 2) & 0x07FF);
  channelData[11] = ((readSBusData[15] >> 1 | readSBusData[16] << 7) & 0x07FF);
  channelData[12] = ((readSBusData[16] >> 4 | readSBusData[17] << 4) & 0x07FF);
  channelData[13] = ((readSBusData[17] >> 7 | readSBusData[18] << 1 | readSBusData[19] << 9) & 0x07FF);
  channelData[14] = ((readSBusData[19] >> 2 | readSBusData[20] << 6) & 0x07FF);
  channelData[15] = ((readSBusData[20] >> 5 | readSBusData[21] << 3) & 0x07FF);

  CH17 = (readSBusData[22] & 0x01);
  CH18 = (readSBusData[22] & 0x02);
  frameLost = (readSBusData[22] & 0x04);
  failSafe = (readSBusData[22] & 0x08);

  digitalWrite(13, ledState);
}

Jego zadaniem jest po prostu odczytanie pierwszego bajtu i jeżeli zostanie odczytany zmienić stan diody przy pinie 13.

Niestety nie mogę osiągnąć zamierzonego efektu.

Tak jak jeszcze widać na oscyloskopie dane wysyłane są co 10 us i zgodnie z tym jest ustawiony bps w Serial.begin. 

Czy ma ktoś może pomysł, gdzie leży błąd? Co mogę robić źle. Z góry dziękuję za pomoc.

hantek60_2.png

Link do komentarza
Share on other sites

Problem u mnie polegał też na tym, że nawet biblioteka SBUS nie chciała pomóc, dlatego właśnie zabrałem się za to sam.

Niestety nie starczyło czasu aby dokończyć temat, ale powoli się przymierzam aby do tego wrócić.

W razie jakiegoś update'u dam znać.

W między czasie liczę może jeszcze na kogoś doświadczenie i pomysły. 😄

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.