Bu pratik ve kapsamlı projeyle etrafınızdaki dünyayı ölçmeye başlayın.

Temel Çıkarımlar

  • Raspberry Pi'nin analog girişi yoktur ancak kayıt, manipülasyon ve kontrol amacıyla gerçek dünyadaki voltajları dijital forma dönüştürmek için harici ADC'ler ekleyebilirsiniz.
  • Popüler ADC seçenekleri arasında hız ve hassasiyet için MCP3004/MCP3008 veya daha yavaş örnekleme hızında 16 bit okumalar için ADS111x yer alır.
  • Adafruit'in ADS1115'i, küçük voltaj farklılıklarını tespit etmenize ve program sırasında kazancı ayarlamanıza olanak tanıyan Programlanabilir Kazanç Yükselticisine (PGA) sahip basit bir seçenektir. I2C kullanarak Raspberry Pi ile bağlantı kurmak basittir.

Raspberry Pi'nin kutudan çıktığı haliyle analog girişi yoktur. Bu, Arduino gibi mikrodenetleyici tabanlı kartlara kıyasla onu dezavantajlı hale getiriyor.

Ancak umutsuzluğa kapılmayın: dikkate alınması gereken pek çok seçenek var. Raspberry Pi ve harici bir ADC ile çalışmaya başlayın.

Neden Giriş Eklemelisiniz?

Gerçek dünya, eğer doğru devreye sahipseniz, voltaj kullanılarak kolayca tanımlanabilecek olaylarla doludur. Bu voltajları dijital forma dönüştürün; bunları kaydedebilir, işleyebilir ve diğer parametreleri ve cihazları kontrol etmek için kullanabilirsiniz.

instagram viewer

Toprağınızın nemini, seranızın sıcaklığını veya hamsterinizin ağırlığını takip etmek istiyor olabilirsiniz. Pi'nize bir ses kontrolü eklemeyi, tam bir fader kümesi oluşturmayı veya sıfırdan bir joystick tasarlamayı düşünüyor olabilirsiniz. Olasılıklar az ya da çok sınırsızdır.

ADC'ler için seçenekler

Peki yeni başlayanlar için hangi ADC en iyisidir?

En popüler ve basit seçenekler arasında MCP3004 (Ve MCP3008) Microchip'ten çipler. Her biri 10 bitlik, 200 kSPS'ye kadar okuyabilen dört (veya sekiz) kanala sahip olacaksınız. Öte yandan Texas Instruments'ın 860 SPS'de 16 bit okuyan ADS111x cihazları var. Yani hız ile hassasiyet (ve doğal olarak fiyat) arasında bir denge var.

Birçok mikrodenetleyici yerleşik ADC'lerle birlikte gelir. Ortalama Arduino'da bulduğunuz ATMega her şeyin ötesinde birkaç 10 bitlik kanal sunacak. Bu, Raspberry Pi'nin sağlayamadığı durumlarda Arduino'nun analog girişler sağlamasına olanak tanıyan şeydir. Kurulumunuza zaten dahil olan bir Arduino'nuz varsa ve 10 bit yeterliyse, o zaman bu aslında gitmenin en kolay yolu olabilir.

Burada Adafruit'in ADS1115'i ile işi basit tutacağız.

Programlanabilir Kazanç Yükselticisi Nedir?

Bu çip, Programlanabilir Kazanç Yükselticisi (PGA) dahil olmak üzere birkaç ilginç özellikle birlikte gelir. Bu, istenen değer aralığını dijital olarak bir voltun çok küçük bir kısmına kadar ayarlamanıza olanak tanır. 16 bitin temsil edebileceği değer sayısıyla bu, yalnızca birkaç mikrovoltluk farkı tespit etmenize olanak tanır.

Buradaki avantaj, kazancı programın ortasında değiştirebilmenizdir. MCP3004 gibi diğer çipler farklı bir yaklaşım benimsiyor; referans voltajı sağlayabileceğiniz ekstra bir pin ile birlikte gelirler.

