Przedstawię tutaj ADS1115 czyli 4-kanałowy, 16-bitowy przetwornik ADC. ADS1115 dostępny jest do kupienia w naszym kraju za kilkanaście złotych, a zza granicy można go sprowadzić nawet o połowę taniej. ADS1115 korzysta z protokołu I2C, więc można na jedną magistralę podłączyć aż 4 osobne takie moduły, uzyskując w ten sposób 16 kanałów ADC. ADS1115 oferuje również tryb pracy różnicowy oraz programowalną wartość wzmocnienia, co pozwala na pomiar małych zmian napięcia.
Schemat popularnego w sprzedaży modułu ADS1115 umieszczam poniżej:
Jak podłączyć ADS1115?
Podłączenie gotowego modułu jest naprawdę bardzo proste, gdyż wszystko co potrzebne jest już obecne na płytce. Magistrala I2C wymaga użycia rezystorów podciągających linie SDA i SCL do zasilania, ale gotowy moduł ma te rezystory już obecne na pokładzie. Z tego powodu podłączenie całości sprowadza się do użycia czterech kabelków, zasilanie (2.0V do 5.5 V), masa, SDA i SCL.
W przypadku użycia sprzętowego I2C należy sprawdzić które z pinów na naszej płytce z MCU mają tę rolę. Arduino UNO SDA ma na A4, a SCL to A5.
Jeśli planujemy tworzenie własnej płytki, to możemy bazować na schemacie z noty katalogowej:
Tak wygląda podłączenie kilku ADS1115 na jednej magistrali:
Przy podłączeniu wejść należy też zadbać o to, by napięcie na nich nie przekroczyło napięcia zasilania całego modułu. Określa to nota katalogowa, sekcja "Absolute Maximum Ratings":
Dostępny w sprzedaży moduł ADS1115 nie ma na płytce dodatkowych zabezpieczeń.
Jak przetestować ADS1115?
ADS1115 to ADC, czyli zamienia sygnał analogowy na cyfrowy. Upraszczając, wykonuje on pomiar napięcia. W takim razie starczy nam jeden potencjometr. Jego skrajne nóżki podłączamy na zasilanie (5V bądź 3.3V), i na masę, a środkowy odczep do jednego z wejść ADS1115. Tak podłączony potencjometr stanowi dzielnik napięcia i te właśnie napięcie możemy z ADS odczytać.
Jak wybrać adres ADS1115?
Zdawać by się mogło, że jeden pin ADR to dwie opcje adresu - bo można go podłączyć do stanu wysokiego lub niskiego - ale nie:
Mamy tu 4 opcje - bo można ADR podłączyć jeszcze do SCL lub SDA:
Protokół komunikacji ADS1115
Uruchomienie ADS1115 pod kątem protokołu komunikacji najlepiej opisuje sekcja "Quick-Start Guide" z noty katalogowej:
Osobiście bym tu dodał, że najpierw warto puścić jakiś skan I2C, chociażby bazujący na przykładowym kodzie z Arduino, by móc się upewnić, że wszystko dobrze podłączyliśmy.
Odczyt z ADS1115 wykonujemy w dwóch etapach:
- wysyłamy bajty do rejestru Config, określają one tryb pracy oraz kanał z którego odczytujemy (pkt 1 na zrzucie ekranu)
- po chwili rozpoczynamy odczyt rezultatu z rejestru Conversion (pkt 2 i 3)
Config Register
Po szczegółowy opis bitów rejestru konfiguracyjnego odsyłam do noty katalogowej.
Jak uruchomić ADS1115 z Arduino?
Można użyć gotowej biblioteki (do dodania przez Libraries):
https://docs.arduino.cc/libraries/ads1115_we/
Kod: C / C++
Można również wykonać prosty odczyt samodzielnie. Wystarczy biblioteka Wire:
Kod: C / C++
Najpierw wykonywany jest etap 1 z dokumentacji, czyli funkcja writeConfig. Określa ona tryb pracy oraz kanał do odczytu. Potem wykonywane są kroki 2 i 3, czyli odczyt dwóch bajtów z CONVERSION_REGISTER.
Rezultat:
Wizualizacja komunikacji z ADS1115
Komunikację można podejrzeć analizatorem Sigrok:
Przedstawiałem go w temacie:
Analizator stanów logicznych Salae 24MHz za 40 zł - analiza nieznanego protokołu wyświetlacza LED
Pomiędzy etapami jest odstęp 8ms aby moduł mógł dokonać konwersji:
Pierwszy etap to jest wysłanie danych do rejestru konfiguracyjnego o adresie 0x01, w tym przypadku wysyłane do niego jest 0xC183. Wszystko zawarte w jednej transakcji, poprzedzone warunkiem I2C start a zakończone stopem:
Drugi etap to odczyt. Tutaj osobno po starcie wysyłamy adres rejestru do odczytu (jest to zapis, więc adres urządzenia 0x48 jest z bitem Write - 0), a potem osobno (po stopie i starcie) wysyłamy adres urządzenia 0x48 z bitem Read - 1 i odczytujemy dwa bajty. Po pierwszym odczytanym bajcie jest ACK, gdyż chcemy czytać dalej, po drugim jest już NACK:
Uruchomienie z BK7231
ADS1115 uruchomiliśmy też z BK7231, dzięki czemu można też łatwo raportować jego pomiary do Home Assistant, ale szczegóły umieszczę w osobnym temacie.
Podsumowanie
To była krótka prezentacja modułu ADS1115. Uruchomienie tego modułu jest bezproblemowe, do Arduino mamy gotowe biblioteki, a jeśli chcemy samodzielnie implementować jego komunikację to i tak nie ma dużo roboty - zasadniczo jeden "write" i jeden "read" z danego adresu. To nie jest BME280 czy tam BMP280, gdzie niezbyt bym się garnął do samodzielnego tworzenia sterownika.
ADS1115 potrafi nieco więcej niż pokazałem, więc możliwe, że spróbuję osobno zrealizować na nim jakiś projekt, może jakiś pomiar napięcia czy tam prądu (na boczniku), może też osobno uruchomię ten pin ALERT i zrobię odczyt, który nie jest blokujący (bez tego delay w moim przykładowym kodzie). To wszystko już będzie w kolejnym temacie.
Załączam powiązane materiały, nota katalogowa na której bazowałem, tam też są szczegóły konfiguracji PGA itd (jeśli chcemy to implementować samodzielnie), oraz przechwycona komunikacja z ADS1115 w formacie dla PulseView:
Czy korzystaliście już z ADS1115 w swoich projektach, a jeśli tak to do czego?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.