Bartt Napisano Kwiecień 9, 2019 Udostępnij Napisano Kwiecień 9, 2019 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 More sharing options...
deshipu Kwiecień 9, 2019 Udostępnij Kwiecień 9, 2019 (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 Kwiecień 9, 2019 przez deshipu 1 1 Link do komentarza Share on other sites More sharing options...
Bartt Kwiecień 9, 2019 Autor tematu Udostępnij Kwiecień 9, 2019 (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 Kwiecień 9, 2019 przez Bartt Link do komentarza Share on other sites More sharing options...
deshipu Kwiecień 9, 2019 Udostępnij Kwiecień 9, 2019 Zapewniam cię, że nocie katalogowej do której ten link prowadzi nic nie jest napisane z myślą o Arduino — wszystko jest wyjaśnione ogólnie. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
Popularny post Treker (Damian Szymański) Kwiecień 9, 2019 Popularny post Udostępnij Kwiecień 9, 2019 8 godzin temu, Bartt napisał: I tutaj pytanie do was czy ten kod wystarczy do samego odczytywania bieżących parametrów? Trzeba jeszcze coś dodać? @Bartt to raczej trochę za mało. Musisz najpierw "uruchomić czujnik", aby zaczął wykonywać pomiary. Odebrane dane musisz jeszcze obrobić, ponieważ ciśnienie jest zapisywane w 3 rejestrach, a temperatura w dwóch. Po odebraniu danych musisz sobie te dane "skleić", aby otrzymać użyteczne wartości. Zerknij na poniższy kod: import smbus # importujemy biblioteki import time bus = smbus.SMBus(1) # odpalamy smbus i=0 for i in range(30): # pętla 30 powtórzeń bus.write_byte_data(0x5d, 0x20, 0b10000000) # odpalamy czujnik bus.write_byte_data(0x5d, 0x21, 0b1) # aktualizujemy zawartość rejestrów print'who am I ',bus.read_byte_data(0x5d,0x0F) # wydruk zawartości rejestru "who I am" Temp_LSB = bus.read_byte_data(0x5d, 0x2b) # odczyt temperatury w dwóch kolejnych rejestrach Temp_MSB = bus.read_byte_data(0x5d, 0x2c) count = (Temp_MSB << 8) + Temp_LSB # zapisanie 16 bitowej wartości do jednej zmiennej if (count >= 0x8000): # najstarszy bit oznacza czy wartość jest + czy - count1 = -((65535-count) + 1) else: count1 = count Temp = 42.5 + (count1/480.0) # przeliczenie wartości zgodnie z dokumentacją #print"Temperatura = ",Temp ph=bus.read_byte_data(0x5d, 0x2a) # odczyt ciśnienia w trzech kolejnych rejestrach pl = bus.read_byte_data(0x5d, 0x29) pxl=bus.read_byte_data(0x5d, 0x28) print'PressOut_XL = ',pxl cis=float((((ph<<8)+pl)<<8)+pxl)/4096 # przeliczenie wartości ciśnienia zgodnie z dokumentacją print "cisnienie = ",cis time.sleep(0.5) Powyższy program pochodzi ze strony: http://raspberrypi.edu.pl/lps331ap.html Wklejam go powyżej, bo strona ta chyba ma jakieś problemy i aktualnie nie działa. 2 1 Link do komentarza Share on other sites More sharing options...
Bartt Kwiecień 10, 2019 Autor tematu Udostępnij Kwiecień 10, 2019 @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 More sharing options...
Gieneq Kwiecień 10, 2019 Udostępnij Kwiecień 10, 2019 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. 1 1 Link do komentarza Share on other sites More sharing options...
deshipu Kwiecień 10, 2019 Udostępnij Kwiecień 10, 2019 (edytowany) 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 Kwiecień 10, 2019 przez deshipu 1 Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 11, 2019 Udostępnij Kwiecień 11, 2019 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. 1 Link do komentarza Share on other sites More sharing options...
Bartt Kwiecień 16, 2019 Autor tematu Udostępnij Kwiecień 16, 2019 (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 Kwiecień 16, 2019 przez Bartt Link do komentarza Share on other sites More sharing options...
deshipu Kwiecień 16, 2019 Udostępnij Kwiecień 16, 2019 (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 Kwiecień 16, 2019 przez deshipu 1 1 Link do komentarza Share on other sites More sharing options...
ethanak Kwiecień 17, 2019 Udostępnij Kwiecień 17, 2019 Zawsze możesz użyć jakichkolwiek mechanizmów blokowania - w przypadku kilku programów działających równolegle np. flock. 1 1 Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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ę »