Arduino Nano Datenerfassung von Laborwaage

Hallo zusammen,

vorweg ich bin völlig neu in der Welt der Microcontroller und habe von Elektrotechnik wenig Ahnung.

Ich habe hier einen Arduino Nano hingelegt bekommen und soll mittels Temperatursensor und Laborwaage Werte auslesen und speichern. Einen ersten Test mit "Adafruit thermocouple" + "Adafruit Breakout Board+" und dem Beispielcode, konnte ich recht einfach Sensorwerte auslesen und auf microSD sichern.

Als nächstes muss ich nun eine Laborwaage von A&D Modell FX-5000i, die über eine RS232 Schnittstelle verfügt, anbinden. Vermutlich habe ich ein grundlegendes Vertsändnissproblem, aber nach nun drei Tagen "try & error" + ewig langes "googlen" bin ich praktisch kein Stück vorran gekommen.

Versucht habe ich eine direkte Verbindung so wie eine Verbindung über eine Zwischenplatine (RS232 -> TTL [selbst gebastelt, nicht von mir!]). Egal welche Beispielcodes ich verwende, es erscheint nur "Müll" im seriellen Monitor. (Baudrate beachtet!)

Ziel des ganzen ist es, das Gewicht eines Werkstoffs bei steigender Temperatur aufzuzeichnen z.B. alle zehn Sekunden Gewicht:Temperatur.

Wenn es Fragen gibt werde ich versuchen sie so gut ich kann zu beantworten.

Wenn Du schon direkt die Waage an den arduino angeklemmt hast (wie auch immer, wissen wir nicht :( ), dann haste letzteren möglicherweise schon gehimmelt.

RS232 != TTL

Falls der arduino noch lebt dann zeig uns den Hardwareaufbau (Skizze, vernünftiges Foto oder so) und den Sketch. Wie wird die Waage angesteuert? Oder schiebt die einfach zyklisch Daten raus?

Die Waage lässt sich doch bestimmt auch an einen PC über RS232 anschließen? Funktioniert sie dort?

RS232 arbeitet mit Spannungen zwischen 3-15V beider Polaritäten. Eine Null wird mit positiver, eine Eins wird mit einer negativen Spannung dargestellt. Direkter Anschluss ohne Converter auf TTL (0=0V, 1=5V) kann den Arduino aber auch die Waage beschädigen. Du brauchst das Datenblatt der Waage. Mit welcher Datenrate sendet sie, irgendwelche Stop und Paritätsbits? Wie ist das Protokoll aufgebaut? Notfalls beim Hersteller erfragen.

Der Nano hat nur eine serielle Hardwareschnittstelle. Die ist mit der USB-Verbindung blockiert. Du brauchst eine zusätzliche Software-serielle Schnittstelle. Z.B. über Altsoftserial-Library. Einfacher geht es mit einem Arduino Mega, der mehrere serielle Schnittstellen hat oder mit dem etwas exotischen Leonardo, wo USB und serielle Schnittstelle getrennt sind.

Leben wird er hoffentlich noch^^ jedenfalls kann ich noch munter drauflos flashen.

So wie ich es verstanden habe, muss man “Q” senden um einen Wert zu erhalten.
Die weiteren Daten müssten sein:

  • Bits/s 2400
  • Datenbits 7
  • Stoppbits 1
  • Parität EVEN
  • 10

Als Programmcode habe ich die zur Verfügung stehenden (seriellen) Beispiele genutzt. Dort habe ich nur noch RX auf 2 und TX auf 1 gesetzt, stand ursprünglich auf 10 und 11.

Bilder: https://drive.google.com/open?id=0B3R71hRXZ2-2djJfczBMRmVmRFU

Ziel des ganzen ist es, das Gewicht eines Werkstoffs bei steigender Temperatur aufzuzeichnen z.B. alle zehn Sekunden Gewicht:Temperatur.

Ich muß Dich enttäuschen. Das Gewicht von Materie ändert sich nicht mit der Temperatur. Es ändert sich eventuell lediglich durch Verdampfen.

Grüße Uwe

Pin1 kollidiert jedenfalls mit der USB-Schnittstelle des Nanos.

Die Drähte zwischen Kabel der Waage und TTL-Adapter sehen mir etwas wackelig aus.

Dein Sketch wäre bestimmt auch hilfreich.

@Uwe: Genau genommen gibt es auch noch eine Gewichtsveränderung durch den Auftrieb der verdrängten Luft. Kalter Körper ist kleiner also weniger Auftrieb als ein warmer. Dann kann man auch noch die Dichteveränderung der durch den Körper sich abkühlenden und erwärmenden Luft einbeziehen und Auswirkungen von Luftströmungen (Kamineffekt) untersuchen.

Nachtrag: Ich weiß nicht, ob man die seriellen Softwareschnittstellen auf das etwas unübliche Datenformat der Waage stellen kann. Die Hardwareschnittstelle kann man entsprechend einstellen (siehe: unter Parameter), aber dann ist der USB-Port blockiert.

Theseus:
Pin1 kollidiert jedenfalls mit der USB-Schnittstelle des Nanos.

Klingt logisch wenn nur eine vorhanden ist. Habe nun mal Pins 9 und 10 verwendet. Das sind also D6 und D7.

Theseus:
Die Drähte zwischen Kabel der Waage und TTL-Adapter sehen mir etwas wackelig aus.

Ein Provisorium.^^
Die Ummantelung der Drähte stecken ebenfalls ein Stück in den beiden weiblichen Steckern. Ohne aktiv daran zu ziehen fallen sie nicht raus.

Theseus:
Dein Sketch wäre bestimmt auch hilfreich.

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 9); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(2400,SERIAL_7E1);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(2400);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.println(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.println(Serial.read());
  }
}

Hinzugekommen ist nun noch “SERIAL_7E1”. Damit erscheint nicht einmal mehr “Goodnight moon!” sondern “Gooäîiçèt íooî!�”.
Bei Betätigung der “PRINT” Taste der Waage passiert leider auch nichts. :frowning:

Hinzugekommen ist nun noch "SERIAL_7E1". Damit erscheint nicht einmal mehr "Goodnight moon!" sondern "Gooäîiçèt íooî!�".

Dann ist 7E1 wohl nicht richtig, oder SoftwareSerial hat ein Problem damit :P

Bei "Good" sind bei den ersten 3 Buchstaben Even Parity Bits = 0, beim 'd' wird das Parity Bit gesetzt, was als 8N1 interpretiert das Zeichen 0xe4 wäre. ( 'ä' in mehreren 8-Bit Zeichensätzen, s. ISO/IEC 8859)

Nachtrag: (Richtig, Theseus!) wenn Serial auf 7E1 gesetzt wird, müsste der SerialMonitor damit klarkommen. Wenn der weiterhin 8N1 erwartet, zeigt er das auch an.

Bei den Pins spricht man eigentlich immer von den Arduinos Pins, da sie genau so auch bei den anderen Boardformen wie dem Uno vorhanden sind. Ich gehe davon aus, du hattest mit 1 und 2 D0 und D1 des Nanos gemeint. Diese Pins sind mit USB parallelgeschaltet. Sie kann man nur nutzen, wenn man nicht gleichzeitig mit dem Nano über USB kommunizierst. Du könntest die Werte z.B. über ein LCD anzeigen lassen.

  Serial.begin(2400,SERIAL_7E1);
[...]
  mySerial.begin(2400);

Du initialisierst Serial über USB mit den exotischen Daten der Waage. Deshalb kommt nur Schrott am Computer an. Die Software-Serial initialisierst du, wie es der Computer, aber nicht die Waage haben will. Ob du Software-Serial mit 7E1 initialisieren kannst, weiß ich nicht.

Bei SoftwareSerial kann man keine config übergeben, das hatte ich schon ausprobiert.

Hier noch mal die genauen Daten aus dem Handbuch:

  • Transmission system : EIA RS-232C (D-Sub 9-pin, female connector)
  • Transmission form : Asynchronous, bi-directional, half duplex
  • Transmission rate : 20 times/second, 10 times/second or 5 times/second (same as data refresh rate)
  • Data format : Baud rate : 600, 1200, 2400, 4800, 9600, 19200 bps
  • Data bits : 7 or 8 bits
  • Parity : Even, Odd (Data bits 7 bits)
  • None (Data bits 8 bits)
  • Stop bit : 1 bit
  • Code : ASCII

