Isi kandungan:

Tahap Semangat Digital Berasaskan Arduino & MPU6050: 3 Langkah
Tahap Semangat Digital Berasaskan Arduino & MPU6050: 3 Langkah

Video: Tahap Semangat Digital Berasaskan Arduino & MPU6050: 3 Langkah

Video: Tahap Semangat Digital Berasaskan Arduino & MPU6050: 3 Langkah
Video: LCD I2C OLED 0.96" ARDUINO JAM DIGITAL DENGAN RTC DS3231 2024, November
Anonim
Image
Image
Litar
Litar

Selamat datang ke arahan pertama saya! Saya harap anda menganggapnya bermaklumat. Jangan ragu untuk memberikan maklum balas sama ada positif atau negatif.

Projek ini adalah untuk membuat tahap semangat digital berasaskan arduino & MPU6050. Walaupun reka bentuk dan kod yang sudah siap adalah milik saya, konsep asalnya dan banyak kod yang saya gunakan tidak. Saya tidak suka melakukan peniruan, jadi saya lebih senang memberi penghargaan kepada mereka yang idea yang telah saya bangunkan. 2 orang utama yang ingin saya beri perhatian ialah Bengkel Paul McWhorter dan DroneBot YouTuber. Saya sertakan pautan ke dalam PDF pautan berguna youtube saya. Terima kasih juga kepada EEEnthusiast untuk video maklumatnya mengenai penggunaan MPU6050 termasuk menyiapkan dan membaca dari modul tanpa perpustakaan luaran (pautannya ada dalam PDF yang sama).

Projek yang saya hasilkan, berfungsi 'apa adanya' dan tepat pada peri, pasti hingga 45% ke arah mana pun. Anda boleh menggunakannya sama seperti yang saya reka, atau anda boleh menyesuaikannya dengan citarasa anda sendiri. Yang lebih cerdik dari anda akan melihat bahawa projek saya kelihatan hampir sama dengan projek yang dihasilkan oleh bengkel DroneBot, tetapi yakinlah, terdapat perbezaan yang ketara, terutama mengenai kod untuk mengira sudut, ditambah kemudahan untuk menyimpan nilai penentukuran di Eeprom!

Beberapa ciri untuk memenuhi selera anda:

Sudut pitch dan roll tersedia dalam lingkungan 0.1 darjah.

Mengesan orientasi unit giro secara automatik (mendatar atau menegak)

Penentukuran penuh dengan hasil disimpan secara automatik ke eeprom

Petunjuk LED dari -2 hingga +2 darjah (boleh berubah dalam kod)

Petunjuk tahap tambahan yang dapat didengar (boleh dihidupkan / dimatikan semasa terbang)

Curcuit padat yang memerlukan komponen minimum

Mari kita mulakan.

Bekalan

Projek ini (seperti) menggunakan item berikut:

1 x Arduino nano (tambang adalah klon)

1 x modul gyro / accelerometer MPU6050

1 x LCD - 16 x 2 + Sambungan I2C

1 x Tekan untuk membuat suis

1 x Buzzer Piezo

1 x LED Hijau

2 x LED Kuning

2 x LED Merah

Perintang 5 x 220 ohm

Pelbagai kabel pelompat

Papan roti

Bekalan kuasa (saya menggunakan bank kuasa 5v USB, apabila tidak disambungkan ke PC saya, tetapi anda boleh menggunakan bateri yang disambungkan dengan betul)

Langkah 1: Litar

Litar
Litar
Litar
Litar

Dengan mengandaikan bahawa anda mempunyai semua komponen, anda perlu membina papan roti anda.

Saya menunjukkan persediaan saya sebagai panduan, tetapi sambungannya adalah seperti berikut:

Arduino pin D2 menyambung ke 1 sisi suis tolak. Bahagian lain dari suis tekan menyambung ke tanah

Arduino pin D3 menyambung ke 1 sisi perintang 220 ohm. Bahagian perintang lain menyambung untuk menyekat LED Merah. Katod LED Merah menuju ke tanah.

Arduino pin D4 menyambung ke 1 sisi perintang 220 ohm. Bahagian perintang lain menyambung untuk menyekat LED Kuning. Katod LED Kuning menuju ke tanah.

