yoshiyuki's blog

Arduino/Teensy/Raspberry pi pico を利用した I2C, SPI 通信アプリを紹介します

Arduino で I2C / GPIO コマンドの使用例と解説

この記事では自作アプリの使い方を説明しています。自作アプリに関しては以下の記事をご参照ください。
ysin1128.hatenablog.com

Windows アプリの「CMD_Multi」タブ、または、Android アプリで GPIO コマンドを使用した例を紹介します。

接続

Arduino の GND を相手の GND と接続した後で、Digital High/Low を与えたい端子に D2-D5 を接続します。これにより 4端子までに Digital High/Low を与えることができます。また、Digital High/Low の状態を検出したい端子にD6/D7 を、Analog 電圧値を検出したい端子に A0/A1 を接続します。それぞれ各2端子まで Digital High/Low の状態、または、Analog 電圧値を検出できます。特に GND の接続を忘れないように注意してください。

f:id:ysin1128:20200816001849p:plain

実行例

接続について説明した後ですが動作例に使うのにちょうど良い相手が無かったので、ここでは Arduino を PC/Android とだけ接続して、 GPIO の入出力に何も繋がない状態の動作例を紹介します。
とりあえず、 D2-D5 を適当に動かすコマンドを実行てみました。
f:id:ysin1128:20200814133000p:plain

コマンドの概要

g 00 01 01 02 04 08 00

このコマンドの実行によりD2-D5 から下図の波形が出力されます。
f:id:ysin1128:20200814135945p:plain

D2-D5 の波形、ならびに、各パルス幅の 1ms がコマンドで指定したものです。High/Low レベルの電圧は固定で、 Arduino の電源電圧と同じものとなり、通常、High は約5V, Low は 0V となります。

実行結果として表示されているのは D2-D7 と A0, A1 の値で、波形の図の各矢印のタイミングで取得されます。

> g 00 01 01 02 04 08 00
D7 D6 D5 D4 D3 D2 A1 A0
1 0 0 0 0 1 0276 0281
1 0 0 0 1 0 0349 0344
1 0 0 1 0 0 0372 0368
1 1 1 0 0 0 0365 0360
1 0 0 0 0 0 0316 0311

D2-7 は Digital端子なので値は 1 = High または 0 = Low のどちらかとなります。 A0, A1 は Analog 端子なので値としては Analog電圧値そのものが取得されるのですが、ここに表示されているのはそれを 10-bit AD変換して Digital の値にしたものです。さらに詳しく言うと、これは Arduino の電源電圧を 1024 分割したうちのいくつかという値で、Arduino の電源電圧を 5V とした場合、0276 という Digital 値は取得した Analog 値が 5V x (276/1024) = 1.35V だったことを意味します。
D2-D5 から出力する値はコマンドで指定しているので指定した通りの値が取得できています。D6, D7, A0, A1 は入力端子であり、今はそこに何も接続しないままコマンドを実行したので、ここで取得された値は不定値がたまたまその値になっただけでコマンドを実行するたびにふらふらと変動します。

ここで、例えば下図のように D2-D5 を D6, D7, A0, A1 に繋いで同じコマンドを実行すると D6, D7, A0, A1 から取得される値がそれぞれ接続された D2-D5 と同じ値になります。

f:id:ysin1128:20200814144014p:plain
f:id:ysin1128:20200814144026p:plain

コマンドの詳細

g 00 01 01 02 04 08 00

g はこのアプリ専用の Command word で、GPIO の操作を行うことを示しています。

続く 00 01 の 2-byte はパルス幅の指定です。単位は ms です。

残りの 01 02 04 08 00 は D2-D5 の波形の指定です。各 1-byte で D2-D5 の High/Low 状態の指定を行っています。Bit の割り当ては下図の通りです。
f:id:ysin1128:20200814150415p:plain

D2-D5 は各 1-byte で指定された状態を、先に指定したパルス幅分継続した後にD2-D7, A0, A1 の値を取得し、次の 1-byte で指定した状態に移行します。
f:id:ysin1128:20200814151241p:plain

この例では 5-byte 分の D2-D5 の波形の指定をおこなっていますが、ここでは 1-byte から 255-byte まで任意の長さの指定を行えます。例えば D2 = High を出力したいだけであれば g 00 01 01 のように波形の指定を 1-byte だけで行うことができ、逆に 255-byte いっぱいを使って長大なパターンを生成することも可能です。

その他の機能

GPIO コマンドはさらに下記の機能を有します。

  • D6, D7 の内蔵 Pull-up を有効にする
  • D6, D7 を D2-D5 と同様に Digital 出力として使用する
  • g コマンドで出力したパターンを任意の回数、または、無限に繰り返し出力する (p コマンド)

これら機能の使い方は下記のリンクをご参照ください。
ysin1128.hatenablog.com
ysin1128.hatenablog.com