Skocz do zawartości

I2C + Malinka - komunikacja z czujnikiem LPS331AP


Bartt

Pomocna odpowiedź

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ć?

 

 

Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

@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)

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

7 minut temu, Gieneq napisał:

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

Adresy w kodzie Arduino są zdefiniowane tutaj: https://github.com/pololu/lps331-arduino/blob/master/LPS331/LPS331.cpp#L8-L9

Ale oczywiście podane są też w nocie katalogowej.

Edytowano przez deshipu
  • Lubię! 1
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.