• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 1 głosów - średnia: 5
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Mega i waga na RS232C
#1
Witam wszystkim,
jestem bardzo początkujący w temacie arduino (moje to Mega 2560). Chciałbym zrobić prostą rzecz. Mam wagę Kern DE 150K2D (scan z manuala o RS232 załączony poniżej) i sczytywać z niej wagę do arduino. W tym celu dokupiłem konwerter RS232/TTL (taki ). Złącza DB-9 w obu urządzeniach są żeńskie, czyli łączę Rx z Rx i Tx z Tx (Waga-konwerter) czy na odwrót ? Następnie połączyłem konwerter i Arduino (Rx do pinu 48 i Tx do pinu 46 wg dokumentacji AltSoftSerial). Spróbowałem prostego kodu:
Kod:
#include <AltSoftSerial.h>
AltSoftSerial mySerial;
#define TwobitDelay 200

void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
}
void loop()
{
while (mySerial.available()){
   Serial.println(mySerial.read(), OCT);
   delayMicroseconds(TwobitDelay);
}
}
Uskuteczniam różne kombinacje i w żaden sposób to nie działa. Mógłby mi ktoś pomóc z tym tłumacząc łopatologicznie? Z góry dziękuję
}[/url][url=https://ibb.co/bJRHhS4][Obrazek: KERN.png]
 
Odpowiedź
#2
Łączysz tx-rx. Jesli masz ttl-usb połączyć do PC i zobacz co waga ci wysyła sadze ze najpierw zmusisz zrobić komunikacie po przed jakiś terminal a następnie tworzyć program na arduino. Bo to pozwali ci sprawdzić czy twoje zapytania uzyskują odpowiedz.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#3
(02-07-2020, 12:34)Darnok1911 napisał(a): moje to Mega 2560

Dla czego więc sof serial, skoro masz cztery hard.

(02-07-2020, 12:34)Darnok1911 napisał(a): Rx z Rx i Tx z Tx (Waga-konwerter) czy na odwrót ?
}

Na odwrót.

I ostatnia sprawa. Mi się wydaje, że port w tej wadze nie pracuje na poziomach TTL i można podpinać Arduino bezpośrednio do portu.
Zdecydowana większość urządzeń przystosowana jest do portów emulowanych pracujących na logice 5V.
Podpiąłem już kilkadziesiąt wag do uC i jeszcze nie spotkałem się z poziomami TTL.

edit: Ale powinieneś to pomierzyć, zanim cokolwiek zrobisz.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#4
Ok, dzięki za odpowiedzi. Rzeczywiście pomiar wykazał napięcie na poziomie TTL i podłączyłem arduino bezpośrednio bez softawareSerial Tx->pin 19 Rx i Rx-> Pin18 Tx. Użyłem następującego programu:
Kod:
void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    Serial1.write(119);
   int inByte = Serial1.read();
    Serial.write(inByte);
  }

  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
   
  }
Jak wcisnę przycisk print dostaję następujący ciąg z obciążeniem 1,746 kg:
[Obrazek: wynik.png]
 Ustawiłem funkcję AU PC, czyli ciągłe wysyłanie wagi i ten ciąg znaków zmienia się z wagą. Jak to zdekodować? Wg. dokumentacji to ASCII, próbowałem zmienną char, ale to samo.
 
Odpowiedź
#5
Zmień prędkość UART w Serial1.begin na inną, najwyraźniej to nie jest 9600.
 
Odpowiedź
#6
(05-07-2020, 18:24)kaczakat napisał(a): Zmień prędkość UART w Serial1.begin na inną, najwyraźniej to nie jest 9600.
Ustawiłem w wadze 9600 Baud, więc inna nie może być. Czyli to są zupełnie błędnie odebrane dane?
 
