🔌

ラズパイ5にUSB接続の電源ボタンを実装する

2024/11/18に公開

はじめに

  • Raspberry Pi 5 中々にいい性能で、私はモニタなし、キーボード・マウスなし、VNC接続でヘッドレス運用しています。
  • ラズパイぐらいの低消費電力コンピュータは、常時、電源ONで使うのが基本なんでしょうが、私は家を空けるときは電源を切りたい。ACアダプタをコンセントから抜きたい。
  • そのためにはシャットダウン処理が必要です。いきなりコンセントを抜くと壊れちゃうそうです。
  • 5からは電源ボタンが標準搭載され、2回押すとシャットダウン処理を行ってくれます。ACアダプタを抜いてもよい状態にしてくれるということです。家を出る前に電源ボタン2回Push→赤ランプを確認して電源タップOFFでOK。
  • ケースに入れてしばらく運用していると思いました。電源ボタン、押しにくい
  • そこで、押しやすい電源ボタンを実装したいと思った次第です。

前提 (こんな人向け)

  • ラズパイ5に外付けのシャットダウンボタンが欲しい。
  • ラズパイ5はケースに入っている。
  • USB端子が1個は使用できる。
  • GPIOは使用したくない。
  • ラズパイには追加で何もインストールしたくない。
  • Arduinoを使い慣れている。

構想

  • M5AtomS3Lite に USB HID としてふるまっていただきます。
  • ラズパイ5とUSB接続して、一番大きいボタンを押すとシャットダウンを目標とします。

USB HIDとは

  • USB接続のマウスとかキーボードとかのことです。
  • ラズパイOSが元からドライバを持っているので、追加で何かインストールする必要がありません。
  • 今回は、マウスでもキーボードでもなく、システムコントロールになってもらいます。

完成品

AtomS3用スケッチ例のUSB→SystemControlを参考に,AtomS3Liteに、ボタンを押すとシャットダウン命令を出すデバイスになってもらいます。
Arduinoで以下をAtomS3Liteに書き込み、ラズパイ5のUSBポートに接続してボタンを押してみてください。
約1秒間、押し続けるとシャットダウンします。

UsbPowerOffButton.ino
#include <M5Unified.h>
#include "USB.h"
#include "USBHIDSystemControl.h"

USBHIDSystemControl SystemControl;

void setup() {

  auto cfg = M5.config();
  M5.begin(cfg);

  SystemControl.begin();
  USB.begin();
}

void loop() {
  const uint32_t max_pressed_time = 500;
  static uint32_t pressed_time = 0;

  delay(1);
  M5.update();

  if (M5.BtnA.isPressed()) {
    pressed_time++;

    if(pressed_time > max_pressed_time) {
      pressed_time = 0;
      SystemControl.press(SYSTEM_CONTROL_POWER_OFF);
      SystemControl.release();
    }
  }
  else {
    pressed_time = 0;
  }
}

USB.hUSBHIDSystemControl.hをインクルードして、USBHIDSystemControlのインスタンスを使用します。
beginでUSB HIDデバイスとして動き始めます。
pressで引数に対応したボタンを押したことになり、releaseでボタンを離したことになります。
コンパイル時のポイントとして、USB-OTGという仕組みを利用するので、ツール→USB Mode:"USB-OTG(TinyUSB)"を選択する必要があります。

余談

  • ラズパイ以外でも、USBマウスやキーボードが使用できるPCであれば使用できます。
  • 厳密には、シャットダウン命令を出すというのは誤りで、電源ボタンが押されたという情報を流すという動作になります。ですから、例えば、電源ボタンを押したときの動作をスリープするにしている方のPCでは、シャットダウンではなくスリープ動作になります。

感想

欲しかったやつができました。

Discussion