はじめに
前回「pyserial」を使ってPython-Arduino間でシリアル通信を行いました。touch-sp.hatenablog.com
あまり知られていないと思いますが実は「PyQt」を使ってもシリアル通信ができます。
その際には「pyserial」のインストールは不要です。
PyQt6編はこちらです。
touch-sp.hatenablog.com
目的
今回の目的は前回同様WSL2とArduino間でシリアル通信を行うこととします。Arduinoのスケッチは前回から変更していません。
Python環境の構築
「pyqt5」のみインストールしました。pipで可能です。先ほども書きましたが「pyserial」のインストールは不要です。WSL2でPyQtを使うための設定はこちらを参照して下さい。Pythonスクリプト
from PyQt5 import QtSerialPort from PyQt5.QtCore import QSize, QIODevice from PyQt5.QtWidgets import * from PyQt5.QtGui import QFont class Window(QWidget): button_size = QSize(200, 80) def __init__(self): super().__init__() self.initUI() self.serial = QtSerialPort.QSerialPort( '/dev/ttyACM0', baudRate=QtSerialPort.QSerialPort.Baud9600) self.serial.open(QIODevice.WriteOnly) def initUI(self): self.setWindowTitle("pyqt-serial sample") self.button_on = QPushButton('on') self.button_on.setFont(QFont("Times", 24, QFont.Bold)) self.button_on.setFixedSize(self.button_size) self.button_on.clicked.connect(self.led_on) self.button_off = QPushButton('off') self.button_off.setFont(QFont("Times", 24, QFont.Bold)) self.button_off.setFixedSize(self.button_size) self.button_off.clicked.connect(self.led_off) self.main_layout = QHBoxLayout() self.main_layout.addWidget(self.button_on) self.main_layout.addWidget(self.button_off) self.setLayout(self.main_layout) def led_on(self): self.serial.write((0).to_bytes(1, 'big')) def led_off(self): self.serial.write((1).to_bytes(1, 'big')) def closeEvent(self, e): self.serial.close() e.accept() if __name__ == "__main__": app = QApplication([]) ex =Window() ex.show() app.exec_()
実行結果
こういうGUIが表示されます。ボタンを押すことでArduinoボード上のLEDをつけたり消したりできます。
環境
Windows 11 Ubuntu 20.04 on WSL2
WSL バージョン: 0.51.3.0 カーネル バージョン: 5.10.93.2 WSLg バージョン: 1.0.30 Windows バージョン: 10.0.22000.556
python 3.8.10 PyQt5==5.15.6 PyQt5-Qt5==5.15.2 PyQt5-sip==12.9.1