はじめに
以前USB接続のWebカメラを認識されるために「usbipd-win」というのを使いました。touch-sp.hatenablog.com
同じ「usbipd-win」でArduinoも認識できると知ったのでさっそく使ってみることにしました。
Arduino Uno R3互換ボード(秋月電子製)を使用しました。
目的
今回の目的はWSL2とArduino間でシリアル通信を行うこととします。Arduinoへのスケッチ書き込みはWindowsで行いました。結果
全く問題なく動作しました。方法
「usbipd-win」のインストール
「usbipd-win」の最新はバージョン2.1ですが1.3を使いました。カメラの接続をするときに2.0以上はすべてうまくいきませんでした。インストールと設定はこちらを参照して下さい。
「usbipd-win」を簡単に操作するためのGUIを以前作りました。今回も同じものが使用可能です。
touch-sp.hatenablog.com
このようなGUIになります。今回は1-1がArduinoです。
接続した後にWSL上でlsusbを実行すると接続を確認できます。
今回は「AKIZUKI DENSHI TSUSHO AE-ATMEGA-UNO-R3」と製品名が表示されました。
(serial) mini@deskmini:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 002: ID 2a50:204b AKIZUKI DENSHI TSUSHO AE-ATMEGA-UNO-R3 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Python環境の構築
「pyserial」のみインストールしました。pipで可能です。Arduinoスケッチ
ボード上のLEDをつけたり消したりするだけのスケッチです。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); } } }
Pythonスクリプト
ポートは「/dev/ttyACM0」になるようです。Pythonスクリプトを実行する前にWSL2上で以下の1行を実行する必要があります。
sudo chmod 777 /dev/ttyACM0
import serial, time print("Open Port") ser =serial.Serial("/dev/ttyACM0", 9600) time.sleep(1.5) while(True): input_key = input('入力:') if input_key == 'q': break elif input_key == '1': ser.write((0).to_bytes(1, 'big')) elif input_key == '2': ser.write((1).to_bytes(1, 'big')) else: None print("Close Port") ser.close()
「1」を入力したら点灯
「2」を入力したら消灯
「q」を入力したら終了
環境
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.9.5 pyserial==3.5
2022年3月13日追記
「PyQt5」編を書きました。touch-sp.hatenablog.com
2022年3月31日追記
「PyQt6」編を書きました。touch-sp.hatenablog.com