Isi kandungan:

Mengendalikan Cincin Led Neopixel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)
Mengendalikan Cincin Led Neopixel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)

Video: Mengendalikan Cincin Led Neopixel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)

Video: Mengendalikan Cincin Led Neopixel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)
Video: BAKAT LUAR BIASA YANG DIANGGAP SAMPAH‼️ LIAT ENDINGNYA 2024, November
Anonim
Image
Image
Perhimpunan & Muat Naik
Perhimpunan & Muat Naik

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: