Dodawanie ADC do Raspberry Pi: co musisz wiedzieć

Dodawanie ADC do Raspberry Pi: co musisz wiedzieć

Kluczowe dania na wynos

  • Raspberry Pi nie ma wejścia analogowego, ale można dodać zewnętrzne przetworniki ADC w celu konwersji napięć ze świata rzeczywistego na postać cyfrową w celu nagrywania, manipulacji i sterowania.
  • Popularne opcje ADC obejmują MCP3004/MCP3008 dla kompromisu w zakresie szybkości i precyzji lub ADS111x dla 16-bitowych odczytów przy mniejszej częstotliwości próbkowania.
  • ADS1115 firmy Adafruit to prosta opcja z programowalnym wzmacniaczem wzmocnienia (PGA), który umożliwia wykrywanie małych różnic napięcia i regulację wzmocnienia w trakcie programu. Podłączenie go do Raspberry Pi za pomocą I2C jest proste.

Po wyjęciu z pudełka Raspberry Pi nie ma wejścia analogowego. Stawia to go w niekorzystnej sytuacji w porównaniu z płytkami opartymi na mikrokontrolerach, takimi jak Arduino.

Ale nie rozpaczaj: istnieje wiele opcji do rozważenia. Przygotuj się do pracy z Raspberry Pi i zewnętrznym przetwornikiem ADC.

Po co dodawać dane wejściowe?

Prawdziwy świat jest pełen zjawisk, które, jeśli dysponuje się odpowiednimi obwodami, można łatwo opisać za pomocą napięcia. Przekształć te napięcia w formę cyfrową, aby móc je rejestrować, manipulować nimi i wykorzystywać do sterowania innymi parametrami i urządzeniami.

Być może chcesz monitorować wilgotność gleby, temperaturę w szklarni lub wagę chomika. Być może chcesz dodać kontrolę głośności do swojego Pi, zbudować cały zestaw tłumików lub zaprojektować joystick od podstaw. Możliwości są mniej więcej nieograniczone.

Opcje dla ADC

Który ADC jest najlepszy dla początkujących?

Do najpopularniejszych i najprostszych opcji należą chipy MCP3004 (i MCP3008 ) firmy Microchip. Otrzymasz cztery (lub osiem) kanałów po 10 bitów każdy, które mogą odczytać do 200 kSPS. Z drugiej strony są urządzenia ADS111x firmy Texas Instruments, które odczytują 16 bitów przy 860 SPS. Istnieje więc kompromis między szybkością i precyzją (i oczywiście ceną).

Wiele mikrokontrolerów ma wbudowane przetworniki ADC. ATMega, którą znajdziesz przeciętnie Arduino, oprócz wszystkiego innego, zaoferuje kilka 10-bitowych kanałów. Dzięki temu Arduino może zapewnić wejścia analogowe tam, gdzie Raspberry Pi nie może tego zrobić. Jeśli masz już Arduino zaangażowane w swoją konfigurację, a 10 bitów wystarczy do wierności, to może to być najłatwiejszy sposób.

Tutaj będzie to proste, z ADS1115 firmy Adafruit.

Zdjęcie ADC

Co to jest programowalny wzmacniacz wzmocnienia?

Układ ten ma kilka interesujących funkcji, w tym programowalny wzmacniacz wzmocnienia (PGA). Umożliwi to cyfrowe ustawienie żądanego zakresu wartości z dokładnością do ułamka wolta. Przy liczbie wartości, jaką może reprezentować 16 bitów, umożliwi to wykrycie różnic rzędu zaledwie kilku mikrowoltów.

Zaletą jest to, że można zmienić wzmocnienie w połowie programu. Inne chipy, takie jak MCP3004, przyjmują inne podejście; posiadają dodatkowy pin, do którego można podać napięcie odniesienia.

Co z multipleksowaniem?

Multiplekser (lub multiplekser) to przełącznik umożliwiający odczyt wielu sygnałów wejściowych za pomocą jednego przetwornika ADC. Jeśli twój układ ADC jest wyposażony w wiele pinów wejściowych, oznacza to, że zachodzi pewne wewnętrzne multipleksowanie. Multiplekser ADS1115 pozwala na cztery wejścia, które można wybrać za pomocą wewnętrznych rejestrów.

Postępowanie z rejestrami

ADS1115 zapewnia te opcje i kilka innych. Możesz zająć się multiplekserem, wyregulować wzmocnienie, aktywować wbudowany komparator, zmienić częstotliwość próbkowania i wprowadzić urządzenie w tryb uśpienia o niskim poborze mocy, a wszystko to poprzez przestawienie kilku przełączników.

Ale gdzie są te przełączniki? Znajdują się wewnątrz pakietu, w postaci bardzo małych fragmentów pamięci zwanych rejestrami . Aby aktywować daną funkcję wystarczy ustawić odpowiedni bit na 1, a nie na 0.

Patrząc na arkusz danych ADS111x , przekonasz się, że modele te są wyposażone w cztery rejestry, w tym rejestry konfiguracyjne regulujące zachowanie urządzenia.

tabela z arkusza danych ADS

Na przykład bity od 14 do 12 sterują multiplekserem. Używając tych trzech bitów, możesz wybrać jedną z ośmiu konfiguracji. Ten, którego będziesz potrzebować, to „100”, co da różnicę między zerem wejściowym a masą. Z drugiej strony bity od 7 do 5 regulują częstotliwość próbkowania. Jeśli chcesz maksymalnie 860 próbek na sekundę, możesz ustawić je na „111”.

