Präzise Bohrtiefen-Anzeige mit Gyro-Sensor (GY-521) & Arduino Nano
Komponenten und Zubehör
- 1× Arduino Nano R3
- 1× GY-521 / MPU-6050 Gyro-/Beschleunigungssensor (I2C)
- 1× 7-Segment-Display 8-stellig mit MAX7219 (SPI)
- 1× Taster
- 1× Ein-/Ausschalter
- Stromversorgung: 6× AA-Batterien (oder Powerbank)
- 1× Neodym-Magnet (zur Befestigung am Bohrmaschinen-Gehäuse)
- 1× 3D-gedrucktes Gehäuse (STL im Projekt)
Benötigte Werkzeuge
- 3D-Drucker (z. B. Anycubic i3 Mega)
Software
- Arduino IDE
- Bibliothek:
LedControl.h(für MAX7219)
Motivation
Die eingebaute Skala an der Säulenbohrmaschine ist bei schlechter Lichtverhältnissen und altersbedingt schlechteren Augen schwer ablesbar. Eine elektronische Anzeige direkt am Handrad löst das Problem – und macht Spaß beim Basteln.
Messprinzip
Das Handrad der Bohrmaschine dreht ca. 270° (keine volle Umdrehung). Ein Gyro-Sensor (Beschleunigungsmesser) am Handrad misst den Neigungswinkel zur Schwerkraft → direkter Rückschluss auf die Bohrspindel-Position. Vorteile: Keine Mechanik (Seilzug, Zahnrad), keine Kabelverdrehung, nur ein kleiner Sensor.
Konzept
- Bohrer an Werkstück ansetzen (Nullpunkt).
- Taster drücken → aktuelle Position als „Stopp-Position“ (Zieltiefe) speichern.
- Während des Bohrens: Aktuelle Tiefe links, Resttiefe bis Stopp rechts anzeigen.
- Zieltiefe erreicht → „StOP“ auf rechtem Display.


Sensor wird in einen 3D-gedruckten Adapter gesteckt, der auf die SW17-Sechskantmutter der Bohrspindel passt. Hauptgehäuse (Display, Arduino, Batterien) per Neodym-Magnet am Maschinengehäuse – schnell abnehmbar.

Verdrahtung
GY-521 (I2C)
- VCC → 5V
- GND → GND
- SCL → A5
- SDA → A4
- XDA, XCL, ADO, INT → nicht verbunden
7-Segment MAX7219 (SPI, beliebig wählbare Pins)
- VCC → 3,3 V
- GND → GND
- DIN → D12
- CS → D10
- CLK → D11
Taster
- Eingang → D9 (interner Pullup genutzt)
Stromversorgung
6× AA-Batterien in Reihe (9 V) → Ein-/Ausschalter → VIN/GND des Nano (oder 5V-Regler).
Gehäuse
In Autodesk Fusion 360 entworfen, auf Anycubic i3 Mega gedruckt. Neodym-Magnet eingeklebt. Sensor-Adapter separat druckbar (STL-Datei im Projekt: drilling-depth-3d-model_Yn2q0MSNa4.zip).
Arduino-Sketch (Kernlogik)
Keine fertige MPU-6050-Bibliothek verwendet – direkte I2C-Kommunikation über Wire.h. Nur Beschleunigungsdaten genutzt.
Initialisierung & Kalibrierung
Wire.begin();
Wire.beginTransmission(0x68); Wire.write(0x6B); Wire.write(0x00); Wire.endTransmission(true); // Wake up
delay(1000); // KRITISCH: Ohne Delay liefert Sensor nach externer Stromversorgung keine Daten!
Wire.beginTransmission(0x68); Wire.write(0x1C); Wire.write(0x10); Wire.endTransmission(true); // +/- 8g Range
// Offset-Kalibrierung: 100 Messungen mitteln
for(int a=0; a<100; a++) { ... AccAngleErrorX += atan2(AccY, sqrt(AccX²+AccZ²)) * RAD_TO_DEG; }
AccAngleErrorX /= 100;
Winkelberechnung & Glättung
AccAngleX = atan2(AccY, sqrt(AccX*AccX + AccZ*AccZ)) * RAD_TO_DEG - AccAngleErrorX;
TotalAngleX = 0.5 * TotalAngleX + 0.5 * AccAngleX; // Komplementärfilter (50/50)
// Umrechnung -90..+90° → 0..360° mittels Vorzeichen von AccZ, AccY
delta = 0;
if (AccZ < 0) delta = 180.0 - TotalAngleX * 2.0;
if (AccZ > 0 && AccY < 0) delta = 360.0;
DrillingMachineAngle = TotalAngleX + delta;
if (DrillingMachineAngle > 350) DrillingMachineAngle = 0;
Tiefe berechnen
Maximaler Handrad-Winkel (per Serial-Monitor ermittelt): 316°. Maximale Bohrtiefe: 50 mm.
currentPos = 50.0 / 316.0 * DrillingMachineAngle; // mm
Taster-Logik & Anzeige
- Taster gedrückt:
stopPos = currentPos, Anzeige „8888“ 1 s lang. - Stopp gesetzt: Rechte Seite zeigt Resttiefe (
stopPos - currentPos) mit 1 Nachkommastelle. - Zieltiefe erreicht: „5t0P“ (kleines ‚t‘ via
setRow(0,2,B00001111)). - Linke Seite: Immer aktuelle Tiefe (
currentPos). - Anzeige via
dtostrf()→ String → zeichenweiseslc.setChar().
Montage & Test






Sensor mit Heißkleber punktfixieren, Kabel durch Gehäusedeckel führen. Erste Inbetriebnahme: Sensorhalter drehen, bis Display „0.0“ anzeigt. Dann Testbohrung – Reaktionszeit und Genauigkeit exzellent.
Gesamtfazit: Große LED-Anzeige gut ablesbar bis ins hohe Alter. Paul Akers („2 Second Lean“): „Fix what bugs you!“
Hilfreiche Links
- MPU-6050 Tutorial (Medium)
- Arduino Playground MPU-6050
- CircuitDigest MPU-6050
- GY-521 Library (Rob Tillaart)
- Paul Akers: 2 Second Lean
- Deutscher Originalartikel: techpluscode.de
Schaltplan

Code (drilling-depth.ino)
/* drilling-depth.ino * Thomas Angielsky * 2021-03-20 * https://techpluscode.de/bohrtiefenanzeige-mit-gyro-sensor/ */
#include <Wire.h> #include <math.h> #include "LedControl.h"
#define MPU 0x68
char txt[8]; String s;
float currentPos, stopPos; float rad_to_deg = 180/PI;
float AccX, AccY, AccZ; float AccAngleX, AccAngleErrorX; float TotalAngleX;
float DrillingMachineAngle, delta;
LedControl lc = LedControl(12,11,10,1); // DIN, CLK, CS, 1 Device
void setup() {
stopPos=0; currentPos=0;
Wire.begin();
Wire.beginTransmission(MPU); Wire.write(0x6B); Wire.write(0x00); Wire.endTransmission(true);
delay(1000); // WICHTIG!
Wire.beginTransmission(MPU); Wire.write(0x1C); Wire.write(0x10); Wire.endTransmission(true);
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+=atan2(AccY, sqrt(AccX*AccX+AccZ*AccZ))*rad_to_deg;
}
AccAngleErrorX/=100;
pinMode(9, INPUT_PULLUP);
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=atan2(AccY, sqrt(AccX*AccX+AccZ*AccZ))*rad_to_deg - AccAngleErrorX;
TotalAngleX=0.5*TotalAngleX + 0.5*AccAngleX;
delta=0;
if(AccZ<0) delta=180.0-TotalAngleX*2.0;
if(AccZ>0 && AccY<0) delta=360.0;
DrillingMachineAngle=TotalAngleX+delta;
if(DrillingMachineAngle>350) DrillingMachineAngle=0;
currentPos=50.0/316.0*DrillingMachineAngle;
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); }
if(stopPos>0) {
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); }
else { 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 { lc.setChar(0,3,' ',false); lc.setChar(0,2,' ',false); lc.setChar(0,1,' ',false); lc.setChar(0,0,' ',false); }
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);
}
Herstellungsprozess
- Sensordaten in Raspberry Pi integrieren: GPS & MPU-9150 Hands-On Guide
- Line-Tracking-Sensor mit Raspberry Pi – Einfacher KY-033 Tür/Line Detektor
- Robuste Temperatur- & Sensor-API auf Raspberry Pi mit GY-91 Modul bauen
- Automatisiertes Aeroponik-System mit Raspberry Pi und Feuchtigkeitssensor bauen
- Raspberry Pi GPIO meistern: PIR-Bewegungsmelder an B+/Model 2 anschließen
- Acconeer A111 Pulsradar mit Raspberry Pi integrieren: Praktischer Leitfaden
- HC-SR501 PIR-Bewegungssensor an Raspberry Pi anschließen, kalibrieren und programmieren
- Python/MicroPython Sensor Logger: Sensordaten nahtlos in Google Sheets speichern
- Thermofühler (Thermocouple) mit Arduino Portenta H7 über MAX6675 IC integrieren
- Präzise Druck- & Luftstrommessung mit analogem Sensor und Arduino