Çoğullama hakkında ne düşünüyorsunuz?

Çoklayıcı (veya çoklayıcı), tek bir ADC kullanarak birçok girişi okumanızı sağlayan bir anahtardır. ADC çipiniz çok sayıda giriş piniyle birlikte geliyorsa, o zaman bazı dahili çoğullamalar oluyor demektir. ADS1115'in çoklayıcısı, dahili kayıtlar aracılığıyla seçebileceğiniz dört girişe izin verir.

Kayıtlarla Başa Çıkmak

ADS1115 bu seçeneklerin yanı sıra birkaç tane daha sunar. Birkaç anahtarı çevirerek çoklayıcıyla ilgilenebilir, kazancı ayarlayabilir, yerleşik karşılaştırıcıyı etkinleştirebilir, örnekleme hızını değiştirebilir ve cihazı düşük güçte uyku moduna geçirebilirsiniz.

Peki bu anahtarlar nerede? Paketin içinde, adı verilen çok küçük bellek parçaları biçimindedirler. kayıtlar. Belirli bir özelliği etkinleştirmek için ilgili biti 0 yerine 1'e ayarlamanız yeterlidir.

Bakmak ADS111x veri sayfası, bu modellerin, cihazın davranışını yöneten yapılandırma kayıtları da dahil olmak üzere dört kayıtla geldiğini göreceksiniz.

Örneğin, 14'ten 12'ye kadar olan bitler çoklayıcıyı kontrol eder. Bu üç biti kullanarak sekiz konfigürasyon arasından seçim yapabilirsiniz. Burada isteyeceğiniz "100" olup sıfır girişi ile toprak arasındaki farkı verecektir. Öte yandan 7'den 5'e kadar olan bitler örnekleme hızını yönetir. Saniyede maksimum 860 örnek istiyorsanız bunları “111” olarak ayarlayabilirsiniz.

Hangi seçenekleri ayarlayacağınızı öğrendikten sonra ADC'ye gönderebileceğiniz iki baytınız olacaktır. Daha sonra buraya veya oraya tek bir bit ayarlamak isterseniz, bitsel operatörleri kullanarak bunlarla ayrı ayrı ilgilenebilirsiniz.

İşte burası kafa karıştırıcı olabilir. Bu durumda ikili kod bir değeri değil, bireysel anahtarların değerlerini temsil eder. Bu değişkenleri büyük bir sayı olarak, ondalık veya onaltılık sistemde ifade edebilirsiniz. Ancak baş ağrısından kaçınmak istiyorsanız okunması daha kolay olan ikili sürüme sadık kalmalısınız.

Kablolama

Bu cihazı doğrudan devre tahtasına takabilirsiniz. Pozitif voltaj girişi 2 ila 5,5v arasında herhangi bir değeri kabul edecektir, bu da Raspberry Pi'deki 3,3v rayının iyi çalışacağı anlamına gelir.

SDA ve SCL girişlerini RPi'deki karşılıklara bağlayın ve aynı şeyleri toprak ve 3,3v ile yapın. Toprak ve gerilim hatları arasına bir potansiyometre alın ve ortadaki ucu ADC'nin ilk girişine yerleştirin. Devam etmek için ihtiyacınız olan tek şey bu!

I2C ile Başa Çıkmak

Farklı ADC'ler farklı protokoller aracılığıyla çalışır. ADS1115'imiz durumunda, I2C kullanacağız.

Aşağıdaki örnek Python kullanarak ADC ile etkileşime girecektir. Ancak bunu yapmadan önce ayarlamanız gerekir. Raspberry Pi OS'nin son sürümleri bunu çok basit hale getirdi. Git Tercihler > Raspberry Pi Yapılandırması. Daha sonra, Arayüzler sekme, anahtar I2C Açık.