Gdy już wiesz, które opcje ustawić, będziesz mieć dwa bajty do wysłania do ADC. Jeśli później będziesz chciał ustawić pojedynczy bit tu czy tam, możesz zająć się nimi indywidualnie za pomocą operatorów bitowych.

Tutaj może to być mylące. W tym przypadku plik binarny nie reprezentuje wartości, ale wartości poszczególnych przełączników. Można wyrazić te zmienne jako jedną dużą liczbę, w systemie dziesiętnym lub szesnastkowym. Jeśli jednak chcesz uniknąć problemów, powinieneś trzymać się wersji binarnej, która jest łatwiejsza do odczytania.

Okablowanie

Możesz podłączyć to urządzenie bezpośrednio do płytki prototypowej. Dodatnie napięcie wejściowe przyjmie napięcie od 2 do 5,5 V, co oznacza, że ​​szyna 3,3 V w Raspberry Pi będzie działać dobrze.

Podłącz wejścia SDA i SCL do odpowiedników w RPi i wykonaj te same czynności z masą i napięciem 3,3 V. Umieść potencjometr między liniami masy a napięciem i podłącz środkowy przewód do pierwszego wejścia przetwornika ADC. To wszystko, czego potrzebujesz, aby zacząć!

Radzenie sobie z I2C

Różne przetworniki ADC działają poprzez różne protokoły. W przypadku naszego ADS1115 będziemy używać I2C .

Poniższy przykład będzie współdziałał z ADC przy użyciu języka Python. Ale zanim to zrobisz, musisz to skonfigurować. Najnowsze wersje systemu operacyjnego Raspberry Pi bardzo to ułatwiły. Przejdź do Preferencje > Konfiguracja Raspberry Pi . Następnie w zakładce Interfejsy włącz I2C .

Zrzut ekranu okna konfiguracji Raspberry Pi

Aby sprawdzić, czy wszystko działa, otwórz terminal i uruchom:

sudo i2cdetect -y 1

To polecenie wyświetli siatkę. Zakładając, że wszystko działa i poprawnie podłączyłeś przewody, w siatce pojawi się nowa wartość. To jest adres Twojego ADC. Pamiętaj, że jest to wartość szesnastkowa, więc musisz ją poprzedzić „0x”, gdy używasz jej w poniższym kodzie. Tutaj jest 0x48 :

zrzut ekranu konsoli RPi

Po uzyskaniu adresu możesz użyć biblioteki SMBus do wysyłania poleceń I2C. Będziesz miał tutaj do czynienia z dwiema metodami. Pierwsza to write_word_data() , która przyjmuje trzy argumenty: adres urządzenia, rejestr, do którego piszesz i wartość, którą chcesz zapisać.

Możesz nieco upiększyć wynik, a następnie go wydrukować. Zanim wrócisz na początek pętli, wprowadź krótkie opóźnienie. Dzięki temu nie będziesz przytłoczony ilością danych.

from smbus import SMBusimport timeaddr = 0x48bus = SMBus(1)# set the registers for readingCONFIGREG = 1CONVERSIONREG = 0# set the address register to point to the config register# write to the config registersbus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010)) # define the top of the rangeTOP = 26300while True: # read the register b = bus.read_word_data(addr, CONVERSIONREG) # swap the two bytes b = ((b & 0xFF) << 8) | ((b >> 8) & 0xFF) # subtract half the range to set ground to zero b -= 0x8000 # divide the result by the range to give us a value between zero and one b /= TOP # cap at one b = min(b, 1) # bottom is zero b = max(b, 0) # two decimal places b = round(b, 2) print(b) time.sleep(.01)

Już prawie skończyłeś. Zamapuj zakres otrzymywanych wartości na preferowany, a następnie obetnij go do żądanej liczby miejsc po przecinku. Możesz dostosować funkcję drukowania tak, aby drukować nową wartość tylko wtedy, gdy różni się ona od ostatniej wartości.

Radzenie sobie z hałasem

Teraz, jeśli Twoja konfiguracja nie jest super, bardzo schludna i uporządkowana, zauważysz pewien hałas. Jest to nieodłączna wada używania 16 bitów zamiast tylko dziesięciu: ta niewielka ilość szumu będzie bardziej zauważalna.

Łącząc sąsiednie wejście (wejście 1) z masą i przełączając tryb w celu porównania wejść pierwszego i drugiego, można uzyskać znacznie stabilniejsze wyniki. Możesz także zamienić te długie, zbierające szumy kable połączeniowe na mniejsze i przy okazji dodać kilka kondensatorów. Wartość potencjometru również może mieć znaczenie.

Istnieją również opcje oprogramowania. Możesz utworzyć średnią kroczącą lub po prostu zignorować małe zmiany. Wadą jest to, że dodatkowy kod będzie wiązać się z kosztami obliczeniowymi. Jeśli piszesz instrukcje warunkowe w języku wysokiego poziomu, takim jak Python, i pobierasz tysiące próbek co sekundę, koszty te szybko się zwiększą.

Idź dalej, korzystając z wielu możliwych kolejnych kroków

Wykonywanie odczytów przez I2C jest dość proste i to samo dotyczy w dużej mierze innych metod, takich jak SPI. Choć mogłoby się wydawać, że istnieją duże różnice pomiędzy dostępnymi opcjami ADC, prawda jest taka, że ​​gdy już jedna z nich działa, łatwo jest zastosować wiedzę w pozostałych.

Dlaczego więc nie posunąć się dalej? Połącz ze sobą wiele potencjometrów lub spróbuj odczytać światło, dźwięk lub temperaturę. Rozbuduj kontroler, który właśnie stworzyłeś i stwórz konfigurację Raspberry Pi, która jest naprawdę praktyczna!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *