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


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino UNO + RS232 - sterowanie urządzeniem zewnętrznym
#1
Witam.
Mam problem ze sterowaniem poprzez port RS232.

Idea działania programu: program napisany pod Arduino UNO. Do Arduino UNO podpiąłem konwerter RS232 oparty na MAX3232. Do RS232 podpięte mam urządzenie które mogę sterować poprzez port szerwegowy. 
Parametry portu szeregowego do sterowania urządzeniem zewnętrznym to: 19200/8/1.
Rozkaz uruchomienia to: (PWR1)
Rozkaz wyłączenia to: (PWR0)
Dodatkowo podpiąłem dwa przyciski do portów 2 i 3 które maja wysyłać rozkaz po naciśnięciu przycisku.


Po naciśnięciu przycisków widzę że działają gdyż na arduino zapala się na chwilkę dioda TX czyli rozkaz jest wysyłany poprzez piny 0 i 1 (RX i TX) do konwertera, a na konwerterze miga dioda DS1 (więc rozkaz zostaje przyjęty według mnie).
W teorii "słowo-rozkaz " powinno więc wyjść do urządzenia i powinno się urządzenie załączyć. Niestety nie działa.

Czy ktoś jest w stanie pomóc i powiedzieć gdzie robię błąd?

oto KOD programu: 
//////////////////////////////////////////////////////////////////////
const int powerOnButtonPin = 2;
const int powerOffButtonPin = 3;

int powerOnButtonState = 0;
int powerOffButtonState = 0;

void setup() {
  pinMode(powerOnButtonPin, INPUT_PULLUP);
  pinMode(powerOffButtonPin, INPUT_PULLUP);
  Serial.begin(19200);
  delay(100);
}

void loop() {
  powerOnButtonState = digitalRead(powerOnButtonPin);
  powerOffButtonState = digitalRead(powerOffButtonPin);

  if (powerOnButtonState == LOW) {
    Serial.write("(PWR1)");
    delay(500);
  }
  if (powerOffButtonState == LOW) {
    Serial.write("(PWR0)");
    delay(500);
  }
  delay(100);
}

//////////////////////////////////////////////////////////////////////
z góry dziękuję za pomoc 

PS. Dodam tylko, że inne sterowniki pracujące na rs232 bez problemu uruchamiają i wyłączają urządzenie, więc rozkaz jest poprawny, kabel jest sprawdzony i działa. Chciałbym po prostu to samo uzyskać z wykorzystaniem arduino.
 
Odpowiedź
#2
Jak to ma być tekst to wysyłasz Serial.print /.println, a .write to wysyła dane bitowe, więc może zamienić na coś innego niż tekst, choć oczywiście czasami odbiornik może oczekiwać danych o takim układzie bajtów.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#3
(31-05-2024, 13:35)kaczakat napisał(a): Jak to ma być tekst to wysyłasz Serial.print /.println, a .write to wysyła dane bitowe, więc może zamienić na coś innego niż tekst, choć oczywiście czasami odbiornik może oczekiwać danych o takim układzie bajtów.

Dodatkowo podejrzewam jakiś problem z końcem linii - zwykle jak sterowanie jest tekstowe, polecenia kończą się nową linią (w różnych wariantach). Trochę tylko niepokoją mnie te nawiasy.
 
Odpowiedź
#4
no tak, może powinno być cos dodatkowego jeszcze by urządzenie wiedziało gdzie jest koniec rozkazu...
Pomyślałem że może pierw zmodernizuje układ by arduino nie wysyłało, a odbierało rozkaz i wyrzuciło mi to na Serial Monitor. A odczytywać będzie rozkaz który dostanie z wcześniej wspomnianego sterownika. Wtedy będę widział jaka powinna być prawidłowa składnia "słowa/rozkazu".
Jestem cos takie w stanie zrobić na arduino?
 
Odpowiedź
#5
(31-05-2024, 16:27)jonbrawo napisał(a): no tak, może powinno być cos dodatkowego jeszcze by urządzenie wiedziało gdzie jest koniec rozkazu...
Pomyślałem że może pierw zmodernizuje układ by arduino nie  wysyłało, a odbierało rozkaz i wyrzuciło mi to na Serial Monitor. A odczytywać będzie rozkaz który dostanie z wcześniej wspomnianego sterownika. Wtedy będę widział jaka powinna być prawidłowa składnia "słowa/rozkazu".
Jestem cos takie w stanie zrobić na arduino?

Skoro nawet nie wiesz jak steruje się to urządzenie to najpierw poszukaj w sieci - być może jest gdzieś instrukcja lub ktoś już to rozgryzł. A jeśli nie to po co ci Arduino w środku - i tak podejrzeć musisz na PC, więc można od razu na PC podejrzeć komunikacje sterownik<>urządzenie. Skoro to pracuje na standardowych RS-owych napięciach zadziałają zwykłe RS na kompie - dzisiaj to głównie przejściówki USB-RS, chociaż większość płyt głownych do stacjonarnych PC na piny do wyprowadzenia RS, ale to jednak ryzyko - w razie czego można uszkodzić płytę główną a nie przejściówkę za dwie dychy. Można nawet użyć Serial Monitor z Arduino IDE, Hyperterminal lub Putty. Sprawdź jakie są parametry - prędkość, format znaku itp.
 
Odpowiedź
#6
Gdybym sobie robił takie urządzenie czekające na rozkaz to użył bym znaku \r lub \n by wiedzieć kiedy przylatuje linia tekstu, ale wcale nie musi być to tak zrobione, może być też tak, że urządzenie przechowuje w buforze powiedzmy 10 ostatnich odebranych znaków, sprawdza to po każdym odebranym znaku i jeśli znajdzie w nim ciąg "(PWR1)" to wykonuje takie polecenie, czyści bufor.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#7
(31-05-2024, 13:35)kaczakat napisał(a): Jak to ma być tekst to wysyłasz Serial.print /.println, a .write to wysyła dane bitowe, więc może zamienić na coś innego niż tekst, choć oczywiście czasami odbiornik może oczekiwać danych o takim układzie bajtów.
 Dzięki za pomoc. zamiana z write na pintln poskutkowało Smile
Finalnie kod z tą linijką działa

Serial.println("(PWR1)");
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości