logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Komunikacja RS232 z PC i 2x Arduino - nieczytelne dane z peryferyjnych

huzzar.ts 20 Wrz 2018 23:53 1578 53
Najlepsze odpowiedzi

Czy da się zrobić komunikację PC i dwóch Arduino peryferyjnych po RS232, a jeśli nie, to jaki interfejs będzie właściwy zamiast niego?

RS232 nie nadaje się do magistrali z kilkoma urządzeniami, bo jest połączeniem 1:1; przy dwóch i więcej węzłach trzeba przejść na RS485, ewentualnie rozważyć RS422/CAN, a SPI na 10 m jest zbyt niepewne [#17451835][#17455597][#17457227] W układzie master–slave RS485 jest tu najprostszym rozwiązaniem: zostawiasz UART w MCU, dodajesz transceiver typu MAX485/MAX489 i po wysłaniu danych odłączasz nadajnik slave’a od linii [#17455682][#17457250] Jeśli zostajesz przy Arduino Uno, pamiętaj że ma ono tylko jeden sprzętowy UART i jest on zajęty przez USB, więc do komunikacji z PC i z siecią RS485 potrzebujesz osobnego UART-u, innej płytki albo gotowego konwertera USB-RS485 [#17457964][#17457622] Jako obejście wspomniano też ATmega328PB z dwoma USART-ami; software UART działa, ale ma ograniczenia i bywa problematyczny [#17458370][#17458658][#17458697]
Wygenerowane przez model językowy.
  • #1 17451775
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Cześć wszystkim.
    Jestem w trakcie wykonywania pewnego projektu w których chciałbym wykorzystać transmisję po RS232
    układ jest taki: PC (aplikacja w visual basic) < usb > Arduino (sterownik centralny) < RS232 > 2x Arduino (sterowniki peryferyjne)

    dwa sterowniki peryferyjne odbierają informacje z czujników ultradźwiękowych i sterują sygnałami świetlnymi LED
    sterownik centralny zbiera informację z peryferyjnych i komunikuje się z PC
    powinno to działać we wszystkie strony tylko jest problem z odczytem danych
    jeśli połączę PC + centralny + peryferyjny to wszystko idzie a jak dodam drugi peryferyjny to dane jakie z nich spływają są nieczytelne.

    Czy takie połączenie jest w ogóle do zrobienia, czy w takiej sieci może być tylko jedno urządzenie peryferyjne?

    Oczywiście nadawanie odbywa się naprzemiennie ale to i tak nie działa.
    Był bym wdzięczny za pomoc. Walczę z tym już tydzień :/
  • Pomocny post
    #2 17451835
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 569
    RS232 to połączenie 1:1 jeśli chcesz mieć kilka urządzeń powinieneś skorzystać z RS485
  • #3 17451982
    Konto nie istnieje
    Konto nie istnieje  
  • #4 17452523
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    A można zastosować SPI do takiej transmisji?
    Nie wiem czy są jakieś ograniczenia odległości, tu jest około 10 m

    Zacząłem coś tam pisać żeby sprawdzić czy się uda przesłać jakieś dane, no i z mastera do danego slejwa już potrafię wysłać, gorzej z odbieraniem od nich informacji :/
  • #5 17452539
    Konto nie istnieje
    Konto nie istnieje  
  • #6 17453069
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Ok, sprawdziłem w praktyce że na SPI dane dochodzą i wszystko działa (przynajmniej w jedną stronę master >> slave)
    Rozumiem że po RS485/422, CAN było by lepiej itd, ale trochę czas mnie goni i nie wiem ilę zajmie mi nauka czegoś nowego :/

    mam takie pewnie banalne kawałki kodu

    Master
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Slave
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    w proteus działa i fizycznie też, ale nie wiem jak odebrać dane z danego slave.
    Podzieli się ktoś wiedzą ;)

    Dodano po 47 [minuty]:

    Ok, zrobiłem, tyle powiem że zacytuję kolegów z tego forum "czytać instrukcję" ;)
    Link
  • #7 17453157
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Ok, sprawdziłem w praktyce że na SPI dane dochodzą i wszystko działa (przynajmniej w jedną stronę master >> slave)
    Rozumiem że po RS485/422, CAN było by lepiej itd, ale trochę czas mnie goni i nie wiem ilę zajmie mi nauka czegoś nowego :/

    mam takie pewnie banalne kawałki kodu

    Master
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Slave
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    w proteus działa i fizycznie też, ale nie wiem jak odebrać dane z danego slave.
    Podzieli się ktoś wiedzą ;)

    Dodano po 47 [minuty]:

    Ok, zrobiłem, tyle powiem że zacytuję kolegów z tego forum "czytać instrukcję" ;)
    Link

    Dodano po 1 [minuty]:

    master
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    slave
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Dodano po 17 [godziny] 3 [minuty]:

    No i podziałało i przestało, dokładnie mówiąc w komunikacji pomiędzy jednym slave wszystko działa.
    Jak dodaje drugiego to już się wszystko krzaczy. Nawet jak slave nic nie wysyła to otrzymuję wartość 17.
    Jak slave coś nadaje to już cuda dochodzą do mastera.

    Co może być przyczyną takich błędów błędów?
  • #8 17455597
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Na bascomie się nie znam, więc może kod jest nieprawidłowy, ale:
    - w SPI masz sygnały CS, więc komunikacja jest zawsze prosta - master<->slave, niezeleżnie ile tych slave jest na magistrali.
    - SPI to magistrala lokalna, wspominałeś, że łączysz moduły oddalone o 10m. Wbrew różnym forumowym magikom, taka transmisja nie będzie działać stabilnie. Owszem, czasami może zadziałać, ale równie dobrze może nagle przestać. Być może właśnie takiego problemu uświadczasz. Dlatego zarzuciłbym ten sposób realizacji transmisji jak najszybciej.
    Ktoś radził, aby użyć np. RS485 - i tak należy zrobić. Używasz UARTa z MCU, tylko dodajesz transceiver RS485 i realizujesz transmisję jako half-duplex. Nie jest to bardziej skomplikowane niż SPI, a przynajmniej od strony sprzętu musi działać.
  • #9 17455662
    wawxx
    Poziom 17  
    Posty: 162
    Pomógł: 16
    Ocena: 9
    1. każdy z podzespołów musi się łaczyć z niezależnym portem RS-232.
    2. Można sobie wyobrazić sprzętowe multipleksowanie portów, ale to może być kłopotliwe i czasochłonne na etapie projektowania.
    3. w Bascomie można zdefiniować dodatkowo, opócz sprzętowego UART-a, także wirtualne porty UART, na dowolnych portach.
    4. Polecam: https://avrhelp.mcselec.com/, a dokładnie rozdział: "SOFTWARE UART"
  • #10 17455675
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    wawxx napisał:
    1. każdy z podzespołów musi się łaczyć z niezależnym portem RS-232.

    Tylko to jest kłopotliwe, trzeba dodać n transceiverów RS232, pociągnąć dodatkowe przewody, a jeśli mamy typowy protokół master-slave, to nic to nie daje. RS485 w tym przypadku jest rozwiązaniem idealnym i prostym.
  • #11 17455682
    Konto nie istnieje
    Konto nie istnieje  
  • #12 17455791
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Pinczaiewicz napisał:
    Jeśli jest kłopotliwy w implementacji można użyć RS422.

    Dla dwóch urządzeń, owszem, RS422 jest ok, bo to proste przedłużenie RS232 o transmisję różnicową. Jednak już dla 3 urządzeń, jak w omawianym temacie, RS422 nie ma praktycznie żadnych zalet w stosunku do RS485, a ma wady - większą liczbę połączeń. Dla dwóch slave i więcej, w RS422 i tak trzeba wyłączać nadajniki, więc problem jest dokładnie taki sam jak dla RS485.
    Pomysł z wieloma uartami, dedykowanymi dla każdego slave, myślę, że można od razu odrzucić jako z czapy wzięty. Nie widzę sensu, aby kilka linii kodu, zamieniać rozbudowanym hardware...
  • #13 17456636
    Konto nie istnieje
    Konto nie istnieje  
  • #14 17456698
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Pinczaiewicz napisał:
    tmf napisał:
    RS422 nie ma praktycznie żadnych zalet w stosunku do RS485, a ma wady - większą liczbę połączeń. Dla dwóch slave i więcej, w RS422 i tak trzeba wyłączać nadajniki, więc problem jest dokładnie taki sam jak dla RS485.


    RS422 daje pełen dupleks. Jeśli soft z tego korzysta (będzie korzystał) łatwiej przejść z RS232 na 422 niż na 485.


    A czytałeś o co autorowi chodzi? Zaproponuj połączenia RS422 dla mastera i dwóch slave, tak, aby nie trzeba było robić kombinacji z nadajnikami tak, jak dla RS485?
  • #15 17456879
    Konto nie istnieje
    Konto nie istnieje  
  • #16 17456978
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Pinczaiewicz napisał:
    RS422 i multiwibrator przyłączający nadajnik do linii choć prościej i lepiej sterować ta linią z GPIO.

    Mając mikrokontroler taka zabawa z układami zewnętrznymi jest kompletnie pozbawiona sensu. Poza tym nie załapałeś pytania - w jaki sposób dla wielu slave RS422 miałby być prostszy niż RS485?
    Pinczaiewicz napisał:
    Jeśli nie ma być zabawy w przyłączanie nadajnika, to jak już proponowałem wcześniej, wyjścia OC (OD).

    A widziałeś transceiver RS422/485 z wyjściami OC/OD?
  • #17 17457015
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Dzięki wielkie za takie zainteresowanie tematem. Sprawdziłem wszystko w warunkach rzeczywistych. Powiem tak, wszystko zachowuje się bardzo różnie. Wysłanie z mastera na dwa slave czasem się udaje a czasem nie. Myślałem że wszystko zależy od długości przewodu ale slave "A" jest oddalony o około 1,5m "kabla", a slave "B" o jakieś 10m, Efekt jest taki że na jednym i na drugim dochodzi około 50% komunikatów, może na tym bliższym jest mniej błędów ale też się zdarzają.

    Dlaczego Bascom i dlaczego SPI? Bo nie pisałem w C takich rzeczy a z transmisją też dopiero się uczę na własnych błędach. Teraz podpinam do mastera trzy multimetry (V/A) po I2C i też łapię dopiero coś niecoś. Na jednym działa jutro zobaczę jak to pójdzie na trzech.

    Chętnie bym zrobił to po jakimkolwiek RSxxx tylko jak w RS232 wklepię print to leci i finał, a jak zobaczyłem kody do RS4xx to mi kopara opadła.
    Nie mam w chwili obecnej za bardzo czasu, muszę skończyć tą część i iść dalej. Do napisania mam jeszcze część w Visual Basic (w tym piszę już duże rzeczy) i wszystko scalić w jedno. Od około 1,5 roku piszę oprogramowanie i teraz muszę zbudować kilka urządzeń peryferyjnym. Komunikację jednego mikrokontrolera z PC mam połapaną i sprawdzoną.

    Dlatego myślałem już nad rozwiązaniem że wysyłam komendę do slave on odsyła do mastera jak się zgadza to pin SS daje na stan wysoki i slave idzie dalej, jak nie to master powtarza itd. Ale jak z nadawaniem jeszcze to idzie to z odbiorem jest lipa straszna.

    Nie zależy mi na jakimś mega transferze. Ważne żebym mógł przesłać prosty komunikat w stylu wartości z termometru w jedną i drugą stronę.

    Jak to w miarę szybko zrobić, macie coś sprawdzonego?
    Ja biorę się dalej do walki z Bascom i uC, może zatrybi w końcu...
  • #18 17457101
    Konto nie istnieje
    Poziom 1  
  • #19 17457110
    Konto nie istnieje
    Konto nie istnieje  
  • #20 17457146
    tronics
    Poziom 38  
    Posty: 5025
    Pomógł: 358
    Ocena: 838
    khoam napisał:
    Tak, informacyjnie: do I2C jest dostępne coś w rodzaju wzmacniacza (transmisja do 50m na zwykłej skrętce): P82B715. Jest to dość tani scalak, na alipowoli 5 szt. kosztuje w granicach 4$ z wysyłką.

    Nie do końca, bo musisz mieć jeden taki po stronie mastera i dodatkowo po jednym do każdego slave.
  • #21 17457153
    Konto nie istnieje
    Konto nie istnieje  
  • #22 17457155
    Konto nie istnieje
    Poziom 1  
  • #23 17457177
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Pinczaiewicz napisał:
    Może widziałeś implementacje Ethernetu po RS4xx

    Dobrze to to nie wyglądało :P
    Przekonaliście mnie do RS485, mam już kawałki kodów i coś postaram się z nich sklecić.

    Dodano po 1 [minuty]:

    i już widzę że z "Const Adr" jest jakaś lipa, czyli pomoc bascom i proza do wciągnięcia :P
  • #24 17457202
    Konto nie istnieje
    Konto nie istnieje  
  • #25 17457217
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Pinczaiewicz napisał:
    Jak byś od razu posłuchał, to pewnie dawno miałbyś zrealizowaną komunikację.


    Spokojnie, jeszcze nic nie działa więc się tak nie ekscytujmy ;P
  • #26 17457227
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    huzzar.ts napisał:
    Powiem tak, wszystko zachowuje się bardzo różnie. Wysłanie z mastera na dwa slave czasem się udaje a czasem nie. Myślałem że wszystko zależy od długości przewodu ale slave "A" jest oddalony o około 1,5m "kabla", a slave "B" o jakieś 10m, Efekt jest taki że na jednym i na drugim dochodzi około 50% komunikatów, może na tym bliższym jest mniej błędów ale też się zdarzają.


    Ułatwię ci zadanie - na SPI przy tych odległościach to w życiu pewnie nie zadziała o czym się zresztą przekonałeś. Jakbyś nie rzeźbił działać to w ten sposób sensownie nie będzie. Niby jak koledzy piszą, jakieś można dać nadajniki linii, ale to interfejs synchroniczny i jak każdy bufor zacznie radośnie zmieniać czasy propagacji (bo np. zmieni się temperatura) to dopiero zrobią się kwiatki. Więc wyboru nie masz- zaprzyjaźnij się z tym RS485 (wyjdzie najprościej i najtaniej). Każdy kod na początku wygląda strasznie, szczególnie jeśli masz takie do tego nastawienie. W istocie transmisja master-slave dla tego interfejsu jest naprawdę prosta.
  • #27 17457235
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Ok, a jest jeszcze jedna kwestia.
    PC komunikuje się poprzez USB z Arduino a dokładnie z pierwszym uC (atmega16), następnie ten komunikuje się z głównym uC (atmega328) i to on jest masterem. Teraz ten master z atmega16 komunikuje się poprzez RS232.

    Zastanawiam się czy jak master zacznie działać na RS485 to czy nie popsuję sobie tym komunikacji z PC .....
  • #28 17457250
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    @huzzar.ts Do transmisji musisz wykorzystać dwa oddzielne interfejsy UART - jeden dla RS485 i tych twoich slave'ów, drugi do komunikacji z drugim MCU. Pytanie pomocnicze - po co i dwa mikrokontrolery? Idę o zakład, że znowu niepotrzebnie komplikujesz i można zrobić to wszystko w jednym, co ci przy okazji uprości projekt.
  • #29 17457276
    huzzar.ts
    Poziom 13  
    Posty: 143
    Ocena: 8
    Powiem tak, to o czym piszę już jest, i jest fizycznie wykonane. Wszystkie funkcje działają i to bez żadnych błędów. Jak dokładnie to działa i co to jest to mogę Ci opisać prywatnie jak bardzo Cie to interesuję ;)
    Ale sprawdziłem już kilka rozwiązań i musiałem zastosować dwa slave i jeden master, praktycznie wszystkie piny są zajęte, no w masterze jest chyba 3-4 wolne. Jedno czego brakuję to dobrej komunikacji na którą tez mam ewentualnie wyjście awaryjne. Ale wolałbym zrobić to tak jak ma być w zamyśle.

    Dodano po 3 [minuty]:

    tmf napisał:
    jeden dla RS485 i tych twoich slave'ów, drugi do komunikacji z drugim MCU.

    chyba nie do końca się zrozumieliśmy, na pokładzie Arduino są dwa mikro kontrolery z tego co wynika ze schematu. Pomiędzy gniazdem usb a tym głównym jest jeszcze atmega16 połączona TX i RX.
  • #30 17457492
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik pracuje nad projektem, w którym planuje wykorzystać komunikację RS232 pomiędzy PC a dwoma Arduino jako urządzeniami peryferyjnymi. Napotyka problemy z nieczytelnymi danymi, gdy do systemu dodawane jest drugie urządzenie peryferyjne. Uczestnicy dyskusji sugerują, że RS232 jest połączeniem 1:1, a dla wielu urządzeń lepszym rozwiązaniem byłoby użycie RS485 lub RS422. Wskazują również na możliwość zastosowania SPI, jednak podkreślają, że przy większych odległościach może to być niestabilne. Użytkownik testuje różne metody komunikacji, w tym SPI i I2C, ale ostatecznie decyduje się na RS485, aby uprościć projekt. Wskazano również na ograniczenia związane z używaniem ATmega328, który ma tylko jeden UART, co komplikuje komunikację z PC przez USB. Uczestnicy podkreślają, że lepiej jest użyć mikrokontrolera z większą liczbą UART-ów lub zastosować zewnętrzne konwertery USB-RS485.
Wygenerowane przez model językowy.
REKLAMA