はじめに
前回「PyQt5」を使ってPython-Arduino間でシリアル通信を行いました。touch-sp.hatenablog.com
今回PyQt6を使用するためにスクリプトを書き換えました。
目的
今回の目的はWSL2とArduino間でシリアル通信を行うこととします。Arduinoのスケッチは前回から変更していません。Python環境の構築
「pyqt6」と「pyyaml」をインストールしました。pipで可能です。「pyserial」のインストールは不要です。WSL2でPyQtを使うための設定はこちらを参照して下さい。「pyyaml」についてはこちらを参照して下さい。
PythonスクリプトとYAMLファイル
Pythonスクリプト
from PyQt6 import QtSerialPort from PyQt6.QtCore import QIODevice from PyQt6.QtWidgets import QWidget, QApplication, QPushButton, QHBoxLayout from constructGUI import construct class Window(QWidget): def __init__(self): super().__init__() self.initUI() self.serial = QtSerialPort.QSerialPort( '/dev/ttyACM0', baudRate=QtSerialPort.QSerialPort.BaudRate.Baud9600) self.serial.open(QIODevice.OpenModeFlag.WriteOnly) def initUI(self): self.setWindowTitle("pyqt-serial sample") self.button_on = construct(QPushButton('on'), 'settings.yaml', 'button_1') self.button_on.clicked.connect(self.led_on) self.button_off = construct(QPushButton('off'), 'settings.yaml', 'button_1') 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()
YAMLファイル(「settings.yaml」)
button_1: type: QPushButton width: 200 height: 80 fontFamily: times fontPoint: 24 fontBold: True
実行結果
Pythonスクリプトを実行する前にWSL2上で以下の1行を実行する必要があります。sudo chmod 777 /dev/ttyACM0
こういうGUIが表示されます。
ボタンを押すことでArduinoボード上のLEDをつけたり消したりできます。
環境
Windows 11 Ubuntu 20.04 on WSL2
usbipd-win 1.3.0
WSL バージョン: 0.56.2.0 カーネル バージョン: 5.10.102.1 WSLg バージョン: 1.0.30 MSRDC バージョン: 1.2.2924 Direct3D バージョン: 1.601.0 Windows バージョン: 10.0.22000.593
PyQt6==6.2.3 PyQt6-Qt6==6.2.4 PyQt6-sip==13.2.1 PyYAML==6.0
その他(接続を簡略化)
接続を簡略化するためにはこちらが役に立つと思います。touch-sp.hatenablog.com