ESP32でマザーボードの電源を遠隔操作する
リモートに置いてある社内PCが度々フリーズしてしまいまして、その度に人力対応せねばならず
社内PCでは大量のVMを起動していたりと負荷が高い状態で使っておりますので、頻繁に固まってしまいます。
いわゆるCPU使用率100%状態になったりする様で。
こうなってしまうとコンソールも応答が無くなり、強制再起動しかない状態に。
その度に非常に長い時間、業務が停止してしまいます。
本当は過負荷にならない様にする方が良いのですが、色々な事をさせているのでイレギュラーを追い切れないのです。
そこで一番早くて低コストな対応策が電源長押し再起動でして、、
これを遠隔で出来ればかなりのコスト削減に繋がりますので、無線内臓のESP32で出来ないかちょっとやってみようかと思います。
方法としては、PCの電源スイッチに繋がっているマザーボード上のピンをESP32で操作するというもの。
PC本体前面の電源ボタンの様な物理スイッチと、物理的にも同じ動きをするリレーが安全確実なのでしょうけれど、、、
生憎手元にリレーを持っておりませんので、先日試してみたトランジスタを使ってみようと思います。
PCの電源ボタンはどんな仕組みなのか
まずはPCのマザーボードの電源ピンがどんな動きで電源をONにするのかを確認します。
WEBで調べた感じ、どうやら電源ボタンに繋がっているピンは、マザーボードによって5Vでプルアップされており、ボタンを押す(導通させる)とGNDへ流れ、電源が押された事をマザーボードが検知してPCを起動したり強制OFFにしたりする仕組みらしい。
要するに、プルアップされている電源ピンをLOWに落とせばいいと。
この落とす長さ(長押し等)や状況(OFF時かON時か等)で動作が決まる、という事みたいですね。
リセットボタンも同様に、ローに落とせればマザーボードがリセット信号を発してくれる様です。
流れる電流がどのくらいなのか判りませんが、物理スイッチで動作させて良いという事は、チャタリングが発生しても大丈夫な様に出来ている筈。
という事は、何とかしてローに落とせればボタンが押せるという事。
じゃあトランジスタでいいよねって事で。
PCの電源ボタンを押す回路
PCの電源ピンにかかっている電圧は5Vですので、3.3Vで動くESP32にそのまま入れてはいけません。
ESP32側からは、トランジスタで蛇口をひねるだけにします。
本当はフォトカプラ等で回路的に分離した方が良いのでしょうけれど
生憎5Vを流しても大丈夫そうなフォトカプラを持っておりませぬので、、、
GNDをどうするか悩ましいですが、ESP32側と接続してしまいます。
10kΩの抵抗を介していますので、コレクタ、エミッタ間もたいした電流が流れないかもしれない。
ちゃんとPCのプルアップを落とせればいいのですけれど、、、
PC電源ボタンを押すスケッチ
まだテストですので簡単に済ませたいところですが、遠隔操作を行うのでwifi経由でスイッチできる様にWEBサーバーを搭載します。
長くなりますのでボタンを押す所だけ抜粋して、、、
変数の宣言と初期化と
// ----------------------------------------------------------------
// 電源ボタン操作
uint8_t gpio_pin1 = 32; // GPIO 32
uint16_t pw_short = 500; // ms 電源ボタンの押下時間
uint16_t pw_long = 6000; // ms 電源ボタンの押下時間
// ----------------------------------------------------------------
setup()でピンを初期化して
// GPIOピンモードを設定 初期設定
pinMode(gpio_pin1, OUTPUT);
digitalWrite(gpio_pin1, LOW);
WebServerの待ち受けを追加して
else if (server.uri() == "/SwitchControl")
{
// html作成
str += "<html><head></head><body>\n";
str += "PC Power Switch Controll<br /><br />\n";
// スイッチ押下を受信した場合
if (server.hasArg("sw_down"))
{
str += "Processing Power Switching....<br /><br />\n";
// 電源ボタン押し
if (server.arg("sw_down") == (String)1)
{
// 短押し
digitalWrite(gpio_pin1, HIGH);
delay(pw_short);
digitalWrite(gpio_pin1, LOW);
str += "Short Push Done.<br /><br />\n";
}
else if (server.arg("sw_down") == (String)2)
{
// 長押し
digitalWrite(gpio_pin1, HIGH);
delay(pw_long);
digitalWrite(gpio_pin1, LOW);
str += "Long Push Done.<br /><br />\n";
}
else
{
str += "Push Switch not work. please back to Control.<br /><br />\n";
}
}
else
{
// 電源スイッチボタン
str += "<br /><form action='' method='post'>\n";
str += "Short Push : <input type='radio' name='sw_down' value='1' checked='checked'><br />\n";
str += "Long Push : <input type='radio' name='sw_down' value='2'><br />\n";
str += "<br /><input type='submit' value='send'>\n";
str += "</form>";
}
// 戻るリンク
str += "<hr />";
str += "<a href='/SwitchControl'>Back to Switch Control Page</a><br /><br />\n";
str += "<a href='/'>Back to Top</a><br /><br />\n";
}
長押しボタンは6秒くらい押してみます。
短いのは0.5秒くらいで。
簡潔に、ピンをHIGHにしてベースに電流を流し指定時間だけdelayする事で、PC側のプルアップされたPWR_SW+を指定時間だけLOWにする(指定時間だけ電源ボタンを押し続ける)という動作になります。
念のためトランジスタでLEDを点灯させてテストを行ってはおりますが、普段使いのPCで実験するわけで
壊れないかと少し緊張しまする
ESP32への給電は、Ploomの電源を使いました。
5V ⎓ 1.5A LPS と書いてあるので、恐らく電気食いまくりと噂のWifi起動も大丈夫ではないかと、、、
PCとの接続は、デュポンケーブルをビョーンと伸ばしまして、、
適当感あふれる感じですが、頑張ってPC側のPC_PWR+と-のピンに挿しまして、、
※PCへの接続部分は、、、PCが汚過ぎてお見せできません
さて、変な充電器で少し心配でしたが、ESP32本体の電源も無事に入りましたので
※携帯に付いて来た1A充電器では、ESP32自体は起動しますがWifiを起動できませんでした・・・
1.5A~2A程度のパワーのある充電器が必要だと思います。
携帯からアクセスしまして、、、
Short Pushを選んでポチっとな、、、
無事に成功。
ちゃんとPCが立ち上がってくれました。
電源長押しもテストしましたが、無事に強制電源OFFする事ができました。
パスゥンと電源が落ちてくれるまの時間は、大体3~4秒くらい。
念のためPCの電源スイッチに流れる電流をテスターで調べてみましたところ、0.45mA(450uA)でしたのでマルチプレクサ等でも制御できるかもしれない。
同じ方法でリセットスイッチも操作できると思います。
PCのマザーボードのピンはそのままデュポンワイヤーを挿せますので、ESP32と電源と、トランジスタと抵抗2個だけで、ネットワークに繋がっているwifi親機があれば遠隔電源操作が出来てしまうますね。
有線LANは部品が増えて面倒なのでやりません。
とりあえず実地投入までの課題は電源でしょうか。
PC内部から取ってしまっては、PCの電源が落ちている時に起動できませんし。
電源ユニットの間から抜き取るとするとコネクタを作るのが面倒ですしおすし
やはりマイコン本体は外に置いてUSB充電器で給電しておき、細い線をPCから出して接続する感じかしらん
たいした電流でもないので、リレーでなくても大丈夫かもしれない。
ラインは接点がダメになりつつあるLANケーブルでもほぐして使おうかしら
構成を考えるのもわりと仕事量がありますね;
バージョンアップしたらまた記録に残しておきます。
ディスカッション
コメント一覧
まだ、コメントがありません