- Komponen yang Diperlukan
- Pengantar APDS-9960 Digital Proximity RGB & Gesture Sensor
- Diagram Sirkuit
- Pemrograman Arduino untuk Gesture dan Color Sensing
Saat ini sebagian besar ponsel hadir dengan fitur kontrol gerakan untuk membuka atau menutup aplikasi apa pun, memulai musik, menghadiri panggilan, dll. Ini adalah fitur yang sangat berguna untuk menghemat waktu dan juga terlihat keren untuk mengontrol perangkat apa pun dengan gerakan. Kami sebelumnya menggunakan akselerometer untuk membuat robot yang dikendalikan gerakan dan mouse Udara yang dikendalikan gerakan. Tapi hari ini kita belajar untuk menghubungkan sensor gerakan APDS9960 dengan Arduino. Sensor ini juga memiliki sensor RGB untuk mendeteksi warna, yang juga akan digunakan dalam tutorial ini. Jadi Anda tidak perlu menggunakan sensor terpisah untuk gerakan dan deteksi warna, meskipun sensor khusus untuk deteksi 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
- Sakelar DPDT
- Pot 100K dan resistor 10K
- Kabel jumper
Pengantar APDS-9960 Digital Proximity RGB & Gesture Sensor
APDS9960 adalah sensor multifungsi. Itu dapat mendeteksi gerakan, cahaya sekitar dan nilai RGB dalam cahaya. Sensor ini juga dapat digunakan sebagai sensor jarak dan banyak digunakan di smartphone, untuk menonaktifkan layar sentuh saat menghadiri panggilan.
Sensor ini terdiri dari empat fotodioda. Fotodioda ini mendeteksi energi IR yang dipantulkan yang ditransmisikan oleh LED on-board. Jadi, setiap kali gerakan dilakukan, energi IR ini akan terhalang dan dipantulkan kembali ke sensor, sekarang sensor mendeteksi informasi (arah, kecepatan) tentang gerakan dan mengubahnya menjadi informasi digital. Sensor ini dapat digunakan untuk mengukur jarak hambatan dengan mendeteksi pantulan cahaya IR. Ini memiliki filter pemblokiran UV dan IR untuk merasakan warna RGB dan menghasilkan data 16-bit untuk setiap warna.
Pin-out dari sensor APDS-9960 ditunjukkan di bawah ini. Sensor ini bekerja pada protokol komunikasi I 2 C. Ini mengkonsumsi arus 1µA dan didukung oleh 3.3V jadi hati-hati dan jangan menghubungkannya dengan pin 5V. Pin INT di sini adalah pin interupsi, yang digunakan untuk menggerakkan komunikasi I 2 C. Dan pin VL adalah pin daya opsional untuk LED on-board jika jumper PS tidak terhubung. Jika jumper PS ditutup maka Anda hanya perlu memberi daya pada pin VCC, ini akan memberi daya ke kedua - modul dan LED IR.
Diagram Sirkuit
Koneksi untuk APDS960 dengan Arduino sangat sederhana. Kami akan menggunakan tombol DPDT untuk beralih antara dua mode RGB Sensing dan Gesture Sensing. Pertama, pin komunikasi I2C SDA dan SCL dari APDS9960 masing-masing dihubungkan ke Arduino pin A4 dan A5. Seperti yang dinyatakan sebelumnya tegangan operasi untuk sensor adalah 3.3v jadi, VCC dan GND dari APDS9960 terhubung ke 3.3V dan GND dari Arduino. Pin interupsi (INT) APDS9960 dihubungkan ke pin D2 Arduino.
Untuk LCD, pin data (D4-D7) dihubungkan ke pin digital D6-D3 Arduino dan pin RS dan EN terhubung ke D6 dan D7 Arduino. V0 LCD dihubungkan ke pot dan pot 100K digunakan untuk mengontrol kecerahan LCD. Untuk tombol DPDT kami hanya menggunakan 3 pin. Pin kedua terhubung ke pin D7 Arduino untuk input dan dua lainnya terhubung ke GND dan VCC diikuti oleh resistor 10K.
Pemrograman Arduino untuk Gesture dan Color Sensing
Bagian pemrogramannya sederhana dan mudah dan program lengkap dengan video demo diberikan di akhir tutorial ini.
Pertama kita perlu menginstal perpustakaan yang dibuat oleh Sparkfun. Untuk menginstal perpustakaan ini, navigasikan ke Sketch-> Sertakan Perpustakaan-> Kelola Perpustakaan.
Sekarang di bilah pencarian ketik "Sparkfun APDS9960" dan klik tombol install ketika Anda melihat perpustakaan.
Dan kami siap untuk pergi. Mari kita mulai.
Jadi pertama-tama kita harus menyertakan semua file header yang diperlukan. File header pertama LiquidCrystal.h digunakan untuk fungsi LCD. File header kedua Wire.h digunakan untuk komunikasi I 2 C dan yang terakhir SparkFun_APDS996.h digunakan untuk sensor APDS9960.
#include
Sekarang di baris berikutnya kita telah menentukan pin untuk tombol dan LCD.
const int buttonPin = 7; const int rs = 12, en = 11, d4 = 6, d5 = 5, d6 = 4, d7 = 3; LCD LiquidCrystal (rs, en, d4, d5, d6, d7);
Di bagian selanjutnya, kita telah mendefinisikan makro untuk pin interupsi yang terhubung pada pin digital 2 dan satu variabel buttonState untuk status tombol saat ini dan isr_flag untuk rutinitas layanan interupsi.
#define APDS9960_INT 2 int buttonState; int isr_flag = 0;
Selanjutnya sebuah 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 setup , baris pertama untuk mengambil nilai dari tombol (rendah / tinggi) dan baris kedua & ketiga mendefinisikan interupsi dan pin tombol sebagai input. apds.init () menginisialisasi sensor APDS9960 dan lcd.begin (16,2) menginisialisasi LCD.
void setup () { buttonState = digitalRead (buttonPin); pinMode (APDS9960_INT, INPUT); pinMode (buttonPin, INPUT); apds.init (); lcd.begin (16, 2); }
Dalam fungsi loop , baris pertama mendapatkan nilai dari tombol dan menyimpannya dalam variabel buttonState yang ditentukan sebelumnya. Sekarang di baris berikutnya kita memeriksa nilai dari tombol, jika tinggi maka kita mengaktifkan sensor cahaya dan jika rendah maka inisialisasi sensor gerakan.
The attachInterrupt () adalah fungsi yang digunakan untuk interupsi eksternal yang dalam hal ini adalah interupsi sensor. Argumen pertama dalam fungsi ini adalah bilangan interupsi. Di Arduino UNO, ada dua pin interupsi pin digital - 2 dan 3 dilambangkan dengan INT.0 dan INT.1. Dan kami telah menghubungkannya ke pin 2 jadi kami telah menulis 0 di sana. Argumen kedua memanggil fungsi interruptRoutine () yang ditentukan nanti. Argumen terakhir adalah JATUH sehingga akan memicu interupsi saat pin berpindah dari tinggi ke rendah. Pelajari lebih lanjut tentang Arduino Interrupts di sini.
void loop () { buttonState = digitalRead (buttonPin); if (buttonState == HIGH) { apds.enableLightSensor (true); }
Di bagian selanjutnya, kami memeriksa pin tombol. Jika tinggi maka mulailah proses untuk sensor RGB. Kemudian periksa apakah sensor cahaya membaca nilai atau tidak. Jika tidak dapat membaca nilai maka dalam kasus itu, cetak bahwa " Kesalahan membaca nilai lampu". Dan jika dapat membaca nilai kemudian, bandingkan nilai dari tiga warna dan mana yang lebih tinggi, cetak warna tersebut ke LCD.
if (buttonState == HIGH) { if (! apds.readAmbientLight (ambient_light) - ! apds.readRedLight (red_light) - ! apds.readGreenLight (green_light) - ! apds.readBlueLight (blue_light)) { lcd.print ("Kesalahan membaca nilai lampu"); } else { if (red_light> green_light) { if (red_light> blue_light) { lcd.print ("Red"); penundaan (1000); lcd.clear (); } ……. ………..
Di baris berikutnya, periksa lagi pin tombol, dan jika rendah proses sensor gerakan. Kemudian periksa isr_flag dan jika 1 maka fungsi detachInterrupt () dipanggil. Fungsi ini digunakan untuk mematikan interupsi. Baris berikutnya memanggil handleGesture () yang fungsinya ditentukan nanti. Di baris selanjutnya, definisikan isr_flag ke nol dan lampirkan interupsi.
else if (buttonState == LOW) { if (isr_flag == 1) { detachInterrupt (0); handleGesture (); isr_flag = 0; attachmentInterrupt (0, interruptRoutine, FALLING); } }
Selanjutnya adalah fungsi interruptRoutine () . Fungsi ini digunakan untuk menghidupkan variabel isr_flag 1, sehingga layanan interupsi dapat diinisialisasi.
void interruptRoutine (). { isr_flag = 1; }
Fungsi handleGesture () didefinisikan di bagian selanjutnya. Fungsi ini pertama-tama memeriksa ketersediaan sensor gerakan. Jika tersedia maka itu membaca nilai gerakan dan memeriksa gerakan mana itu (ATAS, BAWAH, KANAN, KIRI, JAUH, DEKAT) dan mencetak nilai yang sesuai ke LCD.
void handleGesture () { if (apds.isGestureAvailable ()) { switch (apds.readGesture ()) { case DIR_UP: lcd.print ("UP"); penundaan (1000); lcd.clear (); istirahat; case DIR_DOWN: lcd.print ("DOWN"); penundaan (1000); lcd.clear (); istirahat; case DIR_LEFT: lcd.print ("LEFT"); penundaan (1000); lcd.clear (); istirahat; case DIR_RIGHT: lcd.print ("RIGHT"); penundaan (1000); lcd.clear (); istirahat; case DIR_NEAR: lcd.print ("DEKAT"); penundaan (1000); lcd.clear (); istirahat; kasus DIR_FAR: lcd.print ("JAUH"); penundaan (1000); lcd.clear (); istirahat; default: lcd.print ("TIDAK ADA"); penundaan (1000); lcd.clear (); } } }
Terakhir, unggah kode ke Arduino dan tunggu sensor melakukan inisialisasi. Sekarang saat tombol dimatikan berarti dalam mode gerakan. Jadi coba gerakkan tangan Anda ke arah kiri, kanan, atas, bawah. Untuk gerakan jauh , jaga jarak 2-4 inci dari sensor selama 2-3 detik dan lepaskan. Dan untuk gerakan dekat, jauhkan tangan Anda dari sensor lalu dekatkan dan lepaskan.
Sekarang nyalakan tombol untuk mengalihkannya ke mode penginderaan warna dan ambil objek merah, biru, dan hijau satu per satu di dekat sensor. Ini akan mencetak warna objek.