Odczyt danych z magnetometru za pomocą Raspberry Pi i nakładki Digilent MCC 118 DAQ

Firma Digilent niedawno wprowadziła do oferty moduły MCC DAQ dla Raspbbery Pi. Produkty pozwalają na precyzyjne pomiary napięcia, sygnałów z termopar, a także czujników piezoelektrycznych w standardzie IEPE. Zawierają również analogowe i cyfrowe wejścia i wyjścia.

Rozwiązania zaprojektowane do zastosowań testowych i pomiarowych są zgodne ze standardem Raspberry Pi HAT (Hardware Attached on Top). Nakładki MCC DAQ zapewniają wszystkie funkcje akwizycji danych w niewielkim formacie, pozwalającym na rozbudowę „w górę”, w postaci stosu.

W artykule zaprezentujemy aplikację modułu akwizycji danych z wejściami pomiaru napięcia MCC 118 Voltage Measurement DAQ HAT w połączeniu z płytką Raspberry Pi. Przykład ilustruje jak można odczytać sygnał z czujnika pola magnetycznego z wyjściem liniowym.

Elementy sprzętowe przykładu

Oprogramowanie

Konfiguracja oprogramowania

Aby pracować z nakładką MCC DAQ 118 na Raspberry Pi, należy w pierwszej kolejności zainstalować biblioteki dostarczone przez producenta.

Oto instrukcja krok po kroku:

  1. Otwórz okno terminala, jeśli używasz interfejsu graficznego i zaktualizuj listę pakietów:
  1. Opcjonalnie: zaktualizuj wszystkie pakiety i uruchom ponownie system:
  1. Jeśli jeszcze go nie masz, zainstaluj pakiet git:
  1. Za pomocą gita ściągnij pakiet producenta do obsługi nakładki do katalogu domowego:
  1. Zainstaluj ściągniętą bibliotekę. Instalator zapyta czy chcesz zainstalować Pythona w wersji 2 i 3.
Jeśli chcesz zaktualizować firmware albo dowiedzieć się więcej o nakładce MCC 118 możesz wejść na stronę MCC DAQ HAT Library documentation.

Konfiguracja sprzętowa

Do tego projektu, oprócz Raspberry Pi i MCC 118, będziemy potrzebować jeszcze kilku elementów. Trzeba zbudować układ czujnika pola magnetycznego na podstawie sensora AD22151 (czujnik pola magnetycznego), trzech rezystorów, których oporności dobierzemy później, kondensatora 0,1 µF, płytki uniwersalnej i kilku kabelków połączeniowych. Do tego projektu wykorzystamy konfigurację pierwszą opisaną przez producenta w karcie katalogowej (Karta katalogowa AD22151).

R1 to rezystor używany do kompensacji wpływu zmian temperatury. Wartość 10 kΩ dobrano na podstawie dostarczonego wykresu, aby skompensować niewielkie odchylenia temperatury.

Rezystory R2 i R3 służą do ustawienia wzmocnienia obwodu. Wartości wybrano po wykonaniu obliczeń wg wzoru podanego poniżej. Wartość R3 wynosi 100 kΩ, a dla R2 po wykonaniu obliczeń wybrano wartość 2,2 kΩ. W ten sposób uzyskuje się wzmocnienie około 19 mV/G.

 

Teraz, gdy zbudowaliśmy już obwód pomiarowy, musimy dostarczyć mu zasilanie. Do napięcia 5 V i masy służą porty GPIO, a konkretnie pin 4 dla 5 V i pin 6 dla masy.

Ostatnim krokiem konfiguracji sprzętowej jest podłączenie wyjścia czujnika do jednego z kanałów MCC 118. W naszym przypadku wykorzystamy kanał 0. Napięcie na wyjściu mieści się w zakresie od 0 do 5 V, a wartość 2,5 V reprezentuje próg między dodatnią i ujemną wartością. W dalszej części artykułu, w części dotyczącej działania programu, wspominamy jak można zmodyfikować kod, aby móc podłączyć kilka czujników na raz.

 

Po wykonaniu powyższych kroków Twój obwód powinien wyglądać podobnie do tego na obrazku.

Kod programu

Po zmontowaniu komponentów i instalacji bibliotek, należy zapisać w tym samym folderze dwa pliki składające się na projekt. Plik daqhats_utils.py pochodzi z repozytorium folderu z przykładami, gdzie można go znaleźć w folderze daqhats, który jest instalowany po wykonaniu czynności związanych z instalacją bibliotek za pomocą pakietu git. Natomiast plik scan.py to główny plik projektu.

Oba pliki są dostępne poniżej w sekcji Do pobrania.

W dalszej części artykułu opiszemy strukturę programu w pliku scan.py.

Import bibliotek

Do wykonania pomiaru potrzebujemy jeszcze dostępu do kilku funkcji z bibliotek z repozytorium, a także pliku daqhats_utils. Importujemy całą klasę mcc118 i kilka funkcji pomocniczych. Moduł OptionFlags służy do ustawienia trybu skanowania wartości dostarczanych przez kanały na nakładce Raspberry Pi. Natomiast do rozpoznania identyfikatorów i kodów błędów użyjemy funkcji HatIDs i HatError.

Deklaracje stałych i wydruk informacji

Do wyznaczenia wartości natężenia pola magnetycznego wykorzystujemy dwie stałe: gain_constant i v_ref. Stała gain_constant jest określana przez powyższy wzór. W zależności od wzmocnienia konkretnego obwodu, należy tą stałą zmienić. Jest ona równa odwrotności obliczonego wzmocnienia (1/gain). Stała v_ref to napięcie odniesienia dla punktu zerowego natężenia pola magnetycznego. Napięcia powyżej v_ref oznaczają dodatnie pole, napięcia poniżej – pola ujemne. Obie stałe są używane w funkcji wypisującej dane na konsolę.
Program wyświetla w terminalu wartość składającą się maksymalnie z dziesięciu cyfr oraz kolejnych pięciu cyfr po przecinku. W celu kalibracji wyjścia można odkomentować kolejną linię pozwalającą zmierzyć wartość napięcia, a następnie przypisać jej w kodzie wartość zmiennej v_ref.

W zmiennej scan_rate można ustawić częstotliwość skanowania (na kanał) przez ustawienie częstotliwości zegara wewnętrznego. Można także użyć zewnętrznego zegara o częstotliwości do 100 kHz.

Deklaracja kanałów

Używane kanały należy zadeklarować w postaci wektora. Aby dodać więcej kanałów, zmodyfikuj wektor dodając kanały, których chcesz użyć. Na przykład:
oznacza, że pomiar będzie odbywał się na wszystkich ośmiu kanałach. Wszystkie funkcje w klasie mcc118 używają wektorów do określenia używanych kanałów. Niezbędna jest im także znajomość długości wektora.

Odczyt i wyświetlanie danych

Odczyty są wykonywane w pętli, która trwa do momentu zatrzymania skanowania przez użytkownika lub wykrycia błędu przepełnienia. Odczytywane są wszystkie dostępne próbki (do osiągnięcia rozmiaru read_buffer). Ponieważ read_request_size jest ustawiona na -1 (READ_ALL_AVAILABLE), funkcja hat.a_in_scan_read zwraca natychmiast wszystkie dostępne w danym momencie próbki, natomiast parametr timeout jest ignorowany. Funkcja hat.a_in_scan_read może zwracać wiele flag: running, hardware overrun, buffer overrun, triggered i timeout, przy czym wszystkie są typu bool. Natomiast dane są listą liczb zmiennoprzecinkowych (typu float). Zwrócone dane wykorzystamy następnie do wyświetlenia informacji odczytanych z bufora.
Zmienna samples_read_per_channel służy do przechowywania indeksu listy danych, przy którym został dokonany i wyświetlony pomiar. Zmienna total_samples_read przechowuje całkowitą liczbę próbek. Te liczby są wyświetlane w formacie 12-cyfrowym.

Jeśli w buforze znajdują się próbki, program rozpocznie wyświetlanie. Wynik każdego kanału jest zapisywany jako określona wartość na liście, a pozycja dla każdej wartości jest wielokrotnością liczby użytych kanałów. Do wyświetlania używamy indeksu, który zapisuje dla każdego odczytu pozycję każdej próbki na każdym kanale.

Uruchomienie skryptu

Aby uruchomić skrypt w języku Python, otwórz terminal w folderze, w którym zapisałeś oba pliki i uruchom poniższe polecenie.

W terminalu pojawi się wówczas adres, pod którym znajduje się MCC 118, informacja o trybie jego działania, używane kanały i szybkości skanowania. Po naciśnięciu klawisza ENTER program rozpocznie skanowanie.

Interpretacja wyświetlanych danych jest następująca:

  • Samples Read to liczba wyświetlanych próbek, resetowana z powrotem do 0 po zapełnieniu bufora.
  • Scan Count to całkowita liczba odczytanych próbek; nie resetuje się, gdy bufor jest pełny i kontynuuje liczenie.
  • Channel 0 to wartość odczytana przez ten kanał. Później mogą pojawić się dane z kolejnych kanałów.

Kod źródłowy oraz więcej szczegółów można znaleźć na stronie: Raspberry Pi Magnetometer (electromaker.io)

Wyłącznym dystrybutorem edukacyjnym firmy Digilent w Polsce jest Kamami.pl

O autorze