Odpowiedź
#7
Może to jest RS232 ale na poziomie napięć 5V, czyli odwrócona logika, gdzie 0 jest 1... W innym wątku ktoś próbował taki konwerter podłączyć do Arduino i też miał głupoty drukowane. Może zerknij co tam miał i kup sobie taki, do Arduino nie podłączysz, ale możesz potestować komunikację z terminala PC. Inny pomysł to odwrócić sygnał - tranzystor, wzmacniacz operacyjny czy dedykowany scalak.
 
Odpowiedź
#8
Trochę czasu minęło, usiadłem na powrót do tego i zadziałało. Program był źle napisany plus walnięty kabel D-sub.
Teraz mam jednak inny problem. Chcę mierzyć przepływ masowy za pomocą wagi. Stawiam zbiornik z cieczą na wadze i na podstawie ubytku masy w czasie oblicza przepływ. Wagę przesyła w porządku, ale obliczenia się sypią. Przepływ (flow) oblicza tylko przy dużych zmianach wagi. Przy niewielkich (20g/s) pokazuje 0.0000 kg/h mimo, że wedle pojedynczych działań wypluwanych przez Serial.print powinno wyjść te 72 kg/h. Dodatkowo zauważyłem, że Serial.print z końca programu potrafią wywalać - jeżeli zmienię je miejscami poszczególnych działań. Robię tu jakiś poważny błąd w programie? Program jest następujący:
Kod:
String x ="";
float y =0;
float y1=0;
unsigned long czas0 = 0;
unsigned long czas1 = 0;
float flow = 0;

void setup() {

Serial.begin(9600);
  Serial1.begin(9600);
}

void loop() {
    Serial1.write("w"); // Wysyłam komendę do wagi po której odpowiada aktualną wagą
   
  if (Serial1.available())
{
   x = Serial1.readStringUntil(0x0D); //Czyta do Carriage return
  
   czas1=millis(); // Zapisuje czas kiedy bylo pobrane
   y = x.toFloat(); // zamiana string na float

   Serial.println(y,4);
   flow = (y1-y)/(czas1-czas0)*3600000; //przepływ w kg/h
  
 Serial.println(czas1-czas0);
 Serial.println(y1-y,3);
 Serial.println(x);

Serial.println(flow,3);
  y1=y;
  czas0=czas1;
}

}
Dołączam jak to wygląda ze strony wagi    
 
Odpowiedź
#9
Pokaż co wypluwa w monitorze string "x"
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#10
(24-01-2021, 23:33)Jarewa0606 napisał(a): Pokaż co wypluwa w monitorze string "x"

Poniżej wycinek z monitora jak naciskam ręcznie:
Kod:
x=
       3.886   
y=3.8860
różnica czasu298
y-y1=1.060
flow=81084.562
x=
       0.016   
y=0.0160
różnica czasu299
y-y1=-3.870
flow=46980.605
x=
       0.012   
y=0.0120
różnica czasu=298
y-y1=-0.004
flow=338.255
x=
       0.006   
y=0.0060
różnica czasu=299
y-y1=-0.006
flow=216.722
Teraz zauważyłem dużą ilość pustych pół przed wartością x. Dodatkowo na samym początku jak waga jest 0 to x jest wyświetlane z jednostką, a potem jej już nie ma (0.000 kg).

Edit: Tutaj przy małym przepływie wody. Po obcięciu stringu x z pustych miejsc, zamianie kg na g i dodanym delay 1500ms:
Kod:
x=
-594
y=-594.00
różnica czasu1502
y-y1=-22.000
flow=-2.8
x=
-614
y=-614.00
różnica czasu1502
y-y1=-20.000
flow=-2.9
x=
-634
y=-634.00
różnica czasu1503
y-y1=-20.000
flow=-3.0
x=
-658
y=-658.00
różnica czasu1503
y-y1=-24.000
flow=-3.1
x=
-676
y=-676.00
różnica czasu1502
y-y1=-18.000
flow=-3.2
Jak widać wartość flow nie przystaje do tego co pokazuje y-y1 i różnica czasu (pomijam wartości ujemne)
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości