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

Jak poprawnie podłączyć konwerter poziomów I2C między Arduino 5 V a OLED SSD1306 3,3 V?

240sx 05 Lis 2025 15:37 513 28
  • #1 21742409
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Konwerter poziomów - jak podłączyć między OLED ssd1306 i Arduino?

    Wyświetlacz chce 3,3 V (maks) na logice I2C. Z Arduino wychodzi mi na 5 V (niecałe) - tak musi być, ze względu na inne urządzenia podłączone na i2c.

    Dwa moduły konwertera poziomów logicznych 4-kanałowe, widok z góry

    Podłączyłem więc konwerter poziomów (fotka w załączeniu) i nie działa(?). Połączenia
    Arduino -> konwerter: GND -> GND (po stronie "H"), 5V -> HV, SDL -> HV1, SCL -> HV2
    OLED -> konwerter: GND -> GND, Vcc -> LV, SDL -> LV1, SCL -> LV2
    I dodatkowo 3,3 V z Arduino na LV (czyli też Vcc wyświetlacza).

    Czy to jest prawidłowo?

    Kiedy w ogóle odłączyłem wyświetlacz i miałem tylko z Arduino: 5 V->HV, 3,3 V->LV, GND na oba GND konwertera to niezależnie czy podałem 5 V czy GND na HV1 to na LV1 było stale 0 V.

    Czy coś popsułem?
  • Pomocny post
    #2 21742418
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    I2C jest trudne, bo linia danych jest dwukierunkowa.
    Rzuć okiem tu: https://einhugur.net/blog/index.php/xojo-gpio/i2c-logic-level-converter-building-our-own/
    Co do ostatniego testu, to dobry pomysł i nie, nie tak powinno być. Zacznij od tego żeby w tym teście uzyskać dobre wyniki, czyli 5 V na HV1 daje 3,3 na LV1 oraz 0 HV1 daje 0 na LV1.
    Ustal jaki rodzaj tranzystorów masz użyty, czy mosfety czy bipolarne, sprawdź omomierzem (test diody) czy działają.
    W angielskim opisie masz wspomniane, że dla tego "rx/tx" tylko tor tx jest dwukierunkowy.
    Jak zrobisz już HV->LV, to przestaw Arduino w input-pullup i wtedy zewrzyj LV1 do masy, zobacz czy HV1 też zejdzie na stan niski.
  • #3 21742517
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Coś tu jednak nie tak...

    Obejrzałem polecaną stronę - opis OK, ale niestety nie wiem jak ja mam układ.
    U jednego ze sprzedających znalazłem taki opis: https://pl.aliexpress.com/item/1005007377770600.html

    Czy obraz by sugerował, że "4 bi-channels" to tak naprawę dwa kanały 5 V->3 V (2, 4) i dwa 3 V->5 V (1,3)?

    U mnie po prostu podłączyłem GND-GND, H5 V->HV, 3,3 V->LV i pomierzyłem napięcia.
    Na GND - 0 V (OK), na wszystkich LV - 0V (???), na HV1 i HV2 - 0 V, na HV3, HV4 - 5 V.

    Brrrr... Jeszcze coś innego.

    Odłączenie czegokolwiek na LV1 (GND lub 3,3 V nic nie zmienia na HV...).

    Czy może ktoś miał okazję używać takiej płytki?
  • #4 21742761
    LEDówki
    Poziom 43  
    Posty: 9506
    Pomógł: 1312
    Ocena: 2563
    Spytaj bota. Sypie podpowiedziami jak z rękawa.
  • Pomocny post
    #5 21742966
    _jta_
    Specjalista elektronik
    Posty: 48957
    Pomógł: 3205
    Ocena: 4225
    Na zdjęciu masz dwie płytki, ta po prawej stronie ma w jednym rządku LV1, LV2, LV, GND, LV3, LV4, w drugim HV1, HV2, HV, GND, HV3, HV4 i powinna mieć 4 kanały dwukierunkowe: np. połączenie któregokolwiek z LVx (ale nie LV, x ma być 1/2/3/4) z masą powinno dawać stan niski na odpowiednim HVx, ale też odwrotnie, połączenie któregokolwiek z HVx z masą powinno dawać stan niski na odpowiednim LVx. Jeśli taki układ robi się na zwykłych tranzystorach, to powinien zawierać tranzystor i 3 oporniki na każdy kanał (czyli 4 tranzystory i 12 oporników); może zawierać "tranzystory cyfrowe", które mają wbudowany opornik, i wtedy do każdego tranzystora są 2 zewnętrzne oporniki. Napis "103" na oporniku oznacza opór 10kΩ (10·10^3 Ω).
  • #6 21742993
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    @240sx może wrzuć faktyczne zdjęcia tego co masz. Wyświetlacza też.
  • #7 21743075
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Płytka arduino robi tu tylko za dostawcę napięć 5V i 3.3V (dokładnei to 4.85V i 3.26V - ale to może tylko mój miernik tak mierzy).

    Niebieski kabelek - GND - oba, po stronie H i L są wewnętrze połączone w układzie (jest zwarcie).
    Czerwony, 5V - HV
    Pomarańczowy, 3.3V - LV
    spodziewałem się, że kiedy zielony kabelek z HV4 podłącze do HV4 to na zółtym LV4 będzie +3.3V. Jest zero.
    Na pozostałych podobnie.
    Dobrze myśle czy coś tu pomyliłem?

    (Zwroki inne zworki na płytce - podłączone dalej do nieczego).
    Załączniki:
    • Jak poprawnie podłączyć konwerter poziomów I2C między Arduino 5 V a OLED SSD1306 3,3 V? konwerter.jpg (73.55 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #8 21743275
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    Wygląda ok, możesz przeczytać co jest na tranzystorach, poszukać ich dokumentacji i je pomierzyć, przy czym wątpliwe żebyś spalił wszystkie 4 na raz.
    Zmierz względem pewnej masy (może obudowa usb, jeśli tak to zasilasz) czy na konwerterze (jego nóżkach) są napięcia. Te płytki, kabelki często nie stykają.
    Możesz na pałę dodać elektrolit na 3,3V, w klonach Nano one jest brane z konwertera CH340 i nie raz widziałem tam ciekawy śmietnik na oscyloskopie (ale u Ciebie na miernik jest w miarę i nie działa nawet wolny sygnał więc raczej nie to.
    Możesz spróbować konwertera na układzie TXS0108E (5,5zł na allegro) takiego używałem do jakiegoś modemu co potrzebował ok. 2V i działał bez zarzutów.
  • #9 21743313
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Tak neistety to (nie)działa. Zastanawiam się kiedy ew. mogłem spalić i myślę, że jeśli ta moja płytka to nie "4 bi-directinal channels", a 2 kanały z dwoma kierunkami L->H i H->L to czy podłączając (nieświadomie) w kierunku odwrotnym, tzn. kanał L->H, w którym na H puściłem +5V, a na L sprawdzałem co jest mogłem uszkodzić układ?
  • #11 21743484
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    GNB -> GNB
    5V -> HV (4.63V - z niepodłączonego nigdzie wyjścia Arduino)
    3.3V -> LV (3.26V j/w)

    O, i napięcia ciekawe (względem GNB):

    HV1 - 0
    HV2 - 0
    HV3 - 4.15V
    HV4 - 4.16V

    Lv1 - 3.25V
    LV2 - 3.25V
    LV3 - 3.25V
    LV4 - 3.25V
  • Pomocny post
    #12 21743569
    _jta_
    Specjalista elektronik
    Posty: 48957
    Pomógł: 3205
    Ocena: 4225
    To wypadałoby posprawdzać połączenia - mam wrażenie, że HV1 i HV2 powinny mieć połączenie poprzez oporniki 10 kΩ z HV, oraz poprzez złącza tranzystorów z LV, i każde z tych połączeń powinno dawać jakieś napięcie na HV1 i HV2. Być może jest uszkodzenie kilku elementów (2 oporniki i 2 tranzystory), a może tylko ścieżek na płytce.

    A niezależnie od tego można sprawdzić, czy konwertery 3 i 4 działają - do jednego I2C wystarczą. One powinny działać tak, że jak np. LV3 zewrzesz z GND, to na HV3 będzie niskie napięcie (raczej poniżej 0.1V), a jak HV3 zewrzesz z GND, to poniżej 0.1V będzie na LV3.
  • #13 21744062
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Dzisiaj około 11-tej będę mógł to sprawdzić. W międzyczasie - wszystkiego co potrzbeuję to połączyć po i2c mastera (Ardunion), które oferuje +5V na linii ze slave-em wymagający +3.3V (nie więcej). Czy jeśli dodam jeden oporek 9k to nie otrzymam tego co potrzebuję? (Proszę nie strzelać, jeśli to jakiś błąd).

    Schemat połączenia I2C między Arduino 5V a OLED 3.3V z rezystorami 4.7k i 9k
  • #14 21744186
    _jta_
    Specjalista elektronik
    Posty: 48957
    Pomógł: 3205
    Ocena: 4225
    Jeśli piny Arduino miałyby wyjście open-collector, to mogłoby tak działać; ale chyba mają push-pull, i pin Arduino w stanie wysokim poda prawie 5V.

    Dwukierunkowy translator poziomów można zrobić z tranzystora i 3 oporników (np. 100k między bazę, a LV, emiter do LVx, kolektor do HVx, oporniki pull-up po 10k LV-LVx i HV-HVx). Pożądany jest tranzystor, który ma nie za małą betę przy zamianie emitera z kolektorem.
  • Pomocny post
    #15 21744397
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    Samą linię zegara SCL możesz załatwić dzielnikiem, bo to linia jednokierunkowa z master'a do slave'a. Wtedy z wyjścia Arduino wchodzisz na opornik, środkowy punkt na wyświetlacz i ze środkowego opornik do masy. Gorzej z danymi.
    Owszem te AVRki mają push-pull.
  • #17 21744509
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Czemu z SDL jest problem? Wydaje mi sie, że nie powinno: slave ustawia stan niski na SDA, czyli tak jakby opornika 9k w ogóle by nie było...

    SCL też jest "dwukierunkowy" - slave przecież może przytrzymać stan niski, żeby np. mięc czas na odpowiedź wysłaną z master-a.
  • Pomocny post
    #18 21744531
    _jta_
    Specjalista elektronik
    Posty: 48957
    Pomógł: 3205
    Ocena: 4225
    Jeśli masz wejście, z którego wypływa prąd, to musi być sterowane z wyjścia, które ten prąd przyjmie. A jak jest wyjście push-pull, to podłączone bezpośrednio poda za duże napięcie w stanie wysokim (i może uszkodzić wejście), a podłączone poprzez opornik (żeby uzyskać dzielnik) w stanie niskim nie poda wystarczająco niskiego, żeby ten stan był rozpoznany jako niski, bo prąd z wejścia popłynie przez opornik i zwiększy napięcie.

    Chyba I2C nie przewiduje podawania stanu niskiego przez slave-a.
  • #19 21744534
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    @240sx jeżeli chodzi o twój schemat w ASCII to @_jta_ Ci napisał w czym problem - w druga stronę, jak AVR da 5V to idzie bezpośrednio na wejście 3,3V czego chcemy uniknąć.
    Co do SCL, słuszna uwaga, mi się rzadko zdarzało żeby to było potrzebne, ale w specyfikacji jest, więc d... z prostego rozwiązania.
    Mam gdzieś taki chiński moduł na tranzystorkach, z ciekawości sprawdzę czy to u mnie działa "na drut". Wydaje mi się że to sprawdzałem jak tylko przyszło i jakoś działało, ale nie pamiętam. Tak jak psiałem jak użyłem ww. scalaka.

    edit: w sumie to właśnie zacząłem się zastanawiać jak działa I2C na AVR, skoro te wyjścia są push-pull? Chodzi o prostą wersję czyli wszystko na 5V. Na pewno nie raz używałem i działało, ale zasieliście ziarno niepewności. W 8051 były wyjścia OC ze słabym pullupem i tam było łatwo.

    edit2:
    Zdaje się że AVR się przełącza co każdy bit w tryb we/wy.

    Dodano po 1 [godziny] 31 [minuty]:

    U mnie działa, więc albo coś upaliłeś albo chińczyk lipę sprzedał. U mnie układ płytki jest inny.

    Moduł konwertera poziomów logicznych i układ scalony na płytce stykowej.


  • #20 21744916
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    hm... Zawsze rozumiałem to w ten sposób, że wyjścia i2c (SDL, SCL) po prostu zwierają do masy koniec opornika pull-up, którego drugi koniec jest podłączony na stałe do napięcia "podciągającego".

    Master w swoim stanie wysokim swój wewnętrzny tranzytor (podłączony między oporniki 4.7 i 9k) jest "rozwarty". Prąd płynie z +5V do GND, a slave widzi to co się odkłąda na 9K. W stanie niskim niskim zwiera dolny koniec rezystora 4.7k do GND. Drugi oporek (9k) nie ma w tym stanie znaczenia, a slave widzi GND na swoim wejściu.

    Źle myslę?
  • #21 21745044
    _jta_
    Specjalista elektronik
    Posty: 48957
    Pomógł: 3205
    Ocena: 4225
    A jakie napięcia występują na pinie Arduino używanym do I2C, jeśli jest do niego podłączony opornik, którego drugi koniec jest podłączony do 3.3V?

    Jeśli ten pin będzie ustawiony (nie wiem, czy jest taka możliwość) w tryb "open-collector NPN", to w stanie 1 (tranzystor wyłączony) będzie 3.3V, a w stanie 1 (włączony) około 0V. I do tego można by podłączyć tego OLED-a bez translatora napięć, ale - ważny warunek - ten pin nawet przed wystartowaniem programu nie może być w trybie push-pull w stanie 1, bo to będzie 5V. Trzeba by poczytać dokumentację Arduino, jak to działa - może np. programować ten pin tylko na "output stan 0", albo "input" (jako stan 1).

    I2C powinien mieć nadajniki "open-collector NPN", i opornik pull-up (myślę, że jeden dla całej linii).
  • #22 21745177
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    Schemat blokowy funkcji alternatywnych portu mikrokontrolera

    No więc nie ma opcji na wyjście open collector, jak się przyjrzycie to jest tam bufor sterowany, mniej więcej na środku góra-dół, trochę z lewej, do przełączenie we/wy.
    Tak jak pisałem wcześniej, wygląda na to że dla stanu zero pin jest ustawiany w tryb wyjściowy, a dla stanu 1 w wejściowy i wtedy do gry wchodzi pullup. Więc technicznie do samego I2C powinno się dać zrobić pullup do 3,3V tyle że trzeba zadbać żeby pin nie wszedł w tryb wyjście w stanie wysokim. A wiadomo że w prototypach różnie bywa, więc ja bym wyszedł z atmegi przez jakieś 100-200 omów i dał zenera 3v6 (lub 3,3) do masy. Tak się kiedyś robiło w tanich kablach RS232 do telefonów typu Nokia 5110 :D

    @240sx wiesz że już byś dawno kupił kolejne płytki i byłoby z głowy ;) ?
  • #23 21745264
    _jta_
    Specjalista elektronik
    Posty: 48957
    Pomógł: 3205
    Ocena: 4225
    Może nie trzeba kupować, może są uszkodzone 2 z 4 kanałów, a 2 są sprawne, może te uszkodzone mają przerwaną ścieżkę i można zlutować... tylko trzeba poświęcić trochę czasu i posprawdzać.
  • #24 21749976
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Mam nową płytkę - taką samą. Polutowałem złącza bez problemów (a przynajmniej nie zauważyłem takowych).
    Przed podaniem napięć 5 i 3.3V chciałbym zapytać jak prawidłowo sprawdzić. Domyślam się, że to nie jest technologia kosmiczna, ale chciałbym uniknąć ew. błędów, któ©e uszkodziły(?) moją poprzednia płytkę.

    Pomierzyłem sobie też połaćzenia na płytce. Wygląda to jak na załączonym obrazku:

    Ręczny schemat połączeń płyty, pokazujący złącza HV i LV oraz GND na papierze

    Moje pytanie: w jakiej kolejności podawać napięcia i GND na poszczególne złącza (o ile ma to znaczenie), żeby na 100% nei uszkodzić układu.
  • #25 21749989
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    Wg twojego rysunku oporniki są równolegle do siebie i 3 tranzystory mają zwarte piny same ze sobą. Nie wygląda to dobrze.
    Przeczytaj co masz nadrukowane na tranzystorach, czy na 4. jest to samo i spróbuj znaleźć ich model dokumentacje, (wpisz googla model + smd marking)
  • #26 21749995
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Zapomniałem dodać, że narysowałem połączenia na podstawie pipczenia miernika, a nie z przebiegu ścieżek na płytce. Może te tranzystory są pozwierana bo tak to wynika z ich aktualnego stanu? (sprawdzałem bez podawania jakichkilwiek napięć)

    Dodano po 2 [godziny] 15 [minuty]:

    Temat chyba do zamknięcia: okazało się, że druga taka sama płytka zachowuje się dokładnie tak samo.
    Nie jestem w stanie powiedzieć czy to wada fabryczna czy co - w każdym przestrzegam.

    Ciekawe, że nie mogę tych płytek znleźć na Aliexpress-e. Jest kilka bardzo podobnych, m.in. ta której zdjęcie zmaieściłem na samym początku tego wątku. Ktoś dopiero zwrócił uwagę, że mam inną. Cecha charakterystyczna - 4 pary oporników '103' obok siebie. Na innych płytkach rezystorów jest też 8, ale zgrupowane po 4, a pomiędzy nimi rządek tranzystorów.
  • Pomocny post
    #27 21750119
    gps79
    Poziom 37  
    Posty: 2190
    Pomógł: 495
    Ocena: 793
    240sx napisał:
    Cecha charakterystyczna - 4 pary oporników '103' obok siebie.

    To bez znaczenia. Powinieneś się spodziewać takich połączeń na płytce.
    Schemat układu poziomowania napięcia z tranzystorami MOSFET i rezystorami 10K

    Dodano po 1 [godziny] 4 [minuty]:

    gps79 napisał:
    To bez znaczenia.

    Wygląda na to, że jednak ma to znaczenie.
    Zdaje się, że płytka z dwoma rzędami rezystorów nie jest odmianą popularnego schematu konwertera poziomów z innym ułożeniem elementów, a błędnym montażem tego samego układu PCB.
    Jeśli się przyjrzeć dokładniej płytkom z obu PCB, to okazuje się, że tranzystory zostały wlutowane w miejsce rezystorów, a rezystory w miejsce tranzystorów.
    Taka płytka (z dwoma rzędami rezystorów) po prostu nie będzie działać.
    Kilka płytek konwertera poziomów logicznych; jedna z nich błędnie zmontowana
    To by też tłumaczyło, dlaczego Autor zmierzył zwarcia w dziwnych miejscach (post #24).

    Wg mnie, płytka Autora powinna być zmontowana tak:
    Ręcznie naszkicowany schemat konwertera poziomów napięcia z wlutowanymi elementami
  • #28 21750306
    240sx
    Poziom 10  
    Posty: 361
    Ocena: 65
    Gps79 - jesteś wielki!
  • #29 21751709
    jarekgol
    Poziom 40  
    Posty: 5151
    Pomógł: 642
    Ocena: 1138
    O kwa-kwa Chińczyk pożałował białej farby na obrys tranzystora i niespodzianka :) dobre oko @gps79
    @240sx jeśli przelutujesz, to daj znać czy zadziałało. Jak zdejmiesz elementy to może wrzuć zdjęcia płytki i ścieżek dla potomnych.

Podsumowanie tematu

✨ Dyskusja dotyczy prawidłowego podłączenia konwertera poziomów logicznych I2C między Arduino (5 V) a wyświetlaczem OLED SSD1306 (3,3 V). Problemem jest nieprawidłowe działanie konwertera, który nie obniża napięcia z 5 V do 3,3 V na liniach I2C (SDA, SCL). Użytkownik stosuje konwerter dwukierunkowy z tranzystorami i rezystorami, jednak pomiary wskazują na brak oczekiwanych napięć na kanałach LV1 i LV2, co sugeruje uszkodzenie lub błędny montaż elementów. Wskazano, że linie I2C są dwukierunkowe i wymagają odpowiedniego układu tranzystorów oraz rezystorów pull-up (np. 10 kΩ). Dyskutowano także o charakterystyce wyjść Arduino, które nie są typowymi open-collector, lecz działają w trybie push-pull z przełączaniem pinów między wejściem a wyjściem, co komplikuje bezpośrednie stosowanie prostych dzielników napięć. Zaproponowano użycie konwertera opartego na układzie TXS0108E jako alternatywę. Ostatecznie wykryto, że problemem jest błędny montaż konwertera – tranzystory i rezystory zostały zamienione miejscami na płytce PCB, co powoduje nieprawidłowe działanie i zwarcia. Zalecane jest sprawdzenie oznaczeń elementów SMD i ich poprawne wlutowanie, a także testowanie kanałów konwertera poprzez zwieranie linii do masy i pomiar napięć na odpowiednich pinach. Podano również wskazówki dotyczące kolejności podłączania napięć i masy, aby uniknąć uszkodzenia układu.
Wygenerowane przez model językowy.
REKLAMA