United Statesからアクセスのようです。言語設定をEnglishに切り替えますか?
Switch to English site
Skip to main content

ラズパイにセンサー追加をオシロでデバッグしよう(その3)I2C編

ラズパイにI2C 接続でセンサーを接続してオシロで計測

次にオシロスコープでないとラズパイをデバッグできない事例を紹介します。ラズパイで I2C の機能を使用できるようにするには以下の設定が必要です。

起動前にSD カードのconfig.txtを編集します。これも公式ページに記述がございますが英語ですのでここで簡単に説明します。config.txtに下記の2行の設定を追加してください。

dtparam=i2c_arm=on
dtparam=i2c1=on

Rasbian のバージョンによっては下記のように該当の行に先頭に#がついているかもしれません。

#dtparam=i2c_arm=on

この場合は先頭の#を削除してください。#がついていると設定扱いでなくコメント扱いになりラズパイの設定に反映されません(通称コメントアウトと呼ばれます)。従って、先頭に#なしで上記の2行が config.txt に記述されている必要があります。

次にラズパイを起動し、下記のファイルにさらに2行設定を追記する必要があります。

ファイル

/etc/modules

追記する文字列

i2c-bcm2708
i2c-dev

上記の2行を追記するには Linux で自分の好きなエディターを使ってください。nano は Windows 風ですし、Unix に昔からある vim でも emacs でもよいと思います。

次に下記のコマンドでラズパイを再起動します。

$ sudo reboot

再起動後にラズパイでI2c が on になっているかの確認を行います。コマンドラインで下記を入力してください。

$ ls /dev/i2c-1

上記で/dev/i2c-1が存在すれば i2c はラズパイで on になっております。

そして Linux で i2c を使う上で必須なツールをインストールします。次の2行のコマンドでi2c-toolsをインストールします。

$ sudo apt-get update
$ sudo apt-get install i2c-tools

ここまできたらラズパイの準備は済んだので

$ sudo poweroff

でシャットダウン画面が出たのを確認してからラズパイの電源を切ります(図3-1)。

image18_8c0c23ea74b1b3104be7b2086226e01124e0039a.jpg

図3- 1 シャットダウン完了の表示

上記のシャットダウン処理は開発中のトラブル防止として重要ですので必ず行ってください。マイコンとは違い 、Linux のように汎用 OS が動作している場合、突然電源を切ることを繰り返すとそのうちラズパイが起動しなくなる可能性があります。その理由はファイルシステムの読み書き途中で電源を物理的に外部から絶つとファイルシステムがだんだん壊れていくことがあるからです。Unix 系の OS には、書き込みデータを吐き出す "sync" コマンドがありますが、コマンドラインで  $ sync; sync を実行するだけでは十分でなく、現在の大半の汎用OS では電源を切る前にファイルシステムをアンマウントする必要があります。ファイルシステムのアンマウントを確実に行うにはシャットダウンコマンドの実行が必要です。

今回、ラズパイにつなげるセンサーに MPU-9250を選んでみました。MPU-9250は3軸加速度、3軸ジャイロ、3軸コンパスの3機能が内蔵されている多機能センサーです。最近、IoT などのキーワードでセンサーデバイスが注目されていることと、ロボットやドローンなどに応用できる本センサーを動かしてみたいと思いました。

MPU-9250 は表面実装パッケージですので、ブレッドボードで扱いやすいように標準の 0.1 インチピッチ(2.54mm)に変換したパッケージを購入しました。

それでは I2C 接続で MPU-9250 をラズパイとつなげます。今回はのラズパイの40ピン端子の5番(SCL1,I2C)を青色のジャンパー線で MPU-9250 の SCL/SCLK に接続しました。同様にラズパイの40ピン端子の3番(SDA1,I2C)を黄色のジャンパー線で MPU-9250 の SDA/SDI に接続、ラズパイの40ピン端子の9番(Ground)を黒色のジャンパー線で MPU-9250 の GND に接続します。合計3線の接続です(図3-2-1、図3-2-2、図3-2-3)。

IMG_7337-s_5df1396ee2d30e315ed47613fc7a46095f151614.jpg図3-2-1 ブレッドボードでMPU-9250を I2C 接続した全体写真

IMG_7305-s_396ceaf48ee73e85127c577f1f9dbc0f85d947b1.jpg図3-2-2 ラズパイの40ピンヘッダーのI2C バス配線部(青と黄色配線)

IMG_7332-s_fc704b323aaf49087e6bf9f560b66158585d025d.jpg

図3-2-3 ラズパイに I2C で MPU-9250 を接続した状態(黒色に近く写っているのは青色です)

ラズパイと MPU-9250 の接続が出来たら、先ほどインストールした i2c ツールで通信を試します。コマンドラインで下記コマンドを実行してください。

$ i2cdetect -y 1

