산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

자이로 센서가 있는 드릴 깊이 디스플레이

구성품 및 소모품

Arduino Nano R3
× 1

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

프로젝트를 위해 특정 깊이를 드릴해야 하는 경우 깊이 표시가 있는 벤치 드릴이 필요합니다. 대부분의 벤치 드릴에는 읽기용 화살표가 있는 눈금자가 있습니다. 드릴링의 성공 여부는 원하는 위치를 얼마나 정확하게 읽을 수 있는지에 달려 있습니다. 이 Arduino 프로젝트에서 저는 자이로 센서가 있는 드릴링 깊이 디스플레이와 Arduino를 지원하는 7-세그먼트 디스플레이를 제안합니다.

작업장에서 가장 자주 사용하는 기계는 톱이나 연삭기가 아닙니다. 바로 벤치 드릴입니다. 프로젝트에 관계없이 실제로 항상 사용됩니다. 특정 드릴링 깊이가 필요한 경우 기계에 내장된 눈금자를 사용할 수 있습니다. 그리고 내가 뚫어야 할 깊이를 기억하십시오. 실제로 잘 작동합니다.

그러나 나이가 들면서 - 예, 예, 예 - 밀리미터 정확도로 깊이를 읽는 것이 점점 더 어려워집니다. 그리고 빛이 충분히 밝지 않으면 그것을 읽는 것이 거의 불가능합니다. 근데 이거 그냥 안경쓰냐? 드릴링 후 안경은 어디에 보관합니까? 저는 아직 멀었습니다.

"2 Secon Lean"의 Paul Akers의 모토에 충실:

더 나은 솔루션이 있어야 합니다. 생각하고 실행하기만 하면 됩니다.

가능성 측정

물론 눈금자를 읽기 쉽게 하기 위해 눈금 앞에 돋보기를 둘 수도 있습니다. 그것은 판독을 향상시킬 것이지만 각각의 경우에 측정을 기억해야 하는 것은 도움이 되지 않을 것입니다. 그리고 수공예품을 하는 것도 재미있을 것입니다.

그렇기 때문에 전자 솔루션이 훨씬 더 좋습니다. 드릴의 온/오프 스위치 옆에 모든 것이 맞도록 작은 공간에 두는 것이 좋습니다. 이러한 경우 Arduino Nano를 사용하고 싶습니다. 거의 모든 것을 제어할 수 있는 충분한 핀이 있으며 그에 따라 작습니다.

그러나 드릴링 깊이는 어떻게 측정합니까? 길이 측정에는 여러 가지 가능성이 있습니다. 초음파 측정을 설치하시겠습니까? 작동할 수 있지만 드릴과 함께 반사 표면으로 움직이는 약간의 역학으로만 가능합니다. 아니면 전선 작동식 인코더를 사용합니까? 턴테이블, 포크 라이트 배리어 및 스프링 리턴을 사용하여 직접 제작하면 가능하지만 매우 복잡합니다. 로터리 엔코더를 바로 사용하는 것이 더 낫습니까? 이는 훨씬 적은 수의 구성 요소를 의미합니다. 예, 하지만 너무 조잡하므로 번역을 위해 기어를 설치해야 합니다.

자, 더 생각해보세요.

내 드릴은 대부분의 경우와 마찬가지로 측면에 깊이를 조정할 수 있는 핸드휠이 있습니다. 약 회전할 수 있습니다. 270 °. 따라서 완전히 회전하지도 않습니다.

자이로 센서로 각도 측정에 최적입니다. 케이블 연결은 꼬일 수 없으며 저렴한 부품 하나만 있으면 됩니다. 자이로 센서는 핸드휠의 회전축에 매우 쉽게 직접 부착할 수도 있습니다.

개념

저는 드릴링 깊이를 지정할 때 항상 같은 방식으로 진행합니다. 드릴로 표면을 긁고 좌표를 기록한 다음 원하는 드릴링 깊이를 추가하고 마지막으로 깊이에 도달할 때까지 드릴링합니다.

