Isi kandungan:

Keseronokan Giroskop Dengan Cincin Neopixel: 4 Langkah (dengan Gambar)
Keseronokan Giroskop Dengan Cincin Neopixel: 4 Langkah (dengan Gambar)

Video: Keseronokan Giroskop Dengan Cincin Neopixel: 4 Langkah (dengan Gambar)

Video: Keseronokan Giroskop Dengan Cincin Neopixel: 4 Langkah (dengan Gambar)
Video: Ring Laser Gyroscope 2024, November
Anonim
Image
Image

Dalam tutorial ini kita akan menggunakan giroskop MPU6050, cincin neopixel dan arduino untuk membina peranti yang menyalakan led sesuai dengan sudut kecenderungan.

Ini adalah projek yang mudah dan menyeronokkan dan akan dipasang di papan roti. Sekiranya anda mengikuti langkah-langkah anda akan membina apa yang anda lihat dalam video. Ini adalah tutorial yang baik untuk belajar mengenai giroskop dan cincin neopixel.

Saya membina tutorial ini kerana minat yang saya lihat pada arahan pertama saya di sini (Gyroscope Led Control With Arduino). Dalam arahan ini, saya telah mengganti led sederhana dengan cincin neopixel. Cincinnya lebih mudah digunakan melalui perpustakaan Adafruit dan pastinya lebih hebat.

Oleh itu, jika anda mempunyai komponen ini, ini adalah kaedah yang baik untuk menggunakannya, saya akan cuba membawa anda langkah demi langkah membina peranti dan juga menerangkan bagaimana ia berfungsi pada langkah terakhir.

Langkah 1: Perkara Yang Diperlukan

perhimpunan
perhimpunan

Bahagian

1. Arduino pro mini 328p (eBay) 2 $

2. Papan roti

3. MPU6050 giroskop (eBay) 1.2 $

4. 24 cincin dipimpin neopixel (Adafruit) 17 $

5. Pek bateri 4 x AA dengan 4 bateri

6. Kabel pelompat berbentuk U (pilihan). Saya telah menggunakan kabel pelompat ini kerana ia kelihatan lebih baik di papan roti, dan plumbum lebih kelihatan dengan cara ini. Anda dapat menjumpai sekotak 140 di ebay dengan harga sekitar 4 $. Sekiranya anda tidak mempunyai kabel ini, anda boleh menggantinya dengan wayar dupont.

Alat:

1. USB ke siri FTDI adaptor FT232RL untuk memprogram arduino pro mini

2. Arduino IDE

Kemahiran: 1. Memateri, lihat tutorial ini

3. Pengaturcaraan arduino asas, tutorial ini mungkin berguna

Langkah 2: Perhimpunan

perhimpunan
perhimpunan

Saya telah melampirkan skema fritzing dalam format fzz dan gambarnya untuk visualisasi sambungan yang mudah

1. Anda perlu memateri 3 pin lelaki di bahagian belakang cincin neopixel seperti yang ditunjukkan dalam gambar

- pateri pin positif

- memateri tanah

- solder pin input data

2. Kemudian pemegang bateri 4x harus mempunyai cara untuk menyambungkan ke papan roti, penyelesaian yang mudah adalah dengan memasangkan dua wayar dupont lelaki ke terminal itu.

3. Sediakan papan roti.

- letakkan cincin neopixel, mikrokontroler dan giroskop di papan roti seperti dalam gambar

- letakkan semua wayar negatif: ke mikrokontroler, cincin neopixel, gyro

- letakkan semua wayar positif: ke mikrokontroler, cincin neopixel, gyro

- letakkan semua wayar data:

* SDA dan SCL dari mikrokontroler ke gyro

* pin D6 dari mikrokontroler ke cincin neopixel

- periksa semula semua sambungan sebelum menghidupkan

- secara pilihan menggunakan pita saluran, pita pek bateri di bahagian belakang papan induk untuk menahannya di tempat dan menjadikannya lebih mudah alih

Langkah 3: Kod dan Penentukuran

Mula-mula anda perlu memuat turun dan memasang dua perpustakaan:

1. Adafruit firma perpustakaan neopixel yang mengawal neopixel

2. Perpustakaan MPU6050 untuk giroskop

3. Sumber perpustakaan I2CDev

Mereka adalah dua perpustakaan yang hebat yang akan mengangkat berat!

Maklumat lanjut mengenai neopixel di sini

Kemudian muat turun dan pasang pustaka saya dari sini atau salin dari bawah:

#sertakan "I2Cdev.h"

#include #include "MPU6050_6Axis_MotionApps20.h" #include "Wire.h" #define NEOPIXED_CONTROL_PIN 6 #tentukan NUM_LEDS 24 const int MAX_ANGLE = 45; const int LED_OFFSET = 12; MPU6050 mpu; Adafruit_NeoPixel strip = Adafruit_NeoPixel (NUM_LEDS, NEOPIXED_CONTROL_PIN, NEO_RBG + NEO_KHZ800); longPrintTime yang lama tidak ditandatangani = 0; permulaan bool = salah; // tetapkan benar sekiranya DMP init berjaya uint8_t mpuIntStatus; // memegang byte status gangguan sebenar dari MPU uint8_t devStatus; // kembali status selepas setiap operasi peranti (0 = berjaya,! 0 = ralat) uint16_t packetSize; // ukuran paket DMP yang dijangkakan (lalai adalah 42 bait) uint16_t fifoCount; // kiraan semua bait yang ada di FIFO uint8_t fifoBuffer [64]; // Penyangga simpanan FIFO Quaternion q; // [w, x, y, z] bekas kuarter VectorVloat graviti; // [x, y, z] pelampung vektor graviti ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll container and gravity vector volatile bool mpuInterrupt = false; // menunjukkan adakah pin gangguan MPU telah tinggi

persediaan tidak sah ()

{Serial.begin (9600); Serial.println ("Program dimulakan"); inisialisasi = initializeGyroscope (); jalur.begin (); } gelung void () {if (! inisialisasi) {kembali; } mpuInterrupt = salah; mpuIntStatus = mpu.getIntStatus (); fifoCount = mpu.getFIFOCount (); jika (hasFifoOverflown (mpuIntStatus, fifoCount)) {mpu.resetFIFO (); kembali; } if (mpuIntStatus & 0x02) {while (fifoCount <packetSize) {fifoCount = mpu.getFIFOCount (); } mpu.getFIFOBytes (fifoBuffer, packetSize); fifoCount - = packetSize; mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& graviti, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); redrawLeds (ypr [0] * 180 / M_PI, ypr [1] * 180 / M_PI, ypr [2] * 180 / M_PI); }} boolean hasFifoOverflown (int mpuIntStatus, int fifoCount) {return mpuIntStatus & 0x10 || fifoCount == 1024; } batal redrawLeds (int x, int y, int z) {x = had (x, -1 * MAX_ANGLE, MAX_ANGLE); y = kekangan (y, -1 * MAX_ANGLE, MAX_ANGLE); jika (y 0) {lightLeds (y, z, 0, 5, 0, 89); } lain jika (y <0 dan z 0 dan z 0 dan z> 0) {lightLeds (y, z, 20, 24, 89, 0); }} kekosongan cahayaLeds (int x, int y, int fromLedPosition, int toLedPosition, int fromAngle, int toAngle) {double angle = (atan ((double) abs (x) / (double) abs (y)) * 4068) / 71; int ledNr = peta (sudut, fromAngle, toAngle, fromLedPosition, toLedPosition); printDebug (x, y, ledNr, sudut); warna uint32_t; untuk (int i = 0; i posisi + LED_OFFSET) {kedudukan kembali + LED_OFFSET; } kedudukan kembali + LED_OFFSET - NUM_LEDS; } void printDebug (int y, int z, int lightLed, int angle) {if (milis () - lastPrintTime <500) {kembali; } Serial.print ("a ="); Serial.print (angle); Serial.print (";"); Serial.print ("ll ="); Serial.print (lightLed); Serial.print (";"); Serial.print ("y ="); Serial.print (y); Serial.print (";"); Serial.print ("z ="); Serial.print (z); Serial.println (";"); lastPrintTime = milis (); } bool initializeGyroscope () {Wire.begin (); TWBR = 24; mpu.initialize (); Serial.println (mpu.testConnection ()? F ("Sambungan MPU6050 berjaya"): F ("Sambungan MPU6050 gagal")); Serial.println (F ("Memulakan DMP …")); devStatus = mpu.dmpInitialize (); mpu.setXGyroOffset (220); mpu.setYGyroOffset (76); mpu.setZGyroOffset (-85); mpu.setZAccelOffset (1788); if (devStatus! = 0) {Serial.print (F ("Permulaan DMP gagal (kod")); Serial.println (devStatus); kembali palsu;} mpu.setDMPEnabled (benar); Serial.println (F ("Mengaktifkan pengesanan gangguan (Arduino gangguan luaran 0)… ")); attachInterrupt (0, dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); Serial.println (F (" DMP siap! Menunggu gangguan pertama … ")); packetSize = mpu.dmpGetFIFOPacketSize (); return true;} batal dmpDataReady () {mpuInterrupt = true;}

Muat naik kod:

Dengan menggunakan penyesuai FTDI muat naik kod ke arduino.

Sambungkan bekalan kuasa (bateri)

Penentukuran:

Perkara yang paling penting untuk menentukur di sini ialah pemalar "LED_OFFSET". Dalam contoh saya ialah 12. Anda perlu menyesuaikannya dari 0 hingga 23 sehingga setelah menyalakan papan, lampu LED akan menyala ke arah anda memiringkan papan.

Sekiranya anda ingin mengetahui lebih banyak perincian mengenai cara kerjanya, periksa langkah terakhir

Langkah 4: Bagaimana Ia Berfungsi (pilihan)

Bagaimana Ia Berfungsi (pilihan)
Bagaimana Ia Berfungsi (pilihan)

Pertama, sedikit maklumat mengenai giroskop MPU6050. Ini adalah giroskop MEMS (MEMS bermaksud sistem Microelectromechanical).

Setiap jenis giroskop MEM mempunyai beberapa bentuk komponen berayun dari mana akselerasi, dan oleh itu perubahan arah, dapat dikesan. Ini kerana, menurut undang-undang pemuliharaan gerakan, objek yang bergetar suka terus bergetar dalam bidang yang sama, dan penyimpangan getaran dapat digunakan untuk memperoleh perubahan arah.

Gyro ini juga mengandungi mikrokontroler sendiri untuk menghitung gulungan, nada dan menguap melalui beberapa matematik mewah.

Tetapi data mentah giro mengalami kebisingan dan drift, jadi kami menggunakan perpustakaan luaran untuk melancarkan semuanya dan memberi kami data yang dapat digunakan dengan bersih.

Neopixel adalah LED RGB yang boleh dialamatkan secara berasingan dan dirantai menjadi tali dan cincin. Mereka berfungsi pada 5V dan mereka mengandungi litar sendiri sehingga anda hanya perlu menghidupkan neopixel dan untuk berkomunikasi dengannya menggunakan garis data. Komunikasi dilakukan dengan satu baris data yang mengandungi jam dan data (lebih jelasnya di sini). Adafruit menyediakan perpustakaan yang bersih untuk berinteraksi dengan cincin neopixel.

Kodnya

Di dalam fungsi l oop () dipanggil perpustakaan MPU6050_6Axis_MotionApps20. Apabila perpustakaan mempunyai data baru dari gyroscpe, ia memanggil redrawLeds (x, y, z) dengan 3 argumen yang mewakili yaw, pitch and roll

Di dalam redrawLeds ():

- kami memfokus pada dua paksi: y, z

- kami mengekang kedua-dua paksi dari -MAX_ANGLE hingga + MAX_ANGLE, kami menentukan sudut maksimum hingga 45 dan ia boleh berubah

- kami membahagikan 360 degreed menjadi 4 kuadran dan memanggil fungsi lightLeds () untuk masing-masing seperti berikut:

* y negatif, kuadran pertama positif z akan mengawal led dari 0 hingga 5, sudut akan dari 0 hingga 89

* y negatif, kuadran kedua negatif z dikendalikan dari 6 hingga 12, sudut akan dari 89 hingga 0

* …dan lain-lain

- di dalam fungsi lightLeds

* Saya mengira sudut berdasarkan dua paksi menggunakan arctangent (periksa gambar yang dilampirkan)

* Saya mengira apa yang ditunjukkan dengan menggunakan fungsi peta arduino

* saya menetapkan semula jalur led kecuali dua led, yang sesuai dengan kedudukan led yang telah saya hitung sebelumnya dan posisi led sebelumnya (untuk menunjukkan kesan pudar)

* Saya menggunakan fungsi yang disebut normalizeLedPosition () untuk mempertimbangkan penentukuran neopixel. Kalibrasi berguna kerana cincin neopixel dapat diputar sesuka hati, dan harus sejajar dengan giroskop

* Saya juga mencetak sumbu derek, yang dipimpin mempunyai cahaya dan sudut

Matematik

Saya telah melampirkan gambar dengan cincin yang dipimpin dan fungsi trigonometri yang digunakan untuk menentukan sudut.

Disyorkan: