Level Spirit Digital Berbasis Arduino & MPU6050: 3 Langkah
Level Spirit Digital Berbasis Arduino & MPU6050: 3 Langkah
Anonim
Image
Image
Sirkuit
Sirkuit

Selamat datang di instruksi pertama saya! Saya harap Anda menemukannya informatif. Jangan ragu untuk meninggalkan umpan balik apakah positif atau negatif.

Proyek ini adalah membuat digital spirit level berbasis arduino & MPU6050. Sementara desain dan kode yang sudah jadi adalah milik saya, konsep asli dan sebagian besar kode tempat saya bekerja tidak. Saya tidak menyukai plagiarisme, jadi saya dengan senang hati memberikan penghargaan kepada mereka yang ide-idenya telah saya bangun. 2 orang utama yang ingin saya sapa adalah YouTuber's Paul McWhorter dan DroneBot Workshop. Saya menyertakan tautan ke mereka di tautan berguna youtube saya PDF. Terima kasih juga kepada EEEnthusiast untuk video informatifnya tentang penggunaan MPU6050 termasuk menyiapkan dan membaca dari modul tanpa perpustakaan eksternal (tautannya ada di PDF yang sama).

Proyek yang saya hasilkan, bekerja 'apa adanya' dan sangat akurat, tentu saja hingga 45% di kedua arah. Anda dapat menggunakannya persis seperti yang saya rancang, atau Anda dapat menyesuaikannya dengan selera Anda sendiri. Semakin cerdik Anda akan melihat bahwa proyek saya terlihat hampir identik dengan yang diproduksi oleh bengkel DroneBot, tetapi yakinlah, ada perbedaan yang signifikan, terutama dalam hal kode untuk menghitung sudut, ditambah fasilitas untuk menyimpan nilai kalibrasi di dalamnya. Eeprom!

Beberapa fitur untuk membangkitkan selera Anda:

Sudut pitch dan roll tersedia hingga 0,1 derajat.

Deteksi otomatis orientasi unit gyro (horizontal atau vertikal)

Kalibrasi penuh dengan hasil yang disimpan secara otomatis ke eeprom

Indikasi LED dari -2 hingga +2 derajat (dapat diubah dalam kode)

Indikasi tambahan yang dapat didengar dari level (dapat dinyalakan/dimatikan dengan cepat)

Sirkuit kompak yang membutuhkan komponen minimal

Mari kita mulai.

Perlengkapan

Proyek ini (sebagaimana adanya) menggunakan item berikut:

1 x Arduino nano (milik saya adalah tiruan)

1 x MPU6050 modul gyro/akselerometer

1 x LCD - 16 x 2 + koneksi I2C

1 x Dorong untuk beralih

1 x bel Piezo

1 x LED Hijau

2 x LED Kuning

2 x LED Merah

5x220 ohm resistor

Berbagai kabel jumper

Papan tempat memotong roti

Catu daya (milik saya menggunakan bank daya USB 5v, ketika tidak terhubung ke PC saya, tetapi Anda dapat menggunakan baterai yang terhubung dengan benar)

Langkah 1: Sirkuit

Sirkuit
Sirkuit
Sirkuit
Sirkuit

Dengan asumsi Anda memiliki semua komponen, Anda perlu membuat papan tempat memotong roti.

Saya menunjukkan pengaturan saya sebagai panduan, tetapi koneksi adalah sebagai berikut:

Pin Arduino D2 terhubung ke 1 sisi push switch. Sisi lain dari sakelar dorong terhubung ke ground

Pin Arduino D3 terhubung ke 1 sisi resistor 220 ohm. Sisi lain resistor terhubung ke anoda LED Merah. Katoda LED Merah masuk ke ground.

Pin Arduino D4 terhubung ke 1 sisi resistor 220 ohm. Sisi lain resistor terhubung ke anoda LED Kuning. Katoda LED Kuning masuk ke ground.

Pin Arduino D5 terhubung ke 1 sisi resistor 220 ohm. Sisi lain resistor terhubung ke anoda LED Hijau. Katoda LED Hijau masuk ke ground.

Pin Arduino D6 terhubung ke 1 sisi resistor 220 ohm. Sisi lain resistor terhubung ke anoda LED Kuning. Katoda LED Kuning masuk ke ground.

Pin Arduino D7 terhubung ke 1 sisi resistor 220 ohm. Sisi lain resistor terhubung ke anoda LED Merah. Katoda LED Merah masuk ke ground.

Pin Arduino D8 terhubung ke satu sisi buzzer Piezo. Sisi lain dari buzzer terhubung ke ground.

Pin Arduino A4 terhubung ke pin SDA pada MPU6050 DAN LCD.

Pin Arduino A5 terhubung ke pin SCL pada MPU6050 DAN LCD

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

Setelah selesai, itu harus mirip dengan pengaturan saya yang ditunjukkan. Saya meletakkan blu tak di bawah MPU6050 untuk menghentikannya bergerak dan juga pada LCD agar tetap berada di tepi papan tempat memotong roti.

Langkah 2: Kode

Kode terlampir adalah kode yang saya gunakan untuk proyek ini. Satu-satunya perpustakaan yang mungkin bermasalah adalah

Pustaka LiquidCrystal_I2C.h saat saya mengimpor ini ketika saya pertama kali mulai bekerja dengan LCD. Sayangnya, ada beberapa library yang menggunakan pernyataan #include yang sama, tetapi sedikit berbeda. Jika Anda memiliki masalah dengan Anda, temukan kode LCD lain yang sesuai untuk Anda dan ubah kode yang sesuai. Kemungkinan hanya pengaturannya saja yang berbeda. Semua perintah 'cetak' harus bekerja sama.

