Bohrtiefenanzeige mit Gyro-Sensor

Bohrtiefenmessung mit Arduino, Gyro-Sensor und 7-Segment-Anzeige

Muss man für ein Projekt eine bestimmte Tiefe bohren, braucht man eine Tischbohrmaschine mit Bohrtiefenanzeige. An den allermeisten Tischbohrmaschinen gibt es dafür ein Lineal mit einem Pfeil zum Ablesen. Der Erfolg der Bohrung hängt daran, wie genau man die Wunschposition ablesen kann. In diesem Arduino-Projekt stelle ich einen alternativen Vorschlag vor: Eine Bohrtiefenanzeige mit Gyro-Sensor und 7-Segment-Anzeige mit Arduino-Unterstützung.

Die bei mir am häufigsten eingesetzte Maschine in meiner Werkstatt ist keine Säge und auch keine Schleifmaschine. Es ist mit großem Abstand eine 20 Jahre alte Tischbohrmaschine. Egal bei welchem Projekt, sie kommt eigentlich immer zum Einsatz. Brauche ich eine bestimmte Bohrtiefe kann ich dafür das eingebaute Lineal an der Maschine nutzen. Und mir merken, bis zu welcher Tiefe ich jeweils bohren muss. Das funktioniert eigentlich gut.

Aber mit zunehmendem Alter wird es für mich immer schwieriger die Tiefe millimetergenau abzulesen. Ist das Licht auch noch nicht hell genug, wird es fast unmöglich. Aber nur dafür eine Brille aufsetzen? Und wo sie nach dem Bohren hinlegen ohne zu verstauben? So weit bin ich noch nicht ganz.

Ganz nach dem Motto von Paul Akers aus seinem Buch „2 Secon Lean“:

Fix what bugs you!

Paul Akers

Muss es eine bessere Lösung geben, man muss sie halt nur finden und machen.

Messmöglichkeiten

Ich könnte eine Lupe vor der Skala anbringen, um das Lineal besser ablesen zu können. Es würde das Ablesen verbessern, aber nicht helfen, dass ich mir das Maß jeweils merken muss. Und wenn schon basteln, dass soll es doch wenigsten Spaß machen.

Deswegen passt eine elektronische Lösung viel besser. Am besten in einem kleinen Bauraum, so dass alles neben den Ein-/Ausschalter der Bohrmaschine passt. Für solche Fälle verwende ich gerne einen Arduino Nano. Er hat genügend Pins, um ziemlich alles anzusteuern und ist entsprechend klein.

Wie aber die Bohrtiefe messen? Möglichkeiten für eine Längenmessung gibt es mehrere. Eine Ultraschallmessung einbauen? Könnte gehen, aber nur mit ein wenig Mechanik, welche als Reflexionsfläche mit dem Bohrer mitfährt. Oder einen Seilzuggeber verwenden? Wäre möglich, aber schon sehr aufwändig, wenn man ihn selber baut: mit Drehscheibe, Gabellichtschranken und Federrückzug. Besser gleich einen Drehencoder nehmen? Das würde zwar viel weniger Bauteile bedeuten – ja, aber er wäre zu grob, ich würde Zahnräder für eine Übersetzung brauchen.

Ok, also noch weiter überlegen.

Zur Tiefenverstellung hat meine Bohrmaschine, wie die meisten, seitlich ein Handrad. Es lässt sich ca. 270° drehen. Also nicht mal eine ganze Umdrehung.

Das eignet sich doch perfekt für eine Winkelmessung mit einem Gyro-Sensor. Die Kabelverbindung kann sich nicht verdrehen und es wird nur ein günstiges Bauteil benötigt. Der Gyro-Sensor kann zudem sehr einfach direkt an der Drehachse des Handrades angebracht werden.

Konzept

Ich gehe beim Festlegen einer Bohrtiefe eigentlich immer gleich vor: Ankratzen der Oberfläche mit dem Bohrer, Mass merken, dann gewünschte Bohrtiefe dazu addieren und zuletzt bohren bis die Tiefe erreicht ist.

Den Grundablauf möchte ich beibehalten. Um nicht zu tief zu bohren, hätte ich aber gerne eine Info, wann die Bohrtiefe erreicht ist.

  • Gehäuse Ansicht von vorne
  • Gehäuse Ansicht von hinten (ohne Arduino)

