Daftar Isi:
Video: Mengontrol Cincin Led Neopiksel Dengan Sensor Gerakan: 3 Langkah (dengan Gambar)
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:56
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:
Lampu LED Meja Cerdas - Pencahayaan Cerdas Dengan Arduino - Ruang Kerja Neopiksel: 10 Langkah (dengan Gambar)
Lampu LED Meja Cerdas | Pencahayaan Cerdas Dengan Arduino | Ruang Kerja Neopiksel: Saat ini kita menghabiskan banyak waktu di rumah, belajar dan bekerja secara virtual, jadi mengapa tidak membuat ruang kerja kita lebih luas dengan sistem pencahayaan khusus dan cerdas berbasis Arduino dan LED Ws2812b. Di sini saya tunjukkan cara membangun Smart Anda Lampu LED Meja yang
Kontrol Gerakan Sederhana - Kontrol Mainan RC Anda Dengan Gerakan Lengan Anda: 4 Langkah (dengan Gambar)
Kontrol Gerakan Sederhana - Kontrol Mainan RC Anda Dengan Gerakan Lengan Anda: Selamat datang di 'ible' saya #45. Beberapa waktu yang lalu saya membuat BB8 versi RC yang berfungsi penuh menggunakan bagian Lego Star Wars … https://www.instructables.com/id/Whats-Inside-My-R…Ketika saya melihat betapa kerennya itu Force Band yang dibuat oleh Sphero, saya berpikir: "Ok, saya c
Jam LED Menggunakan Neopiksel: 4 Langkah (dengan Gambar)
Jam LED Menggunakan Neopiksel: Selamat datang di instruksi saya tentang cara membuat jam LED menggunakan 60 Neopiksel. Anda akan menemukan 3 PDF yang terlampir adalah untuk segmen jam, yang lain untuk alas dan yang terakhir adalah template untuk membantu menempelkan bagian bersama-sama. Jadi untuk kom
Gunakan Gerakan untuk Mengontrol Pemutaran YouTube Dengan Arduino: 5 Langkah
Gunakan Gerakan untuk Mengontrol Pemutaran YouTube Dengan Arduino: StoryYouTube hanya memungkinkan Anda untuk maju cepat 5 detik setiap kali Anda mengklik tombol kanan. Jadi saya memutuskan untuk menggunakan Arduino dan python untuk membuat pengontrol untuk membantu saya mempercepat 20 detik setiap kali saya melambaikan tangan
Menggunakan Papan Sensor Seni Kompleks untuk Mengontrol Data Murni Melalui WiFi: 4 Langkah (dengan Gambar)
Menggunakan Papan Sensor Seni Kompleks untuk Mengontrol Data Murni Melalui WiFi: Pernahkah Anda ingin bereksperimen dengan kontrol gestur? Membuat sesuatu bergerak dengan lambaian tangan? Kontrol musik dengan memutar pergelangan tangan Anda? Instruksi ini akan menunjukkan caranya! Papan Sensor Seni Kompleks (complexarts.net) adalah mikroc