I2Cの実験(5/6)
(
1/6
)(
2/6
)(
3/6
)(
4/6
) (
6/6
)
〔マイコンのトップに戻る〕
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>"がスケッチに追加されます。
まぁ、手動でキー入力しても良いんですけどね。

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.