6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MATLABなら超簡単! I2Cデバイスの動作確認ーroller485を例にー

Posted at

はじめに

新しいI2Cデバイスを購入、arduinoに接続して使用する場合の一般的な動作確認として下記の手順を踏む必要があります。

①arduinoとI2Cデバイスを物理的に接続
②arduinoライブラリで該当のI2Cデバイス用ライブラリを探してインストール
③ライブラリからサンプルコードを選択、もしくネットで調べてコピペ
④ビルド
⑤シリアルモニタ or シリアルプロッタでデータモニタ

上記動作確認の方法には、①で接続ミスがあった場合やI2Cデバイス自体が故障していた場合でも⑤でモニタするまで分からないという問題点があります。さらには②で既存のライブラリが無かった場合、プログラミングしてみないと接続ミスおよび故障に気づけない…ということで非常にめんどくさいです。

本記事では、単にデバイスとの接続にミスがないか、およびデバイスそのものが故障していないかを確認する方法として、MATLAB Support Package for Arduino Hardware を用いた動作確認の方法について説明します。

<備考>
MATLAB Home購入でおおよそ1万円ほどするかと思うので、I2Cデバイスの動作目的だけでMATLAB購入する人はいないと思います…なので上記はあくまで建前としての説明であって、どちらかというと自分用メモとしての記事というのが正直なところです。

1. arduinoとI2Cデバイスとの接続

MATLABだからといって特殊な接続をする必要はありません。
今回はarduino Dueが手元にあったので、I2C用のピンである20(SDA),21(SCL)および5V、GNDとI2Cデバイスを接続しています。下記写真は今回の例であるm5stack roller485と接続した例です。
image.png

arduino UNO R3ならA4(SDA)・A5(SCL)ピン、arduino UNO R4 Wifiもおそらく同様と思いますが手元にいずれも無く確証がちょっと取れません…

2. I2Cデバイスとの接続確認

なにげに便利な関数、scanI2CBus。arduinoと接続されているI2CデバイスのIDを認識することが出来ます。

a = arduino('COM5', 'Due', 'Libraries', 'I2C');
scanI2CBus(a)

roller485なら0x64が検出されるはずですが、I2Cデバイスとしてarduinoと正しく接続されていれば通り想定通りの結果が得られます。

image.png

I2Cデバイスと正しく接続できていれば、device関数にて該当デバイスとの接続環境を構築できます。

dev = device(a, 'I2CAddress', '0x64');

3. arduino→I2Cデバイスへのデータ送信

データ送信関数はwrite関数とwriteRegister関数がありますが、後述するデータ受信関数readRegisterとの組み合わせの都合上、writeRegisterが使いやすいです。

所定のアドレスに1個だけデータ送る場合

writeRegister(dev, hex2dec('00'), 1, 'uint8');

所定のアドレスに複数データを送る場合

writeRegister(dev,hex2dec('40'),[0 10 0 0], 'uint8');

なお、m5stack roller485の仕様 では、各アドレスの割り付けは下記になります。

・アドレス00:モータ制御のON/OFF切り替え設定用 1byteデータ
・アドレス40:速度制御モードにおける速度設定用 4byteデータ

image.png

image.png

このため、上記コマンドを送信することでモータが所定回転数で回りはじめます。

4. I2Cデバイス→arduinoへのデータ受信

データ受信は、データ読み込みアドレスをwriteしてからデータをreadする方法と、1関数でデータ受信を行うreadRegister を用いる方法の2通りがありますが、どう考えても後者のほうが便利です。

上記でデータ書き込みを行ったアドレス00、アドレス40ともにRead/Write両対応アドレスのため、今度はアドレスデータを読み込んで設定が正しく出来ているかを確認してみましょう。

所定のアドレスから1個のデータを受信する場合

dataAdress00 = readRegister(dev, hex2dec('00'))

image.png

所定のアドレスから複数のデータを受信する場合

dataAdress40 = readRegister(dev, hex2dec('40'), 4)

image.png

書き込んだデータが正しく設定できていることが確認できました。

おまけ roller485を回転数制御するためのMATLABコマンド

上記2,3を一つのコードにまとめただけですが。

a = arduino('COM5', 'Due', 'Libraries', 'I2C');
dev = device(a, 'I2CAddress', '0x64');
writeRegister(dev,hex2dec('00'),1, 'uint8');
writeRegister(dev,hex2dec('40'),[0, 10, 0, 0], 'uint8');

お後がよろしいようで。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?