Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Tampilkan Kedalaman Bor Akurat dengan Sensor Giros & Arduino Nano

Komponen dan Perlengkapan

KomponenJumlah
Arduino Nano R31

Alat dan Mesin yang Diperlukan

Aplikasi dan Layanan Online

Tentang Proyek

Jika Anda perlu membuat luboran pada kedalaman tertentu untuk suatu proyek, Anda memeruka bor dinding dengan tampilan kedalaman. Sebagian besar bor dinding memiliki penggaris dengan panah untuk pembacaan. Keberhasilan pemborongan tergantung pada seberapa akurat Anda dapat membaca posisi yang diinginkan. Dalam proyek Arduino ini, saya menyajikan alternatif: tampilan kedalaman bor dengan sensor giros dan layar 7-segmen dengan dukungan Arduino.

Mesin yang paling sering saya gunakan di bengkel saya bukanlah gerinda atau mesin gerinda. Ini adalah bor dinding. Terlepas dari proyek apa pun, mesin ini selalu digunakan. Jika saya perlu kedalaman bor tertentu, saya dapat menggunakan penggaris bawaan pada mesin dan mengingat kedalaman yang harus saya capai. Metode ini sebenarnya bekerja cukup baik.

Namun, seiring bertambahnya usia, semakin sulit bagi saya untuk membaca kedalaman dengan akurasi milimeter. Dan jika pencahayaan tidak cukup terang, hampir tidak mungkin untuk membacanya. Namun, apakah saya harus memakai kacamata hanya untuk ini? Dan setelah bor, di mana saya menyimpan kacamata? Saya belum sampai titik itu.

Sejalan dengan motto Paul Akers dari "2 Second Lean":

Harus ada solusi yang lebih baik, Anda hanya perlu berpikir dan mewujudkannya.

Kemungkinan Pengukuran

Saya tentu dapat memasang kaca pembesar di depan skala untuk membuat penggaris lebih mudah dibaca. Ini akan meningkatkan pembacaan, tetapi tidak akan membantu saya harus mengingat pengukuran setiap kali. Dan jika Anda sedang berkecimpung di bidang kerajinan tangan, proses itu juga harus menyenangkan.

Itulah sebabnya solusi elektronik jauh lebih baik. Preferably dalam ruang yang kecil sehingga semuanya muat di samping tombol on/off bor. Untuk kasus seperti ini, saya suka menggunakan Arduino Nano. Ini memiliki cukup pin untuk mengontrol hampir segalanya dan ukurannya relatif kecil.

Tetapi bagaimana cara mengukur kedalaman bor? Ada beberapa kemungkinan untuk pengukuran panjang. Pasang pengukuran ultrasonik? Bisa bekerja, tetapi hanya dengan sedikit mekanisme yang bergerak bersama bor sebagai permukaan pantulan. Atau gunakan enkoder dengan kawat tarik? Mungkin mungkin, tetapi sangat kompleks jika Anda membangunnya sendiri: dengan piring putar, rintangan cahaya cabang, dan pengembalian spring. Lebih baik langsung ambil enkoder rotatif? Itu akan berarti banyak kurang komponen - ya, tetapi itu akan terlalu kasar, Anda harus memasang roda gigi untuk translasi.

Oke, jadi pikirkan lebih jauh.

Bor saya, seperti kebanyakan, memiliki roda genggam di samping untuk menyesuaikan kedalaman. Roda ini dapat diputar sekitar 270 °. Jadi bahkan tidak satu putaran penuh.

Ini sempurna untuk pengukuran sudut dengan sensor giros. Koneksi kabel tidak dapat berputar dan hanya satu komponen murah yang diperlukan. Sensor giros juga dapat dipasang dengan sangat mudah secara langsung pada sumbu rotasi roda genggam.

Konsep

Saya selalu melakukan hal yang sama ketika menentukan kedalaman bor: gores permukaan dengan bor, catat koordinat, kemudian tambahkan kedalaman bor yang diinginkan dan akhirnya bor sampai kedalaman tercapai.

Saya ingin menjaga proses dasar. Agar tidak terlalu dalam, saya ingin menerima informasi tentang kapan kedalaman bor telah tercapai.

Tombol mengambil fungsi ini. Saat Anda menekannya, Arduino menyimpan posisi bor saat ini sebagai nilai batas dan dapat selalu mengingatkan saya padanya ketika tercapai nanti.

Komponen yang tersisa memakan lebih banyak ruang dan jauh lebih berat. Untungnya, casing mesin saya terbuat dari logam. Itulah sebabnya saya menggunakan magnet neodymium untuk memasangnya.

Pertanyaannya tersisa, bagaimana sensor harus dipasang pada mesin?

Sumbu bor memiliki dadu segi enam SW17. Jadi saya hanya perlu komponen cetak 3D yang terima sensor dan dapat dipasang pada dadu segi enam.

Komponen yang Diperlukan

Koneksi Sensor Giros

Sensor giros terhubung melalui I2C. Jadi kita harus menggunakan A5 dan A4 untuk Nano.

Modul Layar 7-Segmen

Pin digital mana pun dapat digunakan saat menghubungkan modul layar 7-segmen. Pin diatur menggunakan sketsa Arduino.

Tombol

Pin input tombol juga dapat dipilih bebas. Saya menggunakan pin D9.

Sumber Daya

Untuk sumber daya, saya menggunakan 6 baterai AA. Setelah tombol on/off, baterai menyeluruh sistem dengan listrik.

Casing

Saya mendesain casing dengan Autodesk Fusion 360. Saya membuat cetakan 3D dengan Anycubic i3 Mega.

Magnet neodymium untuk pemasangan pada mesin dilem. Jika tampilan kedalaman bor keseluruhan mengganggu, semuanya segera dilepas.

Sketsa Arduino

Saya menggunakan perpustakaan LedControl.h untuk mengontrol layar 7 segmen. Jika Anda belum menginstalnya, Anda harus menginstalnya terlebih dahulu menggunakan manajer perpustakaan.

Sensor giros terhubung melalui bus I2C. Saat mencari perpustakaan yang mungkin untuk sensor, saya kemudian memutuskan untuk tidak menggunakan yang mana pun. Komunikasi melalui Wire.h.

Di akhir artikel Anda akan menemukan beberapa tautan yang membantu saya memahami.

Pengontrolan layar 7 segmen bekerja sangat baik dengan LedControl.

Setelah inisialisasi dengan pin, prosedur setup hanya memerlukan beberapa persiapan untuk membangun layar dan menyesuaikan intensitas.

Dalam bagian loop, layar hanya menampilkan kedalaman bor saat ini dan, jika diatur, posisi berhenti, juga sebagai angka.

Layar mengharapkan setiap digit sebagai tipe karakter. Saya ingin menggunakan satu desimal sebagai akurasi. Fungsi dtostrf mengubah float menjadi array karakter. Kemudian menjadi string untuk menampilkan karakter demi karakter pada layar.

dtostrf ( currentPos, 4,1, txt ) ;
s = '' + String ( txt ) ;
lc. setChar ( 0,4, see charAt ( see length () -1 ) , false ) ;
lc. setChar ( 0.5, see charAt ( see length () -3 ) , true ) ;
lc. setChar ( 0.6, see charAt ( see length () -4 ) , false ) ;
lc. setChar ( 0.7, see charAt ( see length () -5 ) , false ) ;

Ketika posisi berhenti tercapai, "StOP" muncul pada layar. Huruf kecil "t" dapat dihasilkan menggunakan prosedur setRow dan pola bit yang tepat B00001111.

Pembacaan sensor giros bekerja melalui fungsi dari perpustakaan wire. Saya hanya menggunakan accelerometer untuk menentukan posisi sudut.

Saat bekerja dengan koneksi USB ke Arduino IDE, semuanya bekerja sempurna. Setelah mencabut dan menghubungkan ke sumber daya eksternal, sensor tidak menyediakan data apa pun. Ini hanya bekerja lagi setelah reset Arduino.

