Mulailah mengukur dunia di sekitar Anda dengan proyek praktis dan komprehensif ini.

Poin Penting

  • Raspberry Pi tidak memiliki input analog, tetapi Anda dapat menambahkan ADC eksternal untuk mengubah voltase dari dunia nyata menjadi bentuk digital untuk perekaman, manipulasi, dan kontrol.
  • Opsi ADC yang populer mencakup MCP3004/MCP3008 untuk kecepatan dan presisi tradeoff atau ADS111x untuk pembacaan 16-bit pada laju sampel yang lebih lambat.
  • ADS1115 dari Adafruit adalah opsi sederhana dengan Programmable Gain Amplifier (PGA) yang memungkinkan Anda mendeteksi perbedaan tegangan kecil dan menyesuaikan penguatan selama program berlangsung. Menghubungkannya dengan Raspberry Pi menggunakan I2C sangatlah mudah.

Di luar kotak, Raspberry Pi tidak memiliki input analog. Hal ini menempatkannya pada posisi yang kurang menguntungkan dibandingkan dengan papan berbasis mikrokontroler seperti Arduino.

Namun jangan putus asa: ada banyak pilihan untuk dipertimbangkan. Bangun dan jalankan dengan Raspberry Pi dan ADC eksternal.

instagram viewer

Mengapa Menambahkan Input?

Dunia nyata penuh dengan fenomena yang, jika Anda memiliki sirkuit yang tepat, dapat dengan mudah dijelaskan menggunakan tegangan. Dapatkan voltase tersebut ke dalam bentuk digital, dan Anda dapat merekamnya, memanipulasinya, dan menggunakannya untuk mengontrol parameter dan perangkat lain.

Anda mungkin ingin memantau kelembapan tanah, suhu rumah kaca, atau berat hamster Anda. Anda mungkin ingin menambahkan kontrol volume ke Pi Anda, membuat kumpulan fader, atau mendesain joystick dari awal. Kemungkinannya kurang lebih tidak terbatas.

Opsi untuk ADC

Jadi, ADC mana yang terbaik untuk pemula?

Di antara opsi yang paling populer dan mudah adalah MCP3004 (Dan MCP3008) chip dari Microchip. Anda akan mendapatkan empat (atau delapan) saluran masing-masing 10 bit, yang dapat membaca hingga 200 kSPS. Di sisi lain, ada perangkat ADS111x dari Texas Instruments, yang membaca 16 bit pada 860 SPS. Jadi, ada trade-off antara kecepatan dan presisi (dan tentunya harga).

Banyak mikrokontroler dilengkapi dengan ADC bawaan. ATMega yang Anda temukan di rata-rata Arduino akan menawarkan beberapa saluran 10-bit, di atas segalanya. Inilah yang memungkinkan Arduino memberikan input analog yang tidak bisa dilakukan oleh Raspberry Pi. Jika Anda sudah memiliki Arduino yang terlibat dalam pengaturan Anda, dan fidelitas 10 bit sudah cukup, maka ini mungkin cara termudah untuk melakukannya.

Di sini, kami akan membuatnya tetap sederhana, dengan ADS1115 dari Adafruit.

Apa Penguat Penguatan yang Dapat Diprogram?

Chip ini hadir dengan beberapa fitur menarik, termasuk Programmable Gain Amplifier (PGA). Ini memungkinkan Anda mengatur rentang nilai yang diinginkan secara digital, hingga sepersekian volt. Dengan jumlah nilai yang dapat diwakili oleh 16 bit, ini memungkinkan Anda mendeteksi perbedaan beberapa mikrovolt saja.

Keuntungannya di sini adalah Anda dapat mengubah penguatan di tengah-tengah program. Chip lain, seperti MCP3004, menggunakan pendekatan berbeda; mereka datang dengan pin tambahan, yang mana Anda dapat memberikan tegangan referensi.

Bagaimana dengan Multipleksing?

Multiplexer (atau mux) adalah saklar yang memungkinkan Anda membaca banyak input menggunakan satu ADC. Jika chip ADC Anda dilengkapi dengan banyak pin input, maka terjadi beberapa multiplexing internal. Mux ADS1115 memungkinkan empat input, yang dapat Anda pilih melalui register internal.

Berurusan Dengan Register

ADS1115 menyediakan opsi ini, dan beberapa opsi lainnya. Anda dapat menangani multiplexer, menyesuaikan penguatan, mengaktifkan komparator internal, mengubah laju sampel, dan mengalihkan perangkat ke mode tidur berdaya rendah, semuanya hanya dengan menekan beberapa tombol.

Tapi di mana saklar-saklar itu? Mereka ada di dalam paket, dalam bentuk potongan memori yang sangat kecil yang disebut register. Untuk mengaktifkan fitur tertentu, Anda hanya perlu menyetel bit yang relevan ke 1, bukan 0.

Melihat ke lembar data ADS111x, Anda akan menemukan bahwa model ini hadir dengan empat register, termasuk register konfigurasi yang mengatur perilaku perangkat.

Misalnya, bit 14 hingga 12 mengontrol multiplexer. Dengan menggunakan tiga bit ini, Anda dapat memilih dari delapan konfigurasi. Yang Anda inginkan di sini adalah “100”, yang akan memberikan perbedaan antara input nol dan ground. Bit 7 sampai 5, sebaliknya, mengatur laju sampel. Jika Anda menginginkan maksimum 860 sampel per detik, Anda dapat mengaturnya ke “111”.

Setelah Anda mengetahui opsi mana yang harus disetel, Anda akan memiliki dua byte untuk dikirim ke ADC. Jika nanti Anda ingin menyetel satu bit di sini atau di sana, Anda dapat menanganinya satu per satu menggunakan operator bitwise.

Di sinilah hal ini mungkin membingungkan. Dalam hal ini, biner tidak mewakili suatu nilai, tetapi nilai dari masing-masing saklar. Anda dapat menyatakan variabel-variabel ini sebagai satu angka besar, dalam desimal atau heksadesimal. Namun jika Anda ingin menghindari sakit kepala, Anda sebaiknya tetap menggunakan versi biner, yang lebih mudah dibaca.

Memasang Kabel

Anda dapat menyambungkan perangkat ini langsung ke papan tempat memotong roti. Input tegangan positif akan menerima antara 2 dan 5.5v, yang berarti rel 3.3v pada Raspberry Pi akan berfungsi dengan baik.

Hubungkan input SDA dan SCL ke rekanan di RPi, dan lakukan hal yang sama dengan ground dan 3.3v. Dapatkan potensiometer antara saluran ground dan tegangan, dan letakkan kabel tengah ke input pertama ADC. Hanya itu yang Anda perlukan untuk memulai!

Berurusan Dengan I2C

ADC yang berbeda bekerja melalui protokol yang berbeda. Dalam kasus ADS1115 kami, kita akan menggunakan I2C.

Contoh berikut akan berinteraksi dengan ADC menggunakan Python. Namun sebelum Anda melakukannya, Anda harus menyiapkannya. Versi terbaru dari Raspberry Pi OS telah membuat ini menjadi sangat sederhana. Menuju ke Preferensi > Konfigurasi Raspberry Pi. Kemudian, dari Antarmuka tab, alihkan I2C pada.

Untuk memeriksa semuanya berfungsi, buka terminal dan jalankan:

sudo i2cdetect -y 1

Perintah ini akan menampilkan grid. Dengan asumsi semuanya berfungsi, dan Anda telah menyambungkannya dengan benar, Anda akan melihat nilai baru muncul di grid. Ini adalah alamat ADC Anda. Ingatlah di sini bahwa ini adalah nilai heksadesimal, jadi Anda perlu mengawalinya dengan “0x” ketika Anda menggunakannya dalam kode di bawah ini. Ini dia 0x48:

Setelah Anda mendapatkan alamatnya, Anda dapat menggunakan perpustakaan SMBus untuk mengirim perintah I2C. Anda akan berurusan dengan dua metode di sini. Yang pertama adalah tulis_kata_data(), yang menerima tiga argumen: alamat perangkat, register tempat Anda menulis, dan nilai yang ingin Anda tulis.

Yang kedua adalah baca_kata_data(), yang hanya menerima alamat perangkat dan register. ADC akan terus membaca tegangan dan menyimpan hasilnya dalam register konversi. Dengan metode ini, Anda dapat mengambil isi register tersebut.

Anda bisa mempercantik hasilnya sedikit, lalu mencetaknya. Sebelum Anda kembali ke awal perulangan, berikan penundaan singkat. Ini akan memastikan Anda tidak kewalahan dengan data.

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)

Anda hampir selesai. Petakan rentang nilai yang Anda peroleh ke nilai yang Anda sukai, lalu potong ke jumlah desimal yang diinginkan. Anda dapat menyesuaikan fungsi cetak sehingga Anda hanya mencetak nilai baru jika nilai tersebut berbeda dari nilai terakhir. Jika Anda tidak yakin tentangnya maks, menit, Dan bulat, kamu bisa lihat daftar 20 fungsi Python terpenting kami!

Mengatasi Kebisingan

Sekarang, kecuali pengaturan Anda super, super rapi, dan rapi, Anda akan melihat beberapa kebisingan. Inilah kelemahan yang melekat dalam penggunaan 16 bit, bukan hanya sepuluh bit: sedikit noise akan lebih terlihat.

Dengan mengikat input yang berdekatan (input 1) ke ground, dan mengganti mode sehingga Anda membandingkan input satu dan dua, Anda bisa mendapatkan hasil yang jauh lebih stabil. Anda juga dapat menukar kabel jumper pengumpul kebisingan yang panjang dengan yang kecil, dan menambahkan beberapa kapasitor saat Anda menggunakannya. Nilai potensiometer Anda juga dapat membuat perbedaan.

Ada juga opsi perangkat lunak. Anda mungkin membuat rata-rata perputaran, atau mengabaikan perubahan kecil saja. Kelemahannya adalah kode tambahan akan membebankan biaya komputasi. Jika Anda menulis pernyataan kondisional dalam bahasa tingkat tinggi seperti Python, dan mengambil ribuan sampel setiap detik, biaya ini akan bertambah dengan cepat.

Melangkah Lebih Jauh Dengan Banyak Kemungkinan Langkah Berikutnya

Melakukan pembacaan melalui I2C cukup mudah dan hal yang sama juga berlaku untuk metode lain, seperti SPI. Meskipun kelihatannya ada perbedaan besar antara opsi ADC yang tersedia, kenyataannya adalah setelah salah satu opsi berfungsi, mudah untuk menerapkan pengetahuan tersebut ke opsi lain.

Jadi mengapa tidak melangkah lebih jauh? Ikat beberapa potensiometer menjadi satu, atau coba baca cahaya, suara, atau suhu. Perluas pengontrol yang baru saja Anda buat, dan buat pengaturan Raspberry Pi yang benar-benar praktis!