Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 11 mar 2026, o 20:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 23 kwi 2014, o 18:14 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Próbuję właśnie uruchomić BMP085 w jednym ze swoich urządzeń i powoli zaczynam z tego powodu siwieć. ;)

Na samym początku, bez większego problemu udało mi się znaleźć TAKĄ OTO bibliotekę w Sieci:

Skompilowała się uruchomiła bez problemu. Wystarczyło właściwie tylko dodać pliki nagłówkowe do istniejącego projektu. Niestety moja radość nie trwała długo - okazało się, że wartość ciśnienia jest nieprawidłowa - wychodzi trochę ponad 300 HPa...

Pierwsze o czym pomyślałem to uszkodzony czujnik. Wyjąłem więc z szuflady Arduino i wgrałem TEN KOD:

Wszystko ruszyło bez najmniejszego problemu, wartości były prawidłowe (a przynajmniej prawdopodobne).

Zabrałem się więc za porównywanie kodu zawartego w obydwu bibliotekach. Odczytywanie danych kalibracyjnych wygląda praktycznie tak samo, podobnie jak końcowa konwersja.

Jedyny fragment, w którym mógłbym się czegoś dopatrywać to odczyt wartości ciśnienia ze scalaka. W bibliotece dla AVR wygląda to następująco:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja bmp085ReadShort zwraca uint16_t, a więc czytane są tylko dwa bajty.

Natomiast w kodzie na Arduino znajduje się następujący fragment:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jak widać odczytywane są tutaj trzy jednobajtowe (char) zmienne, które potem są konwertowane do zwracanej wartości unsigned long.

Czy moja dedukcja jest prawidłowa? A może to nie ma nic do rzeczy i źródła problemu powinienem szukać gdzie indziej?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 20:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Spróbuj jeszcze odpalić bibliotekę z tej strony:
http://davidegironi.blogspot.com/2012/10/avr-atmega-bmp085-pressure-sensor.html#.U1gNuB8o6ds



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 20:24 
Offline
Użytkownik

Dołączył(a): 21 sty 2014
Posty: 75
Pomógł: 0

Podaj cały kod main.c bo z tego co podałeś nic nie wynika.

Aby odczytać wartość ciśnienia z tego czujnika trzeba najpierw pobrać kilka parametrów kalibracyjnych, następnie pobrać nieskalibrowaną wartość ciśnienia a następnie ją skalibrować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 kwi 2014, o 20:45 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

nixie napisał(a):


Wielkie dzięki. Uruchomiłem tę bibliotekę.
Dzieje się coś dziwniejszego, niż myślałem. Dostaję tą samą, dziwną wartość co ostatnio (w tym momencie jest to 32763). Jest wysoce mało prawdopodobne, że obydwie biblioteki mają ten sam błąd, w dodatku tego kalibru. Musiałem się pomylić w innym miejscu.

Procedura wysyłania danych wygląda w tej chwili następująco:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powyższy fragment kodu mieści się wewnątrz procedury obsługującej wystąpienie konkretnej komendy AT.
Wskaźnik do łańcuch pAnswer jest przekazywany na zewnątrz, gdzie przejmuje go procedura zajmująca się odsyłaniem odpowiedzi na zapytania UDP.

Czy widać tutaj coś, co mogłoby przekłamywać wynik?

lukanio napisał(a):
Podaj cały kod main.c bo z tego co podałeś nic nie wynika.

Aby odczytać wartość ciśnienia z tego czujnika trzeba najpierw pobrać kilka parametrów kalibracyjnych, następnie pobrać nieskalibrowaną wartość ciśnienia a następnie ją skalibrować.


Od tego zwykle w bibliotekach jest osobna funkcja, którą albo umieszcza się na początku programu w pliku main.c (ja tak robiłem) albo wchodzi ona w skład jakiejś większej funkcji inicjującej, którą tak czy inaczej wywoływałem przy starcie programu. Raczej nie tu leży źródło problemu...

UPDATE

Spróbowałem jeszcze użyć następującej konstrukcji do wysyłania wyniku:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kończą mi się pomysły co do tego, gdzie szukać przyczyny...
Ktoś ma jakąś teorię, albo chociaż pomysł co mógłbym sprawdzić w następnej kolejności?

Zrobiłem jeszcze jeden test. Stworzyłem unię złożoną ze zmiennej int32_t oraz tablicy uint8_t, złożonej z czterech elementów.
Do zmiennej int32_t zapisałem wynik działania funkcji bmp085_getpressure.
Następnie wykonałem operację memcpy(pAnswer, unia.zmienna_tablicowa, 4). Jedno miejsce wyżej w pAnswer zapisałem 0. Wynik wysłałem do komputera w pakiecie UDP.

Przyszło coś takiego (hex): C0 7F 01.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2014, o 07:48 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Źródło problemu okazało się być banalne. Mianowicie do konwersji liczby na ASCII używałem funkcji itoa(), która przyjmuje jako argument int16_t. Natomiast wartość ciśnienia jest przechowywana w uint32_t. Przy konwersji typów tracona była część danych.
Nie dostrzegłem tego, ponieważ stosując sprintf_P pomyliłem się w podobny sposób, dając %d zamiast %ld. Nie dostrzegłem tej pomyłki, więc stwierdziłem, że błąd musi występować gdzieś wcześniej.

Teraz wszystko działa. Postanowiłem wszystkie wartości, w których może występować ułamek przemnożyć tak, żeby zwracana była liczba całkowita. Oszczędzi mi to zabawy z liczbami zmiennoprzecinkowymi. Zależy mi na jak najszybszym wysłaniu odczytanej wartości. Konwersją do bardziej czytelnych jednostek będzie mógł się zając 32bitowy CPU po drugiej stronie kabla.

W następnej wersji projektu chciałbym jednak zastosować wyświetlacz, na którym byłyby wyświetlane odczytywane periodycznie wyniki pomiarów. Trzeba będzie więc co jakiś czas wyświetlić liczbę z ułamkiem. Nie chcę stosować liczb zmiennoprzecinkowych w sprintpf(), bo to zużywa dodatkową pamięć. Wiem, że była jakaś sztuczka, pozwalająca na umieszczenie części całkowitej i ułamka w dwóch osobnych intach, a następnie przesłanie ich do wyświetlacza za pomocą standardowych komend.
Ktoś pamięta ten kod? Widziałem go w którejś książce, ale nie mogę się go teraz doszukać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2014, o 11:50 
Offline
Użytkownik

Dołączył(a): 21 sty 2014
Posty: 75
Pomógł: 0

A powiedz mi, jak zasilasz ten moduł? Bo z tego co widzę to on potrzebuje 3.3V.

Pytam bo właśnie listonosz mi przyniósł paczkę z eBay'a i zaraz będę brał się za testowanie tego czujnika.

Pozdrawiam
Łukasz



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2014, o 13:04 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

lukanio napisał(a):
A powiedz mi, jak zasilasz ten moduł? Bo z tego co widzę to on potrzebuje 3.3V.

Pytam bo właśnie listonosz mi przyniósł paczkę z eBay'a i zaraz będę brał się za testowanie tego czujnika.


Sam czujnik potrzebuje zasilania w granicach bodajże 1,6V-3,3V.
Na Allegro są jednak dostępne płytki z czujnikiem i stabilizatorem. Właśnie takiej płytki użyłem. Na PCB znajduje się także kondensator filtrujący zasilanie oraz rezystory podciągające linie sygnałowe do 3,3V. Taka płytka wymaga zasilania napięciem 5V. Oczywiście nic nie stoi na przeszkodzie, żeby wylutować stabilizator, zmostkować pady i zasilać całość z systemowej linii zasilania 3,3V.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2014, o 13:20 
Offline
Użytkownik

Dołączył(a): 21 sty 2014
Posty: 75
Pomógł: 0

Masz coś takiego?

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 kwi 2014, o 13:32 
Offline
Użytkownik

Dołączył(a): 05 gru 2013
Posty: 246
Pomógł: 0

Tak, tylko w nieco innej wersji:
http://allegro.pl/modul-bmp085-czujnik- ... 80194.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO