Membaca komentar di
artikel saya sebelumnya tentang APDS-9960, di mana itu tentang pengenalan warna dan tingkat cahaya, dua hal menjadi jelas bagi saya: 1) topik pengenalan gerakan menarik dan 2) topik ini tidak diungkapkan.
Memang, jika saya mengambil deskripsi dari APDS-9960, maka tanpa mempertimbangkan gerakannya, deskripsi tersebut terlihat agak tidak lengkap. Jadi saya menemukan waktu luang untuk menjelajahi topik ini juga.
Pada artikel ini, saya memberikan Anda gambaran tentang kemampuan pengenalan gerakan yang disediakan oleh sensor APDS-9960.
Artikel ini akan mempertimbangkan mekanisme untuk mengatur sensor, pengumpulan data, pemrosesan dan presentasi. Anda sendiri dapat melihat betapa mudahnya bekerja dengan gerakan menggunakan APDS-9960.
Seperti yang terakhir kali, artikel tersebut akan disertai dengan kode, semua yang terjadi di mana akan dijelaskan secara rinci. Versi lengkap kode tersedia di akhir artikel.
Segera komentar kecil: APDS-9960 tidak memiliki mekanisme pendeteksian isyarat otomatis bawaan; yaitu, sedemikian rupa sehingga di sini, saya membaca, artinya, register, dan sudah ada kebohongan yang diproses - ini bukan dalam APDS-9960; dan ini berarti Anda harus menulis algoritma interpretasi isyarat Anda sendiri, yang akan kami lakukan nanti.
Secara umum, ini baik dan tidak terlalu baik. Tidak juga - karena dapat mempersulit studi sensor ini untuk pemula, tetapi bagus, karena, ditambah dengan data perkiraan, Anda dapat, dengan penyempurnaan, bahkan menghasilkan gerakan Anda sendiri dari berbagai jenis dan apa saja.
Namun, karena artikel ini hanya memiliki fungsi ikhtisar, kami membatasi diri hanya untuk gerakan dasar UP-DOWN-LEFT-RIGHT.
Baiklah, mari kita mulai.
Teori
Saya akan membiarkan diri saya sedikit material.
Untuk mendapatkan informasi yang diperlukan tentang gerakan dan arah gerakan, APDS-9960 menggunakan LED IR dan empat fotodioda, yang, seperti diilustrasikan dalam gambar di bawah ini, mendeteksi sinyal dalam kisaran near infrared (NIR).

LED IR (LED) memiliki fungsi lampu latar, dan fotodioda (UDLR) mendaftarkan cahaya yang dipantulkan dari "penghalang".
Fotodioda terletak pada sensor sedemikian rupa sehingga, tergantung pada arah gerakan "hambatan", fotodioda yang sesuai akan menerima sebagian besar sinyal IR yang dipantulkan pada input dan bagian yang lebih kecil pada output. Pada saat yang sama, dokumentasi pada APDS-9960 dengan tegas memberi tahu kami bahwa Anda dapat menginterpretasikan arah gerakan dengan mengukur dan membandingkan perbedaan amplitudo dan fase dari sinyal dari fotodioda UDLR.