Arduino pin D5 menyambung ke 1 sisi perintang 220 ohm. Bahagian perintang lain menghubungkan untuk menyekat LED Hijau. Katod LED Hijau menuju ke tanah.

Arduino pin D6 menyambung ke 1 sisi perintang 220 ohm. Bahagian perintang lain menyambung untuk menyekat LED Kuning. Katod LED Kuning menuju ke tanah.

Arduino pin D7 menyambung ke 1 sisi perintang 220 ohm. Bahagian perintang lain menyambung untuk menyekat LED Merah. Katod LED Merah menuju ke tanah.

Arduino pin D8 menghubungkan ke satu sisi buzzer Piezo. Bahagian buzzer yang lain menghubungkan ke tanah.

Arduino pin A4 menyambung ke pin SDA pada MPU6050 DAN LCD.

Arduino pin A5 menyambung ke pin SCL pada MPU6050 DAN LCD

Kuasa 5v dan Gnd untuk MPU6050 dan LCD masing-masing berasal dari pin Arduino Nano 5v dan GND.

Setelah selesai, ia serupa dengan persediaan saya yang ditunjukkan. Saya meletakkan blu tak di bawah MPU6050 untuk menghentikannya bergerak dan juga pada LCD untuk menyimpannya di tepi papan roti.

Langkah 2: Kodnya

Kod yang dilampirkan adalah kod yang telah saya gunakan untuk projek ini. Satu-satunya perpustakaan yang mungkin anda hadapi ialah

Perpustakaan LiquidCrystal_I2C.h semasa saya mengimport ini semasa mula bekerja dengan LCD. Malangnya, terdapat beberapa perpustakaan yang menggunakan pernyataan #include yang sama, tetapi sedikit berbeza. Sekiranya anda mempunyai masalah dengan anda, cari kod LCD lain yang sesuai untuk anda dan ubah kod tersebut dengan sewajarnya. Kemungkinan hanya penyediaan yang berbeza. Semua arahan 'cetak' harus berfungsi sama.

Semua kod telah dikomentari dan dengan anggapan saya telah melakukannya dengan betul, akan ada juga video yang menjelaskan semuanya, tetapi berikut adalah beberapa perkara yang perlu diperhatikan:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Kod di atas adalah persediaan untuk LCD saya. Sekiranya perpustakaan anda berbeza, anda mungkin perlu menukar bukan sahaja perpustakaan anda, tetapi juga garis ini.

{lcd.setCursor (0, 1); lcd.print ("Mendatar!"); orientasi = HORISONAL; // Baca data acc dan gyro mentah dari MPU-6050 1000 kali untuk (int cal_int = 0; cal_int <1000; cal_int ++) {read_mpu_6050_data (); // Tambahkan ofset gyro x ke pemboleh ubah gyro_x_cal gyro_x_cal + = gyro_x; // Tambahkan ofset gyro y ke pemboleh ubah gyro_y_cal gyro_y_cal + = gyro_y; // Tambahkan ofset gyro z ke pemboleh ubah gyro_z_cal gyro_z_cal + = gyro_z; // Tambahkan offset acc x ke pemboleh ubah acc_x_cal acc_x_cal + = acc_x; // Tambahkan ofset acc y ke pembolehubah acc_y_cal acc_y_cal + = acc_y; } // Bahagikan semua hasil dengan 1000 untuk mendapatkan purata gset gyro_x_cal / = 1000.0; gyro_y_cal / = 1000.0; gyro_z_cal / = 1000.0; acc_x_cal / = 1000.0; acc_y_cal / = 1000.0; penentukuran horizontal = 255; eeprom_address = 0; EEPROM.put (eeprom_address, horisontalCalibration); eeprom_address + = sizeof (int); EEPROM.put (alamat eeprom, gyro_x_cal); eeprom_address + = sizeof (apungan); EEPROM.put (alamat eeprom, gyro_y_cal); eeprom_address + = sizeof (apungan); EEPROM.put (eeprom_address, gyro_z_cal); eeprom_address + = sizeof (apungan); EEPROM.put (alamat eeprom_daftar, acc_x_cal); eeprom_address + = sizeof (apungan); EEPROM.put (eeprom_address, acc_y_cal); eeprom_address + = sizeof (apungan); // Perhatikan kami tidak menyimpan offset untuk acc_z, kerana graviti! kelewatan (500); }

Blok kod di atas dilaksanakan untuk rutin penentukuran. Kod ini adalah untuk penentukuran mendatar. Terdapat kod hampir sama untuk penentukuran menegak (perhatikan, kod tersebut mengetahui sama ada MPU6050 anda dipasang secara mendatar atau menegak!). MPU6050, dibaca 1000 kali. nilai yang sesuai ditambah secara kumulatif kemudian dibahagi dengan 1000 untuk memberikan nilai 'ofset' purata. Nilai-nilai ini kemudian disimpan ke eeprom Nano. Semua nilai penentukuran mendatar disimpan bermula pada alamat eeprom 0. Semua nilai menegak disimpan permulaan di alamat eeprom 24. Penentukuran HARUS dilakukan pada permukaan yang sama rata, jika tidak bermaksud apa-apa.

/ * * Beberapa baris berikutnya memproses data mentah untuk mengubahnya menjadi sudut yang dapat dihasilkan ke LCD dan LED. * Nilai 4096, dimana data pecutan dibahagi diambil dari lembaran data MPU6050 dan berdasarkan pada kadar sampel. * Nilai 9.8 adalah graviti * Fungsi atan2 adalah dari modul matematik dan digunakan untuk mengira sudut dari data yang diberikan * / thetaM = -atan2 ((acc_x / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Data mentah phiM = -atan2 ((acc_y / 4096.0) /9.8, (acc_z / 4096.0) /9.8) /2/3.141592656 * 360; // Data mentah dt = (millis () - millisOld) / 1000.; millisOld = millis (); / * * Bahagian ini menggunakan data gyro untuk menjadikan sistem lebih responsif * nilai 65.5, yang mana data gyro dibahagi diambil dari lembaran data MPU6050 dan berdasarkan pada kadar sampel * / theta = (theta + (gyro_y / 65.5) * dt) *. 96 + thetaM *.04; // Penapis lulus rendah phi = (phi + (gyro_x / 65.5) * dt) *. 96 + phiM *.04; // Penapis lulus rendah

Kod di atas adalah perkara yang mengira sudut. Semoga komen memberi sedikit gambaran tentang cara kerjanya, tetapi untuk penjelasan mendalam, lihat video Paul McWhorters yang dihubungkan dalam PDF yang dilampirkan. Apa yang akan saya katakan ialah anda boleh mengubah kadar sampel untuk gyro dan Accelerometer (yang dilakukan dalam subrutin MPU6050 persediaan di bahagian bawah kod saya). Sekiranya anda menukar kadar sampel, anda juga harus mengubah berapa banyak data mentah dibahagi dengan. Untuk data pecutan, nilai semasa adalah 4096. Untuk giro, nilai semasa ialah 65.5.

Rujuk pada lembaran data yang dilampirkan dan video oleh EEEntusiast (pautan dalam PDF yang dilampirkan) untuk mendapatkan maklumat yang lebih mendalam mengenai bagaimana nilai-nilai pensampelan dan pengimbangan dijumpai.

Langkah 3: Langkah Seterusnya

Pada tahap ini diharapkan projek ini dapat dibuat, tetapi bagaimana sekarang?

Pertama, mengapa tidak benar-benar membinanya menjadi tahap semangat yang boleh anda gunakan. Anda boleh membeli tahap semangat yang murah (pastikan jenisnya jenis) yang boleh anda sesuaikan, atau jika anda mempunyai kit, cetak tingkat / kotak anda sendiri.

Mungkin boleh bermain dengan kadar sampel gyro dan accelerometer untuk melihat apakah ia berfungsi lebih baik pada satu kadar daripada yang lain.

Cuba perbaiki kodnya lebih jauh. Sebagai contoh, pada masa ini, melebihi 45 darjah, sudut yang dinyatakan adalah paling kasar. Adakah terdapat jalan di sekitarnya?

Sekiranya anda mempunyai pertanyaan, tidak peduli betapa mudahnya, tanyakan. Sekiranya saya dapat membantu, saya akan.

Sekiranya anda menyukai arahan ini, sila berikan yang serupa, supaya saya tahu.

Sekiranya anda membuat ini, sila tunjukkan kepada saya (terutamanya jika ia berada dalam kes yang berfungsi).

TERIMA KASIH

Disyorkan: