
あっという間に10月になってしまいましたね。
突然ですが「毛根タイム」っていう言葉を知っていますか?
私も最近知ったのですが、時間を忘れてしまうほど何かに集中していた時に「もうこんな時間?!」と思った時に、「もうこんなじかん」→「毛根な時間」→「毛根タイム」という事みたいです。
社内で使用しているSlackのReactionに「毛根タイム」というものがあって、「これなんだろう・・・?」と思って調べてみただけなんですけどね。
2017年度も半分過ぎてしまい、時刻ではありませんがまさに「毛根タイム」です。
さて、「なんでもIoT」の準備もそろそろ最後の実装段階を残すのみとなってきましたが、その前にマイコンにはGPIOがたくさんついていますが、どれを使うべきなのか?ということを確認したいと思います。
概要
WeMos Lolin ESP32のGPIO確認
まず、WeMos Lolinというのが一体何なのかよく分かっていません。WeMosはESP8266のものも触ったことがるので、どこかのメーカーのブランド?それとも規格なのかな?程度にしか思っていませんでしたが、今回、ESP32を搭載したWeMos Lolinシリーズが、簡単に調べただけでも3種類見つかりました。
WeMos Lilon ESP32の種類
-
WeMos Lolin32でヒットするもの
一番ノーマルな形に見える開発ボードで、GPIOの数も最が多いタイプです。
Li-ion電池を使用するためのコネクタとケーブルがセットになっていますので、おそらくLi-ion電池のチャージ機能もついていると思われます。
-
Lolin32でヒットするもの(OLED付)
今回私が使用しているものです。OLEDがついているので便利ですが、GPIOの端子数は少ないです。
下のOLEDなしタイプのハットを共用できるドーターボードも別売りされていますので、この二つは同じシリーズと思われます。
-
Lolin32でヒットするもの(OLEDなし小型)
非常に小型でESP32メインボードのブレイクアウトボード的な製品です。様々なハットがオプションで発売されています。
今回使用するLolin32(OLED付)の配線図
端子プロファイルとしては、向かって右側の上からGPIO36,25,26,8,11,7,6となっており、同様に右側は上からGPIO39,16,5,4,0,2,14,12,13,15,3,1となっています。
しかし、少なくともOLEDが接続されているGPIO4,5は通常通り使用できるものではないと思いますし、そのほかのGPIOも利用方法はよく分かりませんが、予約済みだったり、そもそも用途が違うものがあるかもしれないので、いったいどのGPIOを自由に使う事が出来るかを洗い出していきたいと思います。
GPIO入力の試験
GPIOの入力は、今回はINPUT_PULLUPで実施したため、GND端子と各GPIO端子を短絡することによって、Digital入力がきちんと取得できるかを試験してみました。
ソースコード
#include <Wire.h>
#include "SSD1306.h"
SSD1306 display(0x3c, 5, 4);
int counter = 1;
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
pinMode(0,INPUT_PULLUP);
pinMode(1,INPUT_PULLUP);
pinMode(2,INPUT_PULLUP);
pinMode(3,INPUT_PULLUP);
pinMode(12,INPUT_PULLUP);
pinMode(13,INPUT_PULLUP);
pinMode(14,INPUT_PULLUP);
pinMode(15,INPUT_PULLUP);
pinMode(16,INPUT_PULLUP);
pinMode(25,INPUT_PULLUP);
pinMode(26,INPUT_PULLUP);
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
}
void loop() {
display.clear();
display.drawString( 0, 0, String(" 0:"));
display.drawString( 0, 8, String(" 1:"));
display.drawString( 0, 16, String(" 2:"));
display.drawString( 0, 24, String(" 3:"));
display.drawString(40, 0, String("12:"));
display.drawString(40, 8, String("13:"));
display.drawString(40, 16, String("14:"));
display.drawString(40, 24, String("15:"));
display.drawString(40, 32, String("16:"));
display.drawString(80, 0, String("25:"));
display.drawString(80, 8, String("26:"));
display.drawString(16, 0, String(digitalRead(0)));
display.drawString(16, 8, String(digitalRead(1)));
display.drawString(16, 16, String(digitalRead(2)));
display.drawString(16, 24, String(digitalRead(3)));
display.drawString(56, 0, String(digitalRead(12)));
display.drawString(56, 8, String(digitalRead(13)));
display.drawString(56, 16, String(digitalRead(14)));
display.drawString(56, 24, String(digitalRead(15)));
display.drawString(56, 32, String(digitalRead(16)));
display.drawString(96, 0, String(digitalRead(25)));
display.drawString(96, 8, String(digitalRead(26)));
display.drawString(96, 52, String(counter));
counter = 1 - counter;
display.display();
delay(200);
}
入力試験結果
以下の写真にあるように、GNDを各端子に短絡させていきます。写真では、GPIO16に短絡させている状態なので、PULLUPですべての端子がHIGH(1)になっている状況からLOW(0)に変わっています。
結果としては、実は画面に表示されていに端子はすべて、digitalRead()を定義した時点でプログラムが走らなくなったため、そのGPIO6,7,8,11は使用できないと思われます。また、この写真では表示していますが、そもそもGPIO4,5はOLEDの表示の信号を伝えているPINなので、使用しない方が無難とおもわれるため、プログラムからは外しました。
そして、GPIO36,39も、そもそもPULLUPしているのにLOW(0)のままであることからもわかるとおり、これも利用できないと思った方が良さそうです。
そのため、問題なくDigitalRead()が出来るGPIOは以下のPINとわかりました。
結論
入力に用いることができるGPIOは、0,1,2,3,12,13,14,15,16,25,26の11PIN。
GPIO出力の試験
次は出力の試験ですが、今度はLEDを点灯させて行うことにします。
ソースコード
#include <Wire.h>
#include "SSD1306.h"
SSD1306 display(0x3c, 5, 4);
int counter = 1;
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println();
pinMode(0,OUTPUT);
pinMode(1,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
pinMode(14,OUTPUT);
pinMode(15,OUTPUT);
pinMode(16,OUTPUT);
pinMode(25,OUTPUT);
pinMode(26,OUTPUT);
display.init();
display.flipScreenVertically();
display.setFont(ArialMT_Plain_10);
}
void loop() {
display.clear();
display.drawString( 0, 0, String(" 0:"));
display.drawString( 0, 8, String(" 1:"));
display.drawString( 0, 16, String(" 2:"));
display.drawString( 0, 24, String(" 3:"));
display.drawString(40, 0, String("12:"));
display.drawString(40, 8, String("13:"));
display.drawString(40, 16, String("14:"));
display.drawString(40, 24, String("15:"));
display.drawString(40, 32, String("16:"));
display.drawString(80, 0, String("25:"));
display.drawString(80, 8, String("26:"));
display.drawString(16, 0, String(counter));
display.drawString(16, 8, String(counter));
display.drawString(16, 16, String(counter));
display.drawString(16, 24, String(counter));
display.drawString(56, 0, String(counter));
display.drawString(56, 8, String(counter));
display.drawString(56, 16, String(counter));
display.drawString(56, 24, String(counter));
display.drawString(56, 32, String(counter));
display.drawString(96, 0, String(counter));
display.drawString(96, 8, String(counter));
digitalWrite( 0, counter);
digitalWrite( 1, counter);
digitalWrite( 2, counter);
digitalWrite( 3, counter);
digitalWrite( 12, counter);
digitalWrite( 13, counter);
digitalWrite( 14, counter);
digitalWrite( 15, counter);
digitalWrite( 16, counter);
digitalWrite( 25, counter);
digitalWrite( 26, counter);
counter = 1 - counter;
display.display();
delay(200);
}
出力試験結果
以下の映像の様に、LEDのプラス端子を3.3vに、マイナス端子を試験目的のGPIOに接続させると、各GPIOのHIGH(1)、LOW(0)切替に同期して点灯することが確認できます。
入力とほぼ同じになると予測していましたが、GPIO1だけがNGという結果になりました。GPIO1は他の役割としてはTX(送信)のPINとなっていますが、なぜ出力することが出来ないかは不明です…
結論
出力に用いることができるGPIOは、0,2,3,12,13,14,15,16,25,26の10PIN。
結局どのGPIOを入出力に使う事が出来るのか
入出力に用いることができるGPIOは、0,2,3,12,13,14,15,16,25,26の10PIN。
上記のGPIOであれば、入力・出力両方とも問題なく利用できたため、上記から選択して好きなPINを使用すればいいということが分かりました。
これで準備は整いました。
次回は待ちに待った、フォトカプラを用いた家電への実装を行ってみようかと思います。
コメント