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
- Płytka Raspberry Pi 4 Model B z pamięcią RAM 1 GB, 2 GB, 4 GB lub 8 GB,
- Moduł Digilent MCC 118 Voltage Measurement DAQ HAT,
- Czujnik pola magnetycznego z wyjściem liniowym AD22151,
- Kondensator 0,1 µF,
- Rezystory R1 = 10 kΩ, R2 = 2,2 kΩ i R3 = 100 kΩ,
- Niewielka płytka stykowa,
- Zestaw kabelków.
Oprogramowanie
- Raspberry Pi OS,
- git,
- biblioteki Python,
- biblioteki do obsługi MCC DAQ HAT.
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:
- Otwórz okno terminala, jeśli używasz interfejsu graficznego i zaktualizuj listę pakietów:
sudo apt update
- Opcjonalnie: zaktualizuj wszystkie pakiety i uruchom ponownie system:
sudo apt full-upgrade sudo reboot
- Jeśli jeszcze go nie masz, zainstaluj pakiet git:
sudo apt install git
- Za pomocą gita ściągnij pakiet producenta do obsługi nakładki do katalogu domowego:
cd ~ git clone https://github.com/mccdaq/daqhats.git
- Zainstaluj ściągniętą bibliotekę. Instalator zapyta czy chcesz zainstalować Pythona w wersji 2 i 3.
cd ~/daqhats sudo ./install.sh
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
from __future__ import print_function from sys import stdout from time import sleep #allows to introduce a delay in the execution of your program from daqhats import mcc118, OptionFlags, HatIDs, HatError #import labrary mcc118 to use all the methods for MCC118 from daqhats_utils import select_hat_device, enum_mask_to_string, \ chan_list_to_mask
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
gain_constant = 52.1376 #determined by the formula from documentation v_ref = 2.3 scan_rate = 2000.0
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ę.
print('{:10.5f}'.format((read_result.data[index+i]-v_ref)*gain_constant), 'Gaus', end='') #print('{:10.5f}'.format(read_result.data[index+i]), 'V', end='') #Use to measured the threshold
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
channels = [0] #if you want to use other channel replace "0" with the channel you want #or to add more channels add to array like in this example channels = [0, 1, 2, 3, 4, 5, 6, 7] channel_mask = chan_list_to_mask(channels) num_channels = len(channels)
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:
channels = [0, 1, 2, 3, 4, 5, 6, 7]
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
total_samples_read = 0 read_request_size = READ_ALL_AVAILABLE timeout = 5.0 while True: read_result = hat.a_in_scan_read(read_request_size, timeout) # Check for an overrun error if read_result.hardware_overrun: print('\n\nHardware overrun\n') break elif read_result.buffer_overrun: print('\n\nBuffer overrun\n') break samples_read_per_channel = int(len(read_result.data) / num_channels) total_samples_read += samples_read_per_channel # Display the last sample for each channel,in a maximum number of 12 digits. print('\r{:12}'.format(samples_read_per_channel), ' {:12} '.format(total_samples_read), end='') #\r is use to write over the existing line if samples_read_per_channel > 0: index = samples_read_per_channel * num_channels - num_channels for i in range(num_channels): #Display the value number of 10 digits and 5 digits after the comma print('{:10.5f}'.format((read_result.data[index+i]-v_ref)*gain_constant), 'Gaus', end='') #print('{:10.5f}'.format(read_result.data[index+i]), 'V', end='') #Use to measured the threshold stdout.flush() sleep(0.1) print('\n')
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.
samples_read_per_channel = int(len(read_result.data) / num_channels) total_samples_read += samples_read_per_channel
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.
if samples_read_per_channel > 0: index = samples_read_per_channel * num_channels - num_channels for i in range(num_channels): #Display the value number of 10 digits and 5 digits after the comma print('{:10.5f}'.format((read_result.data[index+i]-v_ref)*gain_constant), 'Gaus', end='') #print('{:10.5f}'.format(read_result.data[index+i]), 'V', end='') #Use to measured the threshold
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.
sudo apt update
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)