I2Cの実験(5/6)

1/6 )( 2/6 )( 3/6 )( 4/6 ) ( 6/6 )  〔マイコンのトップに戻る〕


《ArduinoでソフトI2C通信》

Arduinoの標準ライブラリで"Wire"ライブラリが有ります、これはMCUチップ内蔵のハードウエアI2Cを
使った物です。
こちらの”Arduino Playground”サイトに、ソフトウエアを使ったI2Cライブラリ(SoftI2CMaster)が
有ります、これの使い方を記事にして置きます。
尚、I2Cの基本話は前の実験記事(1/6 , 2/6 , 3/6)を参照下さい。

”Wire”ライブラリと比較して”SoftI2CMaster”ライブラリの特徴は

・ I2C通信の速度(25KHz〜400KHz)が変更可能です。
 (因みに、Arduino Unoにて下記のサンプルで400KHz動作不可でした、300KHzでは動作しました)
・ リピート・スタート・コンディション操作が可能です。
・ ”Wire”ライブラリの様に送受信32バイトの制限が有りません。
・ SDA/SCLピンが自由に割り付け可能です。
 (ハードI2Cであれば、Arduino Unoの場合、SDA/SCLピンかA4/A5ピンの何方かしか利用出来ない)
 (SDA/SCL・A4/A5ピンは繋がっています、だからSDA/SCLでI2Cをして、A4/A5でアナログはダメよ)
・ スレーブ動作での機能は有りません、マスター動作のみです。

ライブラリのインストール

@ ここ(GitHub)のページの右側に有る[Download ZIP]ボタンをクリックします。

A ダウンロードしたファイル名"master.zip"を"SoftI2CMaster.zip"に変更します。

B 次に、ここのページの登録方法1を参照してインストールしましょう。

ライブラリの使い方を説明

関数ライブラリを利用する場合は、メニューバーの「スケッチ」→「ライブラリを使用」→「SoftI2CMaster」
をクリック操作すれば、"#include <SoftI2CMaster.h>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。

MCUとArduinoピン対応図
ATmegaチップとArduinoのピン対応図です、
Arduino 日本語リファレンス”のこちらから拝借しました。

例えば、SCLをデジタル2番ピン、SDAをデジタル3番ピンに割り当てるとします。
上の図から、デジタル2番ピンは"PD2"でデジタル3番ピンは"PD3"となっています、
この"PD"とは"PORTD"のポートと言う事です、なので下記の様に記述します。
#define SCL_PIN  2                 // SCLは2番ピンとする
#define SCL_PORT PORTD 
#define SDA_PIN  3                 // SDAは3番ピンとする
#define SDA_PORT PORTD 
#include <SoftI2CMaster.h>         // ソフトI2Cを利用する為のファイル

必ず、"#include <SoftI2CMaster.h>"の上の方で"define"記述です。
尚、デジタル13番ピンに割り当てる場合は
#define SCL_PIN  5                 // SCLは13番ピンとする
#define SCL_PORT PORTB 
通信速度を400KHzにする場合は
#define I2C_FASTMODE     1         // I2Cの通信速度は400KHzとする(この行を追加)
#include <SoftI2CMaster.h>         // ソフトI2Cを利用する為のファイル
但し、"Arduino Uno"で実験したのですが400KHzでは上手く動作しなかったので
"SoftI2CMaster.h"ファイル内の
#define I2C_DELAY_COUNTER (((I2C_CPUFREQ/400000L)/2-19)/3) この記述を
"400000L"->"300000L"(300KHz)に変更したら動作しました。

因みに通常のデフォルト速度は100KHzです。


ソフトI2C通信の関数ライブラリの使い方を説明します。

 boolean ans = i2c_init(void)
 I2C通信のマスターモードで初期化を行う処理です。
  ans   :戻り値   1(true) =正常終了
            0(false)=失敗(SDA/SCLプルアップしていないと失敗します)

 boolean ans = i2c_start(uint8_t addr)
 スレーブにスタートコンディションを発行する処理です。
  addr  :スレーブのアドレスを指定します
       7bit+"R/W"の8bit構成で指定します。(例:0x80 | I2C_WRITE  0x80 | I2C_READ)
  ans   :戻り値   1(true) =正常終了  0(false)=失敗(相手からACKが返ってこない)

 boolean ans = i2c_rep_start(uint8_t addr)
 スレーブにリピート・スタートコンディションを発行する処理です。
  addr  :スレーブのアドレスを指定します(7bit+"R/W"の8bit構成で指定)
  ans   :戻り値   1(true) =正常終了  0(false)=失敗(相手からACKが返ってこない)

 void i2c_stop(void)
 スレーブにストップコンディションを発行する処理です。

 boolean ans = i2c_write(uint8_t value)
 スレーブにデータを1バイト送信する処理です。
  value :送信するデータを指定します
  ans   :戻り値   1(true) =正常終了  0(false)=失敗(相手からACKが返ってこない)

 uint8_t ans = i2c_read(boolean last)
 スレーブからデータを1バイト受信する処理です。
  last  :スレーブへの返答データを指定します
      0(false)=ACKを返す  1(true)=NOACKを返す(受信データが最後なら1)
  ans   :受信したデータを返します

 例)
     if (i2c_start(0x80|I2C_WRITE)) {              // スタートコンディションを発行する
          if (i2c_write(reg_adrs)) {               // レジスタアドレスを指定
               if (i2c_rep_start(0x80|I2C_READ)) { // リピート・スタートコンディションを発行する
                    dt[0] = (char)i2c_read(false); // 2byte読み出す
                    dt[1] = (char)i2c_read(true) ;
               }
          }
     }
     i2c_stop() ;                                   // ストップコンディションを発行する

サンプルスケッチ

実験回路
 ↓からサンプルスケッチはダウンロードします。
 softI2Ctest.zip


 左は湿度センサーのHDC1000と"Arduino Uno"を
 I2C接続し、上記のソフトI2Cライブラリにて制御を
 行う為の実験回路図です。
 HDC1000の詳しい話はこちらのページを参照
 下さい。

 電源は5Vです。
 デジタル2番端子をSCL、
 3番端子をSDAとしています。
 I2C用プルアップ抵抗はHDC1000モジュールに
 内蔵です。


その他
"SoftI2CMaster.cpp"のファイルは有りません、
"SoftI2CMaster.h"のみでこの中にインラインアセンブラで記述されています、
なので"Arduino"の種類によっては動作しないものが有るかもね。



[前のページ”PICでのマルチマスターの通信”へ]
[次のページ”PCA9547D-I2Cマルチプレクサー(I2Cバス切換器)”へ]





【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.