• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

pobieranie danych portu szeregowego Arduino przy użyciu c++

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
1,406 wizyt
pytanie zadane 3 października 2020 w C i C++ przez antekelektronik Obywatel (1,120 p.)
Witam, zbudowałem prostego robota z Arduino i chciałbym wchodzić z nim w interakcję poprzez komputer. Ne chciałbym używać surowego serial-monitora z Arduino IDE ale umiem programować w c++ (programować to za dużo powiedziane bo jestem początkujący ale prostą aplikacje z interfejsem zrobić potrafię) i pojawia się problem do nie wiem dokładnie jak mogę wrzucić dane z portu szeregowego do mojego kodu. I właśnie chciałbym się zapytać czy istnieje jakaś biblioteka lub funkcja którą mógłbym skopiować do obsługi portu szeregowego? Z góry dziękuję za wszystkie odpowiedzi.
komentarz 3 października 2020 przez Oscar Nałogowiec (29,360 p.)
Trochę nie rozumiem czy masz problem na Arduino czy na PC?
komentarz 4 października 2020 przez antekelektronik Obywatel (1,120 p.)
na PC z kodem c++, nie wiem jak wrzucić dane z arduino do kodu c++
komentarz 4 października 2020 przez tkz Nałogowiec (42,060 p.)
Chcesz, by program napisany w C++ używał danych z portu szeregowego?
komentarz 4 października 2020 przez antekelektronik Obywatel (1,120 p.)
tak
komentarz 4 października 2020 przez Oscar Nałogowiec (29,360 p.)

Może trochę dziwnie, ale ja już dawno nie steruje portem szeregowym z własnych programów. Stosuje połączenie TCP oraz uruchamiam sobie jakiś programik do sprzężenia serial<>TCP. Tam przesuwa się cała zabawa z ustawianiem portu, zwykle w parametrach wywołąnia. Tego typu programów jest cała masa, zarówno pod windą, jak i linuxem. Najprościej pod linuxem użyć polecenia socat. Są też specjalizowane bramki serial<>TCP w postaci sprzętowej.

Dzięki wykorzystaniu połączenia sieciowego można łatwo oddzielić komputer sterujący od urządzenia. Łatwiej też kontrolować przesyłane dane.

Metoda nie zadziała, jeśli ważne są nie tylko przesyłane dane, ale i np. stan linii sterujących RS-a albo zmienia się prędkość lub inne paramtery połączenia,

 

2 odpowiedzi

+2 głosów
odpowiedź 4 października 2020 przez DawidK Nałogowiec (37,910 p.)

Niedawno bawiłem się trochę z serialem na arduino i zrobiłem mały projekt arduino+mini aplikacja, z tym, że w pythonie, ale może Ci się przyda.

Na arduino jest wgrany prosty program, który sprawdza, czy serial jest dostępny i pobiera z niego dane - w tym przypadku jeden znak R,G,B (założyłem sobie, że włącza to odpowiednie kolory diody) i N które wyłącza diode.

przydatne funkcje to:

Serial.begin(9600);

Serial.available();

Serial.read();
byte data = 0;
int red_LED = 3;
int green_LED = 4;
int blue_LED = 5;

void setup() {
  Serial.begin(9600);
  pinMode(red_LED, OUTPUT);
  pinMode(green_LED, OUTPUT);
  pinMode(blue_LED, OUTPUT);
}

void loop() {
  if(Serial.available()>0){
    data = Serial.read();
    if(data=='R'){
      digitalWrite(red_LED, HIGH);
      digitalWrite(green_LED, LOW);
      digitalWrite(blue_LED, LOW);
    }
    if(data=='G'){
      digitalWrite(red_LED, LOW);
      digitalWrite(green_LED, HIGH);
      digitalWrite(blue_LED, LOW);
    }
    if(data=='B'){
      digitalWrite(red_LED, LOW);
      digitalWrite(green_LED, LOW);
      digitalWrite(blue_LED, HIGH);
    }
    if(data=='N'){
      digitalWrite(red_LED, LOW);
      digitalWrite(green_LED, LOW);
      digitalWrite(blue_LED, LOW);
    }
  }
}

