Untuk proyek sains putri saya (kategori Ilmu Komputer dan Matematika), ia ingin menggunakan RPi untuk berkeliling dan mengukur apakah suara keras yang berbeda berada di atas ambang rasa sakit dan merusak telinga kita. Dia adalah siswa kelas 6, tetapi dia memiliki pengalaman dengan RPi dan pemrograman dengan Python. Phillip Heels Nichols telah menjawab beberapa pertanyaan di halaman FB RPi, tetapi menyarankan agar kami datang ke sini untuk bantuan lebih lanjut. Dia ingin mengkalibrasi Pi dengan pengukur tekanan suara (saya punya satu di antaranya) untuk mencari tahu berapa milivolt yang dihasilkan
Inilah yang kami pikirkan sejauh ini. Kami membeli adc (mcp3008) dari adafruit dan menunggu kedatangannya. Jika kita menghubungkan output digital dari adc ke pin GPIO 11 dan pin GPIO 12 ke LED merah, apakah program sederhana ini akan berfungsi?
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11,GPIO.IN)
GPIO.setup(12,GPIO.OUT)
GPIO.output(12,GPIO.LOW) #make sure LED is off
SPL=0 #zero the variable
While SPL<??: #Where ?? is the value in millivolts produced by a sound at 130 db
SPL=GPIO.input(11) #get value from adc connected to microphone
GPIO.output(12,GPIO.HIGH) #turn LED on if the sound level is higher than ??
Jika ini berhasil, kode apa yang bisa diletakkan di akhir untuk mereset program dengan menekan tombol yang terhubung ke pin GPIO? Dia ingin ini portabel, jadi dia tidak akan bisa mengetik perintah untuk menjalankan program lagi.
Jawaban:
Menggunakan bus SPI dengan hanya menghubungkan pin keluar digital ADC ke pin 11 dari GPi RPi tidak akan berfungsi. Bus ini membutuhkan beberapa kabel lagi, 4 tepatnya.
ADC juga akan membutuhkan input SPI, pin Clock dan Chip Select yang terhubung agar berfungsi dengan benar. Untungnya ada informasi bagus tentang ini yang tersedia dari berbagai sumber.
Pertama jika Anda ingin tahu lebih banyak tentang cara kerja SPI, saya sarankan untuk membaca halaman ini di Wikipedia untuk mengenal SPI sedikit lebih baik.
Kedua, ada tutorial yang sangat bagus tentang Adafruits yang membahas topik ini, termasuk kode Python dan memandu Anda melalui proses menghubungkan ADC itu sendiri dan berkomunikasi dengannya. Satu kelemahan (minor) adalah bahwa kode yang digunakan dalam tutorial ini tidak menggunakan port SPI itu sendiri, itu perangkat lunak mengemulasi bus SPI (disebut bit-banging), ini berarti bahwa Anda lebih bebas untuk menggunakan pin pada port GPIO yang kamu ingin.
Saya kira untuk proyek Anda yang relatif sederhana (walaupun saya sangat terkejut saat ini siswa kelas 6 mengerjakan tugas-tugas semacam ini !, bagi mereka banyak informasi baru diberikan kepada mereka dengan membuat proyek semacam ini), solusi bit-banging akan bekerja baik. Keuntungan menggunakan bit banging adalah bahwa untuk tujuan pembelajaran lebih baik karena Anda membuat sendiri semua sinyal SPI, prosesor tidak melakukan apa pun secara otomatis, sehingga Anda akan mendapatkan pengetahuan wawasan yang jauh lebih baik tentang SPI dan komunikasi serial secara umum!
Mungkin itu ide yang bagus untuk memulai dengan contoh-contoh dari Adafruit dan pindah di kemudian hari untuk menggunakan implementasi perangkat keras pada RPi untuk SPI, dalam hal ini Anda akan memerlukan lembar data (juga berguna saat menggunakan implementasi perangkat lunak Adafruit) , Bab 5 dan 6 menjelaskan komunikasi dan apa yang perlu dikonfigurasi untuk menggunakan ADC.
sumber
Untuk SPI perangkat keras dengan pustaka MCP3008 dan Adafruit_MCP3008 dan Adafruit.SPI:
Saya telah mencoba untuk mengubah fungsi set_clock_frequency ('nilai dalam Hz') dari objek SpiDev perpustakaan Adafruit.SPI. Jadi sesuatu seperti,
Saya ingin sampling rate 5 KHz (5 V diberikan kepada MCP3008) tetapi Raspberry Pi model 2 B memberikan JAM seri 25 KHz ketika diamati pada DSO. Untuk laju pengambilan sampel sinyal input analog 5 KHz, Serial CLK dari Pi harus 90 KHz (laju pengambilan sampel 18 kali, seperti yang diberikan dalam lembar data MCP 3008). Namun bahkan ini tidak bisa membantu dan hal-hal tetap tidak berubah saat skrip python berjalan.
Juga mengejutkan, kode yang sama ketika dijalankan pada IDE SPYDER pada RPi mencetak nilai 1006 dalam 1 detik yang menunjukkan tingkat pengambilan sampel yang ditingkatkan dengan pengaturan tetap sama seperti di atas hingga 1 KHz tidak seperti shell Python-2 inbuilt.
sumber