はじめての電子工作で知っておくべきこと:⑤6-9 センサーとの通信 ~「Raspberry Pi で遊ぼう 第4版」の補足知識~

0 件のコメント
ベース資料はコレ→
第6章からが電子工作部分。

Raspberry pi で周辺パーツを扱う前に、最低限の部品知識、部品との通信方式の種類の全体像を把握しとけば、本の情報を理解しながら進められた気がする。

はじめての電子工作で知っておくべきこと
序 ~「Raspberry Pi で遊ぼう 第4版」の補足知識~
① 6-2 Lチカ から得ておく知識
② 6-5 プルアップ?ついでにコンデンサ
③ 6-7 PWM?
④ 6-8 周波数?
⑤ 6-9 センサー部品との通信
⑥ 8-6 コンデンサ?トランジスタ?
おまけ:Raspberry pi周りのまとめ

センサー部品との通信

電子工作の醍醐味はセンサー制御とモーター(後は音とか?)かと。

Raspberry pi というか、Wiring Pi で扱えるのは
  • 1-wire
  • SPI
  • i2c
  • UART
あたり。

全てマスタースレーブ方式で、マスタから通信を開始する形式。


1-Wire

1線式。信号線の数。
Raspberry Pi の GPIO を使う場合は、GND と 電源共用の信号線の2本になるのかな?

ただ、温度センサーくらいしか対応部品が見当たらず、しかも、Vcc/GND/DQ の3本使うやつ(電源共用してない)。
ま、流行ってないっぽいし、ほぼ使うことはなさそう

図解


通信上の特徴は下記くらい。他の方式との相性もありそうなので、基本的にカーネルモジュールの読み込みは削除しとく。

/boot/config.txt
#dtoverlay=w1-gpio-pullup,gpiopin=4

/etc/modules
#w1-gpio
#w1-therm

  • クロックは使わず、マスタの通信開始からのタイミングでスレーブが応答。
  • チップ固有の 64bit ROM ID で、スレーブを区別。
  • 同一バスに複数デバイス可。

i2c

2線式。
シリアルデータライン(SDA)とシリアルクロック(SCL)の2本の信号線で通信する。

Raspberry Pi の GPIO を使う場合は、電源、GND、SDA、SCLの最低4本をつなぐ。
それ以外にも端子があるが、オープンドレインで放置することが多い。
本書のLCDではリセット端子があり、電源と直結させて使うが、その意味は下記がヒントに。

http://startelc.com/usef/usef_amTr.html

本書ではこの方式ばかりだし、センサー類はこの方式で使うことが多そう。

図解
  • I2Cデバイスはオープンドレインとし、信号線はプルアップ。
  • そのため、全デバイスがHighのときだけ信号線はHigh(ひとつでもLowだと信号線はLow)
  • マルチマスタ可
  • 1クロックにつき 1bit のデータ転送 ⇒ 速度はクロック速度に比例。
    標準モード0~100kbit/sec
    ファーストモード400kbit/sec
    ハイスピードモード3.4Mbit/sec
  • クロックはマスタが生成。
  • SCLがHighの時にSDAをHighからLowに変化させることで転送が開始(スタートコンディション)
  • SCLがHighの時にSDAをLowからHighに変化させることでデータの転送を終了(ストップコンディション)
  • SCLがHighの時のSDAのレベルによって、論理が0(SDA=Low)か1(SDA=High)かが決定。
  • SCLがHighの間、SDAのレベルは一定でなければなりません。SDAのレベルを変更できるのは、SCLがLowの時だけ
  • ACKが必要(SDAをLowに)

UART(Universal Asynchronous Receiver Transmitter)

2線式(送信/受信)。
よく聞くシリアル通信のサブセットで、最低限の構成のものっぽい。
通信のハンドシェイクを持つRS232c だと、RTS/CTS/DTR/DSR とかのラインが増える。

RTS: 送信要求
CTS: 送信可
DTR(Data Terminal Ready):送信準備OK。
DSR(Data Set Ready):受信準備OK。

ともにハンドシェイク用で、DTR/DSRのほうがRTS/CTSよりレイヤが低いイメージか。

通信の際には下記を設定する。
  • 通信速度 : 9600bps、19200bps、57600bps(Arduino)、115200bps(シリアルコンソール)など
  • データビット数 : 通常8bit。7bitは稀。
  • パリティビット: 
  • ストップビットの数 1ビットまたは2ビットを選択します。 基本は1ビットです。

