Daftar Isi:

Mengontrol Cincin Led Neopiksel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)
Mengontrol Cincin Led Neopiksel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)

Video: Mengontrol Cincin Led Neopiksel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)

Video: Mengontrol Cincin Led Neopiksel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)
Video: Motion Triggered RGB Shoes! | Neopixel LEDs | DIY 2024, November
Anonim
Image
Image
Perakitan & Unggah
Perakitan & Unggah

Dalam tutorial ini kita akan bermain dengan sensor gerakan (APDS-9960) dan cincin neopiksel untuk mempelajari cara menggabungkan keduanya menggunakan Arduino UNO.

Produk akhir akan merespon gerakan kiri - kanan dengan menganimasikan gerakan led ke kanan atau kiri, dan gerakan naik-turun dengan mengubah warna led.

Pada langkah selanjutnya, Anda akan melihat sekilas daftar komponen dan cara menyambungkan komponen. Dan kemudian kita akan meninjau kode langkah demi langkah untuk mempelajari cara kerjanya.

Langkah 1: Komponen

1. Arduino UNO

2. kabel usb

3. Sensor gerakan APDS9960 (https://www.sparkfun.com/products/12787)

4. 24 led neopixel led ring (https://www.adafruit.com/product/1586)

5. kabel papan tempat memotong roti pria-wanita, pria-pria

6. papan tempat memotong roti

7. Catu daya 5 V untuk ring led (saya menggunakan 4 baterai belakang)

8. Untuk memasang cincin neopiksel ke papan tempat memotong roti, Anda harus menyolder tiga pin jantan ke sana: GND, PWR, dan pin kontrol. Untuk ini, Anda memerlukan besi solder dan fluks

Komponen utama di sini adalah sensor gerakan APDS-9960 dan cincin 24 neopiksel. Anda dapat mengganti berbagai arduino, catu daya kabel usb, dan papan tempat memotong roti sesuai keinginan.

Langkah 2: Perakitan & Unggah

perakitan

Sebelum Anda memulai, pastikan Anda memiliki semua komponen di meja Anda. Kami akan memiliki beberapa langkah bagus untuk diikuti:). Saya juga melampirkan skema Fritzing sebagai gambar dan juga dalam format fritzing.

1. Solder 3 pin pria ke cincin neopiksel (GND, PWR, pin kontrol)

2. pasang cincin neopiksel ke papan tempat memotong roti

3. pasang sensor APDS9960 ke papan tempat memotong roti

4. hubungkan ground: baterai, arduino UNO, APDS9960 dan neopixel ke ground papan tempat memotong roti

5. sambungkan daya: arduino UNO 3V ke pin daya APDS9960, neopiksel ke daya baterai

6. sambungkan pin kontrol neopixel ke pin arduino D6

7. hubungkan SDA dan SCL dari APDS9960 masing-masing ke A4 dan A5

8. sambungkan pin interupsi APDS9960 ke arduino D2

Unggah kode

Pertama-tama Anda harus mengunduh dan menginstal pustaka arduino yang diperlukan:

1. Pustaka cincin Neopixel:

2. Pustaka sensor gerakan:

Jika Anda tidak tahu cara menginstal perpustakaan arduino, lihat tutorial ini.

Setelah Anda mengunduh dan menginstal pustaka di atas, Anda dapat mengkloning atau mengunduh repositori arduino saya yang terletak di sini: https://github.com/danionescu0/arduino, dan kami akan menggunakan sketsa ini: https://github.com/danionescu0 /arduino/tree/master/projects/neopixel_ring_gestures

Di bagian selanjutnya saya akan menyematkan kode langsung ke dalam tutorial ini, jadi jika Anda suka, Anda dapat menyalin dan menempelkannya dari sana.

Terakhir sambungkan arduino ke komputer menggunakan kabel usb, masukkan baterai 1,5 v ke dalam baterai, dan unggah sketsa ke dalam arduino.

Langkah 3: Bagaimana Cara Kerjanya?

Di bagian terakhir ini kita akan mempelajari bagaimana komponen-komponen ini digabungkan bersama, bagaimana menggunakan library-nya dan bagaimana saya menyusun kode saya:

Pertama mari kita lihat sekilas melalui sensor dan metode API perpustakaan neopixel yang akan kita gunakan

1. Neopixel API dari adafruit

Dari perpustakaan ini kita akan menggunakan metode yang mengontrol warna masing-masing led dan menerapkannya

- termasuk perpustakaan:

#termasuk

- mendeklarasikan perpustakaan

#define NEOPIXED_CONTROL_PIN 6

#define NUM_LEDS 24 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800);

- inisialisasi

#biasanya di dalam blok pengaturan

void setup() { strip.begin(); # mungkin beberapa hal lain di sini # …. }

- nyalakan masing-masing piksel lalu terapkan semua modifikasi pada strip (render dengan cara tertentu)

# atur piksel 0 menjadi merah

strip.setPixelColor(0, strip. Color(255, 0, 0)); # atur piksel 1 menjadi strip hijau.setPixelColor(1, strip. Color(0, 255, 0)); # atur piksel 2 menjadi strip biru.setPixelColor(2, strip. Color(0, 0 255)); strip.tampilkan();

2. Sensor gerakan APDS 9960

Dari perpustakaan ini kita akan menggunakan fungsi "baca isyarat". Fungsi ini akan dapat membedakan antara perintah kiri-kanan, atas-bawah, dekat-jauh. Ada trik di sini, kami tidak akan meminta sensor terus menerus untuk gerakan terakhir yang dirasakan. Papan memiliki kemampuan untuk "ping" melalui interupsi bahwa gerakan telah ditemukan.

- sertakan perpustakaan, mirip dengan neopiksel

- nyatakan perpustakaan sebagai pin interupsi, dan flag interupsi

#menentukan APDS9960_INT 2

SparkFun_APDS9960 apds = SparkFun_APDS9960(); int isr_flag = 0;

- inisialisasi perpustakaan, biasanya di dalam fungsi pengaturan

batalkan pengaturan()

{ # nyatakan pin interupsi sebagai INPUT dan lampirkan fungsi pinMode(APDS9960_INT, INPUT); attachInterrupt(0, interruptRoutine, FALLING); if (apds.init() && apds.enableGestureSensor(true)) { Serial.println("Inisialisasi APDS-9960 selesai"); } else { Serial.println("Ada yang tidak beres selama APDS-9960 init!"); } # mungkin inisialisasi hal-hal lain }

- tentukan fungsi interupsi, di sini kita hanya akan menetapkan flag

batalkan interupsi Rutin() {

isr_flag = 1; }

- di dalam fungsi loop periksa bendera secara berkala untuk melihat apakah gerakan telah terdeteksi

lingkaran kosong()

{ # periksa flag if(isr_flag == 1) { # jika flag disetel, hapus interupsi, buat pemrosesan yang diperlukan di dalam fungsi handleGesture() # lalu reset flag dan pasang kembali interupsi detachInterrupt(0); menanganiGerakan(); isr_flag = 0; attachInterrupt(0, interruptRoutine, FALLING); } # beberapa kode lain di sini mungkin }

- tentukan fungsi handleGesture() di mana kita dapat meminta isyarat terakhir

void handleGesture() {

# jika tidak ada gerakan yang tersedia kembali, ini hanya pemeriksaan yang aman if (!apds.isGestureAvailable()) { kembali; } # membaca gerakan terakhir, membandingkan dengan yang dikenal dan mencetak saklar pesan (apds.readGesture()) { case DIR_UP: Serial.println("UP"); merusak; kasus DIR_DOWN: Serial.println("BAWAH"); merusak; kasus DIR_LEFT: Serial.println("LEFT"); merusak; kasus DIR_KANAN: Serial.println("KANAN"); merusak; kasus DIR_FAR: Serial.println("JAUH"); merusak; } }

Sekarang mari kita lihat seluruh kode beraksi:

Jadi saya telah menjelaskan API dasar dari sensor gerakan dan cincin neopiksel, sekarang mari kita satukan:

Algoritma berjalan seperti ini:

- inisialisasi perpustakaan (lihat kode di atas)

- membuat array intensitas led yang disebut "ledStates". Array ini akan berisi 24 intensitas led yang disusun secara menurun dari 150 menjadi 2

- di dalam loop utama periksa apakah pin interupsi telah dimodifikasi jika sudah waktunya untuk mengubah animasi atau warna led

- fungsi "handleGesture()" memeriksa gerakan terakhir dan memanggil fungsi "toggleColor" untuk gerakan UP -DOWN atau mengatur variabel global "ledDirection" untuk gerakan KIRI - KANAN

- fungsi "toggleColor()" hanya mengubah variabel global bernama "colorSelection" dengan salah satu nilai 0, 1, 2

- juga di dalam fungsi loop utama fungsi lain bernama "animateLeds();" disebut. Fungsi ini memeriksa apakah 100 milidetik berlalu, dan jika demikian, ia memutar led menggunakan fungsi "rotateLeds()" dan kemudian menggambar ulang

- "rotateLeds()" akan "memutar" led maju atau mundur dengan menggunakan larik lain yang disebut "intermediateLedStates".

"Efek" rotasi akan terlihat seperti ini:

# setelah inisialisasi

{150, 100, 70, 50, 40, 30, 10, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; # setelah 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}; # setelah 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 seterusnya

Untuk ini pertama-tama buat array baru dan salin intensitas led lama pada posisi baru (menambah posisi atau menguranginya). Setelah itu menimpa array "ledStates" dengan "intermediateLedStates" sehingga proses akan berlanjut setelah 100 milidetik.

#sertakan "SparkFun_APDS9960.h"

#sertakan "Adafruit_NeoPixel.h"

#sertakan "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_CONTROL_KHZ800+ NEO_CONTROL_PIN); SparkFun_APDS9960 apds = SparkFun_APDS9960(); unsigned long lastLedChangeTime = 0; arah led pendek = 0; pemilihan warna pendek = 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; void setup() { Serial.begin(9600); Serial.println("Program dimulai"); strip.mulai(); pinMode(APDS9960_INT, INPUT); attachInterrupt(0, interruptRoutine, FALLING); if (apds.init() && apds.enableGestureSensor(true)) { Serial.println("Inisialisasi APDS-9960 selesai"); } else { Serial.println("Ada yang tidak beres selama APDS-9960 init!"); } lastLedChangeTime = milis(); Serial.println("Ini berhasil"); } void loop() { if(isr_flag == 1) { detachInterrupt(0); menanganiGerakan(); isr_flag = 0; attachInterrupt(0, interruptRoutine, FALLING); } led animasi(); } void interruptRoutine() { isr_flag = 1; } /** * Ini akan menangani gerakan dari sensor APDS9960 * Gerakan Atas dan Bawah akan memanggil fungsi toggleColor * Gerakan Kiri dan Kanan akan mengubah animasi yang dipimpin */ void handleGesture() { if (!apds.isGestureAvailable()) { return; } switch (apds.readGesture()) { kasus DIR_UP: Serial.println("UP"); toggleWarna(); merusak; kasus DIR_DOWN: Serial.println("BAWAH"); toggleWarna(); merusak; kasus DIR_LEFT: ledDirection = 1; Serial.println("KIRI"); merusak; kasus DIR_RIGHT: ledDirection = -1; Serial.println("KANAN"); merusak; kasus DIR_FAR: ledDirection = 0; Serial.println("JAUH"); merusak; } } /** * Mengubah warna led saat ini * Setiap kali fungsi ini dipanggil akan mengubah status led */ void toggleColor() { if (colorSelection == 0) { colorSelection = 1; } else if (colorSelection == 1) { colorSelection = 2; } else { pilihan warna = 0; } } /** * Animasi akan berjalan setelah LED_SPEED_STEP_INTERVAL milis * Pertama fungsi rotateLeds dipanggil, kemudian warna led diatur menggunakan strip api */ void animateLeds() { if (millis() - lastLedChangeTime < LED_SPEED_STEP_INTERVAL) { return; } rotateLed(); for (int i=0; i < NUM_LEDS; i++) { strip.setPixelColor(i, getColor(ledStates)); strip.tampilkan(); } lastLedChangeTime = milis(); } /** * Menggunakan array sekunder "intermediateLedStates", intensitas led dianimasikan * Pertama nilai dari "ledStates" disalin pada "intermediateLedStates" seperti ini * mari kita dudukkan array "ledStates" adalah {100, 80, 60, 0, 0, 0} dan ledDirection adalah 1 * kemudian setelah fungsi ini disebut "ledStates" array adalah {0, 100, 80, 60, 0, 0} mensimulasikan efek rotasi */ void rotateLeds() { byte intermediateLedStates[NUM_LEDS]; for (int i=0; i < NUM_LEDS; i++) { intermediateLedStates = 0; } for (int i=0; i < NUM_LEDS; i++) { if (LedDirection == 1) { if (i == NUM_LEDS -1) { intermediateLedStates[0] = ledStates; } else { intermediateLedStates[i + 1] = ledStates; } } else { if (i == 0) { intermediateLedStates[NUM_LEDS - 1] = ledStates; } else { intermediateLedStates[i - 1] = ledStates; } } } for (int i=0; i < NUM_LEDS; i++) { ledStates = intermediateLedStates; } } uint32_t getColor(int intensitas) { switch (colorSelection) { case 0: return strip. Color(intensity, 0, 0); kasus 1: kembali strip. Warna (0, intensitas, 0); default: kembali strip. Warna (0, 0, intensitas); } }

Saya harap Anda menikmati ini, Anda dapat menggunakan bagian komentar untuk mengajukan pertanyaan kepada saya.

Direkomendasikan: