Sāciet mērīt apkārtējo pasauli ar šo praktisko un visaptverošo projektu.

Key Takeaways

  • Raspberry Pi trūkst analogās ieejas, taču varat pievienot ārējos ADC, lai pārveidotu spriegumus no reālās pasaules digitālā formā ierakstīšanai, manipulācijai un kontrolei.
  • Populāras ADC opcijas ietver MCP3004/MCP3008 ātruma un precizitātes kompromisam vai ADS111x 16 bitu nolasīšanai ar lēnāku paraugu ņemšanas ātrumu.
  • Adafruit ADS1115 ir vienkārša opcija ar programmējamu pastiprinājuma pastiprinātāju (PGA), kas ļauj noteikt nelielas sprieguma atšķirības un pielāgot pastiprinājumu programmas laikā. Savienošana ar Raspberry Pi, izmantojot I2C, ir vienkārša.

No kastes Raspberry Pi trūkst analogās ieejas. Tas nostāda to neizdevīgā stāvoklī salīdzinājumā ar mikrokontrolleru platēm, piemēram, Arduino.

Bet nevajag izmisumā: ir daudz iespēju, kas jāapsver. Sāciet darbu, izmantojot Raspberry Pi un ārējo ADC.

Kāpēc pievienot ievades?

Reālā pasaule ir pilna ar parādībām, kuras, ja jums ir pareizā shēma, var viegli aprakstīt, izmantojot spriegumu. Iegūstiet šos spriegumus digitālā formā, un varat tos ierakstīt, manipulēt ar tiem un izmantot tos citu parametru un ierīču vadīšanai.

instagram viewer

Iespējams, vēlēsities uzraudzīt augsnes mitrumu, siltumnīcas temperatūru vai kāmja svaru. Iespējams, vēlēsities savam Pi pievienot skaļuma regulatoru, izveidot veselu faderu banku vai izveidot kursorsviru no nulles. Iespējas ir vairāk vai mazāk neierobežotas.

ADC iespējas

Tātad, kurš ADC ir vislabākais iesācējiem?

Starp populārākajām un vienkāršākajām iespējām ir MCP3004 (un MCP3008) mikroshēmas no Microchip. Jūs iegūsit četrus (vai astoņus) kanālus pa 10 bitiem, kas var nolasīt līdz 200 kSPS. No otras puses, ir Texas Instruments ADS111x ierīces, kas nolasa 16 bitus ar ātrumu 860 SPS. Tātad pastāv kompromiss starp ātrumu un precizitāti (un, protams, cenu).

Daudziem mikrokontrolleriem ir iebūvēti ADC. ATMega, ko atrodat vidēji Arduino piedāvās vairākus 10 bitu kanālus, papildus visam pārējam. Tas ļauj Arduino nodrošināt analogās ievades vietās, kur Raspberry Pi nevar. Ja jūsu iestatīšanā jau ir iesaistīts Arduino un ar 10 bitiem pietiek, tad tas patiesībā varētu būt vienkāršākais veids.

Šeit mēs to darīsim vienkārši, izmantojot ADS1115 no Adafruit.

Kas ir programmējams pastiprinājuma pastiprinātājs?

Šai mikroshēmai ir dažas interesantas funkcijas, tostarp programmējams pastiprinājuma pastiprinātājs (PGA). Tas ļaus digitāli iestatīt vēlamo vērtību diapazonu līdz volta daļai. Ar vērtību skaitu, ko var attēlot 16 biti, tas ļaus atklāt tikai dažu mikrovoltu atšķirības.

Priekšrocība šeit ir tāda, ka jūs varat mainīt pieaugumu programmas vidū. Citas mikroshēmas, piemēram, MCP3004, izmanto citu pieeju; tiem ir pievienota papildu tapa, kurai var piegādāt atsauces spriegumu.

Kas par multipleksēšanu?

Multiplekseris (vai mux) ir slēdzis, kas ļauj nolasīt daudzas ievades, izmantojot vienu ADC. Ja jūsu ADC mikroshēmā ir daudz ievades tapu, notiek iekšēja multipleksēšana. ADS1115 mux nodrošina četras ieejas, kuras varat atlasīt, izmantojot iekšējos reģistrus.

Darbs ar reģistriem

ADS1115 nodrošina šīs un vēl dažas iespējas. Varat rīkoties ar multipleksoru, pielāgot pastiprinājumu, aktivizēt iebūvēto komparatoru, mainīt izlases ātrumu un pārslēgt ierīci mazjaudas miega režīmā, pārslēdzot dažus slēdžus.

Bet kur ir tie slēdži? Tie atrodas iepakojumā ļoti mazu atmiņas fragmentu veidā reģistros. Lai aktivizētu noteiktu funkciju, jums vienkārši jāiestata attiecīgais bits uz 1, nevis 0.

Skatoties uz ADS111x datu lapa, jūs atklāsiet, ka šiem modeļiem ir četri reģistri, tostarp konfigurācijas reģistri, kas regulē ierīces darbību.

Piemēram, biti no 14 līdz 12 kontrolē multipleksoru. Izmantojot šos trīs bitus, varat izvēlēties kādu no astoņām konfigurācijām. Šeit vēlamais ir “100”, kas noteiks atšķirību starp ievades nulli un zemi. Savukārt no 7. līdz 5. bitiem nosaka izlases ātrumu. Ja vēlaties maksimāli 860 paraugus sekundē, varat iestatīt tos uz “111”.

Kad zināt, kuras opcijas iestatīt, jums būs divi baiti, kas jānosūta uz ADC. Ja vēlāk vēlaties iestatīt vienu bitu šeit vai tur, varat tos apstrādāt atsevišķi, izmantojot bitu operatorus.

Lūk, kur tas var radīt neskaidrības. Šajā gadījumā binārais rādītājs neatspoguļo vērtību, bet gan atsevišķu slēdžu vērtības. Varat izteikt šos mainīgos kā vienu lielu skaitli decimāldaļās vai heksadecimāldaļās. Bet, ja vēlaties izvairīties no galvassāpēm, jums vajadzētu pieturēties pie binārās versijas, kas ir vieglāk lasāma.

Savienojiet to

Šo ierīci varat pievienot tieši maizes panelim. Pozitīvā sprieguma ieeja pieņems jebkur no 2 līdz 5,5 V, kas nozīmē, ka Raspberry Pi 3,3 V sliede darbosies labi.

Pievienojiet SDA un SCL ieejas RPi līdziniekiem un dariet to pašu ar zemi un 3,3 v. Iegūstiet potenciometru starp zemējuma un sprieguma līnijām un ievietojiet vidējo vadu ADC pirmajā ieejā. Tas ir viss, kas jums nepieciešams, lai sāktu!

Darbs ar I2C

Dažādi ADC darbojas, izmantojot dažādus protokolus. Mūsu ADS1115 gadījumā mēs izmantosim I2C.

Šis piemērs mijiedarbosies ar ADC, izmantojot Python. Bet pirms to darāt, jums tas ir jāiestata. Jaunākās Raspberry Pi OS versijas to ir padarījušas ļoti vienkāršu. Doties uz Preferences > Raspberry Pi konfigurācija. Pēc tam no Saskarnes cilne, slēdzis I2C ieslēgts.

Lai pārbaudītu, vai viss darbojas, atveriet termināli un palaidiet:

sudo i2cdetect -y 1

Šī komanda izvadīs režģi. Pieņemot, ka viss darbojas un esat to pareizi savienojis, režģī tiks parādīta jauna vērtība. Šī ir jūsu ADC adrese. Ņemiet vērā, ka tā ir heksadecimālā vērtība, tāpēc jums tā ir jāpievieno prefiksam “0x” kad izmantojat to tālāk esošajā kodā. Lūk, tas ir 0x48:

Kad esat ieguvis adresi, varat izmantot SMBus bibliotēku, lai nosūtītu I2C komandas. Šeit jums tiks izmantotas divas metodes. Pirmais ir write_word_data(), kas pieņem trīs argumentus: ierīces adresi, reģistru, kurā rakstāt, un vērtību, kuru vēlaties rakstīt.

Otrais ir lasīt_vārda_datus(), kas pieņem tikai ierīces adresi un reģistru. ADC nepārtraukti nolasīs spriegumus un saglabās rezultātu konversijas reģistrā. Izmantojot šo metodi, varat izgūt šī reģistra saturu.

Varat nedaudz izrotāt rezultātu un pēc tam to izdrukāt. Pirms atgriežaties cilpas sākumā, ieviešiet nelielu aizkavi. Tas nodrošinās, ka jūs neesat pārpildīts ar datiem.

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)

Jūs tikko esat pabeidzis. Kartējiet iegūto vērtību diapazonu ar vēlamo vērtību diapazonu un pēc tam saīsiniet to līdz vajadzīgajam zīmju skaitam aiz komata. Varat pielāgot drukas funkciju tā, lai jaunu vērtību drukātu tikai tad, ja tā atšķiras no pēdējās vērtības. Ja neesat pārliecināts par maks, min, un raunds, tu vari apskatiet mūsu 20 svarīgāko Python funkciju sarakstu!

Darbs ar troksni

Tagad, ja vien jūsu iestatījums nav īpaši glīts un kārtīgs, jūs pamanīsit nelielu troksni. Tas ir raksturīgs negatīvais aspekts, izmantojot 16 bitus, nevis tikai desmit: šis nelielais trokšņa daudzums būs jūtamāks.

Sasaistot blakus esošo ieeju (1. ieeju) ar zemi un pārslēdzot režīmu tā, lai salīdzinātu pirmo un otro ievadi, jūs varat iegūt daudz stabilākus rezultātus. Varat arī nomainīt šos garos, troksni savācošos džemperkabeļus pret maziem un pievienot dažus kondensatorus, kamēr to darāt. Arī potenciometra vērtība var mainīties.

Ir arī programmatūras iespējas. Varat izveidot slīdošo vidējo rādītāju vai vienkārši neņemt vērā nelielas izmaiņas. Negatīvā puse ir tāda, ka papildu kods radīs skaitļošanas izmaksas. Ja rakstāt nosacījumu paziņojumus augsta līmeņa valodā, piemēram, Python, un katru sekundi ņemat tūkstošiem paraugu, šīs izmaksas strauji palielināsies.

Dodieties tālāk, veicot daudzas iespējamās nākamās darbības

Nolasījumu ņemšana, izmantojot I2C, ir diezgan vienkārša, un tas pats galvenokārt attiecas uz citām metodēm, piemēram, SPI. Lai gan varētu šķist, ka starp pieejamajām ADC opcijām ir lielas atšķirības, patiesība ir tāda, ka, tiklīdz viena no tām darbojas, zināšanas ir viegli pielietot pārējām.

Tātad, kāpēc gan neturpināt lietas tālāk? Savienojiet vairākus potenciometrus vai mēģiniet nolasīt gaismu, skaņu vai temperatūru. Paplašiniet tikko izveidoto kontrolieri un izveidojiet Raspberry Pi iestatījumu, kas ir patiesi praktisks!