USB制御の拡張IOボード(もどき)をArduino nanoで作ってみた。

背景

PCで自動制御や各種の測定を自動化する際、周辺装置に対してGPIOでオンオフ制御したり、I2Cで通信したり、アナログ値を読んだり、アナログ値を出力したりすることが頻繁に必要になるが、そのような目的に対応する拡張IOボードや拡張IOボックスが、色々なメーカーから発売されている。そのような製品は、絶縁性を備えていたり、ライブラリが充実していたり、いたれりつくせりではあるが、そこまでの性能や機能を必要としない場合は、Arduinoのような簡単なマイコンでその代わりは十分に果たせる。

今回は、Arduino Nanoを用いて、PCからUSB経由のシリアル接続(COMポート)からコマンドを送ることにより、Arduinoの指定したピンからH/Lのデジタル信号を出力したり、I2Cデバイスとの読み書きを行ったり、アナログ値の入出力、IRの出力等を行えるようにした拡張IOユニットを作ってみたので、備忘録として記録しておく。

ハードウエア

Arduino Nanoのモジュールを、ネジ端子のついた変換基板に載せただけ。(下の写真は、温度・湿度・気圧計測のBMP280モジュールがI2Cで接続されている状態)

PCとのインターフェースはUSBを使う。

DSC_0735

仕様

端子仕様

Arduino Nanoに装備されているGPIOは基本的に全て使用可能。各ピンの電気的仕様は、Arduino Nanoの仕様を参照すること。

  • D2: Digital In/Out
  • D3: Digital In/Out、ただしIR出力をする時はこのピンから出力される。
  • D4: Digital In/Out
  • D5: Digital In/Out
  • D6: Digital In/Out
  • D7: Digital In/Out
  • D8: Digital In/Out
  • D9: Digital In/Out
  • D10: Digital In/Out
  • D11: Digital In/Out
  • D12: Digital In/Out
  • D13: Digital In/Out
  • A0: Analog In/Digital In/Out
  • A1: Analog In/Digital In/Out
  • A2: Analog In/Digital In/Out
  • A3: Analog In/Digital In/Out
  • A4: I2CのSDA専用 (プルアップあり)
  • A5: I2CのSCL専用 (プルアップあり)
  • A6: Analog In
  • A7: Analog In

コマンド

シリアル通信で送るコマンド表は下記。シリアル通信は、9600baudに固定されている。コマンド表の書式に従った文字列を送り、最後に改行(CRLF)を送った時点でコマンドが実行される。読み取り系のコマンドの場合は、その直後、シリアルポートを読めば指定したコマンドに相当する応答を読み取ることが出来る。

各パラメータを、コロン(:)で区切り指定する。コマンドの文字は全て大文字。空白やタブ等は入れない。HEX値で指定する所は、小文字のHEX値でも大丈夫。ピン番号や不当なパラメターに対するチェックはほとんど入れてないので、広く活用するためには、エラーチェック等を強化する必要あり。

VISAコマンドの書式を少し真似て、コマンドの先頭にもコロンを付けることにしているが、無くても動作する(先頭のコロンは無視するようにしているため)

コマンド パラメター、例
PMOD

:PMOD:ピン番号:入力あるいは出力指定

例):PMOD:2:OUTPUT

例):PMOD:3:INPUT

例):PMOD:4:PULLUP

DIGW

:DIGW:ピン番号:LOWあるいはHIGH指定

例):DIGW:2:LOW

例):DIGW:2:HIGH

DIGR

:DIGR:ピン番号

例):DIGR:3

ピンを読んだ結果は、HIGHレベルの時、”1”が、LOWレベルの時 “0”がそれぞれ返ってくる。

ANAW

:ANAW:ピン番号:PWM出力値(HEX値で0からFFの範囲)

ピン番号で指定できるのは、3, 5, 6, 9, 11のどれか。

例):ANAW:5:80

この例では、5番ピンに 80h (50%)デューティー比のPWM信号を出力する。指定出来るPWM値は0から FF。必ずHEX値で指定すること。10hex以下の場合、先頭のゼロは付けない。例 ANAW:5:e (この例では、5番ピンに eすなわち14のPWMを出力する)

PWMのデューティー比の計算は、例えば x値の場合は、x/256になる(はず)

ANAR

注意:未実装

:ANAR:ピン番号

指定したピンのアナログ電圧を数値(0~255)で読む。

I2CW

指定したスレーブアドレスのデバイスの、指定したサブアドレスに、指定したデータを書き込む。書き込むバイト数指定は無く、コロンで接続したデータ列を全て書き込む。最大同時書き込みバイト数は10バイト(要チェック)

:I2CW:スレーブアドレス:サブアドレス:データ0:データ1:…

全てのアドレスやデータはHEX値で指定すること(大文字、小文字可)。エラーチェックは入っていないので注意。0xとかhexとかの接頭語、接尾後は付けてはいけない。

例):I2CW:76:E0:B6

例):I2CW:76:F4:27:00

I2CR

指定したスレーブアドレスのデバイスの、指定したサブアドレスから、指定したバイト数のデータを読み込む。読み出しバイト数を指定する必要がある。全ての数字はHEX値で指定すること(大文字、小文字可)。読み出しバイト数もHEX値として解釈される。最大読み出しバイト数は理論上 255バイトだが、確認していない。32バイトまでは実績あり。

:I2CR:スレーブアドレス:サブアドレス:バイト数

例):I2CR:76:88:18  (この例では、76hのデバイスの 88h番地から 18h(24バイト)のデータを読み込む事になる。

結果は、コロンでバイト毎に区切られたHEX値の文字列で返ってくる。

(c7:6e:ae:66:32:00:60:91:10:d6:d0:0b:6e:22:4b:ff:f9:ff:0c:30:20:d1:88:13)

IRWR

注意:実装テスト中に付き、正しくは動作しない

指定したメーカーコードの、指定したコードに相当するパルス信号をD3ピンから出力する。

例) :IRWR:SONY:A91:12

この例で、ソニーのTVカテゴリー、電源コマンド(12ビット)を出力する。

Arduinoのコード

IRリモート用の IRremote ライブラリと、I2C用のWire.hを使っている。

このArduino-IO拡張ツールとPC上のPythonプログラムを使って、Excel上に表現したシーケンス一覧からコマンドを読み取り、実行した結果をExcelに書き込むという自動化ツールを作成したので、後日、別の記事として掲載する予定。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする