ArduinoにiPadから(嘘)、スケッチを書き込む

**RaspberryPiに心臓を捧げよ。**
せっかちな人は[ここ](#コンパイル書き込み役を別に用意するraspberrypiの利用)から

この記事は[Arduino Advent Calendar 2021](https://qiita.com/advent-calendar/2021/arduino)の3日目の記事です。
昨日は[@KeitetsuWorks](https://qiita.com/KeitetsuWorks)さんの[Arduino: 複数のLEDを別々の周期やON/OFF比で点滅させる](https://keitetsu.blogspot.com/2021/12/arduino-ledonoff.html)でした。

# モチベーション
最近は大学の講義もオンラインがほとんどで、たまに登校するときもiPadだけで事足りるようになってきた。便利だね。

ところがどっこい、今学期はプログラミングのTAがあった。このプログラミングの講義では導入としてArduinoを使う。TAなので、Arduinoにスケッチを書き込める環境が必要になってしまった。**このままでは俺のiPad悠々自適ライフが危うい！！**

# アプリを探す
「iPad arduino スケッチ 書き込み アプリ」とかで適当にググって探してみる。

…ないんだよな、これが。
[ArduinoCode - Arduino IDE (Compiler, Uploader & Serial Monitor)](https://apps.apple.com/jp/app/arduinocode-arduino-ide-compiler-uploader-serial-monitor/id1068753028)が一番近そうではあるけど、コメントを見るとコンパイルまではできないらしい。ダメじゃん。

# Pro Micro Web Updaterを思い出す
Pro Micro Web Updaterはせきごんさん([@_gonnoc](https://twitter.com/_gonnoc))が作ってらっしゃる自作キーボード勢向けのツール。ブラウザからシリアルポートを触って、Pro Micro(ATMEGA32U4)にhexファイルを書き込むことができる。

iPadでコンパイルできないならGithub Actionとかを利用してコンパイル→似た感じでブラウザからシリアルポートを触って書き込んだらいいじゃんって考えたわけ。いや、でも待って。WebKitってそんなことできる？そもそもiPadのシリアルポートって触れるの？？？

# コンパイル・書き込み役を別に用意する(RaspberryPiの利用)
**真打ち登場**
iPadだけって言うのは叶わぬ願いだったけど、ラズパイが1つくらいは大した荷物じゃないので及第点。

## ラズパイの環境

- Raspberry Pi OS Lite : v10.11
- arduino-cli alpha: v0.19.3

## 実現するには
まず、iPadとラズパイを繋ぐ(物理)手段が必要。今回はUSB Cハブを経由して有線LANで接続する。古めのiPadシリーズでもLightning - RJ45変換コネクタがあるはずなのでそれを使えば(多分)大丈夫。
Wi-Fiでもいいんだけど、大学とかのWi-FiはCaptive Portal(GUIでAgreeボタンとか押したら繋がるやつ)があったりして、ヘッドレスのラズパイで突破するのは難しそうで諦めた。

あとはラズパイにアクセスする手段。これはsshでいいでしょう。GUI環境じゃないとダメ！っていう人はVNC接続してください。iPadからVNCのやり方は知らんけど、僕の[過去記事](https://qiita.com/C2_now/items/cdadec8bfbddb81e4090)が参考になるかもしれない(し、ならないかもしれない、むしろならない)(ダイマ)。この記事で使ってるVNCクライアントはiOS版もリリースされてる(はず)。

sshするなら、そのためのアプリが必要。僕は[WebSSH](https://apps.apple.com/us/app/webssh-ssh-client/id497714887)を使ってる。無料版で十分使えて、サポートも充実してる。GithubページからQ&Aに助けを求めると結構すぐに助けに来てくれる。ありがたすぎるので僕は課金した。

ラズパイからArduinoに書き込む環境も必要。僕はこれにArduino CLIを使っている。ぶっちゃけ、GUI版のArduino IDEのが使いやすいと思うが、あいにくLite版のOSだった。まあなんとかなる。
この手順だけは家とかでやっておく必要がある。今回の場合だと、大学でラズパイをインターネットに繋ぐ術がないので。

## 手順
### 1. ラズパイにOSのインストール
よしなにどうぞ。Raspberry Pi Imagerを使うと楽。sshすることを考えて、OSをSDカードに焼いたら、SD直下に`ssh`という名前の空ファイルを作成しておくこと。

### 2. ラズパイにArduino CLI(Arduino IDE)のインストール
さっきも書いたけど、この手順だけはお家でPCからsshしてやろう。

GUIの人は適当にArduino IDEをインストールしてくれ。なお、GUI版OSを使ってる人もArduino CLIをインストールすることは可能。メリットあんまりないと思うけど。

Arduino CLIのインストールは以下で行う。

```
$ cd Downloads
$ wget https://downloads.arduino.cc/arduino-cli/arduino-cli_latest_Linux_ARMv7.tar.gz
$ tar xf arduino-cli*
$ mv arduino* arduino-cli
$ sudo mv arduino-cli /usr/local/bin
```

ダウンロードリンクがもしかしたら変わっているかもしれない。最新版は[ここ](https://arduino.github.io/arduino-cli/0.20/installation/)から確認して欲しい。Linux ARM 32bitのリンクのところ(Raspberry Pi OSをインストールすると32bitになる)。ちなみに記事執筆時(2021/11/26)で最新はv0.20.0。

バージョンを確認できたらインストールOK

```
$ arduino-cli version
arduino-cli alpha Version: 0.19.3 Commit: 12f1afc2 Date: 2021-10-12T10:15:19Z
```

### 3. iPadからラズパイにssh
[WebSSH](https://apps.apple.com/us/app/webssh-ssh-client/id497714887)を使う。右上の+から接続先を追加。

![IMG_4632.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629180/cd297a62-80b0-fd64-c655-5c9239fab3fa.jpeg)

`Host`にはraspberrypi.local、`Port`に22、`User`にpi、`Password`にUserのパスワードを入力。各項目をここで説明しているものから変えてる場合はそのように。公開鍵認証を行っている場合は秘密鍵も追加する。左上のターミナルっぽいアイコンからローカルで鍵の生成もできると思う。
![IMG_4634.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629180/9d04678f-46b1-ef3e-c34f-f2b378950f64.jpeg)

### 4. スケッチの書き込み(with ラズパイ)
夜中2時に執筆してて疲れてきたのであとは[公式ドキュメント](https://arduino.github.io/arduino-cli/0.20/getting-started/)に投げます。
余力があれば実際にやってる動画とかつけるかも〜〜〜。

## 問題点
実は完璧じゃない。問題点は2点。

### 問題点1: ハイライトがない
Arduino IDE自体も自動補完があるわけじゃないけど、予約語とかはハイライトしてくれる。ところが、CLIでやろうとするとハイライトしてくれない。まあ、この記事を参考にしようとしてる人はハイライトがあろうとなかろうと関係ないと思うけど。

### 問題点2: スケッチの管理が不完全
ラズパイ上で作成したスケッチをiPadとかPCに持ってくる方法をまだ確立してない。保存する度にiPadに転送してクラウド経由でPCに持ってくるとか出来たらいいけど。それか、自宅LANへの接続をトリガーにしてラズパイから直接クラウドにアップロードするか。

ちょっとよく分からない。詳しい人いたらアイデアください。

# まとめ
iPadだけじゃArduinoにスケッチの書き込みができなさそうなので、ラズパイを利用して最小限の周辺機器でiPadでArduinoにスケッチを書き込む環境を作った。
問題点もちょいちょいあるけど、外でArduinoプログラミングを軽くするくらいの用途には耐えられるんじゃないかな。

明日は[@C2_now](https://qiita.com/C2_now)さんの記事です。
どんなのが来るか楽しみですね(棒)

# 参考文献
[Raspberry Pi に arduino-cli を導入し、Arduino Unoを認識させる](https://qiita.com/okhiroyuki/items/7bf853ab60eb1c9d2ba2)
[Arduino CLI](https://arduino.github.io/arduino-cli/0.20/)