http://serialcomm.info/?p=54
http://chicklab.blog84.fc2.com/blog-entry-46.html

本書には登場しないが、結構利用はされそう。




Raspberry pi ⇔ RAPIRO(Arduino)はこれで通信。
回路図には電源/GND/送信/受信/DTR の5線接続。
Raspberry pi(というかwheezy) はデフォルトでシリアルコンソールが有効になっているため、切っておかないとダメ。

/boot/cmdline.txt(デフォ)
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

/boot/cmdline.txt(変更後)
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

/etc/inittab(デフォ)
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
/etc/inittab(変更後)
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
最初、inittabが無くて???と思ったが、JESSIEからsystemd-sysv化しているらしい。
いま覚える気がないので、WHEEZYに戻した。
ついでに /etc/apt/preferences.d/local-pin-init も修正し、アップグレード中に systemd-sysv がインストールされないようにしとく。
Package: systemd-sysv
Pin: release o=Debian
Pin-Priority: -1

  • 1バイト8ビットのデータを1本の電線で送るために、時系列にデータを分解して、1ビットづつ出力(送信)または入力(受信)します。 
  • 最近のほとんどのマイコンには、UART機能が搭載されています。マイコンメーカーによってはUART以外に独自の呼び方をするメーカーもあり、PICはUSARTと呼び、ルネサス製H8マイコンはUART機能を持った内蔵デバイスのことをSCIといいます。これは、各メーカーでUARTの機能以外にも各社独自の機能を付け足していることが多いため、純粋なUARTと区別する意味もあるのではないかと思います。 
  • UARTで扱う信号の電圧がTTLやCMOS ICと同じ電圧レベルであるため、中にはUARTのことをTTL、CMOSやロジックと呼ぶ方もいるようです。 
  • UARTは送信・受信・GNDの3線式構成
  • ただし、3線方式はノイズに弱いため遠距離の通信には向いていません。
  • 通信速度や使用する周囲環境にもよりますが数m以上の通信には不向きと思った方がよいでしょう。 
  • 基本的にはTX端子を相手のRX端子に接続。
  • 回路図中のR1とR2は、電源を入れた瞬間などで誤通信する可能性があるので、それを防ぐ意味でプルアップ抵抗をいれてあります。 マイコン間の配線が数十cm以上ある場合は、ノイズ耐性を上げるためにも入れたほうが無難です。ソフトウエア等で誤通信をフィルタリング出来る場合などは不要な事もあります。



SPI(Serial Peripheral Interface)

4線式。

  • シリアルクロック(SCLK)
  • マスタアウトプット/スレーブインプット(MOSI)
  • マスタインプット/スレーブアウトプット(MISO)
  • スレーブセレクト(SS)



  • マルチマスタなマスタ-スレーブ
  • 通信は必ずマスタが開始
  • マスタは、通信をおこなうスレーブをSS信号によって特定。
  • スレーブ1つにつき1本のSS信号を接続。
  • 1クロックにつき1bitのデータ転送
  • データ転送速度はクロックの速度による
  • データの転送は、マスタがSS信号をアサートすることで開始。
  • SCLK信号に同期して、マスターからスレーブへのデータをMOSIに出力し、スレーブからマスタへのデータをMISOから入力。
  • データの入出力をおこなう線が分かれているため、全二重の通信をおこなうことができます。
  • 1度の転送で送受信できるビット数はデバイスごとに異なり、SPIプロトコルとしての制限はありません。 
  • SPIでは、クロックのポラリティとフェーズを指定できます。
  • それぞれの設定をCPOLとCPHAで表します。 
  • CPOL=0: クロックを出力していないときSCLKをLowに保ちます。 
  • CPHA=0: クロックの立ち上がりでデータをラッチします。 
  • CPHA=1: クロックの立ち下がりでデータをラッチします。 
  • CPOL=1: クロックを出力していないときSCLKをHighに保ちます。
  • CPHA=0: クロックの立ち下がりでデータをラッチします。
  • CPHA=1: クロックの立ち上がりでデータをラッチします。
  • CPOLとCPHAの組み合わせを、SPIモードで表現する場合もあります。

http://toshiba.semicon-storage.com/jp/design-support/e-learning/mcupark/village/serial-interface-2.html


適宜更新

0 件のコメント :

コメントを投稿

ご来訪者様の判別のため、
匿名希望の方もコメントの記入者欄に「名前/URL」 を選択し、
テキトーなペンネームを入れてくださいm(_ _)m
※ URLは不要。書いていただいてもOK。