はじめに
必要なことは「usbipd-winの導入」と「PyQt6の導入」です。良ければ過去の記事を参考にして下さい。
usbipd-winの導入
touch-sp.hatenablog.comPyQt6の導入
touch-sp.hatenablog.comArduinoとの接続
こちらを参考にして下さい。Ubuntu 20.04を使っている時の記事ですがUbuntu 22.04でも同じ手順で接続可能です。
touch-sp.hatenablog.com
Pythonスクリプト
上のようなトグルボタンでLEDをつけたり消したりします。オリジナルのトグルボタンを定義したPythonファイルをGitHUbで公開しています。まずはそれをダウンロードして下さい。(説明はこちら)
import os from urllib.request import urlretrieve url = 'https://raw.githubusercontent.com/dai-ichiro/pyqt6_yaml/main/qtyaml.py' fname = os.path.basename(url) if not os.path.isfile(fname): urlretrieve(url, fname)
あとは以下のスクリプトを実行するだけです。
from PyQt6 import QtSerialPort from PyQt6.QtCore import QIODevice from PyQt6.QtCore import pyqtSlot from PyQt6.QtWidgets import QWidget, QApplication, QLabel, QHBoxLayout from PyQt6.QtGui import QFont from qtyaml import ToggleButton 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('arduino LED') font = QFont() font.setPointSize(72) font.setBold(True) self.on_off_label = QLabel('off') self.on_off_label.setFont(font) self.toggle_button = ToggleButton() self.toggle_button.clicked.connect(self.handle_clicked) mainFrame = QHBoxLayout() mainFrame.addWidget(self.on_off_label) mainFrame.addWidget(self.toggle_button) self.setLayout(mainFrame) @pyqtSlot(bool) def handle_clicked(self, on_off): match on_off: case True: self.on_off_label.setText('on') self.serial.write((0).to_bytes(1, 'big')) case False: self.on_off_label.setText('off') 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()
Arduinoスケッチ
<注意>Arduinoへのスケッチ書き込みはWindowsで行っています。void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); } void loop() { if(Serial.available()>0){ int var = Serial.read(); if(var == 0){ digitalWrite(LED_BUILTIN, HIGH); }else{ digitalWrite(LED_BUILTIN, LOW); } } }