Berlatih
Untuk bekerja dengan APDS-9960, dan juga yang
terakhir kali , kami akan menggunakan STM32VLDISCOVERY. Koneksi juga tidak berubah.
Konfigurasikan APDS-9960Kami membuat pengaturan awal sensor.
Seperti ini:
APDS9960_initvoid APDS9960_init(void) { i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN); i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH); i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN); i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH); }
Apa yang sedang terjadi di sini? Mari kita perbaiki.
i2c1_write(APDS9960_CONTROL, DEFAULT_PGAIN);
PGAIN (Proximity Gain Control) adalah parameter yang mengontrol penguatan sensitivitas jarak. Tetapkan nilai 2, yang sesuai dengan empat kali perolehan.
i2c1_write(APDS9960_GPENTH, DEFAULT_GPENTH); i2c1_write(APDS9960_GEXTH, DEFAULT_GEXTH);
GPENTH (Gesture Proximity Enter Threshold Register) - parameter ini menetapkan nilai ambang proximity untuk menentukan awal pengenalan gerakan.
GEXTH (Gesture Exit Threshold Register), masing-masing, menetapkan nilai ambang untuk menentukan akhir pengenalan gerakan.
i2c1_write(APDS9960_GCONF2, DEFAULT_GGAIN);
Dalam register GCONF2 (Konfigurasi dua), kami secara eksplisit menetapkan hanya parameter GGAIN (Kontrol Gesture) untuk empat kali nilai perolehan.
i2c1_write(APDS9960_GPULSE, DEFAULT_PULSE_LENGTH); i2c1_write(APDS9960_PPULSE, DEFAULT_PULSE_LENGTH);
Lampu latar Secara default, nilai untuk sumber saat ini dari lampu latar IR diatur ke 0, yang sesuai dengan arus 100 mA, ini akan cocok untuk kita - kita tidak akan mengubahnya.
Penerangan IR dalam APDS-9960 adalah urutan pulsa dan ditandai dengan parameter register yang sesuai untuk gestur GPULSE (Gesture pulse count and length): GPLEN (Gesture Pulse Length) dan GPULSE (Number Pulsa Gesture), serta PPULSE (Register Proximity Pulse Count Register) perkiraan ): PPLEN (Panjang Proximity Pulse) dan PPULSE (Proximity Pulse Count) mengatur jumlah pulsa dan periode masing-masing pulsa individu.
Tentukan bahwa GPLEN dan PPLEN akan mengambil nilai 2 sama dengan 16 ΞΌs, dan GPULSE dan PPULSE nilai 9, yang sesuai dengan 10 pulsa.
Seperti yang Anda lihat, pengaturan ternyata sedikit lebih rumit daripada yang serupa untuk pengenalan warna dan pencahayaan dari tinjauan APDS-9960 sebelumnya.
Membaca dataSekarang kita beralih ke siklus program utama, di mana kita mulai mendaftar dan menafsirkan data dari fotodioda setiap sekarang dan kemudian, dan juga belajar bagaimana membedakan satu gerakan dari yang lain.
Hal pertama yang pertama, mari kita mulai APDS-9960 dengan fungsi untuk bekerja dengan gerakan dan zoom.
GesturesSet(GESTURES_START);
Dan segera kita mulai melacak parameter GVALID. GVALID (Gesture FIFO Data) adalah parameter dari register GSTATUS (Gesture Status Register), yang, dalam keadaan tidak nol, memberi tahu kami bahwa sensor memiliki data isyarat yang dapat digunakan.
Dokumentasi mengajarkan kita bahwa informasi gerakan ada di buffer, di bidang RAM, yang secara umum berukuran 32 x 4 byte.
Dalam praktiknya, ukuran aktual buffer ini dapat ditemukan dengan membaca nilai register GFLVL (Gesture FIFO), mis. menurut pengamatan eksperimental empiris murni saya, GFLVL * 4 diperoleh. Sesuatu seperti ini:

Nah, sebagai berikut dari nama buffer, data di dalamnya disusun dalam urutan First In - First Out. Artinya, secara kasar, "sebelumnya" sinyal dari masing-masing fotodioda tiba, "lebih tinggi" di GFLVL.
Data dari fotodioda (UDLR) dapat dibaca dari Gesture FIFO Register yang sesuai:
- GFIFO_U (Gesture FIFO Data, UP)
- GFIFO_D (Gesture Data FIFO, BAWAH)
- GFIFO_L (Isyarat Data FIFO, KIRI)
- GFIFO_R (Isyarat Data FIFO, KANAN)
Setelah setiap pembacaan nilai dari register ini, GFLVL dikurangi; dengan demikian, dengan cara yang baik, perlu membaca seluruh buffer sampai GFLVL mencapai nol.
Untuk mendefinisikan gerakan, kita hanya perlu empat byte pertama buffer ini, tidak lebih. Karena itu, kami hanya akan membacanya.
GestureUp = i2c1_read(APDS9960_GFIFO_U); GestureDown = i2c1_read(APDS9960_GFIFO_D); GestureLeft = i2c1_read(APDS9960_GFIFO_L); GestureRight = i2c1_read(APDS9960_GFIFO_R);
Pengenalan gerakanUntuk menginterpretasikan gerakan seperti apa yang terjadi, kami akan membuat perhitungan sederhana:
GestUpDown = GestureUp-GestureDown; GestLeftRight = GestureLeft-GestureRight;
Untuk menentukan gerakan mana yang saat ini terjadi, bukan nilai-nilai GestUpDown dan GestLeftRight yang penting bagi kami, tetapi hanya tanda, dengan kata lain, bilangan real.
Dengan kata lain, dengan mengambil nilai negatif dan positif dari variabel GestUpDown dan GestLeftRight sebagai input, kami menentukan gerakan mana yang sempurna.
Tabel kebenaran untuk variabel GestUpDown dan GestLeftRight ditunjukkan pada gambar di bawah ini.

Sekarang atur ulang GFLVL:
GesturesSet(GESTURES_STOP);
... dan kembali ke awal siklus program utama.
Dan sekarang seluruh kode:
main.c #include "stm32f10x.h" #define APDS9960_I2C_ADDR 0x39 #define APDS9960_ENABLE 0x80 #define APDS9960_GSTATUS 0xAF #define APDS9960_GFLVL 0xAE
Saya ingin mencatat bahwa mekanisme gerakan APDS-9960 bekerja dengan sangat baik. Pengakuan stabil, filter yang dibangun di dalam APDS-9960 UV dan IR bekerja dengan baik.
Semoga materi ini bermanfaat bagi seseorang. Terima kasih atas perhatian anda