Diese Funktion übernimmt ein Taster. Beim Drücken speichert der Arduino die aktuelle Bohrtiefe als Stoppwert ab und kann mich beim späteren Erreichen immer daran erinnern.

Die restlichen Bauteile nehmen, zusammen mit der Stromversorgung, mehr Raum ein und wiegen auch deutlich mehr. Glücklicherweise ist das Gehäuse meiner Bohrmaschine aus Blech. Deswegen nehme ich zur Befestigung einen Neodym-Magneten.

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

Beim Sensor ist es einfach. Die Drehachse hat eine SW17 Sechskantmutter. Ich brauche also nur ein 3D-Druck Bauteil, dass den Sensor aufnimmt und sich auf die Sechskantmutter stecken lässt.

Halterung für den Gyro-Sensor
Halterung für den Gyro-Sensor

Um den Gyro-Sensor an der Bohrmaschine zu befestigen und ihn später noch nivellieren zu können, besteht die Halterung der Sensorplatine aus drei Teilen:

  1. Anschlussteil an Sechskantmutter
  2. Drehbare Halterung für die Gyro-Sensor-Platine
  3. Schutzdeckel

Damit das, was der Sensor ermittelt, auch sinnvoll angezeigt wird, verwende ich ein 7 Segment Modul mit 8 Ziffern. Der MAX 7219 Chip darauf lässt sich komfortabel über SPI ansprechen.

Bauteilliste

Dementsprechend ist die Bauteilliste recht kurz. Die Hauptbauteile sind neben dem Arduino, der Gyro-Sensor und das 7-Segmente Modul.

Benötigte Bauteile:

  • Arduino Nano (ggf. mit Punktrasterplatine und Wannenbuchsenleiste)
  • GY-521 MPU-6050 3-Achsen-Gyroskop und Beschleunigungssensor
  • 7-Segmente Modul mit 8 Ziffern (SPI Version mit MAX7219 IC)
  • Taster
  • Ein-/Aus-Schalter
  • Stromversorgung: Batterieclips für AA oder AAA Batterien oder Powerbank
  • 3D-Druck-Gehäuse
  • Neodym-Magnet
Schaltung für die Bohrtiefenanzeige mit Gyro-Sensor, Arduino und 7-Segment-Anzeige
Schaltung für die Bohrtiefenanzeige mit Gyro-Sensor, Arduino und 7-Segment-Anzeige

Gyro-Sensor

Der Gyro-Sensor wird über den I2C angeschlossen.

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

7-Segment-Modul

Beim Anschluss des 7-Segment Moduls kann jeder digitale Pin verwendet werden. Die Pins werden über den Arduino Sketch festgelegt.

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

Taster

 Der Input-Pin des Tasters kann auch frei ausgewählt werden. Ich verwende Pin D9.

Stromversorgung

Für die Stromversorgung verwende ich 6 AA Batterien. Die 9V versorgen den Arduino über VIN nach dem Ein-/Ausschalter mit Strom. 

Gehäuse

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

Der Neodym Magnet für die Befestigung an der Bohrmaschine wird eingeklebt. Falls die ganze Bohrtiefenanzeige mal stört, ist auch alles schnell entfernt.

Arduino Sketch

Für die Ansteuerung der 7 Segment Anzeige habe ich die Bibliothek LedControl.h benutzt.

Falls diese noch nicht bei Ihnen installiert sind, müssen Sie sie vorher über den Bibliotheksverwalter installieren.

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

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

7 Segment Anzeige

Die Ansteuerung der 7 Segment Anzeige funktioniert mit LedControl ganz gut.

LedControl lc=LedControl(12,11,10,1);

Nach der Initialisierung mit den Pins braucht die Setup Prozedur nur wenige Vorbereitungen zum Aufwecken des Displays und zum Einstellen der Intensität.

lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);

Im loop-Teil zeigt das Display nur die aktuelle Bohrtiefe und falls eingestellt, die Stopp-Position an, ebenfalls als Zahlen.

Das Display erwartet jede Ziffer als Character-Typ. Als Genauigkeit möchte ich eine Nachkommastelle verwenden. Mit der Funktion dtostrf wird ein Float in einen Character-Array umgewandelt. Anschließend in einen String, um ihn Character-weise auf dem Display anzuzeigen.

  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);

