Skocz do zawartości

I2C + Malinka - komunikacja z czujnikiem LPS331AP


Pomocna odpowiedź

Napisano

Witam, posiadam czujnik Pololu LPS331AP i malinkę.

1. Od jakiegoś czasu próbuję połączyć go z RPI i odczytywać dane za pomocą kodu w Pythonie.

I tu właśnie pojawia się problem, jest w stanie ktoś z wyjaśnić jak wygląda komunikacja przez I2C?

Szukałem trochę w internecie i postanowiłem użyć biblioteki smbus2

Z tego co zrozumiałem trzeba użyć czegoś w tym stylu: 

from smbus2 import SMBus

bus = SMBus(1)
b = bus.read_byte_data(80, 0)
print(b)
bus.close()

 

I tutaj pytanie do was czy ten kod wystarczy do samego odczytywania bieżących parametrów? Trzeba jeszcze coś dodać?

 

 

(edytowany)

Na stronie produktu masz wielki czerwony link "dokumentacja" — tam jest dokładnie opisane co trzeba do tego czujnika wysłać i jak odpowiedzi odebrać.

Edytowano przez deshipu
  • Lubię! 1
  • Nie zgadzam się! 1
(edytowany)
1 godzinę temu, deshipu napisał:

Na stronie produktu masz wielki czerwony link "dokumentacja" — tam jest dokładnie opisane co trzeba do tego czujnika wysłać i jak odpowiedzi odebrać.

Ale tam wszystko jest napisane z myślą o Arduino, a tu mówimy o malince(chodzi mi bardziej o kwestie softu), no chyba że jestem ślepy...

Edytowano przez Bartt

@Treker Dzięki, wiesz może jeszcze skąd wzięły się te trzecie wartości?

Z tego co wiem powinny to być dane ale dlaczego akurat takie to nie mam pojęcia...

bus.write_byte_data(0x5d, 0x20, 0b10000000) 
bus.write_byte_data(0x5d, 0x21, 0b1)

 

Może trochę inżynierii odwrotnej pomoże w tym zadaniu:

Tu masz bibliotekę do Arduino, plik cpp i plik nagłówkowy h. W pliku nagłówkowym masz ładnie ponazywane rejestry, zaś w pliku cpp możesz sobie odtworzyć kolejność operacji na rejestrach i jakie wartości powinny przyjmować.

2 godziny temu, Bartt napisał:

Z tego co wiem powinny to być dane ale dlaczego akurat takie to nie mam pojęcia

Rejest 0x20 to rejestr kontrolny (CTRL_REG1), bit który jest na pozycji 7 to PD (Power down), gdy jest 1 to urządzenie się włącza (dokumentacja strona 20).

void LPS331::enableDefault(void)
{
  // active mode, 12.5 Hz output data rate
  writeReg(LPS331_CTRL_REG1, 0b11100000);
}

W kodzie Arduino który wkleiłem ustawiono jeszcze bit 6 i 5. Dlatego że jest to przykład gdzie z częstotliwością 12,5Hz wyzwalane są pomiary. Domyslnie jest tam 0 i 0 i w takim przypadku pomiar wyzwalany jest na żądanie (dokumentacja storna 21).

0x21 to też rejestr kontrolny numer 2 (CTRL_REG2), którego bit 0 oznaczono ONE_SHOT czyli pojedyncze wyzwolenie pomiaru - po zakończeniu ustawia się na 0 i czeka na kolejne. Dokumentacja strona 22. Czyli ustawiając tę wartość wyzwalasz pomiar, a że w pętli to po prostu 30 razy.

Adres 0x5d nie wiem skąd się wziął bo jak przyjrzysz się wyszukiwaniu adresu w kodzie Arduino to nie ma tam czegoś takiego.

2 godziny temu, Bartt napisał:

Z tego co wiem powinny to być dane

Pierwsze to adres urządzenia, drugie to komenda/rejestr docelowy (masz je wypisane w mapie rejestrów), trzecie to wartość w tym przypadku 8 bitowa.

Myślę że najlepiej jak przekujesz bibliotekę Arduino na własne potrzeby.

  • Lubię! 1
  • Pomogłeś! 1
Dnia 10.04.2019 o 14:41, Bartt napisał:

@Treker Dzięki, wiesz może jeszcze skąd wzięły się te trzecie wartości?

Z tego co wiem powinny to być dane ale dlaczego akurat takie to nie mam pojęcia...

Trzecie, czyli której? 😉

Funkcja write_byte_data przyjmuje trzy argumenty: adres urządzenia, offset oraz dane, które mają być wysłane. Fragment, który cytujesz oznacza zwyczajnie ustawienie "1" w rejestrach 0x20, 0x21 urządzenia z adresem 0x5d.

  • Pomogłeś! 1
(edytowany)

@Treker @Gieneq A jeszcze takie pytanie związane z I2C. 

Jeśli podepnę pod Malinkę dwa czujniki (działające na I2C)  i doprowadzę do sytuacji w której będą JEDNOCZEŚNIE funkcjonowały dwa oddzielne programy (po jednym pod jeden czujnik) to czy mogą pojawić się jakieś kłopoty (I2C to w końcu half-duplex i jeśli doszłoby do  sytuacji w której jeden program wysyłałby coś do jednego czujnika, a drugi odczytywał coś z drugiego to wydaję mi się że doszłoby do konfliktu?) Mam rację? 

 

Edytowano przez Bartt
(edytowany)

Masz rację, nie rób tak.

Poprawka: masz rację, ale nie do końca, bo Linux tu trochę pomaga i nakłada na magistralę blokadę do czasu wykonania się transakcji. Zatem dopóki twoje programy nie będą się opierać na stanie w jakim znajduje się czujnik pomiędzy transakcjami (na przykład każdy program będzie komunikował się tylko ze "swoim" czujnikiem), to powinno być dobrze.

Edytowano przez deshipu
  • Lubię! 1
  • Pomogłeś! 1

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ę »
×
×
  • Utwórz nowe...