[Arduino] I2C通信で2byte以上の通信をする関数

電子工作

みなさん,こんにちは.
おかしょです.

センサーとの通信方式はさまざまあります.この記事で解説するI2CやSPI,UARTなどがあります.

このI2Cについて詳しく知りたい方は以下の記事を参照してください.
[電子工作] センサとI2C通信を行う

この記事では通信をする関数の作り方について解説をします.

この記事を読むと以下のようなことがわかる・できるようになります.

  • 2byte以上のI2C通信をする方法
  • I2C通信をする関数の作り方
  • Arduinoのプログラムの書き方

 

この記事を読む前に

この記事で解説する2byte通信関数は以下の記事で解説している1byte通信関数を基にしています.

以下の記事を読んでおけば,この記事の内容をより理解できると思うので先に読んでおくことをおすすめします.

 

2byte以上通信するのはどんな時?

1byteだけ通信するのは,センサーの設定を書き込むときや通信ができているかの応答を確認するときに必要でした.

この記事で解説するような複数のbyteを通信するのはどのようなときかというと,データを読み込むときがほとんどです.

データの構造はほとんどが2byteで構成されています.加速度センサーとジャイロセンサーがどちらも搭載されたセンサーの場合は,それらのデータをまとめて4byte受信することで,データを得ることができます.

そのため,何かしらのセンサーを使う場合は2byte以上の通信を必ずすることになります.

 

I2C通信を行う準備

I2C通信については以下の記事で詳しく解説しているので,こちらでは簡単に説明をします.
[電子工作] センサとI2C通信を行う

I2C通信とはスレーブとマスターという役割に分かれて,マスターが信号を送ったらスレーブが応答を返すという通信方式になっています.マスターを訳すと「主人」,スレーブを訳すと「奴隷」という意味なので,そのような関係になっています.

ここではマスターがセンサーからデータを取得するマイコン,スレーブはセンサーになります.

Arduinoに書き込むプログラムでは,まずI2C通信を行う準備をする必要があります.

まずはI2C通信を行うことができるヘッダファイルをインクルードします.

#include <Wire.h>

セットアップ関数内で,以下のようにしてI2C通信を初期化します.

Wire.begin();

これで,I2C通信を行う準備ができました.

この後は,マスターがスレーブに信号を送ったりするプログラムを書くだけで,センサーからデータを取得することができます.

 

2byte以上の通信をする関数

1byteだけ通信をする関数の作り方では,センサーにデータを書き込む関数とセンサーからデータを読み込む関数の書き方を解説していました.

しかし,センサーを扱う上で2byte以上のデータ量をセンサーに書き込むことはないので,この記事では2byte以上のデータを読み込む関数のみ書き方の解説を行います.

関数をここから作っていくのですが,まず決めなければならないのが関数で使用する引数と返り値です.

今回のような2byte以上のデータを受信する関数の場合は,センサーのデバイスアドレスとスレーブアドレス,やり取りするデータ量,データを格納する箱が必要になります.

返り値は特に必要ありませんが,得られたデータ数とします.

このような設定をすると,関数の冒頭は以下のようになります.

uint8_t I2CreadMULTIbyte(uint8_t DeviceAddress, uint8_t SlaveAddress, uint8_t num, uint8_t * data)

データを格納する箱は配列を使用するので,アスタリスクをつけてポインタとしています.センサーから得られるデータは1byteずつになるので,配列の型はuint8_tとなっています.

あとは,デバイスアドレスを指定し,スレーブアドレスも指定してデータを取得するのみです.

uint8_t I2CreadMULTIbyte(uint8_t DeviceAddress, uint8_t SlaveAddress, uint8_t num, uint8_t * data)
{
  Wire.beginTransmission(DeviceAddress);
  Wire.write(SlaveAddress|0x80);
  Wire.endTransmission(false);
  Wire.requestFrom(DeviceAddress, num);
  for (uint8_t i=0; i<num; i++)
  {
    data[i] = Wire.read();
  }
  return num;
}

しつこいようですが,各行の解説はこちらで行っているので,知りたい方は読んでみてください.
この関数を使用するときは,以下のようにして使用します.

I2CreadMULTIbyte(AG_DEVICE_ADDRESS, OUT_A, 6, data)

 

まとめ

この記事ではI2C通信で複数のbyte数のデータを受信する関数の作り方を解説しました.

このブログで実行しているプロジェクトもこの関数を使ってセンサーを使用しています.

この関数を一度作ってしまえば,違う種類のセンサーでもI2C通信が簡単にできるのでプログラムの簡潔化をしたい方はぜひ参考にしてください.

 

続けて読む

以下の記事では今回作成した関数を使ってセンサーからデータを取得する方法を解説しています.

センサーを使用したい方は参考にしてください.

Twitterでは記事の更新情報や活動の進捗などをつぶやいているので気が向いたらフォローしてください.

それでは最後まで読んでいただきありがとうございました.

コメント

タイトルとURLをコピーしました