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ć):



