はい、Reveの技術担当です。
もうネタが尽き始めて困り始めたところなのですが、今日はとりあえずタイトルの通りです。
Raspberry Piでシリアル通信するための記事を書こうかと。
ちなみに、ここでいうシリアル通信とは、いわゆるRS 232C通信を意味します。
詳しくは、こちらの記事を参照していただければ。
(注意)
この記事では、Raspberry PiのOSインストールは済ませているものとします。
また、シリアルコンソールでのログインは使用できません(ログインに必要なピンを使用するため)。
(シリアル通信の方法)
それでは早速はじめましょう。
まずはRaspberry Piを起動してください。ログインが済んだあとは、以下の手順で設定します。
1.Raspberry Pi 内のcmdline.txtを編集ツールで開きます。
$ sudo nano /boot/cmdline.txt
2.ファイル内容を全て消去し、以下の内容に書き換えます(実際は改行しないほうが良いらしいです(未確認))。
1 2 3 4 5 6 7 |
<span style="color:#0033FF">dwc_otg.lpm_enable=0 rpitestmode=1 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait</span> |
3.Raspberry Pi のコンフィギュレーション設定を起動します
$ sudo raspi-config
4.項目「8 Advanced setting」の中にある
「A7. Serial」を選択して
NO(使用不可)に設定します。
こうすることで、シリアルコンソールによるログインを無効化します。
5.Pythonでシリアル通信をするためのパッケージをインストールします。
$ sudo apt-get install python-serial
もし、インストールが失敗した場合は、$ sudo apt-get update および $ sudo apt-get upgrade を実行してみてください。
6.再起動します。
ここまでの流れでシリアル通信の設定は完了です。
(デバイスのつなぎ方)
まずは図に表わしてみます。
Raspberry Pi の8番ピンが送信用、10番ピンが受信用のピンになります。また、GNDは6番ピンに当たるため、これらのピンを向こう側の対応するピンに接続することで(互いのTx、Rxピンはクロスさせて接続、つまり互いに逆のピンをつなぐ)通信ができるようになります。
また、電源供給ができるピンもあるため、必要に応じて利用すると良いでしょう。
(プログラム)
続いて、Raspberry Piのプログラムを記載します。
このプログラムでは、送られてきた文字列を画面に表示する処理を行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
; title="serial-pi1.py"]#! /usr/bin/env /usr/bin/python import serial import time def main(): # USB-Serial:ttyUSB0 # GPIO:ttyAMA0 # con=serial.Serial('/dev/ttyUSB0', 9600, timeout=10) con=serial.Serial('/dev/ttyAMA0', baudrate=9600, timeout=10) print con.portstr time.sleep(3) while True: str=con.readline() print str #con.write(str) if __name__ == '__main__': main() |
では、それぞれの解説に入ります。
まず、必要なパッケージをインポートします。シリアル通信にはserialというパッケージが必要となります。
1 |
import serial |
続いて、シリアル通信の初期設定を行います。
Raspberry Pi では、”/dev/ttyAMA0″というポートでシリアル通信を行うため、このポートに接続すると宣言します。
今回は、通信速度を9600bps、タイムアウトを10秒にしました。
1 2 |
con=serial.Serial('/dev/ttyAMA0', baudrate=9600, timeout=10) print con.portstr # show all of available serial ports |
そして、データの送信、および受信はそれぞれreadlineメソッド、writeメソッドを使用します(writeメソッドはコメントアウト)。
readlineメソッドは改行が来るまでのデータを一度に読み取る処理を行います。
ちなみに、ここではwhile文で無限ループをかけています。
1 2 3 4 |
while True: str=con.readline() print str #con.write(str) |
以上でプログラムの解説は終了です。
シリアル通信はArduinoなどのマイコン(ボード)をはじめ、様々なデバイスで搭載されているため、通信ができるようになれば制作の幅も広がってきます。ぜひお試しください。
コメント