Mit Pin 1 und 2 meinte ich “TX1” und “RX0”, so steht es auf der Platine.

TX1 RX0 RST GND D2 D3 D4 …

Theseus:
Die Waage lässt sich doch bestimmt auch an einen PC über RS232 anschließen? Funktioniert sie dort?

Sorry, hatte ich übersehen. Ja, am PC funktioniert sie wunderbar. Da gibt es allerdings auch fertige Tools zum auslesen in Intervallen.^^

Dann stelle doch die Waage auf ein Format, passend zum Arduino. Wenn ich das richtig sehe, wird normalerweise 8bit, no parity, 1Stopbit verwendet. Die RS232-Schnittstelle der Waage sollte gemäß der technischen Daten so eingestellt werden können.

Wenn man die Hardware Schnittstelle für irgendwelche exotischen Datenformate braucht kann man sie auch dafür nehmen und die Kommunikation zum PC mit Software Serial und einem TTL/USB Adapter machen.

Laut Handbuch ist es aber in der Tat möglich das Datenformat zu ändern. Sowie ich das sehe muss man über die DIP-Schalter Mode 3 einstellen. So ganz klar ist es aber nicht.

Theseus: @Uwe: Genau genommen gibt es auch noch eine Gewichtsveränderung durch den Auftrieb der verdrängten Luft. Kalter Körper ist kleiner also weniger Auftrieb als ein warmer. Dann kann man auch noch die Dichteveränderung der durch den Körper sich abkühlenden und erwärmenden Luft einbeziehen und Auswirkungen von Luftströmungen (Kamineffekt) untersuchen.

Nehmen wir zB einen Aluminiumblock von 1dm^3 bei 20°C mit Gamma = 69,3 '10^-6*1/K der dehnt sich bei Erwärmung auf 21 °C um ca 70 mm^3 aus. Das entspringt einer Luftverdrängung 84,7 µg bei einem Gewicht des Aluminiums von 2,7kg.

Grüße Uwe

So, da bin ich wieder.

Die Waage hat keine DIP-Schalter, vermutlich ist damit im Handbuch der Drucker gemeint. Eine Änderung der Konfiguration lässt sich aber über das Tastenfeld realisieren.

Konfiguriert ist nun:

  • 4800 bps
  • 8 Bit
  • keine Parität
  • Datenformat: CSV (also Text)
  • Autoprintmodus B

Angeschlossen sind:

  • RX auf Pin 14
  • TX auf Pin 15

#include <SoftwareSerial.h>

SoftwareSerial mySerial(14, 15); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Bis auf “Goodnight moon!” kommt nichts.

Wo findest du den Pin 14 und 15 an deinem Nano?

Entscheidend ist das, was auf der Platine des Nano steht. Du meinst vermutlich D10 und 11 also, musst du 10 und 11 eintragen. Mit 14 und 15 würdest du die analogen Eingänge A0 und A1 ansprechen, was für den Zweck etwas exotisch wäre…

Gemeint waren tatsächlich A0 und A1, deshalb die URL zum Bild. Habe das ganze nun wieder umgesteckt auf D10 und D11.

Egal ob
SoftwareSerial mySerial(11, 10);

oder
SoftwareSerial mySerial(10, 11);

Es scheint nichts anzukommen.
Sende ich etwas über den Serial Monitor leuchtet die TX LED auf, RX(also empfangen) nie.

Habe diese selbstgebastelte RS232/TTL Platine nun direkt an der Waage, ohne fummelige Kabel.

Am besten ist in der Tat erst mal das Teil direkt an den PC hängen und mit einem Programm wie HTerm testen. Dann hat man nur eine Baustelle und kann besser testen was da wirklich gesendet wird.

So, nun habe ich die Waage wieder direkt am COM-Port des Rechners.
Die Waage lieferte hier kontinuierlich korrekte Werte an HTerm.

output_2016-04-08_11-18-16.txt (378 Bytes)

Dann hast du die korrekten Einstellungen.

Wenn Software Serial nicht geht, dann mal AltSoftSerial probieren: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html Auf die Pin-Belegung achten. Die ist da festgelegt!