- Komponen yang Diperlukan
- Pengenalan kepada APDS-9960 Digital Proximity RGB & Gesture Sensor
- Rajah Litar
- Pengaturcaraan Arduino untuk Gerak isyarat dan Pewarnaan Warna
Hari ini kebanyakan telefon dilengkapi dengan ciri kawalan isyarat untuk membuka atau menutup aplikasi, memulakan muzik, menghadiri panggilan dan lain-lain. Ini adalah ciri yang sangat berguna untuk menjimatkan masa dan juga kelihatan hebat untuk mengawal mana-mana peranti dengan gerak isyarat. Kami sebelumnya menggunakan accelerometer untuk membina robot kawalan isyarat dan tetikus Air terkawal isyarat. Tetapi hari ini kita belajar untuk menghubungkan sensor isyarat APDS9960 dengan Arduino. Sensor ini juga mempunyai sensor RGB untuk mengesan warna, yang juga akan digunakan dalam tutorial ini. Oleh itu, anda tidak perlu menggunakan sensor terpisah untuk pengesanan isyarat dan warna, walaupun sensor khusus untuk pengesanan warna tersedia - sensor warna TCS3200 yang telah kami gunakan dengan Arduino untuk membangun mesin penyortir warna.
Komponen yang Diperlukan
- Arduino UNO
- APDS9960 RGB dan Sensor Gerakan
- LCD 16x2
- Suis DPDT
- Periuk 100K dan perintang 10K
- Kabel Jumper
Pengenalan kepada APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 adalah sensor pelbagai fungsi. Ia dapat mengesan isyarat, cahaya persekitaran dan nilai RGB dalam cahaya. Sensor ini juga dapat digunakan sebagai sensor jarak dan kebanyakan digunakan di telefon pintar, untuk menonaktifkan layar sentuh ketika menghadiri panggilan.
Sensor ini terdiri daripada empat fotodiod. Fotodiod ini mengesan tenaga IR yang dipantulkan yang dihantar oleh LED on-board. Oleh itu, setiap kali gerak isyarat dilakukan maka tenaga IR ini terhalang dan dipantulkan kembali ke sensor, kini sensor mengesan maklumat (arah, halaju) mengenai gerak isyarat dan mengubahnya menjadi maklumat digital. Sensor ini dapat digunakan untuk mengukur jarak halangan dengan mengesan cahaya IR yang dipantulkan. Ia mempunyai penapis penyekat UV dan IR untuk merasakan warna RGB dan menghasilkan data 16-bit untuk setiap warna.
Pin-out sensor APDS-9960 ditunjukkan di bawah. Sensor ini berfungsi pada protokol komunikasi I 2 C. Ia menggunakan arus 1µA dan dikuasakan oleh 3.3V jadi berhati-hatilah dan jangan sambungkannya dengan pin 5V. Pin INT di sini adalah pin interrupt, yang digunakan untuk mendorong komunikasi I 2 C. Dan pin VL adalah pin kuasa pilihan untuk LED on-board jika pelompat PS tidak disambungkan. Sekiranya pelompat PS ditutup maka anda hanya perlu menghidupkan pin VCC, ia akan memberi kuasa kepada kedua - modul dan LED IR.
Rajah Litar
Sambungan untuk APDS960 dengan Arduino sangat mudah. Kami akan menggunakan butang DPDT untuk beralih antara dua mod RGB Sensing dan Gesture Sensing. Pertama, pin komunikasi I2C SDA dan SCL APDS9960 masing-masing disambungkan ke Arduino pin A4 dan A5. Seperti yang dinyatakan sebelumnya, voltan operasi untuk sensor adalah 3.3v, VCC dan GND APDS9960 disambungkan ke 3.3V dan GND dari Arduino. Pin interrupt (INT) APDS9960 disambungkan ke pin D2 dari Arduino.
Untuk LCD, pin data (D4-D7) disambungkan ke pin digital D6-D3 dari Arduino dan pin RS dan EN disambungkan ke D6 dan D7 dari Arduino. LCD V0 disambungkan ke periuk dan periuk 100K digunakan untuk mengawal kecerahan LCD. Untuk butang DPDT kami hanya menggunakan 3 pin. Pin kedua disambungkan ke pin D7 dari Arduino untuk input dan dua lagi disambungkan ke GND dan VCC diikuti oleh perintang 10K.
Pengaturcaraan Arduino untuk Gerak isyarat dan Pewarnaan Warna
Bahagian pengaturcaraannya mudah dan mudah dan program lengkap dengan video demo diberikan pada akhir tutorial ini.
Mula-mula kita perlu memasang perpustakaan yang dibuat oleh Sparkfun. Untuk memasang perpustakaan ini, pergi ke Sketch-> Include Library-> Manage Library.
Sekarang di bar carian ketik "Sparkfun APDS9960" dan klik pada butang pasang apabila anda melihat perpustakaan.
Dan kami sudah bersedia untuk pergi. Mari kita mulakan.
Oleh itu, pertama kita memasukkan semua fail tajuk yang diperlukan. Fail header pertama LiquidCrystal.h digunakan untuk fungsi LCD. Fail header kedua Wire.h digunakan untuk komunikasi I 2 C dan yang terakhir SparkFun_APDS996.h digunakan untuk sensor APDS9960.
#sertakan
Sekarang dalam baris seterusnya kami telah menentukan pin untuk butang dan LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Pada bahagian seterusnya, kami telah menentukan makro untuk pin interrupt yang disambungkan pada pin digital 2 dan satu butang berubah. Nyatakan untuk keadaan butang semasa dan isr_flag untuk rutin perkhidmatan gangguan.
#tentukan APDS9960_INT 2 int butangState; int isr_flag = 0;
Selanjutnya objek dibuat untuk SparkFun_APDS9960, sehingga kita dapat mengakses gerakan isyarat dan mengambil nilai RGB.
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); uint16_t ambient_light = 0; uint16_t red_light = 0; uint16_t green_light = 0; uint16_t blue_light = 0;
Dalam fungsi persediaan , baris pertama adalah untuk mengambil nilai dari butang (rendah / tinggi) dan baris kedua & ketiga mendefinisikan interrupt dan pin butang sebagai input. apds.init () menginisialisasi sensor APDS9960 dan lcd.begin (16,2) menginisialisasi LCD.
kekosongan persediaan () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Dalam fungsi gelung baris pertama mendapat nilai dari butang dan menyimpannya dalam pemboleh ubah buttonState yang ditentukan sebelumnya. Sekarang di baris berikutnya kita memeriksa nilai dari butang, jika tinggi maka kita mengaktifkan sensor cahaya dan jika rendah maka mulailah sensor isyarat.
The attachInterrupt () adalah fungsi digunakan untuk sampukan luar yang dalam kes ini adalah sampukan sensor. Argumen pertama dalam fungsi ini adalah nombor gangguan. Di Arduino UNO, terdapat dua pin digital interrupt - 2 dan 3 yang dilambangkan oleh INT.0 dan INT.1. Dan kami telah menghubungkannya ke pin 2 sehingga kami menulis 0 di sana. Argumen kedua memanggil fungsi interruptRoutine () yang ditakrifkan kemudian. Hujah terakhir adalah JATUH sehingga akan mencetuskan gangguan ketika pin naik dari tinggi ke rendah. Ketahui lebih lanjut mengenai Gangguan Arduino di sini.
gelung void () { buttonState = digitalRead (buttonPin); jika (buttonState == TINGGI) { apds.enableLightSensor (benar); }
Di bahagian seterusnya, kami memeriksa pin butang. Sekiranya tinggi, mulakan proses untuk sensor RGB. Kemudian periksa sama ada sensor cahaya membaca nilai atau tidak. Sekiranya tidak dapat membaca nilainya maka dalam kes itu, cetak " Kesalahan membaca nilai cahaya". Dan jika boleh membaca nilai, bandingkan nilai tiga warna dan mana yang paling tinggi, cetak warna itu ke LCD.
if (buttonState == TINGGI) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Ralat membaca nilai cahaya"); } lain { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); kelewatan (1000); lcd.clear (); } ……. ………..
Pada baris seterusnya, periksa pin butang, dan jika prosesnya rendah , Gesture sensor. Kemudian periksa isr_flag dan jika itu 1 maka fungsi detachInterrupt () dipanggil. Fungsi ini digunakan untuk mematikan gangguan. Baris seterusnya memanggil handleGesture () yang fungsi ditentukan kemudian. Pada baris seterusnya, tentukan isr_flag ke sifar dan pasangkan interrupt.
lain jika (buttonState == RENDAH) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } }
Yang seterusnya adalah fungsi interruptRoutine () . Fungsi ini digunakan untuk menghidupkan pemboleh ubah isr_flag 1, sehingga layanan interrupt dapat diinisialisasi.
batal gangguanRutin (). { isr_flag = 1; }
Fungsi handleGesture () ditakrifkan di bahagian seterusnya. Fungsi ini terlebih dahulu memeriksa ketersediaan sensor isyarat. Sekiranya tersedia, ia akan membaca nilai isyarat dan memeriksa gerak isyaratnya (ATAS, BAWAH, KANAN, KIRI, JAUH, NEAR) dan mencetak nilai yang sesuai ke LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { kes DIR_UP: lcd.print ("UP"); kelewatan (1000); lcd.clear (); rehat; kes DIR_DOWN: lcd.print ("DOWN"); kelewatan (1000); lcd.clear (); rehat; kes DIR_LEFT: lcd.print ("LEFT"); kelewatan (1000); lcd.clear (); rehat; kes DIR_RIGHT: lcd.print ("KANAN"); kelewatan (1000); lcd.clear (); rehat; kes DIR_NEAR: lcd.print ("NEAR"); kelewatan (1000); lcd.clear (); rehat; kes DIR_FAR: lcd.print ("JAUH"); kelewatan (1000); lcd.clear (); rehat; lalai: lcd.print ("TIADA"); kelewatan (1000); lcd.clear (); } } }
Akhirnya, muat naik kod ke Arduino dan tunggu sensor dimulakan. Sekarang semasa butang dimatikan bermaksud ia berada dalam mod isyarat. Oleh itu, cuba gerakkan tangan anda ke arah kiri, kanan, atas, dan bawah. Untuk memberi isyarat jauh , jaga tangan anda pada jarak 2-4 inci dari sensor selama 2-3 saat dan lepaskan. Untuk gerakan dekat, jauhkan tangan anda dari sensor, kemudian angkat dan lepaskan.
Sekarang hidupkan butang HIDUP untuk memasukkannya ke mod penginderaan warna dan ambil objek merah, biru dan hijau satu persatu dekat dengan sensor. Ia akan mencetak warna objek.