Bei Überschreiten der Stopp-Position erscheint auf dem Display „STOP“. Das kleine „t“ lässt sich über die Prozedur setRow und dem passenden Bitmuster B00001111 erzeugen.

    if (currentPos>=stopPos) {
      lc.setChar(0,3,'5',false);
      lc.setRow(0,2,B00001111);
      lc.setChar(0,1,'0',false);
      lc.setChar(0,0,'P',false);
    }

Gyro-Sensor

Den Gyro-Sensor auszulesen funktioniert über Funktionen der Wire-Bibliothek. Ich verwende zur Bestimmung der Winkelposition nur den Beschleunigungssensor.

Im Setup-Teil wird der Sensor vorbereitet. Dafür wird die Übertragung zum Sensor mit Wire.begin() gestartet. Es gibt eine Möglichkeit den Sensor aufzuwecken, das passiert gleich am Anfang.

Bei der Arbeit mit USB-Verbindung zur Arduino IDE hat alles perfekt funktioniert. Nach dem Abstecken und Verbinden mit der externen Stromquelle lieferte der Sensor keine Daten. Erst nach einem Reset des Arduino hat es wieder funktioniert.

Das hat mir beim gesamten Projekt das allermeiste Kopfzerbrechen bereitet. Man könnte sagen, dass mir Bohrtiefenanzeige vielleicht die Augen gerettet hat, aber ich mir deswegen auch fast alle Haare ausgerauft habe!

Nach langem Suchen war der Einbau einer Wartezeit nach dem Aufwecken des Sensors die Lösung. Damit ist wohl der Delay(1000) der wichtigste Befehl im ganzen Sourcecode.

  Wire.begin(); 
  Wire.beginTransmission(MPU);  
  // wake up MPU       
  Wire.write(0x6B);
  Wire.write(0x00); 
  Wire.endTransmission(true); 

  //this delay was very necessary in my case!
  delay(1000);

  Wire.beginTransmission(MPU);
  Wire.write(0x1C); //register ACCEL_CONFIG 
  Wire.write(0x10); //Set as 00010000 for +/- 8g full scale range
  Wire.endTransmission(true); 

Für den Sensor müssen am Anfang Offsetwerte ermittelt werden, sonst schwanken die Werte etwas. Dafür hat mir die Idee von electronoobs.com gut gefallen, die ich dann auch übernommen habe. Um die Offsetwerte zu ermitteln, werden im Setup Teil mehrere Messungen mit dem Beschleuningungssensor durchgeführt. Der Sensor muss dabei ruhig bleiben. Am besten in der Nulllage der späteren Einbauposition. Dann werden die Messungen durchgeführt, z. B. 100 Messungen und daraus die Offsetwerte ausgemittelt.

Ermitteln der Gyro-Winkelposition

Das Abfragen der Daten des Beschleuningungssensors ist einfach, den Winkel aus den Sensordaten zu berechnen, ist es aber leider nicht.

Der X-Winkel in Grad wird über diese Formel berechnet:

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

Die Werte des Beschleunigungssensors schwanken aber auch mit Kompensation durch die Offsetwerte. Deswegen wird der aktuell berechnete Wert mit dem vorherigen Wert gemittelt zu je 50%. Das reduziert das Schwanken und lässt immer noch einen schnellen Messwertwechsel zu.

TotalAngleX=0.5*TotalAngleX+0.5*AccAngleX;

Die Winkelwerte werden von -90° bis +90° vom Sensor ausgegeben. Leider brauche ich aber für die Umrechnung in eine Bohrtiefe eine Winkelangabe von 0° bis 360°. Nach einer Google Recherche, habe ich sehr viele Anleitungen gefunden oder sogar Bibliotheken, aber keine passte für meinen Anwendungsfall.

Einfacher macht es die Tatsache, dass ich nur eine Umdrehung des Handrades betrachten muss. Dafür reicht es zu schauen, ob die Sensordaten Z und Y, an einer Übergangsstelle (-90°/+90°) positiv oder negativ werden. Und den Winkel entsprechend umzurechnen. Das findet man am besten heraus, wenn man sich die aktuellen X, Y, Z Werte über Serial.print ausgebe lässt (im Quellcode ist die Ausgabe als Kommentar enthalten).

  delta=0;
  
  if ((AccZ<0)) { 
    delta=180.0-TotalAngleX*2.0;
  }

 if ((AccZ>0)&&(AccY<0)) {
    delta=360.0;
  }

  DrillingMachineAngle=TotalAngleX+delta;
  //if near 360°, display better 0°
  if (DrillingMachineAngle>350) {DrillingMachineAngle=0;}

