読者です 読者をやめる 読者になる 読者になる

unsuitanの日記

パソコンの神様 公式ブログ!

リモートでPCの電源スイッチ操作(ejectじゃなくてRaspberry Piでな

こちらのWebサイトは移転しました。


超高速落下

自宅サーバ運用している人は欲しいですよね。

外出先からリモートで電源ボタンを操作できる装置。

 

BIOSでAC電源復活したら電源ONする設定にしたり、Linuxでsysctl.confに「kernel.panic=10」(panicしたら10秒後にreboot)とか入れたりするんですが。

後者はOS入れ直して設定忘れたりするんですよねw

 

あと一番怖いのはリモートで自宅サーバを触っててrebootしようとしてうっかり

# shutdown -h now

と叩いてしまうこと。

叩くときは指さし確認を行ってて今までそういう事故は数回しか無い気がするのですが、ただshutdownコマンドを叩くときは相当な緊張を伴います。

十数年ずっと見て見ぬふりをしてきたこの問題を解決しちゃいましょう。

 

というわけで一応はEjectコマンドユーザ会の端くれなのでこの話を他人にすると「ejectでしょ?」とか言われるのですが、そんなん誰もが思いつくんですけど3秒で却下。光学ドライブを使うのは案外難しいし面倒なのです。

 

んで手元にRaspberry Pi B+(eject用に買った)があるのに、なんでそれ素直に使わないのよと。

思いついたら実装です。

 

----------

さて普通の自作PCと呼ばれるヤツの電源スイッチはM/B上のPOWER SWピンをショートさせてるだけです。

皆さんもPC素組みで電源入れるときはドライバー使ってピンをショートさせてるはず。

ていうかアキバのPCパーツ屋だって初期不良の切り分けお願いするとドライバーでのショートを普通に目の前でやってくれます。

 

そんなわけでRaspberry Piにリレー繋げてショートさせるだけのものを作ればそれで済むわけです。

 

ただ電子工作なんてほとんどやったことない素人なので「リレー作るの面倒だな…」と思ったらあるところにはきちんとある。さすがエレキット。

アフィリエイトもクソもないので普通に踏んでください。

 


外部機器をON・OFF! 小型リレーボードキット(5V用) [LK-RB1] :: エレキット・ウェブ・ワールド

 

駆動電源が5Vですが、Raspberry PiからはGPIOに5Vピンがあるので都合がいいです。

制御電圧が2V(min)なので、さすがにGPIOの3.3V出力だと降圧が必要かな?

そんなわけでこんなのが出来上がったわけです。

 

Raspberry Pi B+                                            リレー(LK-RB1)

+-------------+                                           +-----------------------+

|  5V -------------------------------------------駆動用5V                 |

|  GND-----------------------------------------駆動GND                 |

|                    |          抵抗分圧                    |                                 |

|                    |      +-----------------+          |                                 |

| GPIO #17----------(1kΩと2kΩ)--------------制御入力                |

| GND-----------------GND             |           |                                 |

|                           +-----------------+                                            |

| GND------------------------------------------制御GND                 |

|                    |                                            |                                  |

|                    |                                            |                リレーC--------PC PWRBT

|                    |                                            |                リレーM--------PC PWRBT

+-------------+                                           +-----------------------+

 

B+のケース売ってないので素組みでクソ汚い状況なのはお許しを。

自宅用だから壊れない範囲で動けばいいんです。

f:id:unsuitan:20140911220435j:plain

 

現在PC2台分の電源制御を行っているので、回路的には2つあってGPIO#27も使ってます。んでさらにもう1つ追加予定。

 

抵抗分圧は2.2V出ればいいかと計算したけど、実測1.6Vは下がりすぎだろう…どんだけ食ってるんだよ。

でもテストしたら問題なくリレー動いてるので結果オーライとします。客先に入れるわけじゃないから動けばいいです。

 

--------

先に言っちゃったけどテストでRaspberry PiからGPIO操作して普通に動いちゃったので、あとはスクリプト書いてみるだけ。

現状2台分なんで適当にこんな感じでサクッと書いてみる。

 

power.sh

便宜上ホスト名はhost01とhost02に書き換えてます。

-----

#!/bin/sh

 

case $1 in

    "host01" )

        GPIO_ID="17"

        ;;

    "host02" )

        GPIO_ID="27"

        ;;

    * )

        echo "Usage: $0 [host] [long or short]"

        exit 1

        ;;

esac

 

case $2 in

    "short" )

        B_TIME="0.5"

        ;;

    "long" )

        B_TIME="10"

        ;;

    * )

        echo "Usage: $0 [host] [long or short]"

        exit 1

        ;;

esac

 

# 初期化

echo $GPIO_ID > /sys/class/gpio/export 

echo out > /sys/class/gpio/gpio${GPIO_ID}/direction 

echo 0 > /sys/class/gpio/gpio${GPIO_ID}/value

 

# スイッチを押す

echo 1 > /sys/class/gpio/gpio${GPIO_ID}/value

 

# 押したまま待つ

sleep $B_TIME

 

# スイッチを離す

echo 0 > /sys/class/gpio/gpio${GPIO_ID}/value

 

 

-----

いま貼り付けて気付いたけど最後のexit忘れてるけどいいや。どうせ戻り値見てないし。

 

引数にホスト名と電源ボタンを押す長さ(short/longで0.5秒か10秒)を指定する実装にしました。

0/1をechoで投げ込むだけ動くRaspberry Piって素敵。

キーボードを叩けば動くリレーの動作音もなかなかオツなものです。

 

問題点としては。

・POWER BTケーブルを分岐させてスイッチに繋いでないので、ボタン操作するのにRaspberry Piにわざわざsshで入らなきゃならん

というところ。

まあ物理的にやりたきゃ電源ケーブル抜き差しすればいいのでこれはこれで。

 

んでこれ組んで夜明けに早速録画サーバがkernel panicで落ちてくれたので活躍してくれました。

朝っぱらから早速叩いたのがこちらになります。ご確認ください。

# ./power.sh host01 long         (長押し強制Off)

# ./power.sh host01 short        (電源On)

 

録画サーバが最近よく落ちるのはLinux kernelのバージョン落として様子見です。

また活躍しないことを祈りたいところ。