BME280 – czujnik temperatury, wilgotności oraz ciśnienia (część 2)

Artykuł opisuje funkcje i zastosowanie czujnika temperatury, ciśnienia i wilgotności BME280. W drugiej części zaprezentowano praktyczny przykład obsługi sensora przy pomocy zestawu rozwojowego ARIS Edge S3A3 z mikrokontrolerem Renesas Synergy S3A3.
 Zachęcamy do przeczytania pierwszej części artykułu dostępnej na portalu: https://mikrokontroler.pl/2020/01/09/bme280-czujnik-temperatury-wilgotnosci-oraz-cisnienia-czesc-1/

Testy praktyczne

Do testowania czujnika została wybrana płytka ewaluacyjna Aris Edge S3A3 połączona z wyświetlaczem LCD. Głównym elementem modułu jest mikrokontroler Renesas Synergy z rodziny S3 o oznaczeniu R7FS3A37A3A01CFM. Renesas Synergy S3 jest oparty o rdzeń ARM Cortex-M4 taktowany maksymalną częstotliwością 48 MHz. Mikrokontroler R7FS3A37A3A01CFM zamontowany w module Aris Edge S3A3 jest umieszczony w 64-pinowej obudowie LQFP do montażu powierzchniowego i ma wbudowane 512 KB pamięci programu Flash, 96 KB pamięci danych SRAM, a także 8 KB stałej pamięci danych Flash. Mamy tu również do dyspozycji 52 linie I/O, 6 kanałów uniwersalnego interfejsu komunikacyjnego SCI, po 2 interfejsy SPI i I2C, 14-bitowy przetwornik ADC z maksymalnie 18 kanałami pomiarowymi, 12-bitowy przetwornik DAC, interfejs USB FS, oraz liczniki PWM o rozdzielczości 16 i 32 bity, a także 4 kanały DMA. Jest też moduł DTC (Data Transfer Controller), który z punktu widzenia użytkownika działa jak kanał DMA obsługujący dużą ilość transferów.

Wyposażenie Aris Edge S3A3

Pomimo dość kompaktowych wymiarów – 70 x 53 mm – oprócz mikrokontrolera i układu debuggera, na płytce umieszczono dwa rzędy wyprowadzeń zgodnych ze standardem Arduino, a ponadto szereg ciekawych układów peryferyjnych:

  • Moduł komunikacyjny MGM111 realizujący komunikację z wykorzystaniem protokołów Bluetooth Low Energy, Thread i ZigBee,
  • Czujnik temperatury i wilgotności i ciśnienia atmosferycznego Bosch BME280,
  • Sensor natężenia światła AMS TSL25711FN,
  • Czujnik położenia MEMS Bosch BNO055.

Jak w większości tego typu modułów został wyposażony w układ programatora/debuggera J-Link firmy Segger komunikujący się z komputerem za pomocą interfejsu USB (złącze mini-USB). J-Link jest wspierany przez środowisko e2studio bezpłatnie dystrybuowane przez firmę Renesas.

Zgodność ze standardem Arduino umożliwia dołączenie wielu układów (płytek) rozszerzeń przeznaczonych dla tego standardu. Producent modułu mikrokontrolera oferuje własny moduł kolorowego graficznego wyświetlacza TFT zintegrowanego z rezystancyjnym panelem dotykowym,  sprzętowo zgodny z Arduino.

Obie płytki mikrokontrolera i wyświetlacza można połączyć ze sobą. Do połączenia wykorzystuje się szpilki umieszczone pod spodem płytki mikrokontrolera. Górne złącza (gniazda) pozostają wolne i można do nich podłączać dodatkowe moduły rozszerzeń. Na rysunku 20 pokazano widok połączonych modułów z uruchomiona fabryczną aplikacją demonstracyjną mierzącą temperaturę, ciśnienie i wilgotność z czujnika BME280.

Rysunek 20. Zestaw testowy Aris Edge S3A3

Program testowy

Zestaw testowy ma wszystko co nam potrzeba: 32 bitowy wydajny mikrokontroler z programatorem-debuggerem, wbudowany czujnik BME280 i wyświetlacz LCD do prezentacji wyników pomiarów z sensora. Jako środowisko projektowe wykorzystamy e2studio z firmowymi bibliotekami SSP.

Pomimo, że firmowy program demonstracyjny mierzy i wyświetla dane z sensora, to nie wykorzystywałem zawartych tam procedur mimo, że dostępne są kody źródłowe. Rozbudowane firmowe programy demonstracyjne są atrakcyjne i funkcjonalne, ale im bardziej skomplikowane, tym mniejszy z nich pożytek. Bez dokładnej dokumentacji użytych procedur i działania całości, która zazwyczaj jest niedostępna, czas który trzeba poświecić na analizę skomplikowanego kodu jest bardzo długi. W naszym przypadku do testowania sensora BME280 potrzebujemy drivera magistrali I2C warstwy HAL dostępnego w bibliotece SSP, a także kilku funkcji napisanych na podstawie informacji, które podałem wyżej. Konfiguracja, a potem użycie drivera magistrali I2C, jest stosunkowo prosta przy założeniu, że wykorzystamy konfigurator Synergy Configuration wbudowany w środowisko e2studio.

