Zacznij mierzyć otaczający Cię świat dzięki temu praktycznemu i kompleksowemu projektowi.
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 najbardziej popularnych i prostych opcji należą MCP3004 (I MCP3008) chipy 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 zatem kompromis między szybkością i precyzją (i oczywiście ceną).
Wiele mikrokontrolerów ma wbudowane przetworniki ADC. ATMega, którą znajdziesz na przeciętnym 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.
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żna sobie poradzić z 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ę one w opakowaniu w postaci bardzo małych fragmentów pamięci, tzw rejestruje. Aby aktywować daną funkcję wystarczy ustawić odpowiedni bit na 1, a nie na 0.
Patrzeć na arkusz danych ADS111x, przekonasz się, że te modele są wyposażone w cztery rejestry, w tym rejestry konfiguracyjne, które regulują zachowanie urządzenia.
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”, który 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. Zmierzać do Preferencje > Konfiguracja Raspberry Pi. Następnie od Interfejsy zakładka, przełącznik I2C NA.
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ć prefiksem „0x” kiedy użyjesz go w poniższym kodzie. Tu jest 0x48:
Po uzyskaniu adresu możesz użyć biblioteki SMBus do wysyłania poleceń I2C. Będziesz miał tutaj do czynienia z dwiema metodami. Pierwszym jest write_word_data(), który przyjmuje trzy argumenty: adres urządzenia, rejestr, do którego piszesz i wartość, którą chcesz zapisać.
Drugie jest read_word_data(), który akceptuje tylko adres urządzenia i rejestr. ADC będzie stale odczytywać napięcia i zapisywać wynik w rejestrze konwersji. Dzięki tej metodzie możesz odzyskać zawartość tego rejestru.
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 SMBus
import time
addr = 0x48
bus = SMBus(1)# set the registers for reading
CONFIGREG = 1
CONVERSIONREG = 0# set the address register to point to the config register
# write to the config registers
bus.write_word_data(addr, CONFIGREG, (0b00000100 << 8 | 0b10000010))# define the top of the range
TOP = 26300whileTrue:
# 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. Jeśli nie jesteś pewien maks, min, I okrągły, możesz sprawdź naszą listę 20 najważniejszych funkcji Pythona!
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!