2013-08-12

Raspberry Piでシリアル通信

Raspberry Piの拡張コネクタからUARTの信号を引き出して、汎用シリアルポートとして使用します。

拡張コネクタの外側の端から、5V、5V、GND、TXD、RXD、と並んでいますので、1×5のコネクタを用意して、RS-232Cレベル変換基板をつなぎます。

拡張コネクタ

RS-232Cレベル変換基板

ケーブル接続

改訂版

上に掲載した基板は、一応動作しますが、 運が悪いとRaspberry Piにダメージを与える恐れがあります。即死はしなくても、長時間の使用で少しずつ壊れていくかもしれません。

RS-232Cレベル変換IC(ADM232A)を5Vの電源で駆動し、その信号をRaspberry Piで受けているのですが、Raspberry Piは3.3V動作ですので、5Vの信号を3.3Vに落としてRaspberry Piに入れるべきです。上に掲載した基板では、Raspberry Piの入力ピンに5Vを印可しているため、推奨されません。そこで、安全のため、抵抗分圧で電圧を下げる回路を追加したのが、下の基板です。

回路図(PDF)
配線図(PDF)

起動時設定の修正

Raspberry Piの初期状態では、シリアルポートは、コンソールとしてログインできるように設定されています。これを無効化し、汎用シリアルポートとして、プログラムから利用できるように設定します。

※見やすいように改行して掲載していますが、実際のファイルは各行が空白で区切られ、一行で記述されています。

/boot/cmdline.txt 変更前(初期状態)

dwc_otg.lpm_enable=0
console=ttyAMA0,115200
kgdboc=ttyAMA0,115200
console=tty1
root=/dev/mmcblk0p2
rootfstype=ext4
elevator=deadline
rootwait  

/boot/cmdline.txt 変更後

コンソールの設定(ttyAMA0,115200と書かれている項目)を削除します。

rpitestmode=1 はあってもなくても動作するようですが、多数のサイトで、これを付けているのを見かけますので、一応書いておきます。今のところ意味不明のおまじないです。

dwc_otg.lpm_enable=0
rpitestmode=1
console=tty1
root=/dev/mmcblk0p2
rootfstype=ext4
elevator=deadline
rootwait 

/etc/inittab

#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
シリアルログインに関する最後の行をコメントアウトします。

通信プログラムのサンプル

簡易ターミナルソフトを作ってみました。

main.c
Makefile

Raspberry PiとPCをクロスケーブルで接続し、PCでターミナルソフトを9600bpsで実行します。

上のプログラムをmakeしてtinytermを実行すると、タイプした文字が相手の画面に表示されます。終了するにはCtrl+Cを押してください。