はじめに
この記事ではNerves を活用した Raspberry Pi のデバッグにおいて、USB to TTL シリアルケーブルを使ってシリアル通信してみます。
対象デバイスと直接シリアル通信することで、メンテナンスやファームウェア異常時のデバッグに役立ちます。
ブート時のオペレーティングシステム(OS)のログも見れます。
また、Wi-Fi や Ethernet が利用できない環境でも通信が可能です。
必要なもの
参考までに、この記事で使用する製品と環境は以下の通りです。
ハードウェア
- Adafruit USB to TTL Serial Cable
- Raspberry Pi Zero WH (GPIO ピン付きモデル)
ソフトウェア
- シリアルターミナルソフトウェア (例:
screen
、picocom
) - すでに Nerves プロジェクトの環境が構築済みの前提で進めます。
電子工作におけるシリアル通信
シリアル通信は、電子工作や IoT の分野で頻繁に使われる通信方法です。1ビットずつ、逐次的にデータを伝送するシンプルな仕組みが特徴です。
参考リンク
- シリアル通信(Wikipedia)
- シリアル通信を始めよう(Qiita 記事)
- Nerves のワークフロー(YouTube)
- Nerves のワークフロー(プレゼン資料)
- Raspberry Pi のシリアルポート設定(UART)を理解する
USB to TTL シリアルケーブルとは
USB to TTL シリアルケーブルは、PC の USB ポートを介してデバイスとシリアル通信を可能にする変換ケーブルです。このケーブルは、電子工作や組み込みシステムのデバッグに広く利用されています。以下に主な特徴をまとめます。
主な特徴
- シリアル通信の簡易化: デバイスに直接接続するだけで、UART を介したシリアル通信が可能。
- デバッグ用途に最適: ブート時のログ確認やファームウェア異常時のトラブルシューティングに役立ちます。
- ネットワーク環境が不要: Wi-Fi やイーサネットが使えない環境でもシリアル通信でアクセス可能。
Nerves 開発での利点
- デバッグの効率化: ネットワークなしでもファームウェアの動作確認が可能。
- ブート時のログ取得: 初回起動時やエラー時の詳細ログを確認できる。
- IEx シェル操作: Nerves プロジェクトのライブデバッグや設定変更が可能。
Adafruit USB to TTL シリアルケーブル
この記事で使用する Adafruit USB to TTL シリアルケーブル は、USB を介してデバイスとシリアル通信を可能にするチップを内蔵しています。このチップが PC とデバイス間のデータ変換を実現します。
以下の機能を備えています。
- 内蔵チップで USB と UART (TTL レベル) の信号変換を実現。
- 3.3V または 5V のシステムに対応。
- 公式ドライバーを使用して PC との接続が簡単。
詳細は、以下を参照してください。
ドライバーをインストール
Adafruit USB to TTL シリアルケーブルを使用するには、OS に応じたドライバーをインストールする必要があります。
ドライバーをインストールすることで、PC 上の仮想 COM ポートを介して通信が可能になります。
参考までに手順の概略を記しますが、詳細は公式チュートリアルをご参照ください。
Linux ユーザーは追加のドライバーインストールを省略できる可能性が高いです。まずは接続を試してください。
Windows と Mac
使用しているケーブルのチップセットに応じたドライバーをインストールする必要があります。
- 次のいずれかのドライバーをダウンロード:
- Prolifics 製のドライバー
- SiLabs 製のドライバー
- インストーラを実行し、画面の指示に従ってインストールを完了。
- 必要に応じて PC を再起動してください。
ケーブルのチップセットが不明な場合は、両方のドライバーをインストールしたら、どちらかがいい感じに適用されるようです。しらんけど。
Linux
Linux の場合、必要なドライバー (PL2303 および CP210X) はカーネル 2.4.31 以降に組み込まれているため、通常はドライバーの追加インストールは不要です。
配線方法
Adafruit USB to TTL シリアルケーブルの配線は簡単です。公式ドキュメントの手順を参考にしつつ、以下の通り接続してください:
ケーブルの色とピンの対応
ケーブルの色 | Raspberry Pi GPIO ピン |
---|---|
黒 (GND) | 6 (GND) |
白 (RX) | 8 (TXD) |
緑 (TX) | 10 (RXD) |
赤いケーブル (5V) は接続しないでください。Raspberry Pi は自身で電源を供給します。
Elixirで Raspberry Pi のピン配置を確認することもできます。
詳しくは Adafruit の配線ガイド を参照してください。
シリアルターミナルソフトウェアをインストール
Adafruit USB to TTL シリアルケーブルを使って、Raspberry Pi からのログを確認するには、シリアルターミナルソフトウェアを使用します。
オープンソースのシリアル接続クライアントをいくつか列挙します。
ここでは、screen
とpicocom
の使い方を紹介します。
必要に応じて、インストールしてください。
Ubuntu/Debian 系:
sudo apt install screen picocom
Mac (Homebrew):
brew install screen picocom
screen
を実行する方法
screen /dev/ttyUSB0 115200
-
/dev/ttyUSB0
は接続したデバイスに応じて変更してください。 - 終了する場合は、
Ctrl+A
を押してからK
を入力し、y
で確認。
picocom
を実行する方法
picocom /dev/ttyUSB0 -b 115200
-
-b
オプションでボーレートを指定します。 - 終了する場合は、
Ctrl+A
を押してからCtrl+X
を入力します。
以下は出力の例です。
mnishiguchi@thinkpad:~ 1m57s
$ ls /dev/tty*
/dev/tty /dev/tty6 /dev/tty13 /dev/tty20 /dev/tty27 /dev/tty34 /dev/tty41 /dev/tty48 /dev/tty55 /dev/tty62
/dev/tty0 /dev/tty7 /dev/tty14 /dev/tty21 /dev/tty28 /dev/tty35 /dev/tty42 /dev/tty49 /dev/tty56 /dev/tty63
/dev/tty1 /dev/tty8 /dev/tty15 /dev/tty22 /dev/tty29 /dev/tty36 /dev/tty43 /dev/tty50 /dev/tty57 /dev/ttyS0
/dev/tty2 /dev/tty9 /dev/tty16 /dev/tty23 /dev/tty30 /dev/tty37 /dev/tty44 /dev/tty51 /dev/tty58 /dev/ttyS1
/dev/tty3 /dev/tty10 /dev/tty17 /dev/tty24 /dev/tty31 /dev/tty38 /dev/tty45 /dev/tty52 /dev/tty59 /dev/ttyS2
/dev/tty4 /dev/tty11 /dev/tty18 /dev/tty25 /dev/tty32 /dev/tty39 /dev/tty46 /dev/tty53 /dev/tty60 /dev/ttyS3
/dev/tty5 /dev/tty12 /dev/tty19 /dev/tty26 /dev/tty33 /dev/tty40 /dev/tty47 /dev/tty54 /dev/tty61 /dev/ttyUSB0
mnishiguchi@thinkpad:~
$ picocom /dev/ttyUSB0 -b 115200
picocom v3.1
port is : /dev/ttyUSB0
flowcontrol : none
baudrate is : 115200
parity is : none
databits are : 8
stopbits are : 1
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
hangup is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv -E
imap is :
omap is :
emap is : crcrlf,delbs,
logfile is : none
initstring : none
exit_after is : not set
exit is : no
Type [C-a] [C-h] to see available commands
Terminal ready
warning: :simple_one_for_one strategy is deprecated, please use DynamicSupervisor instead
(elixir 1.16.2) lib/supervisor.ex:762: Supervisor.init/2
(stdlib 5.2.1) supervisor.erl:330: :supervisor.init/1
(stdlib 5.2.1) gen_server.erl:980: :gen_server.init_it/2
(stdlib 5.2.1) gen_server.erl:935: :gen_server.init_it/6
(stdlib 5.2.1) proc_lib.erl:241: :proc_lib.init_p_do_apply/3
[Livebook] Application running at http://nerves-777f.local/
Erlang/OTP 26 [erts-14.2.3] [source] [32-bit] [smp:1:1] [ds:1:1:10] [async-threads:1]
Interactive Elixir (1.16.2) - press Ctrl+C to exit (type h() ENTER for help)
████▄▄ ▐███
█▌ ▀▀██▄▄ ▐█
█▌ ▄▄ ▀▀ ▐█ N E R V E S
█▌ ▀▀██▄▄ ▐█
███▌ ▀▀████
nerves_livebook 0.12.3 (a54e5048-1af7-5244-61ec-afe6d4eaf5bc) arm rpi0
Serial : 777f
Uptime : 37.380 seconds
Clock : 2024-06-22 09:20:17 UTC (unsynchronized)
Temperature : 31.5°C
Firmware : Valid (A) Applications : 113 started
Memory usage : 85 MB (27%) Part usage : 0 MB (0%)
Hostname : nerves-777f Load average : 0.70 0.19 0.06
usb0 : 172.31.7.141/30
Nerves CLI help: https://hexdocs.pm/nerves/iex-with-nerves.html
Toolshed imported. Run h(Toolshed) for more info.
iex(livebook@nerves-777f.local)1> IO.puts "元氣ですかー"
元氣ですかー
:ok
iex(livebook@nerves-777f.local)2>
トラブルシューティング
-
ログが表示されない場合:
- 配線を確認してください (特に GND)。
-
RX
とTX
を入れ替えてみてください。
-
文字化け:
- ボーレート (115200) が正しく設定されているか確認してください。
詳細は公式チュートリアル
を参照してください。
おわりに
この記事では、Adafruit USB to TTL シリアルケーブルを用いた Nerves プロジェクトのデバッグ手法を紹介しました。
記事が、Nerves プロジェクトを始めるきっかけとなれば幸いです。
ぜひ NervesJP Advent Calendar 2024 もご覧いただき、IoT を Nerves をたのしんでいきましょう!
あ、よく考えたら過去にも似たようなメモをまとめてましたね。そのうちまた整理します!