概要
PCの電源をアレクサから操作できれば素晴らしく便利ですね。最近はIoTにはまっていて、いろいろと設備がそろい始めました。手元にRaspberry Pi Pico、SwitchBot Hub Mini(スマートリモコン)、
かなり遠回りな方法になってしまいましたが実現できたのでまとめます。
実行環境
- Raspberry Pi Pico
- 赤外線リモコン受信モジュールOSRB38C9AA
- フォトカプラPS817
- SwitchBot
- SwitchBot本体
- Hub Mini
-
SwitchBot - Google Play のアプリ
- アプリバージョン9.13
- アレクサ
- Echo Dot (エコードット)第3世代 - スマートスピーカー with Alexa、チャコール
- Amazon Alexa - Google Play のアプリ
システム構成図
システム構成図を示しました。カッコ内の丸数字は後述の構築手順を参照します。
構築手順
各項目で実行される内容を設定もしくはコーディングします。
- あらかじめ、SwitchBot、Hub mini、Alexaの設定や連携をしておく
- 赤外線送信のため、switchBotアプリにて、適当な機器の電源をオンにするリモコン設定を追加
- アレクサ側でデバイスが自動的に追加されたことを確認
- Raspberry Pi Picoに赤外線受信モジュールを接続し受信した信号を解析するコードを追加
- 任意のイベントをリレーできるようにRaspberry Pi PicoにフォトカプラでPCの電源スイッチを結線
SwitchBotアプリにて、リモコン設定を追加する
アプリを起動してHub Miniから、スマートリモコンを追加します。
- アプリを起動
- 「ホーム」にて、上部+アイコンから「デバイスの追加」

「赤外線リモコン」内の適当な製品を選択します。例では「テレビ」を選択しています。

ハブミニを選択します。

「リモコンの手動学習」を選択します。

適当な製品を選択します。私はあとあと楽なようにSonyの適当なテレビ「43X7000E」用リモコンを設定しました。後述のライブラリが対応している、NEC、Philips、Sony、MCE、Samsung、Panasonicの製品のどれかにすることを推奨します。ただし、家の中で使用している家電と被らない製品を選んでください。

リモコンを選択したら、適当なボタンを何か押下し「保存」します。

「パソコン」という名称を付けて「保存」します。アレクサから呼びかける名前になります。
Alexaアプリにて、追加したデバイスを確認
アレクサアプリから、SwitchBotより自動的にデバイスが追加されたことを確認します。
- 下部のハンバーガーメニュー>「デバイス」一覧が表示される
- SwitchBotにて追加した「パソコン」デバイスが表示されていることを確認
これで、「アレクサ、<デバイス名>をつけて♪」と発生するだけで先ほど指定したリモコンの電源ボタンを押下したときの赤外線データが送信されます。
電子部品をRaspberry Pi Picoへ接続
赤外線リモコン受信モジュールOSRB38C9AAで信号を受信します。
PIN番号 | BCM(GPIO)番号又は名称 | → | 部品名 | 部品PIN名 | 備考 |
---|---|---|---|---|---|
20 | 15 | → | 赤外線リモコン受信モジュール OSRB38C9AA | OUTPUT | 赤外線の信号線 |
18 | GND | → | 赤外線リモコン受信モジュール OSRB38C9AA | GROUND | GNDならどこでも接続してOK |
40 | VBUS | → | 赤外線リモコン受信モジュール OSRB38C9AA | VCC | モジュールに5vを供給 |
19 | 14 | → | フォトカプラ PS817 | Anode | 間に抵抗(46Ωぐらい)を挟んでください |
18 | GND | → | フォトカプラ PS817 | Cathode | GNDならどこでも接続してOK |
Raspberry Pi Pico のコード
信号を解析して、あらかじめ設定した信号かどうかを判断します。赤外線受信のライブラリはこちらを使用します。
赤外線通信の規格(だいたいNEC、Sony、MCE、Samsung、Panasonicのうちのどれか)を選択すれば、自動的にデータのパースを実施してくれます。おかげさまで、以下のように短いコードを書くだけで実装できました。
import time
from ir_rx.sony import SONY_20
from machine import Pin
PICO_LED = Pin("LED", Pin.OUT, value=0) # ラズピコ本体に実装されているLED
TARGET = Pin(14, Pin.OUT) # フォトカプラをつないでいるGPIO番号
def make_pulse(sleep_ms):
"""フォトカプラ経由でPCの電源を入れます"""
PICO_LED.on() # 動作状況が分かるようにラズピコ本体に実装されているLEDをオンにします
TARGET.on() # フォトカプラ オン (=電源スイッチ押下)
time.sleep_ms(sleep_ms)
TARGET.off() # フォトカプラ オフ (=電源スイッチ放す)
PICO_LED.off() # LED オフ
def callback(data, addr, ctrl):
"""赤外線の信号を受信時に呼び出されるコールバック関数"""
print("Data {:02x} ({:016})Addr {:04x}".format(data, data, addr))
if data == 21:
# 受信したデータが 0x15 (0000000000000021)Addr 0001 のとき
# (= テレビ Sony 43X7000E リモコンの電源ボタン押下を受信したとき)
# どのようなデータがスマートリモコンから送られてくるかは、
# 実際にデータを送信してみて確かめればよい
make_pulse(200)
# Sony製リモコンの設定
# Pinは赤外線リモコン受信モジュールをつないでいるGPIO番号
ir = SONY_20(Pin(15, Pin.IN), callback)
# 無限ループ、信号を受信するとcallback関数が呼ばれます。
while True:
time.sleep_ms(1000)
PCへの接続
デスクトップPCに付属している電源ボタンの回路を、Raspberry Pi Picoで電気的に横取り(?)し操作します。
部品名 | 部品PIN名 | → | 接続先名称 | 備考 |
---|---|---|---|---|
フォトカプラ PS817 | Collector | → | Switch + | |
フォトカプラ PS817 | Emitter | → | Switch - |
- 参考 デスクトップPCの電源スイッチをラズパイで操作し起動させる #Python - Qiita
- これはRaspberry Pi 4での例ですが、つなぎ方は同じです。