上記のオプションの -y はユーザーからの入力を待つのを止めますので必須です。数字の '1' はラズパイの I2C のバスの番号の指定です。ラズパイでは40ピン端子に出ている I2C バスは番号 1 ですので'1' を指定します。実行した画面です(図3-3)。i2cdetect コマンドはしてした I2C バス 1 に接続されたデバイスをスキャンして反応のあった I2C アドレスを表示します。MPU-9250 の I2C アドレスは 0x68 が標準値です。

image20_4e0d34eec6b4520a19a98489463778b9f2965f61.jpg

図3- 3  シリアルコンソールの i2cdetect の画面表示

すこしおかしいです。

$ i2cdetect -y

の入力を繰り返しますと図3-3のように 0x68 と 0x69 がランダムに反応することがあります。本来は0x68 のみのはずです。

追究するために、次のコマンドで MPU-9250 のデバイスIDを読んでみます。正常なら MPU-9250 のデバイスIDである 0x71 が読み出せるはずです(図3-4)。

$ sudo i2cget -y 1 0x68 0x75 b

しかし、”Error: Read failed” と表示されます(?)。i2cgetコマンドの '0x68' は I2C アドレスの指定です。'0x75' は MPU-9250 のレジスターアドレスの指定であり、このアドレスからは MPU-9250 のデバイスID '0x71'が安定して読めるはずです。ビット化けでも起きているのでしょうか。

image21_03836daedecaac3c5d0a18fcaee326fb8b4063df.jpg

図3- 4 i2cget の画面表示

それではオシロスコープで調べてみます。I2C 接続は SCL と SDA の2本線での通信ですので黄色のチャンネル1で SCL をプローブし、黄緑のチャンネル2で SDA をプローブしてみます(図3-5)。

image22_c621385a628ac6a5a49899c5406ca4f7e308c1f5.jpg

図3- 5 i2cget を実行時のオシロの波形

I2C通信は HIGH と LOW のデジタル通信です。また今回はラズパイの IO 電圧は 3.3V ですので、HIGH が 3.3V付近で LOG が 0V 付近であるはずです。

ここで 0x71 の読み出しがうまくいっていないチャンネル2をオシロスコープのカーソル機能で電圧を計ってきます。画面で Y2 の表示です。この状態では LOW が 0V にならず1.1V 付近になっていることがオシロスコープからわかります。これがおそらく原因と思われます。

I2C の規格ではオープンドレインかオープンコレクタの出力ですのでプルアップ抵抗が必要です。今回は通信相手の MPU-9250 側に 1K オームのプルアップ抵抗をつけていました。

図3-6のオシロスコープの表示では LOW の電圧が高すぎますのでプルアップ抵抗が小さすぎるときの波形である可能性が高いです。ラズパイの基板に1.8Kオームのプルアップ抵抗が接続されてありますので、追加で1K オームのプルアップ抵抗を付けたことでプルアップ抵抗の値が小さくなりすぎた可能性があります。これらのことから、MPU-9250 側のプルアップ抵抗を外して再度オシロスコープで計測してみました(図3-6)。

IMG_7315_0000-s1_b582a272ff992f2da8532c03c8d928e394d24df5.jpg

図3- 6外付けのプルアップ抵抗を外した時の波形

今度は LOW が 0V 付近(画面で Y1)になりました。オシロスコープのデコード機能でも 0x68, 0x75 の送信に対して 0x71 の受信が表示されています。

また、先ほどの i2cget コマンドでも正常に '0x71'が安定して読み出せるようになりました(図3-7)。

IMG_7093.JPG-s_0000__66e635eddb2ee9fa3f07aef7798f0e3f35a5d9d5.jpg

図3- 7外付けのプルアップ抵抗を外した時の i2cget の表示

さらにオシロスコープのズーム機能を使ってこの時の波形を拡大して確認してみます(図3-8)。

image25_9dc0a4464b2d7252e12d6612b8f92d819cb66cdb.jpg

図3- 8波形のズームアップ画面

プルアップ抵抗で波形の立ち上がりがシャープでなく少しゆっくりになっていますが、I2C通信に問題ない波形であることが確認できます。

これでラズパイに MPU-9250を I2C 接続して比較的に安心してプログラミングを進めることができます。

ロジックアナライザーで HIGH とLOWを識別してデコードすることができますが、今回のように波形の電圧でのトラブルの症状を発見することは困難です。オシロスコープで計測してみて動かない原因を追究できた例です。

それでは、I2C よりトラブルが多くなかなか動作しにくいに SPI 接続を試してみましょう。

記事一覧:

* Summary - Project Leadership and developer under multi-cultural circumstance and cooperation with external team and/or open source communities. * Technical profile Developing flight controller. https://github.com/DCoJA/yatagarasu-red Library to enable GPIO, I2C and SPI on Linux Boards. http://www.96boards.org/blog/programing-i2c-devices-libmra Youtube channel https://www.youtube.com/channel/UCnda3kAWPcxMnDBoaSM6uXQ
DesignSpark Electrical Logolinkedin