Počnite mjeriti svijet oko sebe s ovim praktičnim i sveobuhvatnim projektom.

Ključni zahvati

  • Raspberry Pi nema analogni ulaz, ali možete dodati vanjske ADC-ove za pretvaranje napona iz stvarnog svijeta u digitalni oblik za snimanje, manipulaciju i kontrolu.
  • Popularne ADC opcije uključuju MCP3004/MCP3008 za kompromis brzine i preciznosti ili ADS111x za 16-bitna očitanja pri nižoj brzini uzorkovanja.
  • ADS1115 iz Adafruita jednostavna je opcija s programibilnim pojačalom pojačanja (PGA) koje vam omogućuje otkrivanje malih razlika u naponu i podešavanje pojačanja tijekom programa. Povezivanje s Raspberry Pi pomoću I2C je jednostavno.

Izvan kutije, Raspberry Pi nema analogni ulaz. To ga stavlja u nepovoljniji položaj u usporedbi s pločama temeljenim na mikrokontrolerima poput Arduina.

Ali nemojte očajavati: postoji mnogo opcija koje treba razmotriti. Pokrenite se uz Raspberry Pi i vanjski ADC.

Zašto dodavati ulaze?

Stvarni svijet je pun fenomena koji se, ako imate pravi strujni krug, mogu lako opisati pomoću napona. Stavite te napone u digitalni oblik i možete ih snimati, manipulirati njima i koristiti ih za kontrolu drugih parametara i uređaja.

instagram viewer

Možda želite pratiti vlažnost vašeg tla, temperaturu vašeg staklenika ili težinu vašeg hrčka. Možda želite dodati kontrolu glasnoće na svoj Pi, izgraditi čitavu banku prigušivača ili dizajnirati joystick od nule. Mogućnosti su, više-manje, neograničene.

Opcije za ADC

Dakle, koji je ADC najbolji za početnike?

Među najpopularnijim i najjednostavnijim opcijama su MCP3004 (i MCP3008) čipovi tvrtke Microchip. Dobit ćete četiri (ili osam) kanala od po 10 bita, koji mogu očitati do 200 kSPS. S druge strane, tu su ADS111x uređaji iz Texas Instrumentsa, koji čitaju 16 bita na 860 SPS. Dakle, postoji kompromis između brzine i preciznosti (i, naravno, cijene).

Mnogi mikrokontroleri dolaze s ugrađenim ADC-ovima. ATMega koju možete pronaći na prosječnom Arduinu ponudit će nekoliko 10-bitnih kanala, povrh svega ostalog. To je ono što omogućuje Arduinu da pruži analogne ulaze tamo gdje Raspberry Pi ne može. Ako već imate Arduino uključen u svoje postavke, a 10 bita je dovoljno vjerno, onda bi ovo zapravo mogao biti najlakši način.

Ovdje ćemo biti jednostavni, s ADS1115 iz Adafruita.

Što je programibilno pojačalo?

Ovaj čip dolazi s nekoliko zanimljivih značajki, uključujući Programmable Gain Amplifier (PGA). To će vam omogućiti digitalno postavljanje željenog raspona vrijednosti, sve do djelića volta. Uz broj vrijednosti koje 16 bita može predstaviti, to će vam omogućiti da otkrijete razlike od samo nekoliko mikrovolta.

Prednost je u tome što možete promijeniti pojačanje usred programa. Drugi čipovi, poput MCP3004, imaju drugačiji pristup; dolaze s dodatnim pinom, na koji možete dovesti referentni napon.

Što je s multipleksiranjem?

Multiplekser (ili mux) je prekidač koji vam omogućuje čitanje mnogih ulaza pomoću jednog ADC-a. Ako vaš ADC čip dolazi s mnogo ulaznih pinova, tada se događa interno multipleksiranje. Mux ADS1115 omogućuje četiri ulaza, koje možete odabrati putem internih registara.

Rad s registrima

ADS1115 nudi ove mogućnosti, i još nekoliko drugih. Možete se pozabaviti multipleksorom, podesiti pojačanje, aktivirati ugrađeni komparator, promijeniti brzinu uzorkovanja i staviti uređaj u stanje mirovanja niske potrošnje, a sve okretanjem nekoliko prekidača.

Ali gdje su ti prekidači? Oni su unutar paketa, u obliku vrlo malih dijelova memorije tzv registri. Da biste aktivirali određenu značajku, samo trebate postaviti relevantni bit na 1, umjesto na 0.

Gledati u podatkovnu tablicu ADS111x, vidjet ćete da ovi modeli dolaze s četiri registra, uključujući konfiguracijske registre koji upravljaju ponašanjem uređaja.

Na primjer, bitovi 14 do 12 kontroliraju multipleksor. Pomoću ova tri bita možete birati između osam konfiguracija. Ovdje ćete željeti "100", što će dati razliku između ulazne nule i mase. Bitovi 7 do 5, s druge strane, upravljaju brzinom uzorkovanja. Ako želite maksimalno 860 uzoraka u sekundi, možete ih postaviti na "111".

