Добавяне на ADC към вашия Raspberry Pi: Какво трябва да знаете

Добавяне на ADC към вашия Raspberry Pi: Какво трябва да знаете

Ключови изводи

  • Raspberry Pi няма аналогов вход, но можете да добавите външни ADC за преобразуване на напрежения от реалния свят в цифрова форма за запис, манипулиране и контрол.
  • Популярните опции за ADC включват MCP3004/MCP3008 за компромис между скорост и прецизност или ADS111x за 16-битови показания при по-бавна честота на дискретизация.
  • ADS1115 от Adafruit е проста опция с програмируем усилвател на усилването (PGA), който ви позволява да откривате малки разлики в напрежението и да регулирате усилването по време на програмата. Свързването му с Raspberry Pi с помощта на I2C е лесно.

Извън кутията Raspberry Pi няма аналогов вход. Това го поставя в неизгодно положение в сравнение с платки, базирани на микроконтролери като Arduino.

Но не се отчайвайте: има много възможности, които да разгледате. Започнете да работите с Raspberry Pi и външен ADC.

Защо да добавяте входове?

Реалният свят е пълен с явления, които, ако имате правилната схема, могат лесно да бъдат описани с помощта на напрежение. Преведете тези напрежения в цифрова форма и можете да ги записвате, манипулирате и използвате за управление на други параметри и устройства.

Може би искате да наблюдавате влажността на почвата, температурата на оранжерията или теглото на вашия хамстер. Може да искате да добавите контрол на силата на звука към вашия Pi, да изградите цяла банка от фейдъри или да проектирате джойстик от нулата. Възможностите са повече или по-малко неограничени.

Опции за ADC

И така, кой ADC е най-подходящ за начинаещи?

Сред най-популярните и прости опции са чиповете MCP3004MCP3008 ) от Microchip. Ще получите четири (или осем) канала по 10 бита всеки, които могат да четат до 200 kSPS. От друга страна, има устройствата ADS111x от Texas Instruments, които четат 16 бита при 860 SPS. Така че има компромис между скорост и прецизност (и, естествено, цена).

Много микроконтролери идват с вградени ADC. ATMega, който намирате в средния Arduino, ще предложи няколко 10-битови канала, освен всичко останало. Това позволява на Arduino да предоставя аналогови входове там, където Raspberry Pi не може. Ако вече имате включен Arduino във вашата настройка и 10 бита са достатъчно точни, тогава това всъщност може да е най-лесният начин.

Тук ще бъдем прости, с ADS1115 от Adafruit.

Снимка на ADC

Какво е програмируем усилвател на усилване?

Този чип идва с няколко интересни функции, включително програмируем усилвател на усилването (PGA). Това ще ви позволи да зададете цифрово желания диапазон от стойности до част от волта. С броя на стойностите, които 16 бита могат да представят, това ще ви позволи да откриете разлики от само няколко микроволта.

Предимството тук е, че можете да промените печалбата по средата на програмата. Други чипове, като MCP3004, имат различен подход; те идват с допълнителен щифт, към който можете да подадете референтно напрежение.

Какво ще кажете за мултиплексирането?

Мултиплексорът (или mux) е превключвател, който ви позволява да четете много входове, като използвате един ADC. Ако вашият ADC чип идва с много входни щифтове, тогава има някакво вътрешно мултиплексиране. Мултиплексорът на ADS1115 позволява четири входа, които можете да изберете чрез вътрешните регистри.

Работа с регистри

ADS1115 предоставя тези опции и още няколко. Можете да се справите с мултиплексора, да регулирате усилването, да активирате вградения компаратор, да промените честотата на дискретизация и да поставите устройството в режим на заспиване с ниска мощност, всичко това чрез завъртане на няколко превключвателя.

Но къде са тези превключватели? Те са вътре в пакета под формата на много малки части от паметта, наречени регистри . За да активирате дадена функция, просто трябва да зададете съответния бит на 1, а не на 0.

Разглеждайки листа с данни на ADS111x , ще откриете, че тези модели се доставят с четири регистъра, включително конфигурационните регистри, които управляват поведението на устройството.

таблица от листа с данни на ADS

Например, битове от 14 до 12 управляват мултиплексора. Използвайки тези три бита, можете да избирате от осем конфигурации. Това, което ще искате тук, е “100”, което ще даде разликата между входната нула и земята. Битове 7 до 5, от друга страна, управляват честотата на дискретизация. Ако искате максимум 860 проби в секунда, можете да ги зададете на „111“.

След като разберете кои опции да зададете, ще имате два байта за изпращане към ADC. Ако по-късно искате да зададете един бит тук или там, тогава можете да се справите с тях поотделно, като използвате побитови оператори.

Ето къде може да стане объркващо. В този случай двоичният файл не представлява стойност, а стойностите на отделните превключватели. Можете да изразите тези променливи като едно голямо число, десетично или шестнадесетично. Но ако искате да избегнете главоболия, трябва да се придържате към двоичната версия, която е по-лесна за четене.

Окабеляване

Можете да включите това устройство направо в макетната платка. Положителният вход на напрежение ще приеме някъде между 2 и 5,5 v, което означава, че 3,3 v шина на Raspberry Pi ще работи добре.

Свържете SDA и SCL входовете към аналоговете на RPi и направете същите неща със земята и 3.3v. Вземете потенциометър между заземяването и напрежението и поставете средния проводник в първия вход на ADC. Това е всичко, от което се нуждаете, за да тръгнете!

Справяне с I2C

Различните ADC работят чрез различни протоколи. В случая с нашия ADS1115 ще използваме I2C .

Следващият пример ще взаимодейства с ADC с помощта на Python. Но преди да направите това, ще трябва да го настроите. Последните версии на Raspberry Pi OS направиха това много просто. Насочете се към Предпочитания > Конфигурация на Raspberry Pi . След това от раздела Интерфейси включете I2C .

Екранна снимка на прозореца за конфигурация на Raspberry Pi

За да проверите дали всичко работи, отворете терминал и стартирайте:

sudo i2cdetect -y 1

Тази команда ще изведе решетка. Ако приемем, че всичко работи и сте го свързали правилно, ще видите нова стойност да се появява в мрежата. Това е адресът на вашия ADC. Тук имайте предвид, че това е шестнадесетична стойност, така че трябва да поставите префикс „0x“, когато го използвате в кода по-долу. Тук е 0x48 :

екранна снимка на конзолата RPi

След като имате адреса, можете да използвате библиотеката SMBus, за да изпращате I2C команди. Тук ще работите с два метода. Първият е write_word_data() , който приема три аргумента: адреса на устройството, регистъра, в който пишете, и стойността, която искате да запишете.

Можете да разкрасите малко резултата и след това да го отпечатате. Преди да се върнете към началото на цикъла, въведете кратко забавяне. Това ще гарантира, че няма да сте затрупани с данни.

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)

Почти сте готови. Съпоставете диапазона от стойности, които получавате, с този, който предпочитате, и след това съкратете до желания брой десетични знаци. Можете да настроите функцията за печат, така че да отпечатвате нова стойност само когато е различна от последната стойност.

Справяне с шума

Сега, освен ако настройката ви не е супер, супер чиста и подредена, ще забележите известен шум. Това е присъщият недостатък на използването на 16 бита, а не само на десет: това малко шум ще бъде по-забележимо.

Чрез свързване на съседния вход (вход 1) към земята и превключване на режима, така че да сравнявате входове едно и две, можете да получите много по-стабилни резултати. Можете също така да замените тези дълги, събиращи шума джъмперни кабели с малки и да добавите няколко кондензатора, докато сте там. Стойността на вашия потенциометър също може да има значение.

Има и софтуерни опции. Можете да създадете пълзяща средна стойност или просто да пренебрегнете малки промени. Недостатъкът там е, че допълнителният код ще наложи изчислителни разходи. Ако пишете условни изрази на език от високо ниво като Python и взимате хиляди проби всяка секунда, тези разходи ще се увеличат бързо.

Продължете напред с много възможни следващи стъпки

Отчитането чрез I2C е доста лесно и същото важи до голяма степен за други методи, като SPI. Въпреки че може да изглежда, че има големи разлики между наличните опции за ADC, истината е, че след като накарате една от тях да работи, е лесно да приложите знанията към останалите.

Така че защо да не продължим нещата? Свържете няколко потенциометра заедно или опитайте да прочетете светлина, звук или температура. Разширете контролера, който току-що сте направили, и създайте настройка на Raspberry Pi, която е наистина практична!