Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Bohrtiefenanzeige mit Gyrosensor

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1

Notwendige Werkzeuge und Maschinen

3D-Drucker (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Wenn Sie für ein Projekt eine bestimmte Tiefe bohren müssen, benötigen Sie eine Tischbohrmaschine mit Tiefenanzeige. Die meisten Tischbohrmaschinen haben ein Lineal mit einem Pfeil zum Ablesen. Der Erfolg der Bohrung hängt davon ab, wie genau Sie die gewünschte Position ablesen können. In diesem Arduino-Projekt präsentiere ich einen Alternativvorschlag:Eine Bohrtiefenanzeige mit Gyrosensor und 7-Segment-Anzeige mit Arduino-Unterstützung.

Die Maschine, die ich in meiner Werkstatt am häufigsten verwende, ist keine Säge oder Schleifmaschine. Es ist bei weitem die Tischbohrmaschine. Unabhängig vom Projekt wird es eigentlich immer verwendet. Wenn ich eine bestimmte Bohrtiefe benötige, kann ich das eingebaute Lineal an der Maschine verwenden. Und denken Sie daran, wie tief ich bohren muss. Es funktioniert tatsächlich gut.

Aber mit zunehmendem Alter – ja, ja, ja – wird es für mich immer schwieriger, die Tiefe millimetergenau abzulesen. Und wenn das Licht nicht hell genug ist, ist es fast unmöglich, es zu lesen. Aber dafür einfach eine Brille aufsetzen? Und nach dem Bohren, wo die Brille aufbewahren? So weit bin ich noch nicht.

Getreu dem Motto von Paul Akers aus "2 Secon Lean":

Es muss eine bessere Lösung geben, du musst nur überlegen und sie machen.

Messmöglichkeiten

Ich könnte natürlich eine Lupe vor die Skala stellen, um das Lineal besser ablesbar zu machen. Es würde die Ablesung verbessern, aber es würde nicht helfen, dass ich mir die Messung jeweils merken muss. Und wenn du bastelst, soll es auch Spaß machen.

Deshalb ist eine elektronische Lösung viel besser. Am besten auf kleinem Raum, damit alles neben den Ein-/Ausschalter der Bohrmaschine passt. Für solche Fälle verwende ich gerne einen Arduino Nano. Es hat genug Pins, um so ziemlich alles zu steuern und ist dementsprechend klein.

Aber wie misst man die Bohrtiefe? Für eine Längenmessung gibt es mehrere Möglichkeiten. Ultraschallmessung installieren? Könnte funktionieren, aber nur mit ein wenig Mechanik, die sich als Reflexionsfläche mit dem Bohrer mitbewegt. Oder einen Seilzuggeber verwenden? Wäre möglich, aber sehr aufwendig, wenn man es selbst baut:mit Drehscheibe, Gabellichtschranken und Federrückzug. Besser gleich einen Drehgeber nehmen? Das würde viel weniger Bauteile bedeuten - ja, aber es wäre zu grob, man müsste für eine Übersetzung Zahnräder einbauen.

Ok, also denk mehr darüber nach.

Meine Bohrmaschine hat, wie die meisten, ein Handrad an der Seite, um die Tiefe einzustellen. Es lässt sich um ca. 270°. Also nicht einmal eine volle Umdrehung.

Dies ist perfekt für eine Winkelmessung mit einem Gyrosensor. Die Kabelverbindung kann sich nicht verdrehen und es wird nur ein kostengünstiges Bauteil benötigt. Der Kreiselsensor lässt sich auch ganz einfach direkt an der Drehachse des Handrades anbringen.

Konzept

Bei der Angabe einer Bohrtiefe gehe ich immer gleich vor:Oberfläche mit dem Bohrer ankratzen, Koordinate notieren, dann die gewünschte Bohrtiefe addieren und zum Schluss bohren bis die Tiefe erreicht ist.

Ich möchte den grundlegenden Prozess beibehalten. Um nicht zu tief zu bohren, möchte ich wissen, wann die Bohrtiefe erreicht ist.

Eine Taste übernimmt diese Funktion. Wenn Sie darauf drücken, speichert der Arduino die aktuelle Bohrposition als Stoppwert und kann mich immer daran erinnern, wenn sie später erreicht wird.

Die restlichen Komponenten nehmen mehr Platz ein und wiegen deutlich mehr. Zum Glück ist das Gehäuse meiner Maschine aus Metall. Deshalb verwende ich zur Befestigung einen Neodym-Magneten.

Bleibt die Frage, wie soll der Sensor an der Maschine befestigt werden?

Die Bohrerachse hat eine Sechskantmutter SW17. Ich benötige also nur ein 3D-gedrucktes Bauteil, das den Sensor aufnimmt und auf die Sechskantmutter aufgesteckt werden kann.

Erforderliche Komponenten

  • Arduino Nano
  • Gyrosensor GY-521
  • 7-Segment-Modul mit 8 Stellen (SPI-Version mit MAX7219 IC)
  • Drucktaste
  • Ein-/Ausschalter
  • Stromversorgung:Batterieklemmen für AA- oder AAA-Batterien oder Powerbank
  • 3D-gedrucktes Gehäuse
  • Neodym-Magnet

Anschluss des Gyrosensors

Der Gyrosensor wird über das I2C angeschlossen. Also müssen wir A5 und A4 für den Nano verwenden.

  • VCC -> 5V
  • GND -> GND
  • SCL -> A5
  • SDA -> A4
  • XDA -> nicht verbunden
  • XCL -> nicht verbunden
  • ADO -> nicht verbunden
  • INT -> nicht verbunden

7-Segment-Modul

Beim Anschluss des 7-Segment-Moduls kann ein beliebiger digitaler Pin verwendet werden. Die Pins werden mit der Arduino-Skizze gesetzt.

  • VCC -> 3,3V
  • GND -> GND
  • DIN -> D12
  • CS -> D10
  • CLK -> D11

Schaltfläche

Auch der Eingangspin des Tasters ist frei wählbar. Ich verwende Pin D9.

Stromversorgung

Zur Stromversorgung verwende ich 6 AA Batterien. Nach dem Ein-/Ausschalter versorgen sie das gesamte System mit Strom.

Gehäuse

Das Gehäuse habe ich mit Autodesk Fusion 360 entworfen. Den 3D-Druck habe ich mit einem Anycubic i3 Mega erstellt.

Der Neodym-Magnet zur Befestigung an der Maschine ist eingeklebt. Steht die komplette Bohrtiefenanzeige im Weg, ist alles schnell wieder entfernt.

Arduino-Skizze

Ich habe die LedControl.h verwendet Bibliothek zur Steuerung der 7-Segment-Anzeige. Wenn Sie diese noch nicht installiert haben, müssen Sie sie zuerst mit dem Bibliotheksmanager installieren.

Der Gyrosensor wird über den I2C-Bus angeschlossen. Bei der Suche nach möglichen Bibliotheken für den Sensor habe ich mich dann entschieden, keine zu verwenden. Die Kommunikation erfolgt über Wire.h .

Am Ende des Artikels finden Sie einige Links, die mir beim Verständnis geholfen haben.

Die Steuerung der 7-Segment-Anzeige funktioniert sehr gut mit LedControl .

Nach der Initialisierung mit den Pins benötigt der Setup-Vorgang nur noch wenige Vorbereitungen, um das Display aufzuwecken und die Intensität einzustellen.

Im Schleifenteil zeigt das Display nur die aktuelle Bohrtiefe und, falls eingestellt, die Stoppposition auch als Zahlen an.

Das Display erwartet jede Ziffer als Zeichentyp. Als Genauigkeit würde ich gerne eine Dezimalstelle verwenden. Die Funktion dtostrf wandelt einen Float in ein Zeichenarray um. Dann in einen String, um ihn zeichenweise auf dem Display anzuzeigen.

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

Bei Erreichen der Stoppposition erscheint „StOP“ im Display. Das kleine "t" kann mit der setRow generiert werden Prozedur und das entsprechende Bitmuster B00001111.

Das Auslesen des Kreiselsensors funktioniert über Funktionen der Drahtbibliothek. Ich verwende nur den Beschleunigungsmesser um die Winkelposition zu bestimmen.

Bei der Arbeit mit USB-Verbindung zur Arduino IDE funktionierte alles perfekt. Nach dem Abziehen und Anschließen an die externe Stromquelle lieferte der Sensor keine Daten. Erst nach einem Reset des Arduino ging es wieder.

Das hat mir im gesamten Projekt die meisten Kopfschmerzen bereitet. Man könnte sagen, die Bohrtiefenanzeige hätte mir vielleicht die Augen gerettet, aber deswegen habe ich mir fast alle Haare ausgerissen!

Nach langer Suche war die Installation einer Wartezeit nach dem Aufwecken des Sensors die Lösung. Dies macht die Verspätung (1000) der wichtigste Befehl im gesamten Quellcode.

// GY-521-Sensor vorbereiten
//wir verwenden nur Beschleunigerdaten
Wire.begin();
Wire.beginTransmission(MPU);
Wire .write(0x6B);
Wire.write(0x00); // MPU aufwecken
Wire.endTransmission(true);

//diese Verzögerung war in meinem Fall sehr notwendig!
delay(1000);

Wire.beginTransmission(MPU);
Wire.write(0x1C); // ACCEL_CONFIG registrieren
Wire.write (0x10); //Einstellen als 00010000 für +/- 8g Skalenendwert
Wire.endTransmission(true);

Offsetwerte müssen für den Sensor zu Beginn ermittelt werden, sonst schwanken die Werte. Im Setup-Teil werden 100 Werte gemessen und die Abweichungen gemittelt.

Den Winkel aus den Sensordaten zu berechnen ist gar nicht so einfach. Aber es gibt viele Anweisungen, wie man die Berechnungen durchführt.

Der X-Winkel in Grad wird mit dieser Formel berechnet:

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

Allerdings schwanken die Werte des Beschleunigungssensors stark. Daher wird der aktuell berechnete Wert mit dem vorherigen Wert zu jeweils 50 % gemittelt.

TotalAngleX =0,5 * TotalAngleX + 0,5 * AccAngleX; 

Die Winkelwerte werden von -90° bis +90° vom Sensor ausgegeben. Für die Umrechnung in eine Bohrtiefe benötige ich aber einen Winkel von 0° bis 360°.

Dafür habe ich noch keine einfache Lösung gefunden. Für meine Anwendung reicht es jedoch zu sehen, ob die Sensordaten Z und Y positiv oder negativ sind. Und den Winkel entsprechend umrechnen.

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

//bei nahe 360°, Anzeige besser 0 °
if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

Was noch fehlt, ist der maximal mögliche Drehwinkel, den das Handrad ermöglicht. Am einfachsten geht das, indem man sich den ermittelten Winkel über einen Serial.print ausgeben lässt und den Maximalwert notiert.

Bei mir sind es 316°. Bei einer maximalen Bohrtiefe von 50 mm wird die aktuelle Position wie folgt berechnet:

currentPos=50.0/316.0*DrillingMachineAngle; 

Wird die Taste gedrückt, speichert der Arduino die aktuelle Bohrposition. Auf dem Display wird 8888 angezeigt und es erfolgt eine kurze Wartezeit von 1 Sekunde.

Wenn eine Stoppposition eingestellt ist, wird die verbleibende Bohrtiefe bis zum Stopp im rechten Display angezeigt.

Montage und Test

Der Gyrosensor wird am besten mit einem Heißkleberpunkt fixiert. Führen Sie die Anschlusskabel durch die Abdeckung. Das war's für diesen Teil.

Im ersten Test muss zuerst der Gyrosensor ausgerichtet werden. Ich habe es waagerecht eingebaut. Da der Halter drehbar konstruiert ist, kann er leicht verstellt werden, bis 0.0 auf dem Display angezeigt wird.

Dann kann der erste Test beginnen.

Insgesamt bin ich mit der Lösung sehr zufrieden. Der Sensor reagiert sehr schnell und die berechneten Werte stimmen exakt mit der Bohrtiefe überein.

Und dank des großen LED-Displays muss ich mir keine Sorgen um eine Brille bis 85 Jahre machen, um eine genaue Bohrtiefe abzulesen.

Denken Sie also immer daran, was Paul sagt:Repariere, was dich stört!

Viel Spaß beim Bauen!

____________________________________________________________

Einige vielleicht hilfreiche Links:

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

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

oder auch https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interfacing-with-arduino/

Bibliothek von GY-521 von Rob Tilaart:https://github.com/RobTillaart/GY521

Und lesen Sie das Buch von Paul Akers auf https://paulakers.net/books/2-second-lean

Das Projekt is also auch in English unter:https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/

Code

  • bohrtiefe.ino
bohrtiefe.inoArduino
/* Programm:drill-depth.ino * Autor:Thomas Angielsky * Version:2021-03-20 * * https://techpluscode.de/ * https://techpluscode.de/bohrtiefenanzeige-mit-gyro- Sensor/ * * diese Skizze misst die Bohrtiefe einer Tischbohrmaschine * Maschine unter Verwendung der Daten des Kreiselsensors GY-521 * Tiefe wird von 7-Segment-Anzeige angezeigt * * Idee der Berechnungsfehlerkompensation von electronoobs.com - danke! * */#include #include #include "LedControl.h"#define MPU 0x68char 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;//init LEDs:Pin D12, Pin D11, Pin D10, 1 moduleLedControl lc=LedControl(12,11,10,1);void setup () { // Serielle Verbindung vorbereiten / /Seriell.begin(9600); //Startwerte stopPos=0.0; StromPos=0.0; rad_to_deg =180/PI; // GY-521-Sensor vorbereiten // Wir verwenden nur Beschleunigerdaten Wire.begin (); Wire.beginTransmission(MPU); Wire.write (0x6B); Wire.write (0x00); // MPU aufwecken Wire.endTransmission (true); //Diese Verzögerung war in meinem Fall sehr notwendig! Verzögerung (1000); Wire.beginTransmission(MPU); Wire.write (0x1C); // ACCEL_CONFIG registrieren Wire.write (0x10); // Als 00010000 für +/- 8 g Skalenendwert einstellen Wire.endTransmission (true); // Beschleunigerdatenfehler berechnen // 100 Messungen durchführen für (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)); //AccAngleErrorY=AccAngleErrorY+((atan(-1*(AccX)/sqrt(pow((AccY),2)+pow(((AccZ),2)))*rad_to_deg)); } AccAngleErrorX=AccAngleErrorX/100; //AccAngleErrorY=AccAngleErrorY/100; // Schaltfläche vorbereiten:Pin D9 PinMode (9, INPUT_PULLUP); // 7-Segment-Anzeige vorbereiten 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; //AccAngleY=(atan(-1*(AccX)/sqrt(pow((AccY),2)+pow((AccZ),2)))*rad_to_deg)-AccAngleErrorY; //glatte Werte TotalAngleX=0.5*(TotalAngleX)+0.5*AccAngleX; //TotalAngleY=0.5*(TotalAngleY)+0.5*AccAngleY; // x-Winkel auf 360 berechnen mit +/- von X, Y, Z Delta =0; if ((AccZ <0)) { delta =180,0 – TotalAngleX * 2,0; aufrechtzuerhalten. Wenn ((AccZ>0)&&(AccY<0)) {delta=360,0; } DrillingMachineAngle=TotalAngleX+Delta; //wenn nahe 360, besser anzeigen 0 if (DrillingMachineAngle>350) {DrillingMachineAngle=0;} //Bohrtiefe berechnen //max. Bohrtiefe:50 mm (auf Maschine gemessen) //max. Winkel des Handrades:316 (gemessen .) mit Serial.print Daten) 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 (AccY); Serial.print ( " "); Serial.print (AccZ); Serial.print(">> "); Serial.print (DrillingMachineWinkel); Serial.print(">> "); Serial.print (currentPos); Serial.println(" ");*/ //Taste gedrückt? if (digitalRead (9) ==LOW) {// Stoppposition speichern 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); //Serial.println("Taste gedrückt"); Verzögerung (1000); } if (stopPos>0) { //Stoppposition erreicht? if (currentPos>=stopPos) {//ja:STOP (5t0P) auf der rechten Seite anzeigen lc.setChar(0,3,'5',false); lc.setRow(0,2,B00001111); lc.setChar(0,1,'0',false); lc.setChar(0,0,'P',false); } else { //no:Anzeige der Entfernung zur Stoppposition 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 { //Nichts anzeigen lc.setChar(0,3,' ',false); lc.setChar(0,2,' ',false); lc.setChar(0,1,' ',false); lc.setChar(0,0,' ',false); } //aktuelle Bohrtiefe auf der linken Seite anzeigen //als String formatieren 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); Verzögerung(200);}

Kundenspezifische Teile und Gehäuse

Bohrtiefe-3d-Modell_Yn2q0MSNa4.zip

Schaltpläne


Herstellungsprozess

  1. Integration von Sensordaten mit Raspberry Pi-Mikroprozessor
  2. Linienverfolgungssensor mit RPi
  3. Umgebungssensor-API mit einem RPi
  4. Aeroponik mit Raspberry Pi und Feuchtigkeitssensor
  5. Raspberry Pi GPIO mit PIR-Bewegungssensor:Bestes Tutorial
  6. Verwenden des gepulsten Radarsensors A111 mit einem Raspberry Pi
  7. Anbindung des PIR-Bewegungssensors HC-SR501 an Raspberry Pi
  8. Python/MicroPython Sensor Logger mit Google Tabellen
  9. Portenta- und Thermoelement-Sensor (mit MAX6675)
  10. Druckluftstrom-Messgerät mit analogem Sensor