WSL2上のPythonでArduinoとシリアル通信をする【pyserial編】

はじめに

以前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です。
f:id:touch-sp:20220311002235p:plain:w400


接続した後に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