Open7
Raspberry PI Pico 2W でPCの電源をDiscordからつける装置作る
Raspberry PI Pico 2W を使って、DiscordからPCの電源を入れる装置を作りたい。
やることは
- Raspbery PI Pico 2WにPCをつなぐ
- Wake-on-LANする
- AWS IoTCoreに接続する
- DiscordからAWS IoTCoreに信号を送る
この記事の手順通りにチュートリアルを終えた。
- USBでPCとPicoを接続
- Pythonを使えるようにするために、PicoにMicroPythonファームウェアを焼く
- VSCode上でのPico用プロジェクト作成
- 「MicroPico: Upload file to Pico」でスクリプトをPicoに転送
- Lチカ (Pico上に最初から乗っているLEDランプをチカチカ)
Raspbery PI Pico 2W をWi-Fiに接続した。
以下の記事を参考に、接続できた。
記事だと wlan.py
だが、自分の環境では boot.py
という名前にした。
こうすることで、Pico起動時に勝手にWi-Fiにつながってくれる。
Wake-on-LANできた。
こんな感じのスクリプトを作成。
10秒間LEDがチカチカしたあと、Wake-on-LANパケットが送信される。
main.py
import socket
import time
import binascii
import machine
# LED ピン定義
led = machine.Pin("LED", machine.Pin.OUT)
# WoL対象のMACアドレス
MAC_ADDRESS = "ABCDEF012345" # ←起動したいPCのMACアドレスをハイフンなしで記入
# LEDを点滅させる関数
def blink_led(times, delay):
for _ in range(times):
led.on()
time.sleep(delay)
led.off()
time.sleep(delay)
# WoLパケット作成
def create_wol_packet(mac):
mac_bytes = binascii.unhexlify(mac)
return b'\xff' * 6 + mac_bytes * 16
# WoL送信
def send_wol(mac):
packet = create_wol_packet(mac)
addr = ('255.255.255.255', 9)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.sendto(packet, addr)
s.close()
# 1秒間隔で5回点滅
blink_led(5, 1)
# 0.2秒間隔で10回素早く点滅
blink_led(10, 0.2)
# WoLパケット送信
send_wol(MAC_ADDRESS)
# LEDを常時点灯
led.on()
PCの電源を落とし、PicoをUSB充電器につなぐと10秒LEDがチカチカした後、PCが起動することも確認した。
補足: X570 TaichiでWoLするためにはLANドライバーのインストールが必要
- マザーボードの ASRock X570 Taichi を使っていたのだが、Microsoft純正のLANドライバーを使っていたため電源オフ状態から起動しなくて苦戦した。
- ASRockのホームページから Lanドライバー をインストールし、「電源オフ状態からの Wake on Magic Packet」をONにしたら解決した。
AWS IoTCoreに接続する。
まずは以下の記事を参考にAWSコンソールから「モノ」を作成する。
記事と若干UIが変わってたのでメモ
- 2025/04/26現在、AWSではモノを作るとウィザード形式でセットアップが始まる。
- プラットフォームとSDK: 手元の作業PCに合わせてWindows+Node.jsを選んだ。
- 「接続キットをダウンロード」でダウンロード
- zipの中に証明書が入っている。
- 一度作業PC上でstart.ps1を実行して
root-CA.crt
を得る必要がある。 - start.ps1にかかれているエンドポイントのURLを控える
-
root-CA.crt
、~.private.key
、~.public.key
を.derに変換 - (重要) セットアップ完了後にポリシーページから全権限付与する。
これを忘れて1時間溶かした・・・
なぜか繋がらない。
>>> execfile("mqtt.py") Traceback (most recent call last): File "<stdin>", line 7, in <module> File "<string>", line 1, in <module> File "mqtt.py", line 23, in <module> File "/lib/umqtt/simple.py", line 112, in connect IndexError: bytes index out of range Exception occured
どうやらAWS IoTCoreにうまく繋がらないっぽい?
https://github.com/micropython/micropython-lib/issues/915
https://github.com/micropython/micropython-lib/issues/567Issueを読む限り、権限の問題っぽそう。
「*」のポリシーを付与したところ、接続に成功した。
AWSの証明書とキーをラズピコにアップロードする。
VSCodeだとフォルダアップロードが出来なさそうなのでThonnyを使ってアップロードする。
- Thonnyをインストール
- 表示→ファイル で ファイルエクスプローラー を表示する (①②)
- ③ のパネルからPC上に「certs」フォルダを開く
- フォルダを右クリックして「/にアップロード」を選択 (④)