Benutzer-Werkzeuge

Webseiten-Werkzeuge


0x0017

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
0x0017 [2023/02/01 09:56] torsten.roehl0x0017 [2023/02/01 14:36] (aktuell) – [Links] torsten.roehl
Zeile 8: Zeile 8:
  
 ======Übersicht====== ======Übersicht======
 +<figure>
 +{{:digimatic_interface01.png?300|}}
 +<caption> //Der fertige Digimatic-Serial-Umwandler. Diese Ausführung ist für den täglichen Einsatz. Der verbaute Arduino Nano (Klon) verwendet Steckleisten, so dass ein Austausch (falls er doch einmal defekt sein sollte) schnell erfolgen kann.//
 +</caption>
 +</figure>
 +Die wesentliche Hardware ist eine Messuhr (mit RB6-Schnittstelle), ein Arduino und ein Datenkabel. Es werden zwei Programme entwickelt. Das erste Programm zeigt, wie man grundsätzlich das Digimatic-Protokoll mit dem Arduino ausliest. Das zweite Programm demonstriert, wie man darauf aufbauend eigene Messsoftware entwickeln kann, wobei der Arduino dann als Elektronikkomponente zwischen der Messuhr und dem PC vermittelt. 
 +<figure>
 +{{:gauge_prinzip.png?450|}}
 +<caption> //Messprinzip: Eine Messuhr wird über ein Kabel mit dem Messadapter verbunden. Der Messadapter besteht im Wesentlichen aus einem Arduino, der wiederum für die Kommunikation mit dem PC sorgt.//
 +</caption>
 +</figure>
 =====Hardware===== =====Hardware=====
 +
 +Einen Arduino Nano, einen Widerstand und ein Transistor reichen aus, um mit der Messuhr kommunizieren zu können. Das Kabel (hier Digimatic-Kabel mit RB6/Wannenstecker) ist allerdings auch noch notwendig. 
 +
 +
 +^Anzahl^Hardware^ ^
 +|1|Arduino Nano (Klon) | |
 +|1|4,7 k Widerstand | |
 +|1|BC 548B Transistor | {{:bc548.png?300 |}}| 
 +|1|Digimatic-Kabel  |{{:digimatic_kabel.jpg?300|}} | 
 +|1|Wannenstecker (10-polig) 2.54mm |{{:wannenstecker_03.png?300|}} | 
 +
 +Grundsätzlich könnten alle Messgeräte mit dem Digimatic-Protokoll ausgelesen werden (auch andere Schnittstellen als RB6, z.B. RB5, inbegriffen). Testen konnten wir natürlich nur mit dem uns zur Verfügung stehenden Messgerät(siehe folgende Tabelle). Der Wannenstecker ist nur notwendig, wenn das Digimatic-Kabel verwendet wird. Eine Alternative ist im Abschnitt Downloads/Links aufgeführt (Adapter RB6 auf RB5). 
 =====Software===== =====Software=====
 +  * **Digimatic** Protokoll Das Digimatic-Protokoll muss gründlich verstanden sein, bevor man versucht, Daten vom Messgerät zu lesen. Insgesamt werden 13 Halfbytes (Nibble) gelesen und somit insgesamt 52 Bits bei jedem Lesevorgang empfangen.
 +  * **Arduino** Testprogramm Ein erster Test mit der Messuhr und dem Arduino demonstriert das grundlegende Prinzip. Der Arduino liest die Daten von der Messuhr und zeigt sie auf der seriellen Konsole an. Wenn dieser Schritt erfolgreich beendet wurde, ist das schwierigste geschafft. Es bleibt nur noch ein ordentliches Hardware-Interface für den Dauereinsatz zu basteln und die Software für die PC-Kommunikation zu entwerfen.
 +  * **Messsoftware** Eigentlich geht es ja darum, mit eigener Software die Daten der Messuhr (über den dazwischen geschalteten Arduino) zu lesen. Ein Code-Skelett, wie so eine Mess-Software aussehen kann, wird hier vorgestellt. Für LinuxCNC empfiehlt es sich, Python zu verwenden. Wir demonstrieren hier das Prinzip mit Java. Jede Programmierprache, die mit dem seriellen Port kommunizieren kann, ist natürlich erlaubt.
 ======Details====== ======Details======
 +Zuerst geben wir den Schaltplan an, der nötig ist, um die Messuhr mit dem Arduino verbinden zu können. Für die Prototypentwicklung reicht ein Steckbrett. Ein kleiner Adapter, der die Messuhr mit dem Arduino verbindet, erleichtert allerdings den Aufbau erheblich. Für den dauerhaften Einsatz wurde die Elektronik in ein Elektronikgehäuse gelegt. Die wichtigsten Eigenschaften des Digimatic-Protokolls werden danach besprochen. Anschließend werden die kommentierten Quellcodes der beiden Programme mit zusätzlichen Erklärungen behandelt. 
 =====Hardware===== =====Hardware=====
 +AbsolutSystem Digital-Messuhr (12,7 mm Messbereich) und RB6-Datenausgang, Ablesung 0,001 mm. 
 +<figure>
 +{{:messuhr01.jpg?300|}}
 +<caption> //Für die Kommunikation werden vier Leitungen: DATA, CLK, REQ und GND verwendet. Da der RB6-Datenausgang fünf Leitungen hat, ist eine Leitung unbenutzt.//
 +</caption>
 +</figure>
 +
 +Die Tatsache das Datenleitung und Takt direkt vom Arduino als LOW/HIGH erkannt und somit verarbeitet werden können, erleichtert den Aufbau erheblich. Nur der Request (REQ - Pin 5) erfordert eine Nachbearbeitung.
 +
 +REQ ist ein digitaler Ausgangspin vom Arduino, er wird über dem Widerstand an die Basis des Transistors angeschlossen. Der Emitter des Transistors ist mit GND und der Kollektor mit PIN 5 des Wannensteckers verbunden.
 +
 +Wenn REQ vom Arduino LOW ist, dann sperrt der Transistor und am PIN 5 der Messuhr liegt ein HIGH an. Wenn REQ vom Arduino HIGH ist, öffnet der Transistor und PIN 5 des Wannensteckers wird auf GND gezogen (active LOW Prinzip). Dies ist dann das Signal, das Daten von der Messuhr gelesen werden sollen. Daten können also nur von der Messuhr gelesen werden, wenn zuvor PIN 5 der Messuhr auf GND gezogen wird. 
 +
 +^ ^Digimatic PIN^Arduino Nano^Typ^Anmerkung^
 +|1|GND|GND| |werden direkt miteinander verbunden|
 +|2|DATA|Pin 2|Digital Input|werden direkt miteinander verbunden|
 +|3|Clock (CLK)|Pin 3|Digital Input|werden direkt miteinander verbunden|
 +|4|n.c. (not connected)|| |unbenutzt|
 +|5|Request (REQ)|Pin 5|Digital Output|Widerstand u. Transistor werden benötigt| 
 +
 ====Schaltplan==== ====Schaltplan====
 +<figure>
 +{{:schaltplan_gauge_01.png?450 |}}
 +<caption> **Schaltplan** //Der Emitter des Transistors geht auf GND und der Kollektor wird mit PIN 5 des Wannensteckers verbunden. Der REQ PIN 5 des Arduino wird dann über den Widerstand mit der Basis des Transistors verbunden. Alle anderen Leitungen können direkt verbunden werden.//
 +</caption>
 +</figure>
 ====Arduino Prototyp Entwicklung==== ====Arduino Prototyp Entwicklung====
 +<figure>
 +{{:board_dial_gauge01.png?400 |}}
 +<caption> **Arduino Prototypentwicklung** //Ein Steckbrett und ein Arduino ist Ausgang für erste Versuche, die Messuhr anzusprechen. Da Messuhren teuer sind, sollte doppelt geprüft werden, ob Wannenstecker-Pins, Transistor und Steckbrücken richtig miteinander verbunden sind.//
 +</caption>
 +</figure>
 ====Arduino mit Messadapter==== ====Arduino mit Messadapter====
 +<figure>
 +{{:gauge_04.png?400 |}}
 +<caption> **Messadapter** //Ein Messadapter vereinfacht die Prototypentwicklung und kann auch schon für erste Messungen in der Praxis herhalten. Um den Adapter benutzen zu können, werden noch vier Steckbrückenkabel und ein Arduino benötigt.//
 +</caption>
 +</figure>
 ====Fertiges Elektronikgehäuse==== ====Fertiges Elektronikgehäuse====
 +<figure>
 +{{:gauge_05.png?350 |}}
 +<caption> **Elektronikgehäuse** //Für den Dauereinsatz ist ein Elektronikgehäuse am Besten geeignet. Wer keine Fräse hat, um die Ausschnitte für USB und Wannenstecker zu fertigen, hat nur die Möglichkeit, den klassischen Weg (Bohrer und Säge) zu beschreiten.//
 +</caption>
 +</figure>
 +
 +
 +
 +Manuelle Herstellung der Elektronikausschnitte:
 +
 +  - Mit einem CAD Programm Schablonen anfertigen und anschließend so auf dem Adapter platzieren, dass die Bohrlöcher vorgekörnt werden können.
 +  - Bohrlöcher vorkörnen.
 +  - Mit einem kleinen Bohrer (ca. 1mm) in die Ecken für die Ausschnitte bohren. Die Bohrlöcher für die Schrauben sollten ebenfalls vorgekörnt werden.
 +  - Mit der Laubsäge das Material entfernen.
 +  - Schlüsselfeilen benutzen, um alles sauber in Form zu bringen.
 =====Software===== =====Software=====
 ====Digimatic-Protokoll==== ====Digimatic-Protokoll====
 +Das Digimatic-Protokoll erwartet, dass über den Request (Pin 5) ein Signal (Leseaufforderung) an die Messuhr geschickt wird. Anschließend stehen dann 52Bit (in 13 Halfbyte verpackt) zum Lesen zur Verfügung. Wenn man jetzt noch weiß, was die jeweils einzelnen Bits bedeuten, steht einer Auswertung nichts mehr im Wege. 
 +
 +
 +<figure>
 +{{:digimatic_code.png?500 |}}
 +<caption> **Digimatic-Protokoll**
 +</caption>
 +</figure>
 +
 +**1 Pinbelegung:** Für einen 10-poligen Wannenstecker. Pin 1,2,3 und 5 werden verwendet.
 +
 +**2 Datenformat:** Ein Datensatz besteht aus 13 Halfbyte (hier mit 'digits' bezeichnet). Der eigentliche Messwert steckt in den 'digits' d6 bis d12.
 +
 +**3 Zeitdiagramm:** Ein Lesevorgang wird eingeleitet, indem über den Request (Pin 5) die Ausgabe auf LOW (Low active) gezogen wird. Jedes Bit kann dann nach einem Taktwechsel (LOW-HIGH) gelesen werden. 
 +''Beachte, die Binärangaben scheinen falsch herum, da MSB zuerst gesendet wird!''
 +
 +Das Digimatic-Protokoll besteht (siehe Grafik) aus 13 Halfbyte, so dass insgesamt 13*4=52 Bits übertragen werden. Die Grundsätzliche Abfrage von Messdaten läuft dabei nach folgendem Schema ab: 
 +
 +
 +  - Request senden, indem die Request (REQ)-Leitung auf LOW gesetzt wird.
 +  - Clock-Zyklus abwarten, d.h., CLOCK=HIGH-Signal abwarten, dann CLOCK=LOW-Signal abwarten.
 +  - Bit einlesen.
 +  - Ab Schritt 2 wiederholen, bis 52 Bits gelesen worden sind.
 +  - Request-Leitung auf HIGH setzen.
 +
 +Dieses Schema ist in der Funktion 
 +<code> readDialGauge()</code>
 +umgesetzt. Diese Funktion wird unten noch genauer beschrieben. Da Arduino den Datentyp Halfbyte (Nibble) nicht besitzt, verwendet die Funktion den Datentype byte. D.h., die Daten werden insgesamt in ein Array von 13 Bytes gelesen, wobei jedes Byte die 4 gelesenen Bits beinhaltet. 
 +
 +^Digits (4Bit)^Wert dec(bin)^Bedeutung^
 +|d1|15 (1111)|normale Messung|
 +|d2|15 (1111)|normale Messung|
 +|d3|15 (1111)|normale Messung|
 +|d4|15 (1111)|normale Messung|
 +|d5|0(0000) oder 8 (1000)|Vorzeichen 0=+ und 8=-|
 +|d6|6 Ziffer|Messwertdaten (MSD=Most Significant Digit, höchster Ziffernwert)|
 +|d7|5 Ziffer|Messwertdaten|
 +|d8|4 Ziffer|Messwertdaten|
 +|d9|3 Ziffer|Messwertdaten|
 +|d10|2 Ziffer|Messwertdaten|
 +|d11|1 Ziffer|Messwertdaten (LSD, niedrigster Ziffernwert)|
 +|d12|3 oder 5|Dezimalpunktstelle (hier 3 für mm und 5 für inch)|
 +|d13|0 (0000) oder 1(0001)|Einheit 0=mm und 1 = inch|
 +
 +Die Ziffern stehen im BCD-Code zur Verfügung. Falls Sie mit diesem Code nicht vertraut sind, ist das in unserem Fall aber nicht weiter wichtig, da jede Ziffer (digit) direkt als Binärzahl interpretiert werden kann. 
 +
 ====Arduino Testprogramm==== ====Arduino Testprogramm====
 +
 +Das folgende Programm (Arduino Sketch) läuft auf dem Arduino, der wiederum mit der Messuhr verbunden ist. Über das USB-Kabel des Arduinos werden die gelesenen Messwerte der Uhr vom Arduino auf den PC übertragen und über den integrierten seriellen Monitor der Arduino-IDE ausgegeben. 
 +
 +<code c |  minimal solution - reading gauge indicator >
 +/* minimal solution - reading gauge indicator (here a device from Absolute-System)
 +   @author torsten roehl
 +   @see this code is based on https://www.instructables.com/id/Interfacing-a-Digital-Micrometer-to-a-Microcontrol/
 +   (there is a little big in the code from instructables - only ocurs for high inch values! )
 +*/
 +
 +
 +/*  ADJUST AREA START  */
 +
 +/* pin configuration */
 +int pinREQ = 5;
 +int pinDATA = 2;
 +int pinCLK = 3;
 +
 +/* pooling intervall */
 +int sleep = 100;
 +/* baudrate */
 +int bd = 9600;
 +
 +/*  ADJUST AREA END  */
 +
 +/* Keep FIXED! - data protocol format */
 +byte digits[13];
 +float value;
 +
 +void setup() {
 +
 +  /*    SERIAL_8N1 (the default)  */
 +  Serial.begin(bd);
 +
 +  pinMode(pinREQ, OUTPUT);
 +  pinMode(pinCLK, INPUT_PULLUP);
 +  pinMode(pinDATA, INPUT_PULLUP);
 +  digitalWrite(pinREQ, LOW); // set request at high
 +
 +}
 +
 +void loop() {
 +
 +  readDialGauge();
 +  decodeDialGauge();
 +  serialInfoMonitor();
 +
 +  delay(sleep);
 +}
 +
 +
 +/*
 +   Read the dial gauge.
 +   After a call to this function the array digits[13] contains all data according to the data protocol.
 +   For normal data reading the first four digits should by all 'F', the function returns false if this is not the case.
 +
 +
 +
 +*/
 +boolean readDialGauge() {
 +
 +  /**
 +     Generate request by making REQ active (low level)!
 +  */
 +  digitalWrite(pinREQ, HIGH); // generate set request
 +
 +  /* read 13 nibble (52 bit) */
 +  for (int i = 0; i < 13; i++ ) {
 +    int digit = 0;
 +    for (int j = 0; j < 4; j++) {
 +
 +      while ( digitalRead(pinCLK) == LOW) {}/* Wait for CLOCK=HIGH */
 +      while ( digitalRead(pinCLK) == HIGH) {} /* Wait for CLOCK=LOW  */
 +
 +      bitWrite(digit, j /*pos*/, (digitalRead(pinDATA) & 0x1));
 +    }
 +
 +    digits[i] = digit;
 +  }
 +
 +  digitalWrite(pinREQ, LOW);
 +
 +
 +  /* d1-d4 should be all oxF */
 +  int header = digits[0] + digits[1] + digits[2] + digits[3];
 +  return header == 60 ? true : false;
 +}
 +
 +
 +/*
 +   decodeDialGauge (according to the digomatic-protocol)
 +   Note: A call to readDialGauge is necessary to use this function!
 +
 +   i) value - contains the (signed) value read out from the gauge indicator
 +   ii) units - if units is equal to 0 then mm is used, otherwise (1) inch is in use
 +   iii) decimal - the number of decimal. mm corresponds to 3 decimal numbers, whereas inch has five decimal numbers.
 +
 +   return (signed) measured value
 +*/
 +
 +void decodeDialGauge() {
 +
 +  int units = digits[12];    // 0=mm or 1=inch
 +  int decimal = digits[11];  // 3 for mm and 5 for inch
 +
 +  value = (float)digits[5] * 10000 + (float)digits[6] * 10000 + (float) digits[7] * 1000 + (float)digits[8] * 100 + (float)digits[9] * 10 + (float) digits[10];
 +  /* assuming digits[11] is allways 3 */
 +  value /= 1000.0;
 +
 +  if (units == 1 )
 +    value /= 100.0;
 +
 +  if (digits[4] == 8)
 +    value *= -1.0;
 +}
 +
 +/*
 +   Helper function: This function decodes and writes the data from the dial gauge to the arduino serial monitor for debugging purposes.
 +   Note: A call to readDialGauge and decodeGauge is necessary to use this  function!
 +
 +*/
 +void serialInfoMonitor() {
 +
 +  int units = digits[12];// 0=mm or 1=inch
 +  int decimal = digits[11];// 3 for mm and 5 for inch
 + 
 +  String info = " (mm)";
 +  if (units == 1 )
 +    info = " (inch)";
 +
 +  Serial.print(value, decimal );
 +  Serial.println(info);
 +
 +}
 +
 +</code>
 +
 ====Messsoftware==== ====Messsoftware====
 <code c | Arduino> <code c | Arduino>
Zeile 249: Zeile 509:
 </code> </code>
 ======Download/Links====== ======Download/Links======
 +Die beiden wichtigsten Quellen sind eine Datei (PDF) über das Digimatic-Protokoll und eine Anleitung von Instructables, die das Auslesen von Mitutoyo-Messgeräten aufzeigt. Unsere Messuhr ist ähnlich aufgebaut, sodass dieser Artikel hilfreich ist. Allerdings enthält der dort verwendete Code einen Bug (kommt nur bei großen Messwerten in inch zum Tragen). Außerdem ist die Verwendung von Strings, selbst wenn man schon mit "Arduinos" programmiert, ungewöhnlich. Ohne Verwendung von Strings läuft der Code wesentlich performanter. 
 +
 ====Download==== ====Download====
 +  * {{ :digimatic_techmusings.pdf |Digimatic Protokoll (TechMusings) }}
 +  * {{ :messuhr.zip |Quellcode: Arduino und Java (mit JSSC) }}
 +
 ====Links==== ====Links====
  
 +Angaben zu den Messgeräten & Kabeln. 
 +  * Kabel Digimatic https://www.amazon.de/gp/product/B0006J415K/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1 (Mitutoyo mt905409 Anschluss Kabel (2 m) 905409)
 +  * Kabel Adapter https://www.shop.santool.de/de/zubehoer/anschlusskabel-digitale-messuhr.html?bruttonetto=with (Art.Nr.: MI-02027153 Anschlusskabel für digitale Messuhr)
 +  * Messuhr https://www.amazon.de/gp/product/B0747MG36S/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1 (CNC QUALITÄT Digital- Messuhr 12,7 mm Messbereich, Ablesung 0,001 mm )
 +
 + Java API für die serielle Schnittstelle: https://code.google.com/archive/p/java-simple-serial-connector/
  
 + Anleitung von Instructables https://www.instructables.com/id/Interfacing-a-Digital-Micrometer-to-a-Microcontrol/
0x0017.1675245404.txt.gz · Zuletzt geändert: 2023/02/01 09:56 von torsten.roehl