• 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++

Object Storage Arubacloud
0 głosów
864 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,290 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,000 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,290 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,420 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 184 wizyt
0 głosów
1 odpowiedź 263 wizyt
0 głosów
0 odpowiedzi 429 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...