Datentransfer Waage - Arduino Uno simulieren

Hallo Leute!

Mich beschäftigt gerade folgendes Problem:

Möchte eine Laborwaage mit RS232-Schnittstelle mit einem Arduino Uno verbinden und in weiterer Folge die gewogenen Messwerte auswerten. Laut Beschreibung werden 14 Byte für die Datenübertragung eines Messwertes verwendet.

Leider habe ich meine Waage noch nicht erhalten. Ist es möglich, so einen Datentransfer zwischen Waage und Arduino zu simulieren? Soweit ich jetzt aber nachgelesen habe geht das mit Hex-Werten aber nicht über den Seriellen Monitor.

Vielleicht kann mir hier ja jemand eine kleine Hilfestellung geben wie ich hier vorzugehen habe.

Vielen Dank im Voraus,

mfG Patrick

patrickk83: Leider habe ich meine Waage noch nicht erhalten. Ist es möglich, so einen Datentransfer zwischen Waage und Arduino zu simulieren? Vielleicht kann mir hier ja jemand eine kleine Hilfestellung geben wie ich hier vorzugehen habe.

Mit einem zweiten Arduino ist das kein Problem. Du musst auf diesem lediglich die serielle Schnittstelle entsprechend der Schnittstelle der Waage konfigurieren. Wie Du dann Werte beliebiger Art darüber schickst, weiß ich nicht. Aber es gibt hier im Forum jemanden, der seinen Messschieber mit einem Arduino ausgelesen hat (AFAIR doc arduino). Wenn er wach ist, meldet er sich vermutlich eh.

Gruß

Gregor

PS: Ich würde wohl warten, bis die Waage vor mir liegt. In der Praxis sind die Dinge manchmal nicht ganz genau so wie in einem Datenblatt. Das Leben kann manchmal echt beschissen sein.

Habe leider nur einen Arduino hier rumliegen... Hab auf einem Blog ein paar Beispiele gefunden, mit denen zwischen der IDE Processing und dem Arduino kommuniziert wird. Werde damit mal mein Glück versuchen.

Hier noch der Link für alle die es interessiert: Serial Communication

Vielen Dank für die Tipps!!

Werde mich mal durch den Thread kämpfen :-)

patrickk83: Möchte eine Laborwaage mit RS232-Schnittstelle mit einem Arduino Uno verbinden und in weiterer Folge die gewogenen Messwerte auswerten.

Denke daran, dass der Arduino für RS232 einen Konverter braucht. Der Arduino hat TTL-Seriel, was zwar im Datenprotokoll gleich RS232 ist, aber RS232 arbeitet mit anderen Spannungspegeln (nagtive, bis 15V), die sogar den UNO beschädigen können. Deshalb braucht man einen Konverter z.B. auf MAX232-Basis. Nicht dass du die Waage zwar da hast, aber trotzdem nichts mit ihr anfangen kannst, da du sie nicht mit dem Uno verbinden kannst.

Vielen Dank für diese nützliche Info!

Kannst du mir eventuell einen Konverter empfehlen? Gibt es da vielleicht sogar was als Shield?

LG

Irgendwie stehe ich total auf der Leitung...

Wenn man als Beispiel für eine Messung 5,5kg annimmt, wie müsste ich dies im Terminal Programm eingeben und senden?

" 5.5 kg\r\n" (vor und nach den 5en sind jeweils Leerzeichen)

oder hexadezimal

"20 20 20 20 35 2E 35 20 20 20 6B 67 0D 0A"

Wenn du nach MAX232 googlest, dann findest du eine Menge Angebote, wo du dir das passende aussuchen kannst.

Dein Projekt ist allerdings ein Mega oder Leonardo besser als der UNO geeignet. Beim UNO ist die Hardware-Seriell-Schnittstelle durch den USB-Port blockiert. Man braucht dann Software-Seriell, was etwas eingeschränkt ist. Beim Leonardo ist USB und Seriell getrennt, der Mega hat mehrere serielle Schnittstellen.

Habe mal folgenden Code getestet:

const byte anzBytes = 14;
char empfBytes[anzBytes];

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println("<Arduino ready>");
}

void loop() {
  // put your main code here, to run repeatedly:
  while (Serial.available() > 0)
  {
    for (int i=0; i<anzBytes; i++)
    {
      empfBytes[i] = Serial.read();
      Serial.println(empfBytes[i]);
    }
  }
}

Im Terminal habe ich dann diese Zeichenfolge innerhalb der " " eingegeben:

" 12.345 kg\r\n"

Als Ergebnis habe ich dann dies erhalten:

ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
 
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
 
1
2
.
3
4
5
 
k
g
C
L
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ

Würde gerne die empfangenen Daten mit Switch-Case auswerten…

Die Variante mit dem end-marker gefällt mir mal ganz gut. Die Waage wird in weiterer Folge mit dem Hex-Code 1B 70 zur Übertragung aufgefordert. Wenn ich das jetzt richtig verstehe, so müsste diese Variante ja genau passen da ich ohnehin keinen start-marker benötige. Bitte korrigiert mich wenn ich jetzt falsch liegen sollte.

Ich werde also diesen Code verwenden:

const byte numChars = 14;
char receivedChars[numChars]; // an array to store the received data

boolean newData = false;

void setup() {
 Serial.begin(9600);
}

void loop() {
 recvWithEndMarker();
 showNewData();
}

void recvWithEndMarker() {
 static byte ndx = 0;
 char endMarker = '\n';
 char rc;

 // if (Serial.available() > 0) {
 while (Serial.available() > 0 && newData == false) {
   rc = Serial.read();

   if (rc != endMarker) {
     receivedChars[ndx] = rc;
     ndx++;
     if (ndx >= numChars) {
       ndx = numChars - 1;
     }
   }
   else {
     receivedChars[ndx] = '\0'; // terminate the string
     ndx = 0;
     newData = true;
   }
 }
}

void showNewData() 
{
 if (newData == true) 
 {
   Serial.println(receivedChars);
   newData = false;
 }
}

Ich halte von der Emulation der Waage wenig da Du weder 100% das Protokoll bzw die übertragenen Daten kennst noch die Waage zur Kontrolle der Daten zu Verfügung hast. Warte auf die Waage und arbeite mir ihr. Grüße Uwe