はじめに
Raspberry Pi は WiFi 接続しなくても USB ケーブルで接続してコンソールにログインできます。
しかしそのやり方の説明は SSH 接続するものばかりです。
ここでは USB ケーブルでラズパイと接続し、シリアル通信する方法を解説します。
USB シリアル通信アダプタは必要ありません。
背景
昔組み込み開発やってたおっさんエンジニア的には、
「開発ボードとはシリアル通信するもんじゃないの? USB ケーブルで繋いでネットワーク通信して SSH 接続とか超イマドキでカッケェ。」
とか思ってました。
しかし Wi-Fi 接続の設定でトラブった際に USB でも SSH 接続できない問題が発生しまして・・・。
ネットワーク絡みで問題が発生したせいで、USB 経由のネットワーク通信もダメになったのかも。
事務所にある2つのディスプレイはどっちも HDMI 接続できず、HDMI-DVI 変換も見当たらず、HDMI 接続があるプロジェクターは持ち出されていて・・・
何が起こってるのかさっぱり分からん!!
「やっぱりシリアル通信したい!!」
と思ったわけです。
pi@raspberrypi.local
はラズパイが Wi-Fi で同じネットワークに繋がってればその IP アドレスにアクセスしに行くので、USB で通信してるんだか Wi-Fi で通信してるんだが分からないのも気持ち悪いです。
でも USB シリアル通信アダプタ手元にない・・・ USB ケーブルでシリアル通信できないのかな?
はい、できました!!
Raspbian 側の設定
以下を参考にしました。
Setup a Raspberry Pi for headless use with USB serial console
上記サイトを見てもらえばそれまでなんですが、英語苦手な人のためにも解説しておきます。
自分のインストールしたのは Raspbian jessie です。
スターターキット付属の SD カードからネットワーク接続なしでもインストールできるのをそのままインストールしました。
まずは /boot/config.txt を編集します。
dtoverlay=dwc2
これは SSH 接続できるようにする場合と同じですね。
次に /boot/cmdline.txt を編集し、行の最後にmodules-load=dwc2,g_serial
を追加します。
dwc_otg.lpm_enable=0 (略) modules-load=dwc2,g_serial
SSH 接続できるようにしたい場合は g_ether を指定しますが、それを g_serial にすればシリアル通信になります。
Mac 側からの接続
自分の環境は macOS なのでその場合のやり方を書きます。
ラズパイを起動して USB ケーブルで繋いだら、以下で TTY デバイスを確認します。
ls -l /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.MALS
/dev/tty.SOC
/dev/tty.1051
1051 とか数字が入ったデバイスが現れているはずです。
どれか分からない場合は一旦 USB ケーブル抜いて確認して、繋いでまた確認してください。増えた奴が目的のものです。
この TTY デバイスに screen で接続します。
screen /dev/tty.1051
ログインして exit してもまたログイン画面に戻ってしまうので、GNU Screen を知らない人のために detatch の仕方を書いておきます。
デフォルトの設定では Ctrl-a d を打つと TTY デバイスとの接続が detatch されて screen を抜けます。
これは接続が切れている訳ではなく、
screen -r
とすると reattatch されて前の接続に復旧します。
Windows 側からの接続
Windows マシンを持っていないので試してませんが、一応こうやればいいんじゃないかというのを書いておきます。
デバイスマネージャを起動して、ラズパイと USB 接続した際に増える COM ポート番号を確認しておきます。多分「ポート(COMとLPT)」ってところに現れるかと。
TeraTerm をインストールして、TeraTerm でその COM ポートに接続します。
まとめ
USB ケーブルでの通信をシリアル通信にすることで、ネットワーク絡みで問題が起こってもラズパイにログインできるようになりました。
シリアル通信接続できるのに何で皆さん SSH 接続したがるんでしょうね?
ケーブルで1対1で接続してるんだから、暗号化通信とかいらなくないですか?
/home/pi/.ssh
を作成しておかなくても通信できますし、ネットワーク関係なくなりますし、こちらの設定の方がトラブルが少ないんじゃないかと思ってます。