RaspberryPi4でPlatformIOを使って複数台のArduinoへ書き込む

# まえおき
ラズパイにArduino(Seeedino Xiao)を複数台USBハブ経由でつないで書き込みをすることになり、その手順をまとめました。PlatformIOを使うとsshでそれぞれのArduinoに書き込めるので便利です。最終的に13台までは動作確認できました。

## 環境
Raspberyy Pi 4 Model B
OS: [2021-05-07-raspios-buster-armhf.zip](https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2021-05-28/2021-05-07-raspios-buster-armhf.zip
)

# 本題
## 作業の流れ
まずは1台、USBデバイス名を固定してみる
PlatformIOのインストール
プログラム書き込み
2台目以降

## まずは1台、USBデバイス名を固定してみる
USBのデバイス名を固定しないと、ラズパイの電源を入れなおしたときなどに不都合が起きるので、まずはUSBのデバイス名を固定します。プログラムを書き込むときにも、どれに書き込んだかわかりやすくなると思います。

つながれているUSBデバイスは
```
$ ls /dev/tty*
```
で確認できるので、USBデバイスをつなぐ前とつないだ後に実行して、新たに追加されたものがつないだデバイスだとわかります。
まずはひとつつなぎ、
`/dev/ttyACM0`（デバイスによって異なります）
 というのが追加されたので、これが今つないだデバイスとなります。
次に以下のコマンドでUSBデバイスの詳細な情報を確認します。
```
$ sudo udevadm info -q all -n /dev/ttyACM0
```
結果の中で、以下の部分に注目します。
`E: DEVPATH=/devices/platform/scb/fd500000.pcie/pci0000:00/0000:00:00.0/0000:01:00.0/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/tty/ttyACM0`

**/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/** （USBデバイスをつなぐ場所によって異なります）をメモして、rulesファイルを設定します。
```
$ sudo nano /etc/udev/rules.d/90-usb.rules
```
```tx:/etc/udev/rules.d/90-usb.rules
ACTION=="add", DEVPATH=="*/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/*", SYMLINK+="XIAO-00"
```

`SYMLINK+="xxxxx"`で任意のデバイス名を設定できます。
以上がUSBデバイス名の固定手順です。


## PlatformIOのインストール
つづいてPlatformIOのインストールです。

```
$ pip3 install platformio
$ sudo reboot
```
今回はArduinoのプロジェクトファイルはWindowsでPlatformIOでpioTestというプロジェクト名でつくっておいて、WinSCPなどを使ってファイル転送することにします。
`/home/pi/`に`Arduino`というディレクトリをつくって、プロジェクトフォルダごと転送しました。

次は、設定ファイルを更新します。
```
$ cd /home/pi/Arduino/pioTest
$ nano platformio.ini
```

```ini:/home/pi/Arduino/pioTest/platformio.ini        
; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:seeed_xiao]
platform = atmelsam
board = seeed_xiao
framework = arduino
monitor_speed = 115200
upload_port = /dev/XIAO-00
platform_packages = toolchain-gccarmnoneeabi@~1.90301.0
```
`upload_port = /dev/XIAO-00` で先ほどSYMLINKで指定したデバイス名となっています。
これで書き込む準備ができました。

## プログラム書き込み
書き込みます。
```
$ pio run -t upload
```

## 2台目以降
同じ要領で、1台目をつないだまま2台目をつなぎます。先ほど`/dev/ttyACM0`だったので`/dev/ttyACM1`が追加されると思います。
```
$ ls /dev/tty*
$ sudo udevadm info -q all -n /dev/ttyACM1
```
DEVPATHの情報をもとに、rulesファイルを更新していきます。
4台つなぐとこうなりました。
```tx:/etc/udev/rules.d/90-usb.rules
ACTION=="add", DEVPATH=="*/usb1/1-1/1-1.3/1-1.3.1/1-1.3.1:1.0/*", SYMLINK+="XIAO-00"
ACTION=="add", DEVPATH=="*/usb1/1-1/1-1.3/1-1.3.2/1-1.3.2:1.0/*", SYMLINK+="XIAO-01"
ACTION=="add", DEVPATH=="*/usb1/1-1/1-1.3/1-1.3.3/1-1.3.3:1.0/*", SYMLINK+="XIAO-02"
ACTION=="add", DEVPATH=="*/usb1/1-1/1-1.3/1-1.3.4/1-1.3.4:1.0/*", SYMLINK+="XIAO-03"
```

rulesファイルを更新したらリブートしてください。
```
$ sudo reboot
```
あとはplatformio.iniのupload_portを書き込みたいデバイス名にすれば任意のデバイスに書き込めます。
```ini:/home/pi/Arduino/pioTest/platformio.ini
upload_port = /dev/XIAO-01   
```
```
$ pio run -t upload
```

お疲れさまでした。

# 参考記事
https://www.raspberrypirulo.net/entry/usbname-fix-port

https://community.platformio.org/t/error-getting-toolchain-gccarmnoneeabi-on-raspberry-pi-4-for-platform-atmelsam/23989

https://beta-notes.way-nifty.com/blog/2020/06/post-6f19ad.html