Ein Kabel-Add-on zur Kommunikation mit dem Mahr Extramess 2001

Mit einem günstigen ESP32-C3 Super Mini und einem M8-4-Pol-Kabel haben wir ein eigenes Interface gebaut, um das proprietäre Mahr Extramess 2001 auszulesen – ganz ohne das teure Originalkabel (111 €). Statt nur 1 Messwert pro Sekunde (offizielle Software) erreichen wir mit dem ESP32 eine effektive Abtastrate von ca. 14,5 Hz. Dazu wurde das serielle Protokoll rückentwickelt (4800 Baud, 7 Datenbits, even Parity, 2 Stopbits), um Befehle wie ?\r (Messwert abfragen) oder ABS\r (absoluter Modus) zu senden.Der ESP32 liest die Antwort, filtert den Messwert und gibt ihn im CSV-Format über USB aus – ideal für Logging und Analyse, z. B. in Excel.

Hardware-Setup

Wir verwendeten zwei Hauptkomponenten:

- ESP32-C3 Super Mini Ein kompakter und kostengünstiger Mikrocontroller, der USB- und UART-Kommunikation unterstützt. (Kaufen bei AliExpress)

- M8 4-Pol-Kabel Verbindet den ESP32 mit dem Mahr Extramess 2001. (Kaufen bei Amazon)

- 3D gedruckten Komponenten Die STL Datein und eine Fusion360 Datei falls nochmal etwas am Design verändert werden soll, findest du hier.

- Mahr Extremess 2001 Messtaster

Der ESP32 fungiert als Vermittler zwischen der seriellen Schnittstelle des Mahr-Geräts und einem modernen Computer via USB. Er sendet Anfragen und verarbeitet die eingehenden Messwerte, welche in einem formatgerechten Stil für Protokollierung oder Analyse ausgegeben werden.

Warum haben wir das gebaut? Weil das Originalkabel vom Hersteller 111 € kostet – hauptsächlich wegen eines integrierten FTDI-Controllers – und die offizielle Software nur eine Messabfrage pro Sekunde erlaubt, was für den praktischen Einsatz viel zu langsam ist.

Zur Lösung dieses Problems haben wir das Kommunikationsprotokoll zwischen der MahrConnect-Software und dem Mahr Extramess 2001 rückentwickelt. Dabei stellten wir fest, dass die Software nur nach einem bestimmten Gerätenamen auf dem FTDI-Controller sucht. Mit diesem Wissen konnten wir ein generisches UART-Gerät nutzen, um den seriellen Datenverkehr zu überwachen und die notwendigen Signale und Befehle zu identifizieren.

Protokollanalyse

Durch Analyse der Signale und Dokumentation identifizierten wir folgende Kommunikationsparameter:

- Baudrate: 4800

- Datenbits: 7

- Parität: gerade (even)

- Stoppbits: 2

Das Protokoll akzeptiert spezifische ASCII-Befehle, die mit einem Wagenrücklauf (`\r`) abgeschlossen werden. Wichtige Befehle sind:

Befehl	Funktion
RES1\r	Messbereich auf Voreinstellung 1 setzen
RES2\r	Messbereich auf Voreinstellung 2 setzen
RES3\r	Messbereich auf Voreinstellung 3 setzen
TOL?\r	Toleranzeinstellungen abfragen
SET?\r	Aktuellen Status abfragen
?\r	Aktuellen Messwert abfragen
RST\r	Zurücksetzen und ABS-Modus deaktivieren
BAT?\r	Batteriestatus abfragen
MAX\r	Maximalen Messwert anzeigen
MIN\r	Minimalen Messwert anzeigen
OFF\r	Gerät ausschalten
ABS\r	Absoluten Messmodus aktivieren

Mit diesen Befehlen konnten wir vollständig kontrolliert mit dem Gerät interagieren.

Implementierung

Wir verwendeten den ESP32-C3 Super Mini – einen der kleinsten und günstigsten Mikrocontroller – als Brücke zwischen der alten seriellen Schnittstelle und einem modernen Computer per USB.

Der ESP32 wurde so programmiert, dass er:

- Alle 5 ms eine Messabfrage `?\r` über Serial1 sendet

- Auf eine Antwort wartet, die mit `\r` endet

- Das Ergebnis parst und nur den numerischen Messwert (in mm) extrahiert

- Zeitstempel und Wert im CSV-kompatiblen Format per USB-Serial ausgibt

Serielle Konfiguration:

mySerial.begin(4800, SERIAL_7E2, 21, 20); RX = GPIO21, TX = GPIO20

Zum Überwachen der seriellen Daten nutzten wir CoolTerm, um die Ausgabe als `.txt`-Datei zu speichern – zur späteren Analyse in Excel.

<br>

Leistung

Mit dieser Konfiguration erreichten wir eine effektive Abtastrate von ca. 14,5 Hz, was eine deutliche Verbesserung gegenüber der ursprünglichen Begrenzung von 1 Hz durch die offizielle Mahr-Software darstellt. Zwar wurde im Code ein Abfrageintervall von 5 ms (entspricht 200 Hz) angestrebt, jedoch limitiert die serielle Schnittstelle (4800 Baud, 7 Datenbits, Even Parity, 2 Stopbits) die tatsächlich mögliche Datenrate:

- Bei 4800 Baud ergibt sich eine maximale Datenübertragungsrate von ca. 480 Zeichen pro Sekunde.

- Durch das verwendete 7E2-Format (insgesamt 11 Bits pro Zeichen) und Protokoll-Overhead ist der Durchsatz auf ca. 40–50 Werte pro Sekunde begrenzt – unter optimalen Bedingungen.

- Reale Einflüsse wie Gerätereaktionszeit und Signalverarbeitung senken die effektive Rate weiter auf etwa 14–15 Hz.

Außerdem zeigte sich, dass bei Intervallen unter 10 ms die Bedienknöpfe am Messgerät nicht mehr zuverlässig reagieren – vermutlich, weil das Gerät durch ständige Anfragen blockiert wird. Daher wurde ein stabiler Kompromiss mit einem 5 ms-Abfrageintervall im Code gewählt, obwohl die effektive Abtastrate auf ca. 14,5 Hz begrenzt bleibt. Für die meisten Anwendungen im Bereich der Positions- oder Längenmessung ist dies jedoch bereits völlig ausreichend.

Der Code auf dem ESP32-C3:

// Verwende Serial1 für die UART-Kommunikation // Wichtige Befehle siehe Kommentare unten HardwareSerial mySerial(1); bool dataRecived = false; void setup() { Serial.begin(115200); mySerial.begin(4800, SERIAL_7E2, 21, 20); // UART-Setup: RX/TX Serial.println("ESP32 UART MahrConnect Extramess 2001"); } void loop() { // Anfrage senden mySerial.write("?\r"); // oder nur "?" falls kein CR erforderlich // Antwort abwarten (max. 500 ms) String message = ""; float startTime = millis(); while (millis() - startTime < 300) { if (mySerial.available()) { char c = mySerial.read(); message += c; if(c == '\r') { break; } } } // Wenn Daten vorhanden und kein Fehler, Zeitstempel + Wert ausgeben if(message == "ERR0\r" && dataRecived) { Serial.println("."); } if (message.length() > 0 && message != "ERR0\r") { float currentTime = millis() / 1000.0; String formatedTime = String(currentTime, 3); formatedTime.replace(".", ","); Serial.print(formatedTime); Serial.print(";"); message.trim(); int index = message.indexOf("mm"); message.replace(".", ","); Serial.println(message.substring(0, index)); dataRecived = true; } else { dataRecived = false; } // Verzögerung bestimmt die Abtastrate: 5 ms = 200 Hz delay(5); }