ESP-WROOM-02でI2Cを使う
前の記事でESP-WROOM-02(以下単にESPと略して書く場合があります)をArduinoのIDEから動かすことが出来ました。このモジュールは高機能なのですが、ピン数が少ないので機能を拡張しようとすると、すぐにピン数リミットになってしまいそうです。
こういう問題の解決策としてI2Cインターフェイスを使う手があります。I2Cは信号ピンを2つしか使わないので貴重なI/Oピンの使用量を最小限にすることができます。ここでもしESPからI2Cがうまく使えないとなると一大事。その魅力は半減してしまいます。
ということで、まずはI2Cインターフェイスの使い方を確認していくことにします。ネットには先人の方々がI2Cインターフェイスの使い方について解説記事をたくさん書かれています。そういう情報を参考にしながら私なりに確認していくことにします。インターフェイスの確認に使うI2Cデバイスは何でもいいのですが、後で役立つ可能性が高いということで、2行x8文字のキャラクタ液晶(秋月のAQM0802)でやってみることにします。
▼回路図
電源電圧は3.3Vで動くのでレベルコンバーターなどは不要で、すっきりした回路になりました。なお、I2CバスのプルアップにはAQM0802モジュール内蔵のプルアップ抵抗を使っています。
I2CのSDAにはIO4を、SCLにはIO5を使いましたが、これがESPのWireライブラリのデフォルトのピンアサインのようです。特に事情が無ければこの組み合わせを使った方がいいと思います。なお、初期化の宣言の中で別のピンを割り当てることも可能です。
ちなみにArduinoではI2Cの信号はA4ピン(SDA)とA5ピン(SCL)に固定されていたので、ESPの方が柔軟な使い方が可能になっています。まあ、ピン数が少ないところにもってきてアサイン出来る機能が制限されたりすると、すごく使い難いものになります。そういう配慮から、どのピンでもI2Cに使えるようにしたのではないかと思います。CPUのクロックも速めなので、力技でやっつけちゃってるかも?
▼ブレッドボード
回路図には書いて無いLEDがいくつかありますが、これは動作チェック用に追加したものです。
ESP-WROOM-02のI2Cインターフェイスの動作確認のために、まずはI2Cアドレスのスキャンプログラムを動かしてみます。
▼I2Cアドレススキャンプログラム
▼動作確認結果
アドレス 3E にデバイスが検出されており、これはAQM0802のアドレスです。ということでこのI2Cインターフェイスはうまく動いているようです。ちなみに動作中のI2Cクロック波形をオシロで見てみると、約100kHzで動いていました。
キャラクタ表示可能なデバイスがつながったので、お約束の、
▼Hello World!
この表示には、ikesatoさんが書かれた、ESP-WROOM-02 の Arduino 環境で I2C 制御の記事中のプログラムを使わせて頂きました。ありがとうございます。
ということでESP-WROOM-02は結構使えそうです。もう少しいじってみたいと思います。
気になるのは普通のArduino 用の関数やライブラリがどこまで使えるかです。CPUのレジスタ名を直接叩いているものは絶対にダメでしょう。またユーザー作成のラリブラリもダメな可能性が高いです。
このへんを手当たり次第に試すのも疲れるので、ドキュメントを読んだほうが良さそうです。たぶんここいらあたりか、
こういう問題の解決策としてI2Cインターフェイスを使う手があります。I2Cは信号ピンを2つしか使わないので貴重なI/Oピンの使用量を最小限にすることができます。ここでもしESPからI2Cがうまく使えないとなると一大事。その魅力は半減してしまいます。
ということで、まずはI2Cインターフェイスの使い方を確認していくことにします。ネットには先人の方々がI2Cインターフェイスの使い方について解説記事をたくさん書かれています。そういう情報を参考にしながら私なりに確認していくことにします。インターフェイスの確認に使うI2Cデバイスは何でもいいのですが、後で役立つ可能性が高いということで、2行x8文字のキャラクタ液晶(秋月のAQM0802)でやってみることにします。
▼回路図
電源電圧は3.3Vで動くのでレベルコンバーターなどは不要で、すっきりした回路になりました。なお、I2CバスのプルアップにはAQM0802モジュール内蔵のプルアップ抵抗を使っています。
I2CのSDAにはIO4を、SCLにはIO5を使いましたが、これがESPのWireライブラリのデフォルトのピンアサインのようです。特に事情が無ければこの組み合わせを使った方がいいと思います。なお、初期化の宣言の中で別のピンを割り当てることも可能です。
ちなみにArduinoではI2Cの信号はA4ピン(SDA)とA5ピン(SCL)に固定されていたので、ESPの方が柔軟な使い方が可能になっています。まあ、ピン数が少ないところにもってきてアサイン出来る機能が制限されたりすると、すごく使い難いものになります。そういう配慮から、どのピンでもI2Cに使えるようにしたのではないかと思います。CPUのクロックも速めなので、力技でやっつけちゃってるかも?
▼ブレッドボード
回路図には書いて無いLEDがいくつかありますが、これは動作チェック用に追加したものです。
ESP-WROOM-02のI2Cインターフェイスの動作確認のために、まずはI2Cアドレスのスキャンプログラムを動かしてみます。
▼I2Cアドレススキャンプログラム
/*このプログラムは以前Arduino UNO用に作ったものですが、ESP-WROOM-02でもそのまま動きました。(一部コメントを修正しています) 普通のArduinoとESPでどれくらいプログラムの互換性があるのか気になるところですが、基本的な言語仕様として定義されている範囲内で使うなら、結構大丈夫なのかも知れません。
I2Cアドレススキャナー(I2C address scanner)
I2Cのアドレスをスキャンしてデバイスが存在するアドレス
をシリアルモニタに表示する。
2014/12/23 ラジオペンチ
http://radiopench.blog96.fc2.com/
2016/04/27 ESP-WROOM-02 (ESP8266) 用にちょっと修正
*/
#include <Wire.h>
void setup() {
Wire.begin(); // 引数無しは (4, 5)と同じ (SDA,SCL)
Serial.begin(115200);
Serial.println(); Serial.println("Start I2C address scanner");
}
void loop() {
Serial.println(" 0 1 2 3 4 5 6 7 8 9 A B C D E F");
for (byte n = 0; n <= 0x7F; n++) { // I2Cアドレスを指定
adrCheck(n); // デバイス有無を調べ結果を出力
}
Serial.println(); // 1行空けて
delay(2000); // 2秒待って繰り返す
}
void adrCheck(byte adr) {
byte dummy; // Dummy
if ((adr & 0x0F) == 0) { // 行の先頭なら
print_hex2chr(adr); // アドレスを出力
Serial.print(":");
}
Serial.print(" "); // 区切り用に空白を入れる
if (adr < 8 || adr > 0x77) { // 予約アドレスの範囲は
Serial.print("xx"); // xx 表示
}
else { // アドレスにデバイスがあるか?
Wire.beginTransmission(adr);
Wire.write(&dummy, 0);
if (Wire.endTransmission() == 0) { // 書き込みが正常終了していたら
print_hex2chr(adr); // そのアドレスを表示
}
else {
Serial.print("--"); // 無効表示(--)
}
}
if ( (adr & 0x0F) == 0x0F) { // 行末なら改行
Serial.println();
}
}
void print_hex2chr(byte x) { // 16進2桁で出力
Serial.print((x >> 4), HEX); // 上位
Serial.print((x & 0x0F), HEX); // 下位
}
▼動作確認結果
アドレス 3E にデバイスが検出されており、これはAQM0802のアドレスです。ということでこのI2Cインターフェイスはうまく動いているようです。ちなみに動作中のI2Cクロック波形をオシロで見てみると、約100kHzで動いていました。
キャラクタ表示可能なデバイスがつながったので、お約束の、
▼Hello World!
この表示には、ikesatoさんが書かれた、ESP-WROOM-02 の Arduino 環境で I2C 制御の記事中のプログラムを使わせて頂きました。ありがとうございます。
ということでESP-WROOM-02は結構使えそうです。もう少しいじってみたいと思います。
気になるのは普通のArduino 用の関数やライブラリがどこまで使えるかです。CPUのレジスタ名を直接叩いているものは絶対にダメでしょう。またユーザー作成のラリブラリもダメな可能性が高いです。
このへんを手当たり次第に試すのも疲れるので、ドキュメントを読んだほうが良さそうです。たぶんここいらあたりか、
- 関連記事