本記事の概要
ZynqやWio Terminalで遊んでいると、世の中に流通している加速度センサやイメージセンサを接続し、IoTデバイスを作ってみたいという欲にかられます。
I2C(Inter-Integrated Circuit)規格 は、タッチセンサや加速度センサなどのセンシングデバイスとの接続によく用いられる通信規格です。
イメージセンサでも、例えば安価で手軽に用いられるOV7670のようなセンサでは、設定レジスタの書き換えに、I2Cと類似したSCCB通信が用いられています。
センシングデバイスをI2C通信で制御する知見を得るため、I2C通信規格について学ぶとともに、ZynqやマイコンでI2C通信を行う方法について調べ、実際に試してみました。
いきなり、センシングデバイスを接続するとデバッグや動作検証がしにくかったので、今回はWio TerminalのマイコンATSAMD51P19とZynqとの通信に挑戦しました。Wio TerminalをM側(マスター)、ZyboをS側(スレーブ)とした通信をまず行っています。
Wio Terminalは加速度センサや光センサを備えるほかに、無線通信機能も備えており、これひとつでIoTデバイスとしてやりたいことが大体できてしまいます。
価格も比較的安価なので、一台持っておいても良いと思います。
本記事では、I2C通信方式について解説しつつ、デバイス間の接続構成までを解説したいと思います。
今後の記事では、以下の順に解説をしていきます。
- I2C通信の概略とデバイス間の接続方法(←本記事)
- Zynqにおけるブロックデザイン
- サンプルプログラムxiicps_intr_slave_example.cにおけるドライバAPIの動作原理
- Wio Terminalの制御コード(Arduino)
I2C通信とは
I2C通信規格は、フィリップス社で開発された規格で、SCL(シリアル・クロック)とSDA(シリアル・データ)の2本の信号線を使って通信する同期式シリアル通信の1種です。
I2CやUARTなどの汎用的に使われる通信規格は、以下の書籍を参考にしています。組み込みマイコン周りのメモリやペリフェラルについて広く浅く記載されているので、網羅的に組み込みシステムを理解する初学者向けの書籍です。
細かいところまでは記載されていないので、より通信規格について学ぶにはWebや別の本が必要にはなりますが、まず持っておいても損はないかと思います。
シリアル・クロックのクロック周波数は、一般的に4種類あります。
I2C通信の接続方法
I2C通信でデバイス間を接続する配線は、デバイス間でSCL信号とSDA信号とをやり取りするための2本の伝送線に加えて、GNDをデバイス間で共通に揃える配線の、合計3本の配線で構成されます。また、一方の機器に電源を供給したい場合は、さらに電源Vddの配線を加えた、合計4本の配線で構成されます。
ここで、I2C通信での注意点が、2本の信号線(SDA, SCL)はVddにプルアップしておくという点です。
プルアップする理由
各信号線はオープンコレクタと呼ばれる出力方式でデバイスと接続されています。
このオープンコレクタ方式であれば、一方をHigh、もう一方をLowに設定したとしても、大電流が流れるのを防ぐことができるようになります。
Low状態とするデバイスがあっても、プルアップ抵抗に電流が流れるだけで済みますので、機器の破壊を避けることが可能です。
ただし、 Vddにプルアップしておかないと、両方の信号源がOFF状態のとき、信号の電圧が不定になってしまいます。そのため、必ずプルアップする必要があります。
I2C通信のプロトコル
I2C通信では、1台のマスターデバイスに、複数のスレーブデバイスを接続することができます。例えば、マイコンがマスターデバイスとなって、複数のセンサから情報を取得するような用途で用いられます。また、一本のSDA線を介して双方向に信号がやり取りされます。
そのため、 I2C通信でのデバイス間でのプロトコル(通信手順) は若干複雑になるので、簡単にまとめました。
デバイス間の接続
では、I2C通信の概略を理解したうえで、実際にデバイスであるWio TerminalとZynqを接続していきたいと思います。
冒頭でも述べた通り、Wio TerminalとZynqをI2C通信するにあたり、今回はWio TerminalのマイコンをM(マスター)側に、ZynqをS(スレーブ)側としました。
Wio Terminal
Wio TerminalにはもともとI2C通信のためのバスが2種類用意されています。
ブロック図で示すと、このようになります。
図のATSAMD51P19がWio Terminalで使われているマイコンです。
今回は、I2C1の方のバスを利用し、背面の40ピンコネクタからジャンパ線でZyboと接続します。
Zybo
Zynqでは、Wio Terminalとやり取りするためのコネクタとして、Pmod JBを選択しました。
下のZyboの写真におけるU20をSDA、T20をSCLとし、Wio Terminalとやり取りすることにしました。
各PmodとZynq I/Oとの接続の関係やZynqの制約ファイル(出力ピンをどう割り付けるか)の設定は次回の記事で解説します。
デバイス間の接続
実際の接続はブロック図のようにして、Wio TerminalとZyboの間にブレッドボードを配置しています。
ブレッドボード上に、10kΩのプルアップ抵抗を接続して、SCLとSDAをHigh状態にプルアップしました。プルアップ抵抗の大きさは立ち上がりの時定数を考慮すると、2.2kΩや5kΩなど、もう少し下げた方がよい気もしましたが、手持ちによい抵抗がなかったため、今回は10kΩとしました。
プルアップのためのVdd信号はWio Terminalの3.3V電源を利用しました。なお、注意点としてWio TerminalとZyboはそれぞれ別電源に接続されているので、PWR電源同士を接続しないように注意が必要です(ともに3.3V同士ではありますが、素子破壊の恐れもあります…)
I2C通信配線名 | Wio Terminal 40ピンコネクタ | Zybo ピン |
SCL | #5 | Pmod JB01 (T20) |
SDA | #3 | Pmod JB02 (U20) |
Vdd | #17 | 【接続しない】 |
GND | #20 | Pmod JB05 |
実際に接続した、Wio TerminalとZyboの写真はこの通りです。
センサを活用したIoTデバイスづくりをやってみようと思い、手始めにI2C通信の実装が難しそうでしたので、簡単な回路から作成してみました。
次回の記事では、Zynq内部のブロックダイアグラムについて解説しようと思います。
最後までご覧いただきありがとうございました!
コメント