M5AtomにOLED SSD1306を直結してみた
M5AtomとSSD1306のピン配置を見比べていたら、VCCとGNDの位置は同じだから直結できるのでは?と言う気がして、やってみたら簡単に出来てしまいました。
ArduinoIDEでボードライブラリにESP32(ESP32 Pico kitやM5STACK-ATOMなど)を指定した場合、
Wireクラス(I2C通信のライブラリ)の初期化時に、SDA/SCLのピン番号と動作クロックを指定できます。
省略時(-1が指定された場合)に SCL=21,SDA=25になるようです。
bool begin(int sda=-1, int scl=-1, uint32_t frequency=0); // returns true, if successful init of i2c bus
begin( ) メソッドのパラメタ指定を変更すれば、スケッチ自体は変更なしで動作します。
adafruitのSSD1306ライブラリを使用する場合の変更箇所
Wire.begin( ) メソッド実行時に引数を設定すれば良いのですが、adafruitのライブラリを使用するサンプルスケッチでは▼の位置に Wire.begin( ) メソッドを追記すれば良いです。
また、上下左右を反転(180度)回転した方が見やすいかも。
void setup() {
Serial.begin(9600);
Wire.begin(21,25); // ★ ココに追記:I2C SDA-21,SCL-25:GROVE端子を使用する場合は SDA-26,SCL-32
// SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// ▼ 表示を180度回転する場合、この2行を追記
display.ssd1306_command(0xC0) ;
display.ssd1306_command(0xA0) ;
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
delay(2000); // Pause for 2 seconds
M5Atom本体とGROVEコネクタの両方にOLEDを接続してみる
ESP32はI2Cバスが2系統使えます。TowWireクラスのインスタンスとしてWireをWire1が定義されていますが、ディフォルトではWire1にはピンが割り当てられていません。
Wire1.begin(SDA,SCL)を宣言する事でWire1が使えるようになります。
※SDA,SCLは適当なピン番号