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に信号を送る
かめっちかめっち

この記事の手順通りにチュートリアルを終えた。
https://qiita.com/IoriGunji/items/ebe6cefd3562639f7ca2

  • USBでPCとPicoを接続
  • Pythonを使えるようにするために、PicoにMicroPythonファームウェアを焼く
  • VSCode上でのPico用プロジェクト作成
  • 「MicroPico: Upload file to Pico」でスクリプトをPicoに転送
  • Lチカ (Pico上に最初から乗っているLEDランプをチカチカ)
かめっちかめっち

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コンソールから「モノ」を作成する。
https://qiita.com/bd8z/items/e12e6885b627fc444eeb

記事と若干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/567

    Issueを読む限り、権限の問題っぽそう。

    「*」のポリシーを付与したところ、接続に成功した。

かめっちかめっち

AWSの証明書とキーをラズピコにアップロードする。

VSCodeだとフォルダアップロードが出来なさそうなのでThonnyを使ってアップロードする。

  1. Thonnyをインストール
  2. 表示→ファイル で ファイルエクスプローラー を表示する (①②)
  3. ③ のパネルからPC上に「certs」フォルダを開く
  4. フォルダを右クリックして「/にアップロード」を選択 (④)