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]
Łą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.
(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.
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:
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.
Zmień prędkość UART w Serial1.begin na inną, najwyraźniej to nie jest 9600.
(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?
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.
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 [
attachment=1099]
Pokaż co wypluwa w monitorze string "x"
(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)