기본적인 절차를 지키고 싶습니다. 너무 깊게 드릴하지 않기 위해 드릴링 깊이에 도달한 시점에 대한 정보를 받고 싶습니다.

버튼이 이 기능을 대신합니다. 누르면 아두이노는 현재 드릴 위치를 정지 값으로 저장하고 나중에 도달하면 항상 알려줍니다.

나머지 구성 요소는 더 많은 공간을 차지하고 훨씬 더 무겁습니다. 다행히도 내 기계의 하우징은 금속으로 만들어졌습니다. 그래서 네오디뮴 자석을 사용하여 고정합니다.

문제는 센서를 기계에 어떻게 부착해야 하느냐는 것입니다.

드릴 축에는 SW17 육각 너트가 있습니다. 따라서 센서를 수용하고 육각 너트에 꽂을 수 있는 3D 인쇄 부품만 있으면 됩니다.

필수 구성 요소

<울>
  • 아두이노 나노
  • 자이로 센서 GY-521
  • 8자리 7세그먼트 모듈(MAX7219 IC가 있는 SPI 버전)
  • 푸시버튼
  • 켜기/끄기 스위치
  • 전원 공급 장치:AA 또는 AAA 배터리 또는 보조 배터리용 배터리 클립
  • 3D 인쇄 주택
  • 네오디뮴 자석
  • 자이로 센서 연결

    자이로 센서는 I2C를 통해 연결됩니다. 따라서 Nano에는 A5와 A4를 사용해야 합니다.

    <울>
  • VCC -> 5V
  • GND -> GND
  • SCL -> A5
  • SDA -> A4
  • XDA -> 연결되지 않음
  • XCL -> 연결되지 않음
  • ADO -> 연결되지 않음
  • INT -> 연결되지 않음
  • 7-세그먼트 모듈

    7-세그먼트 모듈을 연결할 때 모든 디지털 핀을 사용할 수 있습니다. 핀은 Arduino 스케치를 사용하여 설정됩니다.

    <울>
  • VCC -> 3.3V
  • GND -> GND
  • DIN -> D12
  • CS -> D10
  • CLK -> D11
  • 버튼

    버튼의 입력 핀도 자유롭게 선택할 수 있습니다. 핀 D9를 사용하고 있습니다.

    전원 공급 장치

    전원 공급 장치에는 6개의 AA 배터리를 사용합니다. on/off 스위치 후에 전체 시스템에 전기를 공급합니다.

    케이스

    저는 Autodesk Fusion 360으로 케이스를 디자인했습니다. Anycubic i3 Mega로 3D 프린트를 만들었습니다.

    기계에 부착하기 위한 네오디뮴 자석이 접착되어 있습니다. 전체 드릴링 깊이 표시가 방해가 되면 모든 것이 빠르게 제거됩니다.

    아두이노 스케치

    LedControl.h를 사용했습니다. 7세그먼트 디스플레이를 제어하는 ​​라이브러리. 아직 설치하지 않았다면 먼저 라이브러리 관리자를 사용하여 설치해야 합니다.

    자이로 센서는 I2C 버스를 통해 연결됩니다. 센서에 대한 가능한 라이브러리를 찾을 때 나는 아무 것도 사용하지 않기로 결정했습니다. 통신은 Wire.h를 통해 이루어집니다. .

    기사의 끝 부분에서 이해에 도움이 되는 몇 가지 링크를 찾을 수 있습니다.

    7 세그먼트 디스플레이의 제어는 LedControl 과 함께 매우 잘 작동합니다. .

    핀으로 초기화한 후 설정 절차는 디스플레이를 깨우고 강도를 조정하기 위해 몇 가지 준비만 하면 됩니다.

    루프 부분에서는 현재 드릴 깊이만 표시되며, 설정된 경우 정지 위치도 숫자로 표시됩니다.

    디스플레이는 각 숫자를 문자 유형으로 예상합니다. 소수점 이하 자릿수를 정확도로 사용하고 싶습니다. dtostrf 함수는 float를 문자 배열로 변환합니다. 그런 다음 문자열로 변환하여 디스플레이에 문자별로 표시합니다.

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

    정지 위치에 도달하면 디스플레이에 "StOP"가 나타납니다. setRow 를 사용하여 작은 "t"를 생성할 수 있습니다. 절차 및 해당 비트 패턴 B00001111.

    자이로 센서를 읽는 것은 와이어 라이브러리의 기능을 통해 작동합니다. 저는 가속도계만 사용합니다. 각도 위치를 결정합니다.

    USB를 Arduino IDE에 연결하여 작업할 때 모든 것이 완벽하게 작동했습니다. 플러그를 뽑고 외부 전원에 연결한 후 센서는 데이터를 제공하지 않았습니다. Arduino를 재설정한 후에야 다시 작동했습니다.

    그것은 전체 프로젝트에서 가장 골치 아픈 일이었습니다. 드릴 깊이 표시기가 내 눈을 구했다고 말할 수 있지만, 그래서 거의 모든 머리카락을 뽑았습니다!

    긴 검색 끝에 센서를 깨운 후 대기 시간을 설정하는 것이 해결책이었습니다. 이렇게 하면 지연(1000) 전체 소스 코드에서 가장 중요한 명령입니다.

    //GY-521 센서 준비
    //가속기 데이터만 사용
    Wire.begin();
    Wire.beginTransmission(MPU);
    Wire .write(0x6B);
    Wire.write(0x00); // Wake up MPU
    Wire.endTransmission(true);

    //이 지연은 제 경우에 매우 필요했습니다!
    delay(1000);

    Wire.beginTransmission(MPU);
    Wire.write(0x1C); //ACCEL_CONFIG 등록
    Wire.write(0x10); //+/- 8g 전체 스케일 범위에 대해 00010000으로 설정
    Wire.endTransmission(true);

    오프셋 값은 처음에 센서에 대해 결정되어야 하며, 그렇지 않으면 값이 변동합니다. 설정 부분에서는 100개의 값을 측정하고 편차를 평균합니다.

    센서 데이터에서 각도를 계산하는 것은 그리 쉬운 일이 아닙니다. 하지만 계산 방법에 대한 지침이 많이 있습니다.

    X 각도(도)는 다음 공식을 사용하여 계산됩니다.

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

    그러나 가속도 센서의 값은 크게 변동합니다. 따라서 현재 계산된 값은 이전 값을 각각 50%로 평균한 값입니다.

    TotalAngleX =0.5 * TotalAngleX + 0.5 * AccAngleX; 

    각도 값은 센서에 의해 -90 °에서 + 90 °까지 출력됩니다. 하지만 드릴링 깊이로 변환하려면 0 °에서 360 ° 사이의 각도가 필요합니다.

    아직 이에 대한 간단한 해결책을 찾지 못했습니다. 그러나 내 애플리케이션의 경우 센서 데이터 Z와 Y가 양수인지 음수인지 확인하는 것으로 충분합니다. 그리고 그에 따라 각도를 변환합니다.

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

    //360°에 가까우면 더 잘 표시됩니다. 0 °
    if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

    여전히 누락된 것은 핸드휠이 가능하게 하는 가능한 최대 회전 각도입니다. 가장 쉬운 방법은 Serial.print를 통해 결정된 각도를 출력하고 최대값을 기록하는 것입니다.

    나를 위해 그것은 316 °입니다. 최대 드릴링 깊이가 50mm인 경우 현재 위치는 다음과 같이 계산됩니다.

    currentPos=50.0/316.0*DrillingMachineAngle; 

    버튼을 누르면 Arduino가 현재 드릴 위치를 저장합니다. 8888이 디스플레이에 표시되고 1초의 짧은 대기 시간이 있습니다.

    정지 위치가 설정되면 정지까지 남은 드릴 깊이가 오른쪽 디스플레이에 표시됩니다.

    조립 및 테스트

    자이로 센서는 뜨거운 접착제로 고정하는 것이 가장 좋습니다. 커버를 통해 연결 케이블을 안내합니다. 이 부분은 여기까지입니다.

    첫 번째 테스트에서 자이로 센서를 먼저 정렬해야 합니다. 가로로 설치했습니다. 홀더는 회전 가능하도록 설계되어 디스플레이에 0.0이 표시될 때까지 쉽게 조정할 수 있습니다.

    그런 다음 첫 번째 테스트를 시작할 수 있습니다.

    <비디오 너비="100%" 높이="100%" preload="metadata" controls="controls">https://techpluscode.de/wp-content/uploads/2021/03/bta-bohrtiefenmessung-anwendung.mp4

    전반적으로 솔루션에 매우 만족합니다. 센서가 매우 빠르게 반응하고 계산된 값이 드릴 깊이와 정확히 일치합니다.

    또한 대형 LED 디스플레이 덕분에 최대 85년 된 안경에 대해 정확한 드릴 깊이를 읽을 수 있다고 걱정할 필요가 없습니다.

    그러므로 Paul이 말한 것을 항상 기억하십시오. 버그를 수정하십시오!

    즐겁게 조립하세요!

    __________________________________________________________________________

    도움이 될만한 링크:

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

    또는 https://playground.arduino.cc/Main/MPU-6050/

    또는 https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interface-with-arduino/

    Rob Tilaart의 GY-521 라이브러리:https://github.com/RobTillaart/GY521

    https://paulakers.net/books/2-second-lean

    에서 Paul Akers의 책을 확인하십시오.

    Das Projekt gibt es auch auf Deutsch unter:https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • 드릴링 깊이.ino
  • drilling-depth.inoArduino
    /* 프로그램:Drilling-depth.ino * 작성자:Thomas Angielsky * 버전:2021-03-20 * * https://techpluscode.de/ * https://techpluscode.de/bohrtiefenanzeige-mit-gyro- sensor/ * * 이 스케치는 GY-521 자이로 센서의 데이터를 사용하여 테이블 드릴링 * 기계의 드릴링 깊이를 측정합니다. * 깊이는 7 세그먼트 디스플레이로 표시됩니다. * * electronoobs.com의 계산 오류 보정 아이디어 - 감사합니다! * */#include #include #include "LedControl.h#define MPU 0x68char txt[8];String s;float currentPos,stopPos;float rad_to_deg;float AccX, AccY, AccZ; 부동 소수점 AccAngleX, AccAngleY; 부동 소수점 AccAngleErrorX, AccAngleErrorY; float TotalAngleX, TotalAngleY;float DrillingMachineAngle, delta;//초기화 LED:핀 D12, 핀 D11, 핀 D10, 1 moduleLedControl lc=LedControl(12,11,10,1);void setup() { //직렬 연결 준비 / /Serial.begin(9600); // 시작 값 stopPos=0.0; 현재 위치 =0.0; rad_to_deg =180/PI; //GY-521 센서 준비 //가속기 데이터만 사용 Wire.begin(); Wire.beginTransmission(MPU); Wire.write(0x6B); Wire.write(0x00); // MPU 깨우기 Wire.endTransmission(true); //이 지연은 제 경우에 매우 필요했습니다! 지연(1000); Wire.beginTransmission(MPU); Wire.write(0x1C); //ACCEL_CONFIG 등록 Wire.write(0x10); //+/- 8g 전체 스케일 범위에 대해 00010000으로 설정 Wire.endTransmission(true); //가속기 데이터 오류 계산 // 100개 측정 for(int a=0; a<100; a++) { Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(거짓); 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)); //AccAngleErrorY=AccAngleErrorY+((atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)); } AccAngleErrorX=AccAngleErrorX/100; //AccAngleErrorY=AccAngleErrorY/100; //준비 버튼:핀 D9 pinMode(9,INPUT_PULLUP); //7 세그먼트 디스플레이 준비 lc.shutdown(0,false); lc.setIntensity(0,8); lc.clearDisplay(0);} 무효 루프() { Wire.beginTransmission(MPU); Wire.write(0x3B); Wire.endTransmission(거짓); 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; //AccAngleY=(atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorY; // 부드러운 값 TotalAngleX=0.5*(TotalAngleX)+0.5*AccAngleX; //TotalAngleY=0.5*(TotalAngleY)+0.5*AccAngleY; //X,Y,Z의 +/-를 사용하여 x 각도를 360으로 계산합니다. delta=0; if ((AccZ<0)) { delta=180.0-TotalAngleX*2.0; } if ((AccZ>0)&&(AccY<0)) { 델타=360.0; } DrillingMachineAngle=TotalAngleX+델타; //360에 가까우면 0을 더 잘 표시 if (DrillingMachineAngle>350) {DrillingMachineAngle=0;} //드릴링 깊이 계산 //최대 드릴링 깊이:50mm(머신에서 측정) //핸드 휠의 최대 각도:316(측정됨 Serial.print 데이터 포함) currentPos=50.0/316.0*DrillingMachineAngle; /* Serial.print("X / X / Y / Z / E :BOHRTIEFE"); Serial.print(TotalAngleX); Serial.print(" "); Serial.print(AccX); Serial.print(" "); Serial.print(AcY); Serial.print(" "); Serial.print(AccZ); Serial.print(">> "); Serial.print(DrillingMachineAngle); Serial.print(">> "); Serial.print(currentPos); Serial.println(" ");*/ //버튼을 눌렀습니까? if (digitalRead(9)==LOW) { //정지 위치 저장 stopPos=currentPos; lc.setChar(0,3,'8',거짓); lc.setChar(0,2,'8',거짓); lc.setChar(0,1,'8',거짓); lc.setChar(0,0,'8',거짓); //Serial.println("버튼을 눌렀습니다."); 지연(1000); } if (stopPos>0) { //정지 위치에 도달했습니까? if (currentPos>=stopPos) { //예:오른쪽에 STOP(5t0P) 표시 lc.setChar(0,3,'5',false); lc.setRow(0,2,B00001111); lc.setChar(0,1,'0',거짓); lc.setChar(0,0,'P',거짓); } else { //no:정지 위치까지의 거리 표시 dtostrf(stopPos-currentPos,4,1,txt); s=' '+문자열(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 { //아무것도 표시하지 않음 lc.setChar(0,3,' ',false); lc.setChar(0,2,' ',거짓); lc.setChar(0,1,' ',거짓); lc.setChar(0,0,' ',거짓); } //왼쪽에 현재 드릴 깊이 표시 //문자열 형식 dtostrf(currentPos,4,1,txt); s=' '+문자열(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); 지연(200);}

    맞춤형 부품 및 인클로저

    드릴링 깊이-3d-model_Yn2q0MSNa4.zip

    회로도


    제조공정

    1. 센서 데이터와 Raspberry Pi 마이크로프로세서의 통합
    2. RPi가 있는 라인 추적 센서
    3. RPi가 있는 환경 센서 API
    4. Raspberry Pi 및 습도 센서를 사용한 수경재배
    5. PIR 모션 센서가 있는 Raspberry Pi GPIO:최고의 자습서
    6. A111 펄스 레이더 센서를 Raspberry Pi와 함께 사용
    7. HC-SR501 PIR 모션 센서와 Raspberry Pi의 인터페이스
    8. Google 스프레드시트가 포함된 Python/MicroPython 센서 로거
    9. Portenta 및 열전쌍 센서(MAX6675 포함)
    10. 아날로그 센서가 있는 기압 측정 장치