Ini yang memberikan saya pusingan paling besar dalam seluruh proyek. Anda bisa mengatakan bahwa indikator kedalaman bor mungkin telah menyelamatkan mata saya, tetapi itulah sebabnya saya hampir mencabut semua rambut saya!

Setelah pencarian panjang, pemasangan waktu tunggu setelah membangun sensor adalah solusi. Ini membuat delay (1000) perintah paling penting dalam seluruh kode sumber.

//persiapkan sensor GY-521
//kita hanya menggunakan data accelerometer
Wire.begin();
Wire.beginTransmission(MPU);
Wire.write(0x6B);
Wire.write(0x00); // bangunkan MPU
Wire.endTransmission(true);

//delay ini sangat diperlukan dalam kasus saya!
delay(1000);

Wire.beginTransmission(MPU);
Wire.write(0x1C); //register ACCEL_CONFIG
Wire.write(0x10); //Set sebagai 00010000 untuk rentang skala penuh +/- 8g
Wire.endTransmission(true);

Nilai offset harus ditentukan untuk sensor pada awalnya, jika tidak nilai akan fluctuate. Pada bagian setup, 100 nilai diukur dan deviasi dirata-rata.

Menghitung sudut dari data sensor tidak begitu mudah. Namun ada banyak petunjuk tentang cara melakukan perhitungan.

Sudut X dalam derajat dihitung menggunakan rumus ini:

AccAngleX = (atan ((AccY) / sqrt (pow ((AccX), 2) + pow ((AccZ), 2))) * rad_to_deg);

Namun, nilai sensor akselerasi fluctuate sangat besar. Oleh karena itu, nilai yang saat ini dihitung dirata-rata dengan nilai sebelumnya pada 50% masing-masing.

TotalAngleX = 0.5 * TotalAngleX + 0.5 * AccAngleX;

Nilai sudut dikeluarkan dari -90 ° hingga + 90 ° oleh sensor. Namun saya membutuhkan sudut dari 0 ° hingga 360 ° untuk konversi menjadi kedalaman bor.

Saya belum menemukan solusi sederhana untuk ini. Namun untuk aplikasi saya, sudah cukup untuk melihat apakah data sensor Z dan Y positif atau negatif. Dan mengonversi sudut sesuai dengan itu.

delta=0;
if ((AccZ<0)) {
 delta=180.0-TotalAngleX*2.0;
}
if ((AccZ>0)&&(AccY<0)) {
 delta=360.0;
}
DrillingMachineAngle=TotalAngleX+delta;

//jika di dekat 360°, tampilan lebih baik 0°
if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

Yang masih belum ada adalah sudut rotasi maksimum yang memungkinkan roda genggam. Cara termudah untuk melakukan ini adalah dengan memastikan sudut yang ditentukan dieluarkan melalui Serial.print dan mencatat nilai maksimum.

Untuk saya itu 316 °. Dengan kedalaman bor maksimum 50 mm, posisi saat ini dihitung sebagai berikut:

currentPos=50.0/316.0*DrillingMachineAngle;

Jika tombol ditekan, Arduino menyimpan posisi bor saat ini. 8888 ditampilkan pada layar dan ada jeda singkat 1 detik.

Jika posisi berhenti diatur, kedalaman bor yang tersisa sampai ke berhenti ditampilkan pada layar kanan.

Rangkaian dan Pengujian

Sensor giros paling baik dipasang dengan sejumlah lem panas. Pandu kabel koneksi melalui tutup. Itu saja untuk bagian ini.

Dalam pengujian pertama, sensor giros harus difokuskan terlebih dahulu. Saya memasangnya secara horizontal. Karena pengawad dirancang untuk dapat diputar, dapat dengan mudah disesuaikan sampai 0.0 ditampilkan pada layar.

Lalu pengujian pertama dapat dimulai.

Secara keseluruhan, saya sangat senang dengan solusi ini. Sensor bereaksi sangat cepat dan nilai yang dihitung cocok persis dengan kedalaman bor.

