Detektor Jarak Portabel – Kit DIY Arduino Nano dengan HC‑SR04, Baterai 18650, dan Kotak Cetak 3D
Komponen dan perlengkapan
Arduino Nano R3
×
1
Sensor Ultrasonik - HC-SR04 (Umum)
×
1
Sel 18650
×
1
Charger Litium Ion TP4056
×
1
Konverter Boost DC-DC 5V
×
1
Buzzer
×
1
Potensiometer rotary (umum)
×
1
Tombol Geser
×
1
LED (umum)
Merah (2), Hijau (1), Biru (1)
×
4
Resistor 330 ohm
×
2
Baut Cap Head OpenBuilds M3
Baut M3 10mm (4)
×
1
Kabel
18 AWG
×
1
Bagian Cetak 3D
3 bagian untuk enclosure
×
1
Adapter Pas
×
1
Alat dan mesin yang diperlukan
Printer 3D (umum)
Saya menggunakan Anet A8
Pakuat solder (umum)
Pistol Lem Panas (umum)
Dremel
Atau alat rotary apa pun
Aplikasi dan layanan online
Arduino IDE
Perlu mengunduh library NewPing
Simplify3D
Atau slicer pilihan Anda
Tentang proyek ini
Pendahuluan
Jurusan Ilmu Olahraga Lehman College sedang melakukan studi mengenai latihan beban. Ada ketidakkonsistenan dalam jangkauan gerak untuk repetisi, yang dapat mempengaruhi data secara signifikan. Saya diminta untuk membuat sebuah perangkat yang akan mengidentifikasi jangkauan gerak penuh untuk latihan yang menggunakan mesin atau beban lebih besar.
Perangkat harus memenuhi kondisi berikut:
Jarak Dapat Disesuaikan
Tidak terpasang permanen pada mesin.
Kompatibel Tripod
Tanpa kabel
Video
Bagian
Sebagian besar bagian ditampilkan di bawah ini, tetapi untuk daftar lengkap, lihat BoM di atas. Bagian yang digunakan dipilih bukan karena optimal; itulah yang saya miliki. Jejak dapat sangat dikurangi dengan PCB kustom, komponen SMT, atau baterai LiPo.
Kode
Library NewPing diperlukan agar kode (yang disediakan di bawah) dapat dikompilasi.
Frekuensi buzzer dan batas atas/bawah adalah variabel global yang dapat diubah. Batas atas/bawah merujuk pada jarak minimum dan maksimum yang dibaca sensor, yang dipetakan ke nilai analog [0,5]V dari potensiometer.
int frequency = 700; //Frekuensi dalam Hz int lower_bound = 60; //Jarak dalam mm int upper_bound = 200; //Jarak dalam mm
3 bunyi bunyi terjadi saat nyala untuk menunjukkan bahwa boot berhasil (lihat loop setup()). Kemudian, loop() secara terus menerus meminta data dari sensor ultrasonik dan membandingkannya dengan ambang yang ditetapkan oleh potensiometer.
Pencetakan 3D
Semua file telah diunggah ke thingiverse, atau satu file terkompres dapat ditemukan di bagian bawah halaman. Cara menggunakan CAD tidak akan dibahas di sini. Model dibuat dengan mempertimbangkan keterbatasan pencetakan 3D. Overhangs diminimalkan dengan menggunakan chamfer 45 derajat, yang mengurangi bahan dukungan. Keonglong luas, jadi bagian seharusnya pas meskipun dicetak pada printer yang kalibrasi berbeda.
Waktu cetak akan bervariasi, tetapi waktu cetak saya adalah sebagai berikut:
Bagian Atas: 2 jam 40 menit
Bagian Bawah: 2 jam 20 menit
Knob: 20 menit
Rakit
Skematik sirkuit disediakan di bagian bawah halaman. Bagian dimasukkan tanpa dihubungkan kabel untuk memastikan kesesuaian.
Kabel IDE yang digunakan kembali menyediakan semua kabel. Grup kabel dapat dikupas sambil tetap terhubung satu sama lain, yang memberikan beberapa urutan.
Sebagian besar elektronik dipasang pada salah satu bagian yang dicetak, jadi beberapa pemikiran harus dilakukan untuk pengaturan dan manajemen kabel.
LED indikator SMD pada papan TP4056 dilepas solder. Kabel tambahan dan LED THT 3mm disolder di tempatnya. Resistor pembatas arus masih terintegrasi dengan papan. Ada video seseorang melakukan pemindahan ini.
Arduino nano hanya memiliki 2 pad ground yang dapat diakses, jadi stripboard digunakan untuk menambahkan jumlah pad ground. Hal yang sama dilakukan dengan garis 5V, yang dapat dilihat dalam gambar di bawah ini.
Memutuskan koneksi pada strip diperlukan sehingga 5V tidak disingkat ke ground. "X" merah menunjukkan lokasi pemutusan. Hanya tembaga atas yang perlu diacau, bukan seluruh papan serat kaca.
Komponen dihubungkan di luar enclosure. Mereka sesekali dipasang di dalam enclosure untuk mengukur panjang kabel dan memeriksa interferensi kabel.
Potensiometer dipotong 6mm sehingga tidak akan terlihat terlalu banyak.
Koneksi ke 18650 disolder langsung, yang merupakan praktik yang buruk. Overheating sel akan merusaknya dan dapat gagal seiring waktu. Penyelderaan strip aluminium adalah cara yang benar untuk menghubungkan 18650.
Lem panas digunakan dengan malu-malu untuk mengamankan elektronik. Hindari menggunakan lem panas jika memungkinkan. Desain mekanis yang benar dan pemegang akan bertahan lebih lama dari lem panas. Ia pasti akan gagal seiring waktu. Ini dapat dipahami untuk prototipe, tetapi bagian produksi tidak akan pernah menggunakan lem panas.
Ringkasan
Secara refleksi, saya akan lebih suka menggunakan sensor IR daripada Ultrasonik, tetapi tidak ada cara saya dapat mengetahui ini sampai saya mulai bereksperimen dengan sensor Ultrasonik. Sensor IR memiliki FOV yang lebih sempit dengan kompromi jarak maksimum yang jauh lebih rendah (~3ft).
Jika akan ada versi kedua, LiPo akan menggantikan 18650. Nut adapter besar yang bergerotak berat dan menghabiskan ruang. Standar threaded untuk mounting tripod adalah 1/4", jadi nut 1/4" sederhana dari toko hardware cukup. PCB kustom akan mengurangi volume setengahnya.
Untuk prototipe yang dikonsepsi dari konsep hingga penyerahan dalam 2 minggu, saya puas.
Masa Depan Proyek
Saat saya bereksperimen dengan sensor ultrasonik, saya mempelajari lebih banyak tentang keterbatasannya. Yang pertama adalah bahwa FOV-nya memiliki sudut ~±15° (30° total). Ini berarti sebuah objek dapat memicu buzzer sebelum berada tepat di atas sensor. Ini menghasilkan ketidakakuratan dan pembacaan yang tidak diinginkan. Selain itu, jika bidang objek tidak tegak lurus (atau dalam sudut toleransi) terhadap gelombang suara yang ditransmisikan, sensor tidak akan menerima gelombang yang terpantul dan tidak akan dapat memproses nilai untuk jarak.
Rencana awal saya adalah untuk meletakkan unit di tanah dan membiarkan piringan pada bar latihan beban memicu buzzer saat mereka diturunkan melewati ambang. Sistem ini terdiri dari sensor tetap dan pemicu bergerak. Rekan engineering saya telah mengusulkan solusi alternatif, yang melibatkan membalikkan sistem. Dia mengusulkan memasang sensor pada bar yang bergerak sambil mengarah ke tanah. Dengan cara ini tanah menjadi pemicu. Ini juga menghilangkan ketidakakuratan karena FOV yang luas seperti yang disebutkan sebelumnya.
Usulan tersebut tidak hanya merupakan solusi yang hebat untuk masalah yang diberikan, tetapi juga sangat mudah diimplementasikan. Pesanan untuk adapter nut tripod 1/4" datang dengan adapter 1/4" -> 3/8" DAN adapter 3/8" -> 1/4". Yang kedua akan sebenarnya berguna!
Karena saya tidak memiliki akses ke dremel saat saya mulai membuat model 3D, itu memaksa saya untuk mempertimbangkan seluruh adapter tripod. Ini dalam kombinasi dengan sel 18650 meningkatkan berat secara signifikan. Saya tidak ingin menambahkan lebih banyak bobot dari yang perlu, jadi saya akan memotong adapter tripod kedua sebelum memodelkan mounting. Saya akan kembali ke proyek dalam satu minggu untuk menyelesaikan solusi mounting alternatif ini. Sampai saat itu, ini tetap berjalan!
Kode
RangeDetectionDevice.ino
RangeDetectionDevice.inoArduino
/** Viktor Silivanov 3/22/2018 Portable distance detection device using the HC-SR04 Ultrasonic sensor with distance adjustment for triggering the buzzer. **/ //******************** Libraries ************************************************************************************************************************************************************************************************************************* #include <NewPing.h> //******************** Pins **************************************************************************************************************************************************************************************************************************** //Analog Pins #define wiper A5 //Digital Pins #define echo 2 #define trig 3 #define ON_LED 7 #define buzzer 8 #define buzzer_LED 9 //******************** Global Variables ********************************************************************************************************************************************************************************************************* //User Modification Allowed int frequency = 700; //Frequency in Hz int lower_bound = 60; //Distance in mm int upper_bound = 200; //Distance in mm //Do Not Modify int buzz_time = 250; //Time in milliseconds for buzzer right upon startup int buzz_delay = 280; //Time in milliseconds for buzzer delay right upon startup int max_distance = 400; //Argument for object in the NewPing library int i = 0; int distance; int threshold; NewPing sonar(trig, echo, max_distance); //Instanciation of object "sonar" //******************** Setup **************************************************************************************************************************************************************************************************************************** //This function runs only once void setup() { Serial.begin(9600); //Allows use of serial monitor with a baud rate of 9600 //Pin I/O Type Declaration pinMode(trig, OUTPUT); pinMode(echo, INPUT); pinMode(buzzer, OUTPUT); pinMode(buzzer_LED, OUTPUT); pinMode(ON_LED, OUTPUT); digitalWrite(ON_LED, HIGH); //Turns on green LED; Stays on while unit is on //Buzzer beeps 3 times upon turning on device while(i < 3){ digitalWrite(buzzer_LED, HIGH); tone(buzzer, frequency, buzz_time); delay(buzz_delay); i++; } digitalWrite(buzzer_LED, LOW); } //******************** Runs Endlessly ********************************************************************************************************************************************************************************************************************* void loop() { distance = sonar.ping_cm(); //Object "sonar" utilizes ping_cm() function from the library, which returns a value in cm. Distance then take on that value threshold = analogRead(wiper); //Obtain analog value from wiper of the potentiometer threshold = map(threshold, 0, 1023, lower_bound, upper_bound); //Translate analog readings into trigger range. Update values of threshold if(distance != 0 && distance < threshold){ //Condition to trigger the buzzer tone(buzzer, frequency); digitalWrite(buzzer_LED, HIGH); } else{ //State of buzzer & LED otherwise noTone(buzzer); digitalWrite(buzzer_LED, LOW); } //serial_test(); //Uncommment this to view data from the serial monitor } //******************** Test Function ************************************************************************************************************************************************************************************************************ //Utilizes serial monitor to display some values. Used for testing/debugging purposes. void serial_test(){ Serial.print("Ping: "); Serial.print(distance); Serial.println("cm"); Serial.print("Range: ["); Serial.print(lower_bound); Serial.print(", "); Serial.print(upper_bound); Serial.println("] cm"); Serial.print("Threshold: "); Serial.print(threshold); Serial.println("cm"); delay(100); }