ESP32でPC起動リモコンをつくってみた(Wake on LAN)

電子工作

以前、ESP32でWake on LANリピーター(送信機)を製作してみました。

前回ESP32で制作したWOLリピーターは、ブラウザからアクセスしマジックパケットを送信することでパソコンを起動できるというものでしたが、今回はESP32にボタンスイッチを接続し、スイッチを押すことでパソコンを起動できるようにしてみたいと思います!

Wake on LANについての基本知識などについては、前回の記事をごらんください。

スポンサーリンク

しくみ

ボタンが押されたら、マジックパケットを送信し、対象のコンピューターをWake on LAN(=リモート起動)させます。

スポンサーリンク

部品リスト

イチから組み立てたい場合は、以下のパーツが必要となります。

  • ESP32 DevKit(ESP32開発ボード)
  • ジャンプワイヤー
  • 押ボタンスイッチ(自動戻りタイプ)
  • ケース(100円ショップのタッパーなど)

ボクは近所のマルツパーツで購入してきました。Amazonや秋月などの通販サイトでもすべて入手可能です。すべて揃えても、トータル1000円くらいで済みます。

もちろん、以前作ったESP32製WOLリピーターに組み込むこともできますよ♪

組み立て

さっそく組み立てを行います。

① ボタンスイッチを取り付け

まずは、スイッチをケースに取り付けましょう。

パーツショップでボタンスイッチを入手してきました。ミヤマ電器のDS435S-Rというモデルです。お値段110円でした。

押しボタンスイッチ 赤 DS435S-R ミヤマ電器製|電子部品・半導体通販のマルツ
【DS435S-R】 押しボタンスイッチ 赤 224.00円 在庫数:63個 納期:本日出荷在庫品 ミヤマ電器製|16:00までのご注文を翌日お届け、3,000円以上購入で送料無料。角型セルフロックタイプ プッシュスイッチ。取付穴参考寸法 12.2×11.2mm パネル 1.5〜3mm ON-OFFロック式パネルへの...

自分の場合は、環境センサーや赤外線LEDユニットなどと一緒に100円ショップで買ったタッパーにESP32に組み込んでいます。このタッパーの蓋に買ってきたボタンを組み込むことにしました。

ESP32が入っているケース

カッターナイフで蓋から1cmx1cmの正方形を切り出し。

蓋から1cm正方形を切り出し

裏側から押し込んで、あっという間に取り付け完了!

スイッチを取り付ける

このスイッチ(DS435S-R)はスナップインタイプといって、本体側面にバネ式の返しがついています。返しがあるおかげで、ボードに押し込むだけで固定することが可能となっています。

スナップインタイプのスイッチなので取り付けがラクラクです!
スナップインタイプのスイッチなので取り付けがラクラクです!

つづけて、ESP32との配線を行います。本来ははんだ付けを行うべきですが、手元に銅線がなかったので、ジャンプワイヤーの金属部分をペンチで折り曲げ、サクッと配線しました。これならハンダもいらないし、直接ESP32に差し込むだけで配線できます。

スイッチを配線

ショートしないように、互いに反対を向くように金具を曲げます。

スイッチの下にもさまざまな配線があるので、セロハンテープなどで絶縁しておくと安心かもしれませんね。

ジャンプワイヤーはGNDとGPIO14に接続します。

ジャンプワイヤの接続方法

接続するGPIOはプログラムからいくらでも変更できます。すでに使用しているという場合は、後で公開しているソースコードを編集し、自分の環境にあったGPIOを選択してください。

これで完成です。蓋を締めて、ハードウェアの準備は完了!

完成品

プログラミング!

今度はソフトウェアをつくっていきましょう!

当方、開発にはPlatform IOを使用していますが、Arduino Studioでも構いません。基本的な方法は同じです。

PlatformIO: Your Gateway to Embedded Software Development Excellence
Unlock the true potential of embedded software development with PlatformIO's collaborative ecosystem, embracing declarative principles, test-driven methodologie...

ただ、個人的にはPlatform IOをおすすめしています。多くのプログラマーが使用しているVisual Studio Codeで動作しますし、Arduino Studioよりも環境構築でのトラブルが少ないためです。バリバリ開発していくつもりなら、最初からPlatform IOを導入しておくことをおすすめします。

ESP32でボタン押下を検出するには?

ESP32では、押しボタンスイッチをGPIOに接続して、入力を認識することができます。

ボタン入力を検知する基本的なソースコードを掲載しておきます。

// GPIOピン14にボタンを接続
#define BTNPIN 14;

void setup(){
    //ピンモードの設定
    pinMode(BTNPIN, INPUT_PULLUP);
}

void loop(){
  static int btnStatus = 0;
  while (1)
  {
    //GPIOの入力を読み取る
    btnStatus = digitalRead(BTNPIN);

    //プルアップなので
    if (btnStatus == LOW)
    {
      //ボタンが押されているときの処理
      Serial.println("btn!");
    }
  }
}

上のコードは、GPIO14ピン-押しスイッチ-GNDを接続し、押しボタンが押されたときに処理を行うサンプルです。

