バリバリのSoCとSoM(2) Jetson NanoのI2Cにデバイスをつなぐ

やはりちゃんとドキュメントを読めば、手も震えず(アル中か)、テキパキと自信をもって作業が進みます。前回、Jetson Nanoのデータシートを読んだお陰で、今回は、早速実践とI2Cバスの先にセンサを取り付けてみましたが、一発動作、ものの10分もかかっていません(投稿するにはその何倍か時間かかりますが)

さて取り付けるセンサは、このところ目の前に転がっていることが多い、シャープ製の測距センサ、GP2Y0E03です。このセンサ

  1. 最初は、Nucleo-F027RBボードに接続、開発環境はArm Mbed、言語はC++
  2. 次に、Raspberry Pi 3 Model B+に接続、今度はPython3

という具合に使いまわしてきております、今回はこの「蓄積」を活かしてJetson Nanoのラズパイ互換の40ピンGPIOヘッダに接続してみます。

上記の写真を御覧いただくと、なにやらブレッドボードの配線がちょっと複雑ですが、

昔の残骸をそのまま使っているだけ

なので、ぶっちゃけ配線は以下の4本だけです。Jetson Nanoのボード上のGPIOヘッダの番号で記しておきます。

  • 1番ピン(3.3V電源)をセンサ電源へ
  • 3番ピン(I2C-1 SDA)をセンサのSDAへ
  • 5番ピン(I2C-1 SCL)をセンサのSCLへ
  • 6番ピン(GND)をセンサ接地へ

ハードウエアの作業はこれだけ。次にソフトですが、Jetson Nano使っているのに、怠けていた設定をまずしておきました。

$ sudo groupadd -f -r gpio
$ sudo usermod -a -G gpio ユーザ名
$ sudo usermod -a -G i2c ユーザ名

私の使っているラズパイのRaspbian上では、sudoせずにGPIOもI2Cも使えるのに、Jetson Nanoでは駄目だった理由がこれです。gpio、i2cというグループに入れてもらっていないから。なお、Jetson Nanoの場合、

  • i2cグループはすでに存在している(内部でI2C使っているからだと思う)
  • gpioグループは存在しない

ので上のようになりました。(設定後リブートしました)

さて、センサがつながっているか確かめるために、I2Cを調べてみます。まずは、I2Cのインタフェースが何チャネルあるのか調べてみます。i2c-toolsの中のi2cdetectコマンドに -l オプションで調べます。

$ i2cdetect -l
i2c-3   i2c             7000c700.i2c                            I2C adapter
i2c-1   i2c             7000c400.i2c                            I2C adapter
i2c-6   i2c             Tegra I2C adapter                       I2C adapter
i2c-4   i2c             7000d000.i2c                            I2C adapter
i2c-2   i2c             7000c500.i2c                            I2C adapter
i2c-0   i2c             7000c000.i2c                            I2C adapter
i2c-5   i2c             7000d100.i2c                            I2C adapter

7つも見つかりましたが驚きはしません。前回、データシートを読んだので、I2Cとして使える3チャネル以外に、「大物」のIOデバイスを制御するために複数のI2Cが内部使用されていることが分かっているからです。そして今回接続したピンは、i2c-1という名でリストされている上から2つ目の筈。そこで、i2c-1に接続しているデバイスを列挙するために、ラズパイのI2Cでもお世話になった以下のコマンドを実行。

$ i2cdetect -y 1
Warning: Can't use SMBus Quick Write command, will skip some addresses
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:
10:
20:
30: -- -- -- -- -- -- -- --
40:
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60:
70:

7ビットアドレスの0x40にセンサがいる筈ですが、反応がありません。いつもと違い、今回は、ちゃんとドキュメント読んでいるので慌てませんよ。別なオプションで、i2c-1がサポートしている機能を列挙してみれば納得です。

$ i2cdetect -F 1
Functionalities implemented by /dev/i2c-1:
I2C                              yes
SMBus Quick Command              no
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes

みればSMBus Quick command が no になっています。i2cdetect -yは、Quick commandをつかってアドレスを絨毯爆撃してMAPをつくっているのをラズパイのときに「波形」で確かめてあったことが活きました。Quickは駄目だけれど、普通にReadするのは問題ないようです。センサのアドレスは0x40と分かっているので、ピンポイントでせめてみます。

$ i2cdump -y 1 0x40
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 50 70 1b 01 01 32 dc 78 30 00 01 06 00 94 01 27    Pp???2?x0.??.??'
10: 00 05 05 07 00 ff 0a 01 00 00 00 01 0e 10 01 c0    .???..??...?????
20: 20 24 00 40 09 0e 30 03 cd 9d 33 00 00 a0 05 9f     $.@??0???3..???
30: c0 06 00 7f 37 02 bd 0f b2 09 00 03 7d 0f a0 30    ??.?7?????.?}??0
40: 16 01 00 00 00 00 10 06 09 00 1e 06 00 0f 00 00    ??....???.??.?..
50: 00 00 bd 0f b7 02 bd 0f b2 09 00 00 00 00 10 05    ..????????....??
60: 17 06 00 00 00 af 00 00 97 00 00 00 02 00 00 2c    ??...?..?...?..,
70: 00 00 00 00 00 00 00 00 00 17 07 00 06 00 d1 00    .........??.?.?.
80: 0a bf 00 0a 0f 00 00 1f 1f 00 00 00 00 00 00 03    ??.??..??......?
90: 00 00 ff ff ff 00 02 fa 00 0f 00 03 00 ff 00 00    ......??.?.?....
a0: 01 00 00 02 20 ad 00 31 03 00 01 00 00 00 00 45    ?..? ?.1?.?....E
b0: 00 00 00 00 03 33 7f 00 00 00 00 00 00 00 01 00    ....?3?.......?.
c0: 00 00 00 00 00 00 17 07 80 00 00 03 77 00 04 15    ......???..?w.??
d0: 30 30 00 03 f7 03 d9 03 04 00 00 f1 ff 51 00 00    00.??????..?.Q..
e0: e1 04 41 d6 00 8c 25 00 00 10 00 00 7f 04 07 00    ??A?.?%..?..???.
f0: 00 ff 04 00 ff 00 00 01 cf 89 aa 00 00 08 31 00    ..?....????..?1.

結構大量にあるGP2Y0E03内のレジスタのダンプができたようです。念のため、バスに不在のアドレスのダンプを試みるとこんな感じ。

$ i2cdump -y 1 0x41
No size specified (using byte-data access)
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
40: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
50: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
60: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
70: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
80: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
90: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
a0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
b0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX

ACKが返ってこないのでXXです。

ちゃんとセンサは接続されて生きているようなので、ラズパイの上で作ったPythonのスクリプトをそのまま動かしてみました(なお、Python3-smbusモジュールのインストールは必要でした。)

$ python3 test.py
GP2Y0E03 test program.
Shift bit(128cm mode=1)=1, MaxPulsewidth(default=7)7
4 [cm]
4 [cm]
4 [cm]
4 [cm]
6 [cm]
5 [cm]
29 [cm]
25 [cm]
35 [cm]
34 [cm]
127 [cm]

ラズパイ上のスクリプト、まったく手を入れずにうごきました。このセンサ、ちょっと安定するまでしばらく時間がかかるので、最初の方の4cmとかは安定前の状態ですが、しばらくすると障害物までの距離をちゃんと表示しています(目分量ですが。)

やっぱ、ドキュメント、読んでおくべきだわ。

バリバリのSoCとSoM(1) NVIDIA Jetson Nano System-on-Module へ戻る

バリバリのSoCとSoM(3) Jetson NanoのUARTに接続 へ進む