Her şeyin çalıştığını kontrol etmek için bir terminal açın ve şunu çalıştırın:

sudo i2cdetect -y 1

Bu komut bir ızgara çıktısı verecektir. Her şeyin çalıştığını ve kabloları doğru şekilde bağladığınızı varsayarsak, ızgarada yeni bir değerin göründüğünü göreceksiniz. Bu ADC'nizin adresidir. Burada bunun onaltılık bir değer olduğunu unutmayın, dolayısıyla önüne şunu koymanız gerekir: “0x” aşağıdaki kodda kullandığınızda. İşte burada 0x48:

Adresi aldıktan sonra I2C komutlarını göndermek için SMBus kütüphanesini kullanabilirsiniz. Burada iki yöntemle ilgileneceksiniz. İlk olarak write_word_data(), üç bağımsız değişkeni kabul eder: aygıt adresi, yazdığınız kayıt defteri ve yazmak istediğiniz değer.

İkincisi ise read_word_data(), yalnızca aygıt adresini ve kaydı kabul eder. ADC sürekli olarak gerilimleri okuyacak ve sonucu dönüşüm kaydında saklayacaktır. Bu yöntemle o kaydın içeriğini alabilirsiniz.

Sonucu biraz güzelleştirebilir ve ardından yazdırabilirsiniz. Döngünün başlangıcına dönmeden önce kısa bir gecikme ekleyin. Bu, verilerle boğulmamanızı sağlayacaktır.

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)

Bitirmek üzeresiniz. Alacağınız değer aralığını tercih ettiğiniz değerle eşleştirin ve ardından istediğiniz sayıda ondalık basamağa kadar kesin. Yazdırma işlevini, yeni bir değeri yalnızca son değerden farklı olduğunda yazdıracak şekilde uyarlayabilirsiniz. konusunda emin değilseniz maksimum, dk., Ve yuvarlak, yapabilirsiniz En önemli 20 Python işlevi listemize göz atın!

Gürültüyle Başa Çıkmak

Şimdi, kurulumunuz süper, süper temiz ve düzenli olmadığı sürece bir miktar gürültü fark edeceksiniz. Bu, yalnızca on bit yerine 16 bit kullanmanın doğal dezavantajıdır: o küçük gürültü parçası daha algılanabilir olacaktır.

Bitişik girişi (giriş 1) toprağa bağlayarak ve girişi bir ve ikiyi karşılaştıracak şekilde modu değiştirerek çok daha kararlı sonuçlar elde edebilirsiniz. Ayrıca, gürültü toplayan uzun atlama kablolarını küçük olanlarla değiştirebilir ve bu sırada birkaç kapasitör ekleyebilirsiniz. Potansiyometrenizin değeri de bir fark yaratabilir.

Yazılım seçenekleri de var. Dönen bir ortalama oluşturabilir veya küçük değişiklikleri göz ardı edebilirsiniz. Dezavantajı ise ekstra kodun hesaplama maliyeti gerektirmesidir. Python gibi üst düzey bir dilde koşullu ifadeler yazıyorsanız ve her saniye binlerce örnek alıyorsanız, bu maliyetler hızla artacaktır.

Birçok Olası Sonraki Adımla Daha İleriye Gidin

I2C aracılığıyla ölçüm almak oldukça basittir ve aynı şey SPI gibi diğer yöntemler için de büyük ölçüde geçerlidir. Mevcut ADC seçenekleri arasında büyük farklar var gibi görünse de gerçek şu ki, bunlardan birini çalıştırdığınızda bilgiyi diğerlerine uygulamak kolaydır.

Öyleyse neden işleri daha ileri götürmeyesiniz? Birden fazla potansiyometreyi birbirine bağlayın veya ışığı, sesi veya sıcaklığı okumayı deneyin. Yeni yaptığınız denetleyiciyi genişletin ve gerçekten uygulamalı bir Raspberry Pi kurulumu oluşturun!