Was jetzt noch fehlt, ist der maximal mögliche Drehwinkel, den das Handrad ermöglicht. Das geht am einfachsten, wenn man das auch über Serial.print, wie oben, den Drehwinkel ausgeben lässt und den maximalen Wert notiert.

Bei mir sind es 316°. Bei einer maximalen Bohrtiefe von 50 mm errechnet sich die aktuelle Position damit:

currentPos=50.0/316.0*e;

Taster

Wird der Taster gedrückt, speichert der Arduino die aktuelle Bohrposition. Auf dem Display wird 8888 angezeigt und kurz 1 sek gewartet.

 if (digitalRead(9)==LOW) {
    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);
  }

Ist eine Stopp-Position gesetzt wird auf dem rechten Display die verbleibende Bohrtiefe bis zum Stopp angezeigt.

Zusammenbau

Der Gyro-Sensor wird am besten mit einem Punkt Heißkleber in der Halterung fixiert. Die Anschlusskabel durch den Deckel führen. Dann nur noch den Deckel aufdrücken und beides auf den Bohrmaschinenanschluss stecken.

Am besten werden beim Gehäuse zuerst alle Verbindungskabel angebracht und verlötet. Dann lässt sich der Taster mit Heißkleber gut festkleben. Dann die 7-Segment-Anzeige ebenfalls mit Heißkleber fixieren, gefolgt vom Ein-/Ausschalter.

Zum Schluss den Magneten in die Aussparung drücken und den Deckel aufstecken.

  • Gyro-Sensor im Halter eingeklebt
  • Einzelteile des Gyro-Sensor Halters
  • Aufsteckplatine für den Arduino Nano
  • Fertige Bohrtiefenanzeige mit Arduino, Taster, Ein-/Ausschalter und 7-Segment-Anzeige
  • Zusammenbau der Bohrtiefenanzeige mit Gyro-Sensor, 7-Segment-Anzeige, Taster und Arduino Aufsteckplatine
  • Bohrtiefenanzeige mit Gyro-Sensor angebaut an Bohrmaschine

Test

Im ersten Test muss zuerst der Gyro-Sensor ausgerichtet werden. Ich habe ihn waagrecht eingebaut. Da der Halter drehbar ausgeführt ist, lässt er sich einfach justieren, bis im Display 0.0 angezeigt wird.

Dann kann der erste Test beginnen.

Insgesamt bin ich sehr zufrieden mit der Lösung. Nach dem Einschalten ist das ganze System fast sofort bereit. Es zeigt dank der Sensorausführung perfekte Absolutwerte an. Der Sensor reagiert außerdem schnell auf Drehbewegungen am Handrad und die berechneten Werte passen exakt zur Bohrtiefe.

Das Basteln hat auch richtig Spaß gemacht. Und dank der großen LED-Anzeige brauche ich mir wohl über eine Brille bis 85 Jahre keine Sorgen mehr zu machen, um eine exakte Bohrtiefe ablesen.

Viel Spaß beim Nachbauen!

Download

Arduino-Sketch

3D-Druck Gehäuse

Links

https://de.wikipedia.org/wiki/Beschleunigungssensor
Referenz für Wire-Bibliothek: https://www.arduino.cc/en/Reference/Wire
Beispiel zum Datenauslesen: http://electronoobs.com/eng_robotica_tut9_code5.php
Erklärungen zum MPU6040: Lets work with MPU6050 (GY-521): https://medium.com/@kavindugimhanzoysa/lets-work-with-mpu6050-gy-521-part1-6db0d47a35e6 und https://playground.arduino.cc/Main/MPU-6050/ oder auch https://circuitdigest.com/microcontroller-projects/mpu6050-gyro-sensor-interfacing-with-arduino/
Bibliothek zum GY-521 von Rob Tilaart: https://github.com/RobTillaart/GY521

Tolle Erklärung des Sensors, allerdings mit einem ODROID: http://cool-web.de/esp8266-esp32/gy-521-mpu-6050-gyroskop-beschleunigung-sensor-i2c-esp32-odroid-go.htm

E-Book „2 Second Lean“ von Paul Akers: http://paulakers.net/wp-content/uploads/2015/09/2-Second-Lean-3rd-Edition-German-v2.pdf

Kommentar verfassen