Lampu yang dikendalikan gerakan pada Arduino

gambar

Halo semuanya !!!
Saya senang bisa menunjukkan kerajinan baru saya lagi.
Kali ini saya mengumpulkan lampu arduino yang dikendalikan oleh gesture.

Proyek ini menghabiskan banyak waktu, yang selalu saya kekurangan.
Saya merakit versi pertama dari lampu dengan sangat cepat dan itu bekerja dengan baik untuk saya di papan tempat memotong roti, tetapi ketika saya memindahkannya ke tempat permanen di dalam case, semuanya dimulai, semua masalah dengan pembekuan, positif palsu dan masalah lainnya keluar. Googling di Internet, saya menemukan banyak keluhan di situs asing terkait dengan masalah sensor APDS9960, tetapi saya tidak menemukan solusi untuk masalah ini. Saya harus meluangkan sedikit waktu mempelajari Lembar Data dari sensor ini dan memahami operasinya. Pada akhirnya, itu terbayar dan saya bisa menulis kode yang stabil.

Jadi, semuanya beres.

Deskripsi lampu


Penekanan utama dalam lampu ini bukan pada visualisasi, tetapi pada kontrol gerakan, semua fungsi lainnya adalah sekunder.

Lampu menyala dengan gerakan ke kiri atau kanan, dan Anda juga bisa menyalakannya dengan gerakan ke arah diri Anda sendiri, tetapi ini tidak sepenuhnya nyaman. Selanjutnya, gerakan ke kiri dan kanan, Anda dapat menggulir melalui efek pencahayaan. Jika Anda mulai membalik ke kanan, lampu akan lebih dulu mengubah warnanya dari putih menjadi merah, termasuk semua warna primer dan transisi di antara keduanya.

Jika setelah menyalakan lampu kita mulai membalik ke kiri, kita akan melihat efek pencahayaan yang dinamis, seperti "Api", "Matriks", "Lampu Lava", "Pelangi", "Confetti", "Sparks", "Lampu Api", "Lampu Api". Jika Anda perlu kembali ke lampu biasa, maka alih-alih membalik, Anda dapat mematikan lampu dengan gerakan dari diri Anda sendiri dan menghidupkan salah satu dari ketiga gerakan itu.
Mematikan dilakukan dengan gerakan dari diri Anda sendiri.



Kecerahan diatur oleh gerakan mendekati dan menjauh dari sensor. Pertama-tama Anda harus mendekatkan telapak tangan ke sensor, dan kemudian mengangkatnya dengan tajam. Lampu akan beralih ke mode penyesuaian kecerahan, menggerakkan telapak tangan lebih dekat dan lebih dekat, Anda perlu menemukan kecerahan yang sesuai dan mengunci tangan Anda selama beberapa detik sehingga nilai kecerahan dipertahankan. Ketika kecerahan dipertahankan, lampu akan memberi tahu Anda tentang hal itu dengan mematikan lampu dengan mulus dan kemudian menyalakannya dengan tingkat kecerahan baru.

Saya tidak terlalu memperhatikan efek visual, karena saya berencana membuat versi kedua dari lampu pada Wemos D1 mini controller. Di mana saya berencana untuk membawa semuanya ke ideal. Untuk alasan yang sama, saya masih menggunakan hanya satu baris LED, yang terdiri dari 4 strip ws2812b, bukan empat.

APDS9960 Mengganggu


Sebenarnya, masalah utama lampu LED terkait dengannya. Interupsi dalam apds9960 menjalani kehidupan mereka sendiri, ia dapat bekerja dari apa saja, misalnya dari gangguan EM atau berada di dekat sensor seseorang, dari riak nutrisi, dan mungkin dari hal lain.



Pertama saya mencoba untuk memperbaiki masalah dengan perubahan pada perangkat keras. Penyaringan daya tidak membantu, bahkan dengan baterai 18650, sensor masih terus hidup. Saya mencoba mengganti resistor beban sinyal INT ke + 5V dan ini juga tidak berhasil.

Ketika penelitian datang, sebuah pemahaman muncul tentang mengapa gangguan palsu terjadi. Masalah utama adalah refleksi acak dari sinyal IR. Pabrikan merekomendasikan untuk menutupi sensor dan segala sesuatu di sekitarnya dengan lapisan karet hitam. Saya tidak punya cat seperti itu dan saya tidak peduli dengan itu. Meskipun yang pasti ini bisa sedikit mengurangi jumlah positif palsu.

Saya menulis kode yang menyaring semua pemicu acak, tetapi mengalami masalah lain. Setelah interupsi dipicu, informasi isyarat ditransmisikan melalui bus I2C tidak secara instan, tetapi memiliki penundaan tertentu. Dan jika catu daya karena alamat strip LED berisik, maka waktu transmisi, dengan mempertimbangkan gangguan ini, akan selalu berbeda. Saya harus mempertimbangkan fakta ini dan menulis ulang kode untuk menentukan gerakan dengan cara yang baru.

Definisi gerakan


Jika kode tidak menggunakan interupsi dari sensor, maka tidak ada masalah dengan definisi gerakan. Namun dalam kasus ini, multitasking hilang. Jika efek dinamis diaktifkan pada lampu, maka sesuai itu memerlukan kode siklus, terus menerus dieksekusi, dan interupsi akan diperlukan untuk menghapus pengontrol dari siklus.

Untuk meningkatkan stabilitas pengenalan gerakan, perlu juga untuk mengurangi sensitivitas penerima di perpustakaan. Untuk melakukan ini, ganti baris dalam file SparkFun_APDS9960.h:

if (! setLEDBoost (LED_BOOST_300))
pada
jika (! setLEDBoost (LED_BOOST_150))

Jika Anda mengunduh perpustakaan dari artikel ini, maka Anda tidak perlu melakukan apa pun, semuanya sudah diperbaiki di sana.
Saya juga secara eksperimental memilih arus 50 mA LED, di mana gerakan ditentukan paling stabil dan tidak perlu memaksa LED inframerah dengan arus 100 mA.

Dan saya juga membuat kesalahan dengan menempatkan mikrokontroler di bagian bawah lampu, dan sensor gerakan di penutup atas. Karena itu, untuk menghubungkan arduino dan apds9960, saya harus menggunakan kabel sepanjang 30 cm yang juga menambah ketidakstabilan sensor. Akibatnya, saya mengalahkan semua masalah ini secara terprogram.

Skema




Untuk memberi daya pada perangkat, saya menggunakan pengisi daya dari ponsel cerdas saya, dengan tegangan output 5V dan arus 2A. Tetapi pada kenyataannya, lampu dengan cahaya putih yang dinyalakan pada kecerahan maksimum tidak mengkonsumsi di atas 1,3 A. Oleh karena itu, sumber daya apa pun dengan arus keluaran minimal 1,3 A cocok.

Stabilisator dc-dc mini360 dapat diganti dengan konverter tegangan step-down lainnya, dengan arus keluaran minimal 150 mA.

Dalam diagram di bawah ini, saya tidak menggunakan konverter level logika, tetapi ini adalah keputusan pribadi saya. Dan oleh karena itu, saya tidak menerima tanggung jawab sebelumnya jika, jika Anda gagal, sensor APDS9960 terhubung tanpa konverter level TTL.

Alih-alih Arduino Nano, Anda dapat menggunakan pengontrol Arduino UNO atau klonnya.

Pastikan untuk memeriksa keberadaan jumper pada sensor gerakan, mereka ditandai dengan warna merah di foto di bawah ini. Dalam kasus ketidakhadiran mereka, besi solder harus diaplikasikan pada jalur kontak ini, oleskan dan panaskan solder sampai terbentuk seragam. Sekarang orang Cina memasok sensor ini tanpa jumper. Tanpa jumper ini, pengoperasian sensor tidak dijamin.



Komponen yang Digunakan


Arduino Nano - 1 pcs.
Gesture Sensor APDS9960 - 1 pc.
LED strip ws2812b - 4 pcs.
Mini360 step-down converter - 1 pc.
Kabel penghubung - 1 set.

Kode Program untuk Arduino


Kode ini dibagi menjadi dua bagian. Di bagian pertama adalah kode utama yang bekerja dengan sensor, dan di bagian kedua adalah kode untuk semua efek pencahayaan.

Anda dapat menambahkan efek apa pun sendiri dengan analogi dengan kode saya, tetapi yang paling penting, jangan lupa untuk menambahkan fungsi untuk keluar dari gerakan dari efek lingkaran. Untuk melakukan ini, tambahkan baris berikut di akhir loop jika (check_int ()) kembali;

Deskripsi fungsi utama program
processingGesture () memproses interupsi dari sensor gerakan.
processingProximity () memproses interupsi dari sensor proximity.
gesture_int () - interrupt handler dari sensor gesture.
proximity_int () - interrupt handler dari sensor proximity.

Deskripsi konstanta


APDS9960_INT - input untuk interupsi eksternal. Arduino Nano dan UNO hanya memiliki dua input seperti itu, 2 dan 3.

PIN - di sini Anda perlu menentukan output ke strip LED. Anda dapat menentukan pin digital apa pun yang terhubung dengan tali ws2812b.

NUM_PIX - di sini kami menunjukkan jumlah LED alamat dalam rekaman yang digunakan.
range - batas kesalahan adalah dari 0 hingga 10. Jika, ketika mengatur kecerahan, tangan diperbaiki di atas sensor selama 2 detik, maka pembacaan harus disimpan, tetapi jika pembacaan tidak disimpan, secara bertahap menambah batas kesalahan.

Unduh perpustakaan APDS9960
Unduh sketsa lampu

Video yang menunjukkan pengoperasian lampu



Ringkasan


Lampu hidup terlihat lebih baik daripada di video. Sekarang semua orang yang melihatnya dari saya diminta untuk mengumpulkan yang sama untuk mereka. Saat ini, saya tidak suka bagaimana penyesuaian kecerahan bekerja, tetapi saya sedang mengusahakannya. Saya tidak menjanjikan itu segera, tetapi versi lampu berikutnya sudah dalam pengembangan.

Terima kasih telah membaca artikel sampai akhir! Jika Anda masih memiliki pertanyaan, Anda dapat bertanya di komentar di bawah artikel.

PS


Ide lampu terinspirasi di sini
Saya mengambil efek utama di sini

Source: https://habr.com/ru/post/id484278/


All Articles