Raspberry Piは、キーボード・マウス・ディスプレイを用意しないとなかなか使うのが難しいところがあります。お手軽とはちょっと言い難いかもしれません。 また、消費電力的にもPC寄りで、例えばソーラーパネル+バッテリーで駆動させるような用途を手軽に実現するのは難しいです。
- WiFiやイーサネット経由でホストPCからアクセス可能にできますが、いろいろとハマるポイントが多く一筋縄にはいきません。 特に初期設定段階。
- Raspberry Pi Picoが出ましたが、OS(Linux)も動いていないですし、これはRaspberry Piというより新種のマイコンボードといって良いでしょうか。
- 一方、Raspberry Pi Zero (W)にはUSB OTGがあり、これを活用することでイーサネット・WiFi周りの面倒を回避し、PCにUSBで直結して利用することができそうです。
- OTGには2モードあります。(OTG Ether, OTG Serial) ( 2021/08/24 add: Mass storageなどもあるそうです)
- OTG Etherモード (参照その2)は、ネットワーク設定がいろいろ必要で、ちょっと上記の面倒の回避策としては弱いですね。
- OTG Serial(コマンドライン TTY接続)はネットワーク設定を気にせず使えるので回避策として使えそうです。
- Zeroはパフォーマンスがそれほど高くないですが、低消費電力で、コンソール・コマンドラインベースの利用であれば快適でもあります。
- Zero Wであれば、ホストPCなしで単体でIPネットワーク(WiFi)に接続・動作もできます。
- ただ、(コマンドラインベース)TTY接続には専用のターミナルエミュレータソフトが必要です。Web中心なCHIRIMEN的にはブラウザからアクセスしたいですね。
- Chromeには、Web Serial がある!
- ちなみに、Raspberry Pi 4のUSB Cポートは同じ手順でUSB OTGが使えるようです
⇒ ZeroWをOTG Serialで、ブラウザからWeb Serialで接続してみる。
- SDにOSイメージ(Raspberry Pi OS lite)を書き込んだ後、このページに従って、3つファイルを編集して、OTG Serialでターミナル接続できるようにしたOSイメージを作る(以下はOSイメージのSDを別のraspberry pi OSマシンにマウントしてその手順を行った例。rootfs内のシンボリックリンクを張る作業ができればどこでもできると思われる(Windowsではext4のマウントが難しいので厳しい?))
- (/media/pi)/boot/config.txt 末尾に
dtoverlay=dwc2
追加 - (/media/pi)/boot/cmdline.txtの、 rootwait と quietの間に
modules-load=dwc2,g_serial
追加 - (/media/pi/rootfs)/etc/systemd/system/getty.target.wantsにcdして、
sudo ln -s /lib/systemd/system/getty@.service getty@ttyGS0.service
- 2022/05 update この記事によると、このシンボリックリンク設定は不要になったかも?(もしそうであればWindowsなどでSDイメージをマウントしただけで設定ができそうです)(要確認)
- (/media/pi)/boot/config.txt 末尾に
- PCにUSBでつなぐ。電源もUSBから給電され起動する。 USBポートはOTGポートを使います(電源ポートではない方です。基板の真ん中側)
- 最初の起動には1分ぐらいかかるようです
- https://googlechromelabs.github.io/serial-terminal/ でつないでみる
- Portを選んで、 Baud rateはデフォルト(115200), Data bits(8), Parity(None), Stop bits(1)もデフォルト
- Note: default user : pi , password : raspberry , 設定コマンドはsudo raspi-config
- ポートセレクタのダイアログでは、Gadget Serialという名前がついている。
- つながった^^ これは結構お手軽
- CHIRIMEN/RPiZero用として、いろいろ機能を入れたターミナルエミュレータを開発中。
- https://chirimen.org/PiZeroWebSerialConsole/PiZeroWebSerialConsole.html
-
g_acm_ms
を使うことでSerial + Mass Storageが同時に使える (g_multi
でさらにetherも使えるようだが未検証) -
参考情報:https://stackoverflow.com/questions/63540052/raspberry-pi-zero-as-read-write-mass-storage と、 https://qiita.com/mt08/items/838a2a0e42d4dbc9fba7
- 上のstackoverflowの最後の記事のJeremyさんの記事が参考になるが、typoがいくつかある。また共有ストレージの大きさがそんなに大きいものが要らないということでqiitaの記事も参考にする。
-
一旦上の章の設定で起動しシリアルアクセスできるようにした後、安全のためWiFiとsshの設定をしてPiZeroへのコマンドプロンプトアクセスを複数確保しておく。
- Note: WiFiとsshはsudo raspi-config や、 https://qiita.com/rhene/items/828858afae699c5ac0ab の記事など参考に
-
以下を設定・確認する
/boot/config.txt
末尾にdtoverlay=dwc2
があることを確認/boot/cmdline.txt
の、 rootwaitの後 と quietの間をmodules-load=dwc2,g_acm_ms
に設定変更 (g_serial -> g_acm_ms)/etc/systemd/system/getty.target.wants
にcd 以下のシンボリックリンクがあることを確認sudo ln -s /lib/systemd/system/getty@.service getty@ttyGS0.service
echo "blacklist g_acm_ms" | sudo tee -a "/etc/modprobe.d/blacklist-g_acm_ms.conf"
- g_acm_msのmodprobeを遅延実行させる設定?
/etc/rc.local
の末尾のexit 0
の前に以下を追加(sudo vi /etc/rc.local)/sbin/modprobe g_acm_ms file=/piusb.bin removable=y ro=0 stall=0
-
共有ファイル(/piusb.bin)を作成
sudo dd if=/dev/zero of=/piusb.bin bs=512 count=2880
1.4MB FDサイズのイメージ・・sudo mkdosfs /piusb.bin
/etc/fstab
に以下を追加 (sudo vi /etc/fstab)/piusb.bin /mnt/msd vfat loop,ro,auto 0 0
sudo mkdir /mnt/msd
-
PiZeroリブートすると
- Windows10のデバイスマネージャでは、ポートにUSBシリアルデバイス、フロッピーディスクドライブにLinux File-Stor Gadget USB Deviceが現れるようになる。
- WebSerialコンソールをつないでみる
- 注意:新しいUSBシリアルデバイスに切り替わったので、以下を動かすChrome, Edgeブラウザはいったん全終了させた後に起動しないとポートのセレクトのダイアログに新しいポートが現れなかった
- https://googlechromelabs.github.io/serial-terminal/ や、
- https://chirimen.org/PiZeroWebSerialConsole/PiZeroWebSerialConsole.html
- CONNECTすると現れるポートのセレクタでは、
CDC Serial
という新しいポートが出現している
-
Note:
- PCとPiZeroで同時にこのMass Storageの書き込みを可能にすると破綻する
- 上の設定はPC側を書き込み可能にしている。この場合でも、PC側での内容の変更に対してPiZero側はマウント中はその変更が反映されない。
- PiZero側で
sudo umount /mnt/msd
,sudo mount -a
などでマウントしなおすと初めて変更が反映されるらしい。
- PiZero側で
- 参考:
- CHIRIMEN的には、やっぱりPiZeroでWebGPIO, WebI2C!
- with micro:bitなどと違い、node.jsで単体動作
- オンラインの開発環境から、WebSerial経由でZeroにjsアプリコードを流し込み
- CHIRIMEN Nodejs/RPiZeroで IoT ~デバイスのリモートコントロール