Nakon što znate koje opcije postaviti, imat ćete dva bajta za slanje ADC-u. Ako kasnije poželite postaviti jedan bit ovdje ili tamo, tada se možete pojedinačno pozabaviti njima korištenjem bitovnih operatora.

Evo gdje bi moglo postati zbunjujuće. U ovom slučaju, binarno ne predstavlja vrijednost, već vrijednosti pojedinačnih prekidača. Ove varijable možete izraziti kao jedan veliki broj, u decimalnom ili heksadecimalnom obliku. Ali ako želite izbjeći glavobolje, trebali biste se držati binarne verzije koja je lakša za čitanje.

Ožičenje

Ovaj uređaj možete priključiti izravno u matičnu ploču. Pozitivni ulaz napona prihvatit će bilo gdje između 2 i 5,5 V, što znači da će tračnica od 3,3 V na Raspberry Piju dobro raditi.

Spojite SDA i SCL ulaze na parnjake na RPi i učinite iste stvari s masom i 3,3 V. Nabavite potenciometar između uzemljenja i vodova napona i stavite srednji vod u prvi ulaz ADC-a. To je sve što trebate da krenete!

Suočavanje s I2C

Različiti ADC-ovi rade preko različitih protokola. U slučaju našeg ADS1115, koristit ćemo I2C.

Sljedeći primjer će komunicirati s ADC-om pomoću Pythona. Ali prije nego što to učinite, morat ćete ga postaviti. Najnovije verzije OS-a Raspberry Pi ovo su učinile vrlo jednostavnim. Zaputi se Postavke > Raspberry Pi konfiguracija. Zatim, iz sučelja jezičak, prekidač I2C na.

Da provjerite radi li sve, otvorite terminal i pokrenite:

sudo i2cdetect -y 1

Ova naredba će ispisati mrežu. Pod pretpostavkom da sve radi i da ste to ispravno spojili, vidjet ćete da se nova vrijednost pojavljuje u mreži. Ovo je adresa vašeg ADC-a. Ovdje imajte na umu da je to heksadecimalna vrijednost, pa joj morate dodati prefiks “0x” kada ga koristite u donjem kodu. Evo, to je 0x48:

Nakon što dobijete adresu, možete koristiti biblioteku SMBus za slanje I2C naredbi. Ovdje ćete se baviti s dvije metode. Prvi je pisanje_podataka_riječi(), koji prihvaća tri argumenta: adresu uređaja, registar u koji pišete i vrijednost koju želite pisati.

Drugi je read_word_data(), koji prihvaća samo adresu uređaja i registar. ADC će kontinuirano očitavati napone i pohranjivati ​​rezultat u registar pretvorbe. Ovom metodom možete dohvatiti sadržaj tog registra.

Rezultat možete malo uljepšati, a zatim isprintati. Prije nego što se vratite na početak petlje, uvedite kratku odgodu. To će osigurati da niste pretrpani podacima.

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 = 26300

whileTrue:
# 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)

Upravo ste gotovi. Preslikajte raspon vrijednosti koji dobivate na onaj koji preferirate, a zatim skratite na željeni broj decimalnih mjesta. Možete prilagoditi funkciju ispisa tako da ispisujete novu vrijednost samo ako se razlikuje od prethodne vrijednosti. Ako niste sigurni oko max, min, i krug, možeš pogledajte naš popis 20 najvažnijih funkcija Pythona!

Suočavanje s bukom

Sada, osim ako vaše postavke nisu super, super uredne i uredne, primijetit ćete neku buku. Ovo je inherentna loša strana korištenja 16 bita umjesto samo deset: taj mali šum bit će vidljiviji.

Spajanjem susjednog ulaza (ulaz 1) na uzemljenje i promjenom načina rada tako da uspoređujete ulaze jedan i dva, možete dobiti puno stabilnije rezultate. Također možete zamijeniti one dugačke premosne kabele koji skupljaju buku za male i dodati nekoliko kondenzatora dok ste već kod toga. Vrijednost vašeg potenciometra također može napraviti razliku.

Postoje i softverske opcije. Možete stvoriti tekući prosjek ili jednostavno zanemariti male promjene. Nedostatak je taj što će dodatni kod nametnuti trošak računanja. Ako pišete uvjetne izjave na jeziku visoke razine kao što je Python i uzimate tisuće uzoraka svake sekunde, ti će se troškovi brzo povećati.

Idite dalje s mnogo mogućih sljedećih koraka

Uzimanje očitanja putem I2C prilično je jednostavno, a isto vrijedi i za druge metode, poput SPI. Iako se može činiti da postoje velike razlike između dostupnih opcija ADC-a, istina je da nakon što jednu od njih pokrenete, lako je primijeniti znanje na druge.

Dakle, zašto ne krenuti dalje? Povežite više potenciometara zajedno ili pokušajte očitati svjetlost, zvuk ili temperaturu. Proširite kontroler koji ste upravo napravili i stvorite postavku Raspberry Pi koja je uistinu praktična!