Interfejs I2C – implementacja w środowisku e2studio

Projektanci wybranego modułu wybrali na stałe magistrale I2C i adres slave równy 0x77 – rysunek 21. Musimy się do tego wyboru dostosować. Mikrokontroler będzie pracował  w magistrali I2C  jako układ Master.

Rysunek 21. Konfiguracja sprzętowa na płytce testowej

W mikrokontrolerach Renesas Synergy z rodziny S3 interfejs I2C może być realizowany na dwa sposoby. Pierwszy z nich to skonfigurowanie uniwersalnego interfejsu SCI jako I2C z pewnymi uproszczeniami, a drugi to użycie natywnego pełnego interfejsu I2C. Jeżeli popatrzymy na schemat płytki Aris EDGE, to widać, że wyprowadzenia linii SDA są podłączone do portu P206, a linii SCL do portu P205. To sztywne połączenie elektryczne determinuje wybór interfejsu. Nie możemy wybrać SCI pracującego w trybie I2C. Linie P205 i P206 są przypisane do natywnego interfejsu I2C1 i taki musi być użyty do obsługi modułu.

Środowisko e2studio

Jak już wspomniałem użyjemy środowiska e2studio z konfiguratorem Synergy Configurator. Tworzenie nowego projektu jest standardowe i było już opisywane. Dlatego nie będę tego opisu powielał. Dokładne informacje można znaleźć w pliku pomocy e2studio. Przejdźmy od razu do konfiguratora Synergy Configuration i konfiguracji drivera I2C. W pierwszym kroku wybieramy zakładkę Threads. Dla uproszczenia nie będzie tu wykorzystywany system RTOS i dlatego driver zostanie skonfigurowany w domyślnym „wątku” HAL/Common. Wybierany w oknie HAL/Common Stacks ikonę New Stack i w rozwijanym menu wybieramy: New Stack-> Driver->Connectivity-> I2C Master Driver on r_iic – rysunek 22.

Rysunek 22. Wybór drivera interfejsu I2C

Dodany driver pojawia się w oknie HAL/Common Stacks i można go skonfigurować w oknie Properties. W oknie Name nadajemy driverowi swoją nazwę. W naszym przypadku jest to BME280. Ta nazwa występuje potem w funkcjach drivera. Okno Channel wybiera numer kanału interfejsu I2C. Prędkość transmisji wybiera się w oknie Rate. Na początek najlepiej jest ustawić opcję Standard. Jeżeli wszystko zadziała, można eksperymentować z większymi prędkościami. Adres układu slave wpisuje się w oknie Adres Slave, a format adresu w oknie Address Mode (adres 7-bitowy). Priorytety przerwań zgłaszanych przez moduł I2C są ustawiane w 4 ostatnich oknach.

Okno Callback

Trochę szerszego opisu wymaga okno Callback. W interfejsach szeregowych, które nie maja bufora FIFO, wysłanie kolejnego bajtu na magistralę jest możliwe po zakończeniu wysyłania poprzedniego bajtu. W I2C nie ma znaczenia, czy jest to adres slave, dane wysyłane, czy dane odbierane. Dlatego funkcje wysyłające i dobierające dane muszą albo czekać na zakończenie wysyłania (funkcje blokujące), albo kończyć swoje działanie po zainicjowaniu transmisji i wprowadzać mechanizmy sygnalizacji zakończenia transmisji.

Funkcje blokujące nigdy nie są dostatecznie dobrym rozwiązaniem. Jeżeli cos pójdzie nie tak, to możemy całkowicie stracić kontrolę nad programem. Jeżeli w oknie Callback umieścimy wpis NULL, to funkcje transmisji będą się wykonywać jako blokujące. Wpisanie do Callback swojej nazwy spowoduje, że funkcje nie będą czekać na zakończenie transmisji. Użytkownik musi sam sobie napisać funkcję o nazwie z okna właściwości drivera Callback i zadbać o wykrywanie zakończenia transmisji. Opiszę ten mechanizm przy okazji opisywania działania funkcji obsługi I2C. Zastosowana konfiguracja drivera I2C została pokazana na rysunku 23.

Rysunek 23. Konfiguracja drivera I2C

W kolejnym kroku trzeba wybrać zakładkę Pins konfiguratora Synergy Configurator, a następnie ustawić wyprowadzenia interfejsu I2C tak, by był sprzętowo zgodny z płytką Arduino. Jak wiemy I2C musi używać portów P205 i P206. Zostało to pokazane na rysunku 24.

Rysunek 24. Konfiguracja wyprowadzeń I2C

Czujnik BME280 można znaleźć w sklepie Kamami.pl. Oferta obejmuje również moduły z zamontowanym sensorem.

Do pobrania

O autorze