Dan berkat layar LED besar, saya tidak perlu khawatir tentang kacamata hingga berusia 85 tahun untuk membaca kedalaman bor yang tepat.

Jadi selalu ingat apa yang dikatakan Paul: Perbaiki yang mengganggu Anda!

Selamat mencoba!

Beberapa tautan yang mungkin berguna:

https://medium.com/@kavindugimhanzoysa/lets-work-with-mpu6050-gy-521-part1-6db0d47a35e6

atau https://playground.arduino.cc/Main/MPU-6050/

atau juga https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interfacing-with-arduino/

Perpustakaan GY-521 oleh Rob Tilaart: https://github.com/RobTillaart/GY521

Dan lihat buku Paul Akers di https://paulakers.net/books/2-second-lean

Proyek ini juga tersedia dalam bahasa Jerman di: https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/

Kode

/* program: drilling-depth.ino * author: Thomas Angielsky * version: 2021-03-20 *
 * https://techpluscode.de/ * https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/ *
 * sketsa ini mengukur kedalaman bor dari mesin bor meja *
 * dengan menggunakan data sensor giros GY-521 *
 * kedalaman dilihat oleh layar 7 segmen *
 * ide perhitungan kompensasi kesalahan dari electronoobs.com - terima kasih! * */
#include <Wire.h>
#include <math.h>
#include "LedControl.h"
#define MPU 0x68
char txt[8];
String s;
float currentPos, stopPos;
float rad_to_deg;
float AccX, AccY, AccZ;
float AccAngleX, AccAngleY;
float AccAngleErrorX, AccAngleErrorY;
float TotalAngleX, TotalAngleY;
float DrillingMachineAngle, delta;
//inisialisasi LED: pin D12, pin D11, pin D10, 1 modul
LedControl lc=LedControl(12,11,10,1);
void setup() {
  //persiapkan koneksi serial
  //Serial.begin(9600);
  //nilai awal
  stopPos=0.0;
  currentPos=0.0;
  rad_to_deg = 180/PI;
  //persiapkan sensor GY-521
  //kita hanya menggunakan data accelerometer
  Wire.begin();
  Wire.beginTransmission(MPU);
  Wire.write(0x6B);
  Wire.write(0x00); // bangunkan MPU
  Wire.endTransmission(true);
  //delay ini sangat diperlukan dalam kasus saya!
  delay(1000);
  Wire.beginTransmission(MPU);
  Wire.write(0x1C); //register ACCEL_CONFIG
  Wire.write(0x10); //Set sebagai 00010000 untuk +/- 8g rentang skala penuh
  Wire.endTransmission(true);
  //hitung kesalahan data accelerometer
  //lakukan 100 pengukuran
  for(int a=0; a<100; a++) {
    Wire.beginTransmission(MPU);
    Wire.write(0x3B);
    Wire.endTransmission(false);
    Wire.requestFrom(MPU,6,true);
    AccX=(Wire.read()<<8|Wire.read())/4096.0 ;
    AccY=(Wire.read()<<8|Wire.read())/4096.0 ;
    AccZ=(Wire.read()<<8|Wire.read())/4096.0 ;
    AccAngleErrorX=AccAngleErrorX+((atan((AccY)/sqrt(pow((AccX),2)+pow((AccZ),2)))*rad_to_deg));
  }
  AccAngleErrorX=AccAngleErrorX/100;
  //persiapkan tombol: pin D9
  pinMode(9,INPUT_PULLUP);
  //persiapkan layar 7 segmen
  lc.shutdown(0,false);
  lc.setIntensity(0,8);
  lc.clearDisplay(0);
}
void loop() {
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);
  Wire.endTransmission(false);
  Wire.requestFrom(MPU,6,true);
  AccX=(Wire.read()<<8|Wire.read())/4096.0;
  AccY=(Wire.read()<<8|Wire.read())/4096.0;
  AccZ=(Wire.read()<<8|Wire.read())/4096.0;
  AccAngleX=(atan((AccY)/sqrt(pow((AccX),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorX;
  //haluskan nilai
  TotalAngleX=0.5*(TotalAngleX)+0.5*AccAngleX;
  //hitung sudut x menjadi 360 dengan menggunakan +/- dari X,Y,Z
  delta=0;
  if ((AccZ<0)) { delta=180.0-TotalAngleX*2.0; }
  if ((AccZ>0)&&(AccY<0)) { delta=360.0; }
  DrillingMachineAngle=TotalAngleX+delta;
  //jika di dekat 360, tampilan lebih baik 0
  if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}
  //hitung kedalaman bor
  //kedalaman bor maksimum: 50 mm (diukur pada mesin)
  //sudut maksimum roda genggam: 316 (diukur dengan data Serial.print)
  currentPos=50.0/316.0*DrillingMachineAngle;
  //tombol ditekan?
  if (digitalRead(9)==LOW) {
    //simpan posisi berhenti
    stopPos=currentPos;
    lc.setChar(0,3,'8',false);
    lc.setChar(0,2,'8',false);
    lc.setChar(0,1,'8',false);
    lc.setChar(0,0,'8',false);
    delay(1000);
  }
  if (stopPos>0) {
    //posisi berhenti tercapai?
    if (currentPos>=stopPos) {
      //ya: tampilkan STOP (5t0P) di sisi kanan
      lc.setChar(0,3,'5',false);
      lc.setRow(0,2,B00001111);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,0,'P',false);
    } else {
      //tidak: tampilkan jarak ke posisi berhenti
      dtostrf(stopPos-currentPos,4,1,txt);
      s=' '+String(txt);
      lc.setChar(0,0,s.charAt(s.length()-1),false);
      lc.setChar(0,1,s.charAt(s.length()-3),true);
      lc.setChar(0,2,s.charAt(s.length()-4),false);
      lc.setChar(0,3,s.charAt(s.length()-5),false);
    }
  } else {
    //tampilkan tidak ada
    lc.setChar(0,3,' ',false);
    lc.setChar(0,2,' ',false);
    lc.setChar(0,1,' ',false);
    lc.setChar(0,0,' ',false);
  }
  //tampilkan kedalaman bor saat ini di sisi kiri
  //format sebagai string
  dtostrf(currentPos,4,1,txt);
  s=' '+String(txt);
  lc.setChar(0,4,s.charAt(s.length()-1),false);
  lc.setChar(0,5,s.charAt(s.length()-3),true);
  lc.setChar(0,6,s.charAt(s.length()-4),false);
  lc.setChar(0,7,s.charAt(s.length()-5),false);
  delay(200);
}

Bagian dan Kotak Khusus

File model 3D untuk drilling-depth tersedia untuk unduhan.

Skematik

Skematik rangkaian tersedia sebagai bagian dari dokumentasi proyek.

Proses manufaktur

  1. Mengintegrasikan Data Sensor ke Raspberry Pi: Panduan Praktis
  2. Sensor Pelacakan Garis dengan Raspberry Pi – Detektor Pintu/Garis Sederhana KY-033
  3. Membuat API Suhu & Sensor Kuat di Raspberry Pi dengan Modul GY-91
  4. Membangun Sistem Aeroponik Otomatis dengan Raspberry Pi dan Sensor Kelembaban
  5. Menguasai GPIO Raspberry Pi: Menghubungkan Sensor Gerak PIR pada B+/Model 2
  6. Integrasi Radar Pulse Acconeer A111 dengan Raspberry Pi: Panduan Praktis
  7. Cara Menghubungkan, Mengkalibrasi, dan Memprogram Sensor Gerakan PIR HC-SR501 dengan Raspberry Pi
  8. Pencatat Sensor Python/MicroPython: Simpan Data Sensor ke Google Sheets
  9. Integrasi Sensor Termokopel dengan Arduino Portenta H7 Menggunakan IC MAX6675
  10. Alat Pengukur Tekanan & Aliran Udara Presisi dengan Sensor Analog