はじめに
Windowsパソコンの電源ボタンの調子が悪いです.もう今年で満10年を迎えたこともあり多分内部のボタンの回路が壊れちゃったんですかね.さっさとパソコンごと買い換えたいところですが,お金もないのでまだ使い続けなければなりません.しかし電源を入れるのが難しいパソコンなんて起動させようとするところからイライラさせられるならたまったもんじゃありません.というわけでちょうど持っていたM5AtomMatrixを使ってボタンを押したらパソコンが起動するというものを作ろうと考えたわけです.
必要なもの
- M5AtomMatrix
- 起動させるターゲットとなるWindowsパソコン
M5StackをWi-Fiに接続しよう
まずはM5StackをWindowsパソコンがいるLAN内にあるアクセスポイントに接続しましょう.(ルーターをまたがってマジックパケットを送信することはできないみたいなのでそこはお気を付けください)
atom_wifi.ino
#include "M5Atom.h"
#include <WiFi.h>
const char* ssid = "<Wi-FiのSSID>";
const char* password = "<Wi-Fiのパスワード>";
void setup() {
// put your setup code here, to run once:
M5.begin();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.print("\r\nWiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// put your main code here, to run repeatedly:
}
そうするとしっかり接続できたようです.(シリアルモニタで確認)
WoLでWindowsパソコンを起動させよう
まずはWindowsパソコンをマジックパケットで起動するように設定しなければなりません.
Windowsパソコンでの設定①
1つ目はデバイスマネージャーの設定です.左下にいつもいるWindowsマークを右クリックするとずらっと文字列がでてきまして,その中のデバイスマネージャーをクリックします.そしてネットワークアダプタの項目を見つけてその中で有線接続してるアダプタのプロパティを開くのです.開いたらプロパティの「電源の管理」タブの中にある「このデバイスで,コンピューターのスタンバイ状態を解除できるようにする」を有効化,そうすると下の「Magic Packetでのみ,コンピューターのスタンバイ状態wを解除できるようにする」が選択できるようになりますので,そちらのチェックボックスにもチェックを入れます.
Windowsパソコンでの設定②
2つ目は電源の管理の設定をします.Windows10のパソコンは高速スタートアップというのが最初から有効になっていて,シャットダウンしても完全に切れているわけではなく,次起動するときすばやく起動できるようになっているのです.これをハイブリッドシャットダウンといいます.しかしその状態ではマジックパケットによる起動ができません.マジックパケットで起動できるのは,クラシックシャットダウンといって高速スタートアップが無効になっていないといけないのです.(面倒くさい)
- 先ほど同様左下のWindowsマークを右クリック,ずらっと並んでいる中から「電源オプション」をクリック.
- 設定アプリが開いて,右のカラムの関連設定の「電源の追加設定」というのがありますのでそれをクリック.
- そうすると次はコントロールパネルが開きますので,その左カラムの「電源ボタンの動作を選択する」を開きます.
- そして管理者権限のマーク(青と黄色で構成された盾のマーク)がついた「現在利用可能ではない設定を変更します」をクリックしてください.
- 下の方にあるシャットダウン設定が変更できるようになりました.
- そこで「高速スタートアップを有効にする(推奨)」のチェックを外してください.
Windowsパソコンでの設定③
次の設定はパソコンのBIOSというものを開いて設定するのですが,これは各社様々ですので,自分でパソコンの型番をしらべてWoLのワードと組み合わせて設定の仕方を探してください.(これはどうしようもないので...)
M5AtomMatrixでWoLを使おう
次にWoLでWindowsパソコンを起動させます.void setup()
内で1度実行するようにしましょう.
ここではESP32でWoLを簡単に使うことのできるライブラリがあったのでそれをありがたく使わせていただきます.
そして書いたコードがこちら.
atom_wol.ino
#include "M5Atom.h"
#include "WiFiUdp.h"
#include "WakeOnLan.h"
#include <WiFi.h>
WiFiUDP UDP;
WakeOnLan WOL(UDP);
const char *MACAddress = "<WindowsパソコンのMACアドレス>";
const char* ssid = "<Wi-FiのSSID>";
const char* password = "<Wi-Fiのパスワード>";
void setup() {
// put your setup code here, to run once:
M5.begin();
WOL.setRepeat(3, 100);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.print("\r\nWiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask());
WOL.sendMagicPacket(MACAddress);
}
void loop() {
// put your main code here, to run repeatedly:
}
M5AtomMatrixのボタンを押したらマジックパケットを送るようにしよう
今回は電源ボタンの代わりに使うのですから,ボタンが押されたときにマジックパケットを送信するような仕組みにしましょう.ついでに押したときにグラデーションでピカピカしたらゲーミングっぽいのでしましょう.
まずはボタンを押してパケットを送るようにする
if (M5.Btn.wasPressed())
を追加するだけですね.(void loop()
に移すことも忘れずに)
atom_button.ino
#include "M5Atom.h"
#include "WiFiUdp.h"
#include "WakeOnLan.h"
#include <WiFi.h>
WiFiUDP UDP;
WakeOnLan WOL(UDP);
const char *MACAddress = "<WindowsパソコンのMACアドレス>";
const char* ssid = "<Wi-FiのSSID>";
const char* password = "<Wi-Fiのパスワード>";
void setup() {
// put your setup code here, to run once:
M5.begin();
WOL.setRepeat(3, 100);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.print("\r\nWiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask());
}
void loop() {
// put your main code here, to run repeatedly:
if (M5.Btn.wasPressed()){
WOL.sendMagicPacket(MACAddress);
}
M5.update();
}
ボタンを押したらピカピカ光るようにする
ゲーミングPCみたいにレインボーにLEDを光らせていなぁと思っていたら,M5AtomMatrixで動くサンプルプログラムを作成いる方がいらっしゃいました!
この中の「rainbow」を使って作りました!それがこちら
complete.ino
#include "M5Atom.h"
#include "WiFiUdp.h"
#include "WakeOnLan.h"
#include <WiFi.h>
WiFiUDP UDP;
WakeOnLan WOL(UDP);
const char *MACAddress = "<WindowsパソコンのMACアドレス>";
const char* ssid = "<Wi-FiのSSID>";
const char* password = "<Wi-Fiのパスワード>";
int ptr = 0;
CRGB colors[] = {
0xff0000,
0xff8000,
0xffff00,
0x80ff00,
0x00ff00,
0x00ff80,
0x00ffff,
0x0080ff,
0x0000ff,
0x8000ff,
0xff00ff,
0xff0080
};
void rainbow() {
int i, j, t, x, y, p;
unsigned long start_time;
start_time = millis();
while (1) {
p = ptr;
for (i = 0; i < 9; i++) {
t = 4 - abs(4 - i);
for (j = 0; j <= t; j++) {
if (i <= 4) {
x = j;
y = t - j;
}
else {
x = (4 - t) + j;
y = 4 - j;
}
M5.dis.drawpix(x, y, colors[p]);
}
p++;
p = (p == 12) ? 0 : p;
}
delay(100);
ptr++;
ptr = (ptr == 12) ? 0 : ptr;
if (millis() - start_time >= 5000) {
M5.dis.clear();
break;
}
}
}
void setup() {
// put your setup code here, to run once:
M5.begin(true, false, true);
M5.dis.clear();
WOL.setRepeat(3, 100);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("\r\nWiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
WOL.calculateBroadcastAddress(WiFi.localIP(), WiFi.subnetMask());
}
void loop() {
// put your main code here, to run repeatedly:
if (M5.Btn.wasPressed()) {
WOL.sendMagicPacket(MACAddress);
rainbow();
}
M5.update();
}
rainbow.inoのレインボーに光るところを関数化しまして,押してから5秒間光るようにしました.
最後に
これで完成です.(上のcomplete.inoを参照してください)もう電源ボタンが壊れてるからパソコンが起動できない!なんてことは起こりません.いつもパソコンを付けるのが楽しくなっちゃいます.それでは.
- sora さんが 2021/02/28 に 編集 をしました。 (メッセージ: 初版)
- sora さんが 2021/02/28 に 編集 をしました。
投稿者の人気記事