スイッチに接続したいピン番号はdefineにより定義しておきます。ESP32ではGPIO13、14、16~23、27を入力に使用することができます。これらの中から任意のピン番号を選べばOKです。ここでは14番を使うことにしました。

GPIO34以降も入力に対応していますが、後述するプルアップには使えません。注意しましょう!

setupでは、GPIOのモードをINPUT_PULLUPに指定しています。INPUT_PULLUPにすると、指定されたGPIOピンが3.3Vでプルアップ(=電圧が印加)されます。指定したピンに3.3Vの電圧をかけておき、スイッチをはさんでもう一端をGND(0V)に接続しておけば、GPIOの電圧低下によりボタンの押下を検出することができるというわけです。

GPIOの電圧はdigitalRead関数により検出することができますので、loopで電圧の低下を検出し、ボタンが押されたら処理を走らせるようにしています。

ちなみに、INPUT_PULLUPにすると、ESP32に内蔵されている抵抗が自動的に有効になります。なので、プルアップ回路とした場合も別途抵抗を実装する必要はありません。便利です♪

ESP32でWake On LANするには?

ESP32でWake on LANするには、次のライブラリがおすすめです。

GitHub - a7md0/WakeOnLan: Wake On LAN Library (ESP8266 & ESP32)
Wake On LAN Library (ESP8266 & ESP32). Contribute to a7md0/WakeOnLan development by creating an account on GitHub.

a7md0/WakeOnLanは、その名の通り、ESP32からマジックパケットを送信しWake On LANするためのライブラリです。たった1行でWake on LANのマジックパケットを送信することができます。

// マジックパケットを送信する
WOL.sendMagicPacket("xx:xx:xx:xx:xx:xx");

今回はこのライブラリを使用して、マジックパケットを送信できるようにします。

ライブラリを導入するには、Platform IOのコンソールで次のコマンドを実行します。

pio lib install "a7md0/WakeOnLan"

Arduino Studioでは、ライブラリマネージャーからインストール可能です。

Arduinoライブラリのインストール - Humblesoft/Wiki

ソースコード

以上で準備は完了。あとはプログラムを組み立てていくだけです。

完成したソースコードがこちらです↓

#include <Arduino.h>
#include <WiFiUDP.h>
#include <WakeOnLan.h>

// 必要な変数を用意
WiFiUDP UDP;
WakeOnLan WOL(UDP)
// GPIO14にスイッチを接続
#define BTNPIN 14;
// Wifi
const char *ssid = "SSID";
const char *password = "KEY";

setup(){
  // ピンモード設定
  pinMode(BTNPIN, INPUT_PULLUP);
  //
  // Wi-Fiに接続
  //

  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println(WiFi.localIP());
}

loop(){
  static int btnStatus = 0;
  while (1)
  {
    btnStatus = digitalRead(BTNPIN);
    if (btnStatus == LOW)
    {
      // シリアルに出力
      Serial.println("Btn ON");
      // マジックパケットを送信する
      WOL.sendMagicPacket("xx:xx:xx:xx:xx:xx");//MACアドレス指定!
      delay(500);
    }
  }
}

ライブラリのおかげで、非常にシンプルなソースコードに仕上げることが出来ました。

ボタンが押されると、あらかじめソースコードに記載しておいたMACアドレスにマジックパケットを送信し、対象のコンピューターを起動させます。WOL.sendMagicPacket("xx:xx:xx:xx:xx:xx");のところには、起動させたいマシンのMACアドレスを入力しておいてください。

なお、最後の行にdelayを追加しました。これはチャタリングというか、1回押しただけで大量にマジックパケットが送信されてしまったため、追加したものです。1回押したら500msフリーズさせ、次に押されるのを待機するようにしました。1秒間に何度もパソコンを起動させることはないでしょうから、これでいいでしょう。

ひと押しで20回もWOLされてしまっています…

起動させてみた

実際につくったものでパソコンを起動させてみましょう。

しっかり起動してくれました!

前回の記事に記しておきましたが、WOLでの起動にはPCの設定変更が必要です。起動してくれない場合は設定が正しく行われているか確認してみてください。

まとめ

ESP32に接続されたボタンを押してパソコンを起動できるようにしてみました。

自分の場合、ディスプレイを接続してデスクトップとして使っているノートパソコンがあり、ノートパソコンの蓋を閉じたまま起動させたいというニーズに対しつくってみたものですが、実際につくってみるととても便利です。いちいち蓋を開けなくても済むので、ノートパソコン上部のスペースを有効活用できます。

今回作ったソースコードは、前回開発したシステムと共存させることも出来ます。前回のシステムに今回のプログラムを組み込めば、ブラウザからWOLして遠方から起動させることもできますし、手元のスイッチを押して起動させることもできるようになります。

ESP32開発キットはUSB電源で動作しますので、モバイルバッテリーを接続すれば、完全ワイヤレスのリモコンとして使用することも可能です。ぜひチャレンジしてみてください~

コメント

タイトルとURLをコピーしました