Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] Zmiana adresów czujników I2C

27 Paź 2019 17:45 384 14
  • Poziom 14  
    Witam
    ostatnio udało mi się dostać , enkoder absolutny AS5600. Ma on 12 bitowa rozdzielczość itd., ale nie o tym chciałem napisać.
    https://ams.com/documents/20143/36005/AS5600_DS000365_5-00.pdf
    Enkoder posiada wyjście analogowe lub PWM. Można tez czytac go za pomoca I2C, co okazało się najbardziej niezawodne. Chciałbym czytać jednocześnie kilka takich czujników, ale ich adres jest zawsze 0x36. I2C służy tu do programowania enkodera. Czy istnieje możliwość zmiany adresu takiego enkodera?
  • PCBway
  • Pomocny post
    Poziom 35  
    Niestety, nie można zmienić tego adresu, ale możesz rozważyć zastosowanie multipleksera I2C np. TCA9548A.
  • PCBway
  • Poziom 14  
    Świetna rada, dziękuję. Jutro rano zamawiam.
  • Poziom 14  
    Jutro, powinna dojść już przesyłka z botlanda, także od razu spróbuję wykonać testy. Wczoraj jeszcze próbowałem uzyskać precyzję na odczycie sygnału PWM, ale też do bezpośredniego odczytu z rejestru przez I2C, to się chowa, były spore rozbieżności w odczycie pozycji.
  • Poziom 14  
    Planuję do ESP32, temat powiązany z https://www.elektroda.pl/rtvforum/topic3614563.html Całkowicie przerabiam konstrukcję i też chciałbym aby pozycje danych osi były zapamiętane

    Dodano po 4 [godziny] 14 [minuty]:

    Czy tak powinien wyglądać poprawny odczyt z dwóch czujników AS5600?
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Na razie przygotowuję sobie kod, na podstawie tego co wyczytałem w sieci. Zastanawia mnie tylko skąd multiplekser wie, że AS5600 ma adres 0x36, jeżeli nie jest to nigdzie podane w kodzie
  • Pomocny post
    Poziom 35  
    madiz08 napisał:
    Czy tak powinien wyglądać poprawny odczyt z dwóch czujników AS5600?

    Wskaż proszę o jaką konkretnie bibliotekę chodzi do obsługi multipleksera.
  • Pomocny post
    Poziom 35  
    Zamiast
    Kod: c
    Zaloguj się, aby zobaczyć kod

    powinno być:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Odpowiedni kanał I2C jest już wybrany przez switchToBus(), więc komunikujesz się bezpośrednio z enkoderem.
    Ale oczywiście sprawdź to ;)

    Dodano po 5 [minuty]:

    To samo dotyczy Wire.requestFrom(). W tym wypadku też dobrze jest poprzedzić odczyt z I2C sprawdzeniem (z oczekiwaniem) przez Wire.available(), czy faktycznie żądana liczba bajtów nadeszła.
  • Poziom 14  
    Jest sukces! Także kolejny raz dziękuję za pomoc :)
    Zmiana adresów czujników I2C
    Od razu wyfrezowałem sobie płytkę pod multiplekser, podłączając na razie dwa enkodery na ekranowanych przewodach każdy po 1,5m i lekko poprawiając kod (dokładnie tak jak wskazałeś), wynik wyszedł idealnie :)
    Teraz jeszcze tylko odpowiednio muszę zamontować pięć takich na:
    Zmiana adresów czujników I2C
    i spróbuję wprowadzić odczyty pozycji na drugim procesorze, jeżeli oczywiście nie będzie zakłóceń

    Dodano po 4 [minuty]:

    Poprawny kod na odczyt, jeżeli ktoś by potrzebował (oczywiście dla większej ilości enkoderów warto zrobić pętlę for), wygląda następująco:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Ogólnie, dziwi mnie trochę, że te enkoderki (10zł z przesyłką) są tak mało popularne. Nie dość że maja 12-bitowa rozdzielczość, to jeszcze są absolutne, czyli po utracie zasilania i ponownym włączeniu znają swój kąt położenia
  • Poziom 35  
    madiz08 napisał:
    wynik wyszedł idealnie

    Bardzo się cieszę.

    madiz08 napisał:
    Poprawny kod na odczyt, jeżeli ktoś by potrzebował

    Aż się prosi o funkcję :)
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 14  
    Sporo roboty było z odpowiednim "zaekranowaniem" enkoderów ale efekt na prawdę fajny:
    https://youtu.be/wx_8WDe-jAI
    Przed startem robot całkowicie wyłączony z zasilania. Po załączeniu zasilania, wysłałem komendę dojazdu do pozycji zerowych i jak widać wszystkie (na razie tylko 4) osie dojechały perfekcyjnie do pozycji domowej, także świetnie! :)
    Jeszcze przed zamknięciem tematu chciałbym podpytać czy napisany program jest optymalny.
    Zmiana adresów czujników I2C
    Na chwilę obecną podłączenie sterowania wyglada tak jak na zdjeciu powyżej. Ponizej wstawiam kod odczytu. Wszystko przerabiane przez drugi procesor:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Zależy mi, żeby uzyskać odczyt co najmniej 10 razy na sekundę. Teoretycznie 20ms daje 50 odczytów na sekundę. Postanowiłem sprawdzić jak wygląda to na oscyloskopie. Najpierw sprawdziłem przewód łączący SDA z SDA:
    Zmiana adresów czujników I2C
    5ms na wymiane danych, czyli łącznie mam okres 25ms (40 razy na sekundę), myślę sobie świetnie!, ale jak sprawdziłem co się dzieje na złączu SCL-SCL to już sam nie wiem:

    Zmiana adresów czujników I2C
    Na powyższym zdjęciu działka na oscyloskopie ustawiona jest na 20ms. Jak widać na prawo gdzie widzimy tylko szpikli, to są one co około 23ms, ale bardzo często pojawia się takie coś jak po lewej stronie.
    Jak ekran był słabo wykonany, to na serial monitorze mogłem zauważyć, że odczyty były nieprawidłowe oraz czasami te odczyty pozycji były bardzo nierówne, czasami bardzo długie do ponad sekundy.

    Zmiana adresów czujników I2C
    Znalazłem coś takiego jak powyżej. Czy to oznacza, że mikrokontroler wymienia dane z multiplekserem tylko przez SDA? i nie ma się czym martwić, że na SCL wykres jest tak nieregularny.
    Z tego obrazku wynika, że dane do mikrokontrolera mogą być przesyłane jedynie przez SDA
  • Poziom 35  
    madiz08 napisał:
    wynika, że dane do mikrokontrolera mogą być przesyłane jedynie przez SDA

    Tak. Z DS dla tego enkodera wynika, że on może pracować w trybie Fast-mode Plus, z kolei dla TCA9548A maksymalna częstotliwość linii SCL to 400 kHz. Jaką masz w tej chwili ustawioną prędkość Wire dla ESP32? Domyślnie jest 100 kHz.
    https://github.com/espressif/arduino-esp32/blob/master/libraries/Wire/src/Wire.h

    madiz08 napisał:
    //WYKORZYSTANIE DRUGIEGO PROCESORA!!!

    Nie szalej :) W Arduino HAL dla ESP32 drugi rdzeń jest domyślnie wykorzystywany, na pierwszym wykonują się operacje WiFi (też domyślnie).

    Dodano po 13 [minuty]:

    Za dużo masz tych Serial.print() w zadaniu, które ma się wykonywać co 20 ms. To momentami może prowadzić do sytuacji, że któreś z zadań będą opóźniane. Spróbuj wykonać testy bez tych Serial.print().
  • Poziom 14  
    Dobrze, spróbuję bez serial print-ów i zobaczymy. Ogólnie serial mam ustawiony na 500000. Jaka jest ustawiona częstotliwość tego nie wiem, nawet nie wiedziałem, że można to zmienić. Pewnie jest ustawione domyślnie, ale sprawdzę po pracy.
  • Poziom 14  
    Wyeliminowanie Serial.print-ów niewiele zmieniło niestety, ale linia SDA wydaje się być w miarę stabilna. Przy szybszych ruchach robota, pojawiają się sporadycznie zakłócenia, ale to już niestety inny problem. Ogólnie temat rozwiązany także jeszcze raz wielkie dzięki za pomoc.