レガシー機器をなんでもIoT化してしまおう⑤

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

あっという間に10月になってしまいましたね。

突然ですが「毛根タイム」っていう言葉を知っていますか?
私も最近知ったのですが、時間を忘れてしまうほど何かに集中していた時に「もうこんな時間?!」と思った時に、「もうこんなじかん」→「毛根な時間」→「毛根タイム」という事みたいです。

社内で使用しているSlackのReactionに「毛根タイム」というものがあって、「これなんだろう・・・?」と思って調べてみただけなんですけどね。

2017年度も半分過ぎてしまい、時刻ではありませんがまさに「毛根タイム」です。

さて、「なんでもIoT」の準備もそろそろ最後の実装段階を残すのみとなってきましたが、その前にマイコンにはGPIOがたくさんついていますが、どれを使うべきなのか?ということを確認したいと思います。

WeMos Lolin ESP32のGPIO確認

まず、WeMos Lolinというのが一体何なのかよく分かっていません。WeMosはESP8266のものも触ったことがるので、どこかのメーカーのブランド?それとも規格なのかな?程度にしか思っていませんでしたが、今回、ESP32を搭載したWeMos Lolinシリーズが、簡単に調べただけでも3種類見つかりました。

WeMos Lilon ESP32の種類

  1. WeMos Lolin32でヒットするもの

    一番ノーマルな形に見える開発ボードで、GPIOの数も最が多いタイプです。
    Li-ion電池を使用するためのコネクタとケーブルがセットになっていますので、おそらくLi-ion電池のチャージ機能もついていると思われます。

  2. Lolin32でヒットするもの(OLED付)

    今回私が使用しているものです。OLEDがついているので便利ですが、GPIOの端子数は少ないです。
    下のOLEDなしタイプのハットを共用できるドーターボードも別売りされていますので、この二つは同じシリーズと思われます。

  3. 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を使用すればいいということが分かりました。

これで準備は整いました。

次回は待ちに待った、フォトカプラを用いた家電への実装を行ってみようかと思います。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメントを残す