Jacenty Napisano Kwiecień 13, 2020 Udostępnij Napisano Kwiecień 13, 2020 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. Link do komentarza Share on other sites More sharing options...
Dobroslaw Luty 10, 2021 Udostępnij Luty 10, 2021 Tez się tym bawiłem ale użylem biblioteki SBUS. Probowales? Do czego doszedłeś? Problem rozwiązany? Bardzo jestem ciekaw. Pozdro. Link do komentarza Share on other sites More sharing options...
Jacenty Luty 10, 2021 Autor tematu Udostępnij Luty 10, 2021 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 More sharing options...
Pomocna odpowiedź
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ę »