W Twoim przypadku, mogą to być np 5 znaków odpowiadające za lewo, prawo, tył, przód i zatrzymanie.

Do zrobienia aplikacji skorzystałem z pythona modułu serial i pyQt5

Trzeba oczywiście ustawić własny port do którego podłączone jest arduino (u mnie był to akurat COM6) - 7 linijka w kodzie.

ser = serial.Serial('COM6',9600,timeout=.1)

najistotniejsze są te fragmenty, gdzie przy użyciu metody write() z modułu serial wysyła się odpowiednie znaki:

ser.write(b'R')

Reszta to w zasadzie GUI.

import serial
import sys
import time
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel
from PyQt5.QtGui import QPixmap

ser = serial.Serial('COM6',9600,timeout=.1)
time.sleep(1)

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'RGB - LED'
        self.left = 100
        self.top = 100
        self.width = 250
        self.height = 290

        self.label = QLabel(self)
        self.label.resize(150, 25)
        self.label.setStyleSheet("font-size :20px;")

        self.led_image = QLabel(self)

        self.initUI()
    
    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        
        buttonRed = QPushButton('Red', self)
        buttonRed.move(10,10)
        buttonRed.clicked.connect(self.on_click_red)

        buttonGreen = QPushButton('Green', self)
        buttonGreen.move(10,40)
        buttonGreen.clicked.connect(self.on_click_green)
        
        buttonBlue = QPushButton('Blue', self)
        buttonBlue.move(10,70)
        buttonBlue.clicked.connect(self.on_click_blue)

        buttonOff = QPushButton('Off', self)
        buttonOff.move(10,120)
        buttonOff.clicked.connect(self.on_click_off)

        self.label.setText("LED is off")
        self.label.move(100, 10)

        image = QPixmap('offled.png')
        self.led_image.setPixmap(image)
        self.led_image.move(100, 25)
        
        self.show()
    
    def on_click_red(self):
        ser.write(b'R')
        self.label.setText("LED is red")
        image = QPixmap('redled.png')
        self.led_image.setPixmap(image)
    
    def on_click_green(self):
        ser.write(b'G')
        self.label.setText("LED is green")
        image = QPixmap('greenled.png')
        self.led_image.setPixmap(image)

    def on_click_blue(self):
        ser.write(b'B')
        self.label.setText("LED is blue")
        image = QPixmap('blueled.png')
        self.led_image.setPixmap(image)
    
    def on_click_off(self):
        ser.write(b'N')
        self.label.setText("LED is off")
        image = QPixmap('offled.png')
        self.led_image.setPixmap(image)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

Całość wygląda mniej więcej tak:

Istotne jest to, że jak odpalisz program to nie wgrasz nic płytkę i nie urochomisz serial monitora i na odwrót uruchomienie serial monitora w IDE lub wgrywanie kodu zablokuje port i nie pozwoli wgrać programu.

Grafiki przedstawiające ledy (powinno dać się je pobrać):

 

komentarz 4 października 2020 przez antekelektronik Obywatel (1,120 p.)
dzięki
+1 głos
odpowiedź 4 października 2020 przez profesorek96 Szeryf (91,400 p.)
Inaczej mówiąc potrzebujesz wysyłać dane po porcie szeregowym. Niestety nie napisałeś jakiego systemu używasz, Windows, Linux, MacOS ?

Ja na twoim miejscu do komunikacji użył bym biblioteki pyserial, multi platformowej biblioteki napisanej dla języka python.

https://www.obliczeniowo.com.pl/972

Jeśli jednak chciałbyś to robić za pomocą języka C++ to ten materiał będzie pomocny:

https://stackoverflow.com/questions/15794422/serial-port-rs-232-connection-in-c

http://members.ee.net/brey/Serial.pdf
komentarz 4 października 2020 przez antekelektronik Obywatel (1,120 p.)
dzięk za odpowiedźi , windows 10

Podobne pytania

0 głosów
0 odpowiedzi 232 wizyt
0 głosów
1 odpowiedź 443 wizyt
0 głosów
0 odpowiedzi 582 wizyt

93,434 zapytań

142,429 odpowiedzi

322,662 komentarzy

62,799 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...