Isi kandungan:
Video: Mengendalikan Cincin Led Neopixel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:10
Dalam tutorial ini kita akan bermain dengan sensor isyarat (APDS-9960) dan cincin neopixel untuk belajar bagaimana menggabungkan keduanya menggunakan Arduino UNO.
Produk akhir akan bertindak balas terhadap isyarat kiri - kanan dengan menggerakkan pergerakan dipimpin ke kanan atau ke kiri, dan gerakan ke atas dengan menukar warna led.
Pada langkah seterusnya, anda akan melihat senarai bahagian dan cara menyambungkan komponen secara ringkas. Dan kemudian kami akan mengkaji kod langkah demi langkah untuk mengetahui cara kerjanya.
Langkah 1: Komponen
1. Arduino UNO
2. kabel usb
3. Sensor isyarat APDS9960 (https://www.sparkfun.com/products/12787)
4. 24 cincin LED neopixel (https://www.adafruit.com/product/1586)
5. kabel papan roti lelaki-perempuan, lelaki-lelaki
6. papan roti
7. Bekalan kuasa 5 V untuk cincin yang dipimpin (saya menggunakan bateri belakang 4)
8. Untuk memasang cincin neopixel ke papan roti, anda perlu menyolder tiga pin lelaki kepadanya: GND, PWR, dan pin kawalan. Untuk ini, anda memerlukan besi pemateri dan fluks
Komponen utama di sini adalah sensor isyarat APDS-9960 dan cincin neopixel 24. Anda boleh menukar arduino, bekalan kuasa kabel usb dan papan roti yang berbeza mengikut keinginan anda.
Langkah 2: Perhimpunan & Muat Naik
perhimpunan
Sebelum anda memulakan, pastikan anda mempunyai semua komponen di atas meja anda. Kami akan mempunyai beberapa langkah baik untuk diikuti:). Saya juga melampirkan skema Fritzing sebagai gambar dan juga dalam format fritzing.
1. Solder 3 pin lelaki ke cincin neopixel (GND, PWR, pin kawalan)
2. pasangkan cincin neopixel ke papan roti
3. pasangkan sensor APDS9960 ke papan roti
4. sambungkan alasan: pek bateri, arduino UNO, APDS9960 dan neopixel ke aras papan roti
5. sambungkan kuasa: arduino UNO 3V ke pin kuasa APDS9960, neopixel ke bateri pek kuasa
6. sambungkan pin kawalan neopixel ke pin arduino D6
7. sambungkan SDA dan SCL APDS9960 masing-masing ke A4 dan A5
8. sambungkan pin gangguan APDS9960 ke arduino D2
Muat naik kod
Pertama sekali, anda perlu memuat turun dan memasang perpustakaan arduino yang diperlukan:
1. Perpustakaan cincin Neopixel:
2. Perpustakaan sensor isyarat:
Sekiranya anda tidak tahu cara memasang perpustakaan arduino, lihat tutorial ini.
Selepas anda memuat turun dan memasang perpustakaan di atas, anda boleh mengklon atau memuat turun repositori arduino saya yang terdapat di sini: https://github.com/danionescu0/arduino, dan kami akan menggunakan lakaran ini: https://github.com/danionescu0 / arduino / pokok / tuan / projek / neopixel_ring_gestures
Di bahagian seterusnya saya akan memasukkan kod secara langsung ke dalam tutorial ini, jadi jika anda suka, anda boleh menyalin dan menempelkannya dari sana.
Akhirnya sambungkan arduino komputer menggunakan kabel usb, masukkan bateri 1.5 v ke dalam pek bateri, dan muat naik lakaran ke arduino.
Langkah 3: Bagaimana Ia Berfungsi?
Pada bahagian terakhir ini kita akan belajar bagaimana komponen ini digabungkan bersama, bagaimana menggunakan perpustakaan mereka dan bagaimana saya menyusun kod saya:
Pertama mari kita lihat sekilas sensor dan kaedah API pustaka neopixel yang akan kita gunakan
1. Neopixel API dari adafruit
Dari perpustakaan ini kita akan menggunakan kaedah yang mengawal warna led individu dan menerapkannya
- sertakan perpustakaan:
#sertakan
- menyatakan perpustakaan
#tentukan NEOPIXED_CONTROL_PIN 6
#tentukan NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);
- memulakan
# khas dalam blok persediaan
batal persediaan () {strip.begin (); # mungkin beberapa barang lain di sini #…. }
- menerangi piksel individu kemudian menerapkan semua pengubahsuaian pada jalur (membuatnya dengan cara)
# sediakan piksel 0 menjadi merah
strip.setPixelColor (0, strip. Color (255, 0, 0)); # sediakan piksel 1 menjadi jalur hijau.setPixelColor (1, strip. Color (0, 255, 0)); # sediakan piksel 2 menjadi jalur biru.setPixelColor (2, strip. Color (0, 0 255)); strip.show ();
2. Sensor isyarat APDS 9960
Dari perpustakaan ini kita akan menggunakan fungsi "baca isyarat". Fungsi ini akan dapat membezakan antara perintah kiri-kanan, atas, bawah, jarak dekat. Ada muslihat di sini, kami tidak akan meminta sensor secara berterusan untuk isyarat terakhir yang dirasakan. Papan mempunyai kemampuan untuk "ping" melalui gangguan yang telah dijumpai.
- sertakan perpustakaan, serupa dengan neopixel
- menyatakan perpustakaan sebagai pin interrupt, dan bendera interrupt
#tentukan APDS9960_INT 2
SparkFun_APDS9960 apds = SparkFun_APDS9960 (); int isr_flag = 0;
- memulakan perpustakaan, biasanya di dalam fungsi persediaan
persediaan tidak sah ()
{# nyatakan pin interrupt sebagai INPUT dan lampirkan fungsi ke pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); jika (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Permulaan APDS-9960 selesai"); } lain {Serial.println ("Ada yang tidak kena semasa APDS-9960 init!"); } # memulakan perkara lain mungkin}
- tentukan fungsi gangguan, di sini kita hanya akan menetapkan bendera
batal gangguanRutin () {
isr_flag = 1; }
- di dalam fungsi gelung periksa bendera secara berkala untuk melihat apakah isyarat telah dikesan
gelung kosong ()
{# periksa bendera jika (isr_flag == 1) {# jika bendera diatur, hapus gangguan, buat pemprosesan yang diperlukan di dalam peganganGesture () fungsi # dan kemudian tetapkan semula bendera dan pasang kembali interrupt detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } # beberapa kod lain di sini mungkin}
- tentukan fungsi handleGesture () di mana kita boleh meminta isyarat terakhir
pegangan tidak sahGesture () {
# jika isyarat tidak dapat dikembalikan, ini hanya pemeriksaan selamat sekiranya (! apds.isGestureAvailable ()) {return; } # membaca isyarat terakhir, membandingkan dengan yang diketahui dan mencetak suis mesej (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); rehat; kes DIR_DOWN: Serial.println ("DOWN"); rehat; kes DIR_LEFT: Serial.println ("LEFT"); rehat; kes DIR_RIGHT: Serial.println ("KANAN"); rehat; kes DIR_FAR: Serial.println ("FAR"); rehat; }}
Sekarang mari kita lihat keseluruhan kod dalam tindakan:
Oleh itu, saya telah menjelaskan API asas sensor isyarat dan cincin neopixel, sekarang mari kita bersama-sama:
Algoritma berjalan seperti ini:
- mulakan perpustakaan (lihat kod di atas)
- buat pelbagai intensiti led yang disebut "ledStates". Susunan ini akan mengandungi 24 intensiti led yang disusun secara menurun dari 150 hingga 2
- di dalam gelung utama periksa apakah pin interrupt telah diubah jika ya sudah tiba masanya untuk menukar animasi atau warna led
- fungsi "handleGesture ()" memeriksa isyarat terakhir dan memanggil fungsi "toggleColor" untuk isyarat UP -DOWN atau menetapkan pemboleh ubah global "ledDirection" untuk KIRI - isyarat KANAN
- fungsi "toggleColor ()" hanya mengubah pemboleh ubah global bernama "colorSelection" dengan salah satu nilai 0, 1, 2
- juga di dalam fungsi gelung utama fungsi lain bernama "animateLeds ();" dipanggil. Fungsi ini memeriksa sama ada 100 milisaat berlalu, dan jika demikian ia memutar led menggunakan fungsi "rotateLeds ()" dan kemudian melukisnya semula
- "rotateLeds ()" akan "memutar" led ke depan atau ke belakang dengan menggunakan array lain yang disebut "intermediateLedStates".
"Kesan" putaran akan kelihatan seperti ini:
# selepas permulaan
{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # selepas rotateLeds () dipanggil {0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # selepas rotateLeds () dipanggil lagi {0, 0, 150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # dan sebagainya
Untuk ini pertama-tama mencipta susunan baru dan menyalin intensiti lama yang dipimpin pada kedudukan baru (kenaikan kedudukan atau penurunannya). Selepas itu ia menimpa susunan "ledStates" dengan "intermediateLedStates" sehingga prosesnya akan diteruskan setelah 100 milisaat lagi.
#sertakan "SparkFun_APDS9960.h"
#masuk "Adafruit_NeoPixel.h"
#include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #define NUM_LEDS 24 #define APDS9960_INT 2 #define LED_SPEED_STEP_INTERVAL 100 Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CON_NOO_EB) SparkFun_APDS9960 apds = SparkFun_APDS9960 (); unsigned long lastLedChangeTime = 0; ledDirection pendek = 0; warna pendekPilihan = 0; byte ledStates = {150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; int isr_flag = 0; batal persediaan () {Serial.begin (9600); Serial.println ("Program dimulakan"); jalur.begin (); pinMode (APDS9960_INT, INPUT); attachInterrupt (0, interruptRoutine, FALLING); jika (apds.init () && apds.enableGestureSensor (true)) {Serial.println ("Permulaan APDS-9960 selesai"); } lain {Serial.println ("Ada yang tidak kena semasa APDS-9960 init!"); } lastLedChangeTime = milis (); Serial.println ("Init berjaya"); } gelung void () {if (isr_flag == 1) {detachInterrupt (0); handleGesture (); isr_flag = 0; attachInterrupt (0, interruptRoutine, FALLING); } animateLeds (); } batal interruptRoutine () {isr_flag = 1; } / ** * Ini akan menangani gerak isyarat dari sensor APDS9960 * Gerak ke atas dan bawah akan memanggil fungsi toggleColor * Gerakan kiri dan kanan akan mengubah animasi yang dipimpin * / pegangan kosongGesture () {if (! Apds.isGestureAvailable ()) {return; } beralih (apds.readGesture ()) {case DIR_UP: Serial.println ("UP"); toggleColor (); rehat; kes DIR_DOWN: Serial.println ("DOWN"); toggleColor (); rehat; kes DIR_LEFT: ledDirection = 1; Serial.println ("KIRI"); rehat; kes DIR_RIGHT: ledDirection = -1; Serial.println ("KANAN"); rehat; kes DIR_FAR: ledDirection = 0; Serial.println ("JAUH"); rehat; }} / ** * Tukar warna led semasa * Setiap kali fungsi ini dipanggil akan mengubah keadaan led * / void toggleColor () {if (colorSelection == 0) {colorSelection = 1; } lain jika (colorSelection == 1) {colorSelection = 2; } lain {colorSelection = 0; }} / ** * Animasi akan berjalan selepas LED_SPEED_STEP_INTERVAL milis * Pertama fungsi rotateLeds dipanggil, kemudian warna led ditetapkan menggunakan strip api * / void animateLeds () {if (millis () - lastLedChangeTime <LED_SPEED_STEP_INTERVAL) {return; } rotateLeds (); untuk (int i = 0; i <NUM_LEDS; i ++) {strip.setPixelColor (i, getColor (ledStates )); strip.show (); } lastLedChangeTime = milis (); } / ** * Dengan menggunakan array sekunder "intermediateLedStates", intensiti led dianimasikan * Mula-mula nilai dari "ledStates" disalin pada "intermediateLedStates" seperti * mari kita letakan susunan "ledStates" adalah {100, 80, 60, 0, 0, 0} dan ledDirection adalah 1 * maka setelah fungsi ini disebut "ledStates" array adalah {0, 100, 80, 60, 0, 0} mensimulasikan kesan putaran * / void rotateLeds () {byte intermediateLedStates [NUM_LEDS]; untuk (int i = 0; i <NUM_LEDS; i ++) {intermediateLedStates = 0; } untuk (int i = 0; i <NUM_LEDS; i ++) {if (ledDirection == 1) {if (i == NUM_LEDS -1) {intermediateLedStates [0] = ledStates ; } lain {intermediateLedStates [i + 1] = ledStates ; }} lain {if (i == 0) {intermediateLedStates [NUM_LEDS - 1] = ledStates ; } lain {intermediateLedStates [i - 1] = ledStates ; }}} untuk (int i = 0; i <NUM_LEDS; i ++) {ledStates = intermediateLedStates ; }} uint32_t getColor (intensiti int) {switch (colorSelection) {case 0: return strip. Color (intensiti, 0, 0); kes 1: jalur balik. Warna (0, intensiti, 0); lalai: jalur kembali. Warna (0, 0, intensiti); }}
Saya harap anda menikmati ini, anda boleh menggunakan bahagian komen untuk mengemukakan soalan kepada saya.
Disyorkan:
Jam Neopixel Dengan Tiga Cincin Neopixel: 7 Langkah
Jam Neopixel Dengan Tiga Cincin Neopixel: Penciptaan jam Neo Pixel yang cemerlang oleh Steve Manley mendorong saya untuk membuat arahan ini mengenai cara membuat jam yang serupa dengan jumlah wang yang paling sedikit. (Kebiasaan penting Belanda ialah selalu menjimatkan wang ;-)) Saya mendapat tahu bahawa
Keseronokan Giroskop Dengan Cincin Neopixel: 4 Langkah (dengan Gambar)
Giroskop Menyeronokkan Dengan Cincin Neopixel: Dalam tutorial ini kita akan menggunakan giroskop MPU6050, cincin neopixel dan arduino untuk membina peranti yang menyalakan lampu sesuai dengan sudut kecenderungan. Ini adalah projek yang mudah dan menyeronokkan dan akan dipasang di papan roti
Cara Mengendalikan Peralatan Rumah Tangga Dengan Jauh TV Dengan Fungsi Pemasa: 7 Langkah (dengan Gambar)
Cara Mengendalikan Peralatan Rumah Tangga Dengan TV Jauh Dengan Fungsi Pemasa: Walaupun setelah 25 tahun diperkenalkan ke pasaran pengguna, komunikasi inframerah masih sangat relevan dalam beberapa hari terakhir. Sama ada televisyen 4K 55 inci atau sistem bunyi kereta anda, semuanya memerlukan alat kawalan jauh IR untuk memberi respons kepada
Kaleidoskop Cincin NeoPixel: 8 Langkah (dengan Gambar)
Kaleidoskop Cincin NeoPixel: Saya dengan senang hati menawarkan arahan dan fail bahan untuk membuat Kaleidoskop LightLogo! Saya telah berfikir untuk melakukan ini selama berbulan-bulan dan akhirnya membuat reka bentuk. Sekiranya anda mempunyai penambahbaikan pada reka bentuk ini, sila kongsi! Anda akan
Cincin NeoPixel Custom Dari Awal !: 8 Langkah (dengan Gambar)
Cincin NeoPixel Custom Dari Awal !: Cincin NeoPixel, dan NeoPixel pada umumnya, adalah antara komponen elektronik yang paling popular untuk pembuat semua jenis. Untuk alasan yang baik juga, dengan satu pin dari mana-mana Adafruit mikrokontroler yang popular membuat penambahan LED dan animasi yang cantik ke pro