Semua kode telah dikomentari dan dengan asumsi saya telah melakukannya dengan benar, juga akan ada video yang menjelaskan semuanya, tetapi berikut adalah beberapa poin yang perlu diperhatikan:

LiquidCrystal_I2C lcd (0x27, 16, 2);

Kode di atas adalah pengaturan untuk LCD saya. Jika perpustakaan Anda berbeda, Anda mungkin perlu mengubah tidak hanya perpustakaan Anda, tetapi juga baris ini.

{ lcd.setCursor(0, 1); lcd.print("Horisontal!"); orientasi = HORIZONTAL; //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 gyro x offset ke variabel gyro_x_cal gyro_x_cal += gyro_x; //Tambahkan offset gyro y ke variabel gyro_y_cal gyro_y_cal += gyro_y; //Tambahkan gyro z offset ke variabel gyro_z_cal gyro_z_cal += gyro_z; //Tambahkan acc x offset ke variabel acc_x_cal acc_x_cal += acc_x; //Tambahkan acc y offset ke variabel acc_y_cal acc_y_cal += acc_y; } // Bagi semua hasil dengan 1000 untuk mendapatkan rata-rata offset 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; horisontalKalibrasi = 255; eeprom_address = 0; EEPROM.put(eeprom_address, horizontalCalibration); eeprom_address += sizeof(int); EEPROM.put(eeprom_address, gyro_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_y_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, gyro_z_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_x_cal); eeprom_address += sizeof(float); EEPROM.put(eeprom_address, acc_y_cal); eeprom_address += sizeof(float); //Perhatikan kami tidak menyimpan offset untuk acc_z, karena gravitasi! penundaan (500); }

Blok kode di atas dieksekusi ke rutin kalibrasi. Kode ini untuk kalibrasi horizontal. Ada kode yang hampir identik untuk kalibrasi vertikal (perhatikan, kode tersebut mengetahui apakah MPU6050 Anda dipasang secara horizontal atau vertikal!). MPU6050, dibaca 1000 kali. nilai-nilai yang sesuai ditambahkan secara kumulatif kemudian dibagi dengan 1000 untuk memberikan nilai 'penggantian' rata-rata. Nilai-nilai ini kemudian disimpan ke Nano eeprom. Semua nilai kalibrasi horizontal disimpan mulai dari alamat eeprom 0. Semua nilai vertikal disimpan mulai dari alamat eeprom 24. Kalibrasi HARUS dilakukan pada permukaan yang benar-benar rata, jika tidak maka tidak berarti apa-apa.

/* * Beberapa baris berikutnya memproses data mentah untuk mengubahnya menjadi sudut yang dapat ditampilkan ke LCD dan LED. * Nilai 4096, yang dibagi dengan data percepatan diambil dari lembar data MPU6050 dan didasarkan pada laju sampel. * Nilai 9.8 adalah gravitasi * Fungsi atan2 berasal dari modul matematika dan digunakan untuk menghitung 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.; milisOld=milis(); /* * Bagian ini menggunakan data gyro untuk membuat sistem lebih responsif * nilai 65,5, yang dibagi dengan data gyro diambil dari datasheet MPU6050 dan didasarkan pada sample rate */ theta=(theta+(gyro_y/ 65.5)*dt)*.96 + thetaM*.04; //Filter lolos rendah phi=(phi+(gyro_x/65.5)*dt)*.96 + phiM*.04; //filter lolos rendah

Kode di atas adalah hal-hal yang menghitung sudut. Semoga komentar memberikan sedikit wawasan tentang cara kerjanya, tetapi untuk penjelasan mendalam, lihat video Paul McWhorters yang ditautkan dalam PDF terlampir. Apa yang akan saya katakan adalah bahwa Anda dapat mengubah laju sampel untuk gyro dan Accelerometer (yang dilakukan dalam subrutin pengaturan MPU6050 di bagian bawah kode saya). Jika Anda mengubah laju sampel, Anda juga harus mengubah berapa banyak data mentah dibagi. Untuk data accelerometer, nilai arusnya adalah 4096. Untuk gyro, nilai arusnya adalah 65,5.

Lihat lembar data terlampir dan video oleh EEEntusiast (tautan dalam PDF terlampir) untuk informasi lebih mendalam tentang bagaimana nilai sampling dan offset ditemukan.

Langkah 3: Langkah Selanjutnya

Pada titik ini diharapkan akan membuat proyek ini, tetapi bagaimana sekarang?

Pertama, mengapa tidak benar-benar membangunnya menjadi tingkat semangat yang dapat Anda gunakan. Anda dapat membeli spirit level murah (pastikan itu adalah jenis kotak) yang dapat Anda sesuaikan, atau jika Anda memiliki kit, cetak level/kotak Anda sendiri.

Mungkin bermain-main dengan tingkat sampel gyro dan akselerometer untuk melihat apakah mereka bekerja lebih baik pada satu tingkat daripada yang lain.

Cobalah untuk memperbaiki kode lebih lanjut. Misalnya, saat ini, di luar 45 derajat, sudut yang disebutkan itu kasar untuk sedikitnya. Apakah ada cara untuk mengatasinya?

Jika Anda memiliki pertanyaan, tidak peduli betapa sederhananya pertanyaan itu, silakan tanyakan. Jika saya bisa membantu, saya akan membantu.

Jika Anda menyukai instruksi ini, tolong beri suka, agar saya tahu.

Jika Anda membuat ini, tolong tunjukkan saya (terutama jika dalam kasus kerja).

TERIMA KASIH