I2Cの速度・アドレス変更時の波形をアナライザで確認しました。
Pythonとraspberry piでテストして測定動画を撮っています。
I2C通信の使い方・基礎を確認したい方におすすめです。
前回はデフォルトの設定でI2C通信を確認
以前の記事でI2CのACK・NACKの解析記事を上げました。
その際はラズベリーパイ(raspberry pi)のコンソールからコマンド「i2cdetect」で対応していました。
(リンク先はこちらから)
今回はデフォルト設定のI2Cではなく「速度・アドレスを変更」「PythonでI2Cプログラミング」をしてみたとき波形がどのようになるか確認していきます。
I2Cの速度をFast-mode(400kbps)に変更してみる
最初にラズベリーパイでのI2Cの最速であるFast-modeの400kbpsを確認していきます。
単純にI2Cの速度を変えるのであれば「/boot」フォルダ内にある「config.txt」を編集すれば可能です。
既にI2Cが使える環境になっている方はconfig.txtの最後に一文追加するだけでOKです。「config.txt」を編集するにはroot権限が基本必要ですので下記sudoコマンドで対応します。
nanoエディタで最後の一文にI2Cで使う速度を入力します。今回は400kbpsなので「400000」の値で設定します。最後に「Ctrl+o」で書き込みします。
筆者はアナライザを使ってI2Cの速度を確認しました。(詳細の回路図・配線は後半に記載しています)
特に確認程度ならばコマンドの「i2cdetect」で構いません。無事Fast-modeの400kbpsが出ていることを確認できました。
raspberry piのデフォルトは100kbps(standard-mode)
以前の複数スレーブ接続した際の記事でも記載していましたが、ラズベリーパイ(raspberry pi)のI2Cのデフォルトは100kbps(standard-mode)です。(リンク先はこちらから)
1周期10us(100kbps)であることをアナライザで同様に確認しています
PythonでI2Cのプログラミングをする
今回はPythonで簡単なプログラムを組んで、I2C通信の遅い速度の波形を確認していきます。Pythonでプログラムしたのは測定時にI2C通信を無限ループさせたかったためです。
プログラム内容としては簡単です。加速度センサの適当な値を無限に読み続けるようにしています。
I2Cのデータが固定されないような動くレジスタ値を読み続けています。
※今回は適当な動くレジスタ値を拾っています。本来は加速度の値を持ってくる予定でしたが、なぜか狙ったアドレスを確認しても「0」しか読めなかったため。
PythonでI2CをReadして波形解析する動画
実際にPythonのプログラムを走らせて、アナライザで確認する動画が下記となっています。
~4秒 Pythonプログラム実行(I2Cを読み続ける)
~11秒 アナライザで波形解析スタート
~16秒 アナライザの解析終了⇒Pythonプログラムも終了
~24秒 I2Cの波形が見やすい箇所をアップ
~32秒 I2CのACKが返ってきてデータを拾えていることを確認
ちなみに筆者も少し前までPython初心者でした
ちなみに筆者は少し前までPython初心者でしたが、下記記事で紹介しているUdemy で勉強することで今回のレベルのことは出来るようになりました。
初心者が高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから
I2Cの速度を遅く(4kbps)設定する
今回はラズベリーパイで何処までI2Cの速度を遅くできるか確認してみました。最初は100bpsぐらいの速度の設定をしてみましたが…
I2Cが動作しなくなりました。波形を見てみると何もI2Cが出力されていないのでラズベリーパイ側に限界があるようです。(おそらくI2C_IFのクロックの分周・逓倍の関係で限界?)
試行錯誤した結果4kbpsならば動作したので、今回はこれで動作確認させていきます(ちなみに3kbpsは動作しませんでした)
I2CのクロックとデータをLEDとリンク
今回I2Cの遅い速度を確認するだけでは面白くないため、I2Cの「クロック」と「データ」の動作をリンクさせたLEDを実装します。
さすがに「100kbps・400kbpsは目が追い付かない」と思いますが「遅いI2C速度の4kbpsならばLEDで見て分かるレベルになるのでは?」と言った思いつきです。
直接I2CからLEDを駆動することは難しいのでバッファIC(TC4HC4050AP)を一つ噛まして対応します。
そのため今回のテストの全体構成としては下記のようになります。
回路図・配線
今回の回路図としては下記形です。どの部品も汎用的なデバイスで対応してますので誰でも同様に組むことができます。電子工作セットとブレッドボードのみで配線が可能です。
I2Cを遅い(4kbps)速度でテストする
回路図は用意できて、Pythonプログラムも400kbpsで作成したものが流用できるのでテストしていきます。
I2Cデータ読み取りのprint文は省略
一番最初のテスト動画ではI2Cのデータ値が読み取れているかの確認のためprint文を入れていましたが、
print文を入れるとI2Cデータを読み取る間でどうしても処理時間が入ってしまいます。
今回I2CのLEDリンク具合を確認したいので、余計な処理になるprint文はコメントアウトして省略しときます。
テスト結果
無事I2Cの速度を落とした4kbpsでI2C通信できていました。
周期的にHI(点灯)になっている黄LEDのクロックに関しては動作が確認できなかったですが、赤LEDのデータに関してはLow(消灯)の時間も長く点滅していることが確認できました。
PythonでI2C(4kbps)をReadしてLEDとリンクする動画
実際にI2Cの4kbpsでPythonのプログラムを走らせて、アナライザで確認する動画が下記となっています。
~10秒 Pythonプログラム実行(赤LED_I2Cデータが点滅開始する)
~16秒 アナライザで波形解析スタート
~23秒 アナライザの解析終了⇒Pythonプログラムも終了
~32秒 I2Cの波形が見やすい箇所をアップ
~35秒 4kbpsでもI2C通信ができていることを確認
スレーブアドレスを間違えたときのnack波形を確認する
最後にスレーブアドレスをワザと間違えてnack波形を出した時を確認しました。(本来0x68をPythonで0x77にした場合の波形を確認しました。)
下記のようにNackが出てI2C通信が直ぐに終了しました。狙い通りで問題無しです。
PythonとI2CでNackを確認した動画
Pythonで間違ったアドレスにしたプログラムを走らせて、アナライザで確認する動画が下記となっています。
~5秒 アナライザの波形解析スタートさせてPythonプログラム実行
~6秒 Pythonプログラムは直ぐにエラーで止まる
~8秒 アナライザの解析終了
~17秒 I2Cの波形が見やすい箇所をアップ
~22秒 NACKでI2C通信が終了していることを確認
まとめ・感想
PythonでプログラミングすることによりI2C通信のテストを色々と試すことができました。
やはりPythonを使えるようになると色々なデバッグ・テストが捗ります。
筆者は下記記事で紹介しているUdemy で勉強することである程度のレベルのことは出来るようになりました。
初心者が高い参考書を買って一人でPython勉強するよりは「非常に分かりやすく」「費用が抑えられる」はずですのでご参考ください。リンク先はこちらから
コメント