Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.
  • #1
    CyberDuck
    Level 11  
    Odgrzeje temat
    Buduje maly system w ktorym kilka arduino bedzie sie miedzy soba komunikowac poprzez szyne i2c .
    Wszystko zaczyna ladnie dzialac, ale problem pojawia sie w momencie kiedy jedno z urzadzen zostanie
    wylaczone z zasilania, ale nadal jest podlaczone do szyny danych. Efektem jest zamieranie szyny i2c.
    Przy pomiarze napiec na szynie kiedy nic nie jest transmitowane utrzymuje sie mniej wiecej polowa
    napiecia zasilania a wiec 2.25 V.
    Jak temu zaradzic ? Jednym z pomyslow jest wpiecie w szyne szeregowo dwoch rezystorow 1 Kohma.
    Ale to nie jest prawidlowe rozwiazanie. Mimo tego wszystko dziala poprawnie na przewodach dlugosci
    okolo 1.5 m. Jak inaczej mozna temu zaradzic ?
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    BlueDraco
    MCUs specialist
    Szyna I2C została wymyślona w celu łączenia układów w obrębie jednego urządzenia. Zakłada się, że wszystkie układy mają wspólne włączane zasilanie - nie przewiduje się pracy szyny przy odłączeniu zasilania niektórych układów. Problem leży w diodach technologicznych wewnątrz układów scalonych, które z grubsza zwierają niezasilane wejścia układów do masy (przez pewną rezystancję). "Prawdziwe" (a nie mikrokontrolerowe) linie I2C nie mają tej przykrej własności. Tym się różnie prawdziwe OC od symulowanego OC w mikrokontrolerach. Nic tu nie poradzisz.
  • #3
    CyberDuck
    Level 11  
    No ok ale jak napisalem ... podlaczenie szeregowo do pinow i2c rezystorow pomaga ...
    Molestuje przez caly dzien i jak na razie nie wykrylem zadnego bledu. Po odlaczeniu zasilania
    od jednego z ukladow szyna nadal pracuje poprawnie nie wykazujac zadnego bledu ...
    Czy moge tak zostawic czy szukac raczej innego rozwiazania ?
    Obecnie mam przewody 2m, 3m i 30 cm. Rezystory podciagajace standardowo dalem na 4.7 K.
    Te szeregowo do szyny w kazdym ukladzie po 1 K. Rozwiazanie biedne, ale dziala.
    W ostatecznosci moge dobudowac jakis bufor separujacy, ale tego bym nie chcial.
  • #4
    tos18
    Level 41  
    CyberDuck wrote:
    W ostatecznosci moge dobudowac jakis bufor separujacy, ale tego bym nie chcial.

    Obawiam się że to właśnie będzie rozwiązanie. Bufor z prawdziwym OC na wyjściu.

    A może RS485 ? zamiast I2C ?
  • #5
    tmf
    Moderator of Microcontroller designs
    CyberDuck wrote:
    Molestuje przez caly dzien i jak na razie nie wykrylem zadnego bledu.

    Ten odłączony mikrokontroler jest teraz częściowo zasilany przez magistralę i te rezystory. To raczej nie jest dobre i w szczególności może prowadzić do wykonywania jakiegoś pokręconego kodu przez ten mikrokontroler, pomimo pozornego braku zasilania. Poza tym te szeregowe rezystory wprowadzają dodatkowe opóźnienia narastania zboczy sygnału, w efekcie mogą wpływać na transmisję do tego układu.
    CyberDuck wrote:
    Obecnie mam przewody 2m, 3m i 30 cm.

    Z tymi 2-3m to pojechałeś po bandzie. I2C to jak pisał kol. @BlueDraco magistrala lokalna. To, że ci to wszystko działa przy takiej partyzantce to po prostu szczęście, nic więcej. Użyj przewidzianych do takich okazji interfejsów, np. wspomnianego RS485.
  • #6
    aut0matyk

    Level 16  
    Faktycznie, I2C to magistrala lokalna. Pomimo to, będzie działać na 2...3 metrach. Tak jak wcześniej wspomnieli, nie nadaje się na dłuższe odległości. Oprócz RS485, jest jeszcze CAN.
  • #7
    CyberDuck
    Level 11  
    Chyba jednak pojde w kierunku rs485 .
    Duzo mniejsze moduly i tez gwarantuja dosc dobre parametry transmisji.
    Duzo tansze ... i latwiejsze w wykorzystaniu.
    Max polaczenia beda mialy 10 m, a z tego co wyczytalem max predkosc 500 Kbits w zupelnosci
    wystarczy. Urzadzenia beda jedynie wymianiac miedzy soba rozkazy i pojedyncze bajty danych.
    Can jest za bardzo rozbudowana i za drogie uklady.

    Dodano po 1 [godziny] 37 [minuty]:

    Nie wiem jak to wytlumaczyc, ale podlaczylem przewody 5 mb.
    Wszystko polaczone na razie na pajaczka i dziala bez zarzutu.
    Przewody nie ekranowane. Jedynie co zrobilem to dobra filtracja zasilania.
    Pzrewody 4 zylowe. +5V. SDA. SCL, masa. Rezystory sa w poblizu urzadzenia , ktore bedzie wlaczone
    caly czas, ale tez o odleglosci okolo 70 cm na przewodzie. Kazde dodatkowe urzadzenie po zaopatrzeniu
    w rezystory szeregowe z magistrala odlaczone od zasilania nie powoduje zawieszania sie magistrali.
    Mam podlaczone na razie 5 arduino micro pro . No zebym nie byl goloslowny to prosze :
    https://www.youtube.com/watch?v=PrDaG_h9wTw
    to na dole jest podlaczojne na przewodzie 5mb, To z wtykami to wezel magisrali i2c. To w trzeciej rece
    to jedno z urzadzen w ktorym jest arduino i zasilacz. To wygladajace jak pajak to arduino podlaczone
    do komputera z ktorego moge wydawac roznego rodzaju komendy. Na ekranie widac jak wpisuje scan i kazde
    sie zglasza swoja nazwa wraz z adresem.

    Ale ok rozumiem i doceniam Wasze podpowiedzi i doswiadczenie. To jest bardzo cenne i na pewno przejde na jakas
    inna magistrale. Jeszcze nie jest za pozno :)
  • #8
    aut0matyk

    Level 16  
    Jednak CAN załatwia jeden podstawowy problem: ma zaimplementowany protokół i rozwiązuje problem arbitrażu (czyt. dostępu) magistrali. W RS485 będziesz musiał rozwiązać to programowo, np. przez zastosowanie protokołu MODBUS RTU. Ale z kolei ten protokół zapewnia poprawną komunikację tylko z jednym układem Master w systemie (reszta Slave). I tutaj jest przewaga CAN (tutaj mogą być wszystkie układy Master).
  • #10
    CyberDuck
    Level 11  
    Standardowa. 100 KHz

    Co do magistrali CAN tak sobie czytam i czytam i porownuje i po woli tez zaczynam dochodzic
    do takiego samego wniosku.
  • #11
    tmf
    Moderator of Microcontroller designs
    CyberDuck wrote:
    Max polaczenia beda mialy 10 m, a z tego co wyczytalem max predkosc 500 Kbits w zupelnosci

    Są transceivery RS485 nawet na 10 Mbps.
    aut0matyk wrote:
    Jednak CAN załatwia jeden podstawowy problem: ma zaimplementowany protokół i rozwiązuje problem arbitrażu (czyt. dostępu) magistrali.

    Jeśli autor używa na razie I2C to ma sytuację single master, multiple slaves. Przeniesienie tego na RS485 to chwilka - nie potrzeba arbitrażu, bo nie wystąpi jednoczesny dostęp do magistrali kilku urządzeń. W praktyce implementacja programowa będzie prostsza niż I2C. Wystarczy wysłać przez UART prostą ramkę danych. Oczywiście można to sobie komplikować dodając kolejne funkcjonalności, pytanie, czy autor tego potrzebuje.
    aut0matyk wrote:
    I tutaj jest przewaga CAN (tutaj mogą być wszystkie układy Master).

    Autor używa Arduino, a to nie ma kontrolera CAN. Trzeba więc dodać kontroler (droższy niż procesor) i transceiver CAN. Do tego trzeba to oprogramować, bo o ile kontroler realizuje wiele spraw sprzętowo, to jednak coś musi tworzyć ramkę, reagować na błędy i i oprogramować sam kontroler CAN. IMHO w zastosowaniu autora, jest to strzelanie z armaty do muchy. Przy podanych założeniach, zwykły UART i RS232-TTL może być wystarczający. Piny TxD slave'ów trzbaby tylko połączyć robiąc wired-and (zapewniając tylko, aby wyjścia TxD były OC, czyli w praktyce dodatkowy tranzystor na AVR).
  • #12
    CyberDuck
    Level 11  
    Dobra bo widze, ze jesli nie zaczne opisu od poczatku to nie bedzie z tego nic :)
    Rozmowy akademickie ... a chce isc do przodu.

    Calosc bedzie zamontowana w samochodzie. Lubie elektronike i bajerki chociaz w moim wieku zaczynam sie
    powoli tego wstydzic wiec prosze o wyrozumienie wszystkich czytajacych.

    Planuje zrobic :
    1. Oswietlenie do polki przy lewarku zmiany biegow. Pod radiem. Zauwazylem ze po ciemku trudno jest cokolwiek
    tam dostrzec. Podreczna polka wiec uzywana. To urzadzenie ktore jest na filmie zamontowane w trzeciej rece
    to mikrokontroler z dwoma diodami ws2812b na koncach. i oczywiscie przetwornica. Obudowe drukowalem sobie na drukarce 3D :)

    dzieki magistrali mozna regulowac :
    d1 x x x kolor d1
    d2 x x x kolor d2
    j1 x I prog jasnosci
    j2 x II prog jasnosci (czuj)
    t x tempo rozjazniania
    tu x tempo usredniania
    dlsw x dl swiecenia max
    czul x czulosc/zakr reakcji
    stwej x00 wej - INPUT 0
    x01 wej - INPUT 1
    x10 wej - PULL_UP 0
    x11 wej - PULL_UP 1
    1xx zawsze wlacz
    czuj wyswietla wart czuj
    sr wyswietla wart sred
    eep wyswietlenie nastaw
    dmax zapal diody z jasn II
    dmin zapal diody z jasn I
    reb reboot urz podrz

    Ma to dzialac tak ze przy wlaczonych swiatlach beda sie bardzo delikatnie swiecic diody. Po wlozeniu reki diody sie
    rozjasniaja na jakis czas. Jak widac na liscie komend mozna tam wyregulowac wszystko !!. Czas rozjasniania, poziom pierwszy
    jasnosci diod, poziom drugi jasnosci diod, kolor kazdej z osobna, czulosc czujnika zblizeniowego, usrednianie ( napotkalem problem przy
    oswietleniu zewnetrznym ktory wlasnie zalatwilem usrednianiem wartosci mierzonej ), i wiele innych parametow.
    To akurat urzadzenie bedzie potrzebowac informacji o tym czy sa wlaczone swiatla czy nie. Ewentualnie innych danych, ktore beda
    dostepne na magistrali glownej.
    Jak na razie modul pracuje perfekcyjnie :)
    Wszystko w czasie rzeczywistym wlacznie z transmisja danych po szynie.

    2. Oswietlenie klamek zewnetrznych . Po odblokowaniu drzi i pod warunkiem ze na zewnatrz jest ciemno rozjarza sie
    klamki samochodu na zewnatrz do momentu otwarcia drzwi, ale nie dluzej niz 2 min.
    I znowu modul bedzie potrzebowac na magistrali kilku informacji o oswietleniu na zewnatrz i czy drzwi zostaly
    otwarte.

    3. Sterowanie szybami. W wiekszosci samochodow po wylaczniu silnika sterowanie szybami jest wylaczane.
    Tutaj bedzie mozna wlaczyc szyby na czas regulacji i zrobic z nimi to co sie chce.
    Jeszcze sie zastanawiam nad czujnikiem poziomu otwarcia szyb ale chyba poprzestane na czasowym stopniowaniu
    otwarcia czy zamkniecia.

    4. Procesor glowny, ktory bedzie zbierac roznego rodzaju informacje potrzebne w systemie i udostepniac je innym modulom.

    5. Czujnik deszczu docelowo sterujacy wycieraczkami, ale dzieki mozliwosci wymiany informacji bedzie mogl
    np domknac szyby jesli sa otwarte jesli silnik jest wylaczony a na dworze zacznie padac deszcze nie uruchamiajac
    przy tym wycieraczek. Zrobilem juz odpowiednie eksperymenty do wykonania takiego czujnika refrakcyjnego
    (tak jak to jest w samochodach) i dziala fajnie :) Najdrozej mnie kosztowal zel do montazu czujnika.
    Modul porownuje oswietlenie zewnetrzne z tym co przychodzi z diody oswietlajacej w podczerwieni.
    Po zroznicowaniu i usrednieniu wyniku podejmuje decyzje co ma zrobic. Reakcja nie jest moze tak szybka
    jak w pro rozwiazaniach ale to dziala !!

    6. Bezkluczykowy system otwierania drzwi i bagaznika.

    No nie bede opisywac wszystkich modulow, a bedzie troszke tego. Porzebuje wlasnie do tego sprawnie dzialajacej magistrali.
    Dodatkowe urzadzenie do polaczenia sie w magistrale z komputerem bedzie pelnic role takiej plomby miedzy
    komputerem a reszta systemu. Tez juz dziala :) Widac to na filmiku.
    Nie mam jakiegos wypasnego na maxa samochodu i wlasnie chcialem sobie go doposazyc o rozne bajerki.
    Mam jeszcze dosc duzo pomyslow.

    Jak sie domyslacie nie kazde z tych modulow bedzie wlaczone caly czas. I stad problem zamierania magistrali
    po wylaczeniu jakiegos modulu.

    Jak na razie ide w kierunku magistrali CAN. Ale kazda sugestia jest dla mnie cenna. Calosc ma dzialac
    perfekcyjnie. Jak na razie dziala ale na i2c.

    Tak sobie mysle, ze jesli wszystko dziala bez zadnych problemow przy dlugosci przewodow 5 m , a sprawdzalem
    to na rozne sposoby , to moze by zastosowac jakis wzmacniasz mniej wiecej w polowie drogi. Umiescic
    wezel w takim miejscu zeby dlugosc przewodow nie przekroczyla 4 m i zrobic tam gniazda wraz z wzmacniaczami
    sygnalowymi. Nie sprawdzalem tylko tego analizatorem stanow, ale sprawdzalem czy cos sie nie zostaje
    w buforze, sprawdzalem czasy transmisji i za kazdym razem sa bardzo zblizone. Nie wypada zaden pakiet ...
    Nawet probowalem w poblizu przewodow umiescic urzadzenia zaklocajace typu trafo, generatory roznych
    czestotliwosci i dziala nadal. Dodam tylko ze ten przewod na ktorym to sprawdzam jest nie ekranowany.
  • #13
    tmf
    Moderator of Microcontroller designs
    CyberDuck wrote:
    Tak sobie mysle, ze jesli wszystko dziala bez zadnych problemow przy dlugosci przewodow 5 m , a sprawdzalem
    to na rozne sposoby , to moze by zastosowac jakis wzmacniasz mniej wiecej w polowie drogi. Umiescic
    wezel w takim miejscu zeby dlugosc przewodow nie przekroczyla 4 m i zrobic tam gniazda wraz z wzmacniaczami
    sygnalowymi.

    Ponieważ nie za bardzo jest sens o tym dyskutować, po prostu przyjmij, że I2C o długości kilku metrów i automotive nie idą w parze. Powiem więcej - arduino i automotive nie idą w parze. Z jakiegoś powodu w samochodach jest CAN i specjalne procki do automtive - nikt by nie pakował wielokrotnie droższych elementów, gdyby to nie było absolutnie konieczne.
    Skoro masz tyle modułów i tak naprawdę konfiguracja multimaster mogłabybyć wygodniejsza, to można użyć CAN. Tylko wybierz MCU z CAN na pokładzie, ew. użyj RS485 i dodaj odpowiednią warstwę softwarową. BTW, to, że coś działa na biurku niewiele znaczy. W samochodzie masz wysokie temperatury, kurz, wilgoć, zakłócenia. I nie jest to delikatne zakłócenie z trafka małej mocy.
  • #14
    CyberDuck
    Level 11  
    Zamowilem moduly CAN na ukladach MCP2515 TJA1050. Na razie 3 szt wiec bede experymentowac ...
    Z ciekawosci podam tylko ze na i2c podnioslem czestotliwosc transmisji do 400KHz i tez wszystko idzie
    bez problemu. Problem zaczal sie dopiero przy 1 MHz .