遠隔PC起動装置を作る (1)【ESP32】

はじめに

新型コロナウィルス対策でのテレワーク準備の中で、テレワークで自宅にいるときに会社のPCを起動したい場合があり、なにか仕組みを考えようと思い立ちました。

今回は構成とサーボモーターの動作確認を行っていきます。

 

構成を考える

PCの自動起動ではじめに考えついたのは、BIOSのスケジュール機能でした。

しかし、起動時間や曜日をあらかじめ設定しておく必要があるため、今回の目的に合わないため見送ります。

次に考えたのが、物理的にPCの電源ボタンを押すことでした。

ちょうどよく小さめのサーボモーターがあったので、これを動かして実現したいと思います。

 

次に、自宅から装置を制御する方法を考えます。

会社とのネットワーク接続にはVPNが使えるため活用することにします。

ESP32を社内ネットワークにサーバーを作り、リクエストがあったらサーボモーターで電源ボタンを押す構成にしたいと思います。

 

サーボモーターを動かす

今回動かすサーボモーターはSG90です。

このサーボモーターは3.3~6Vで駆動し、180度まで回転できます。

制御はPWMで、以下のようなパルスで制御します。

 

動作確認として、0°→90°→180°の順で動くプログラムを作成します。

ArduinoIDEで以下のプログラムを書きます。

#include "Arduino.h"
#include "stdio.h"

#define SERVO_PIN  32 // PWM信号Pin
#define SERVO_CH   0 // PWMのチャンネル
#define PWM_HZ 50 // 周波数
#define PWM_BIT 16 // ビット数 16bit(0~65535)

// 16ビット,50Hzの場合の、デューティー比の最大、最小を設定
#define RANGE_MAX 7864 // 65535 / 20 * 2.4 = 7864 
#define RANGE_MIN 1638 // 65535 / 20 * 0.5 = 1638

// 角度→デューティー比への変換
int duty_set(int deg){
  int result;

  // 値を0~180の範囲からRANGE_MIN~RANGE_MAXの範囲に変換
  result = map(deg, 0, 180, RANGE_MIN, RANGE_MAX);
  return result;
}

// セットアップ
void setup() {
  Serial.begin(115200);  // シリアルポート設定
  delay(10);

  // PWM設定
  ledcSetup(SERVO_CH, PWM_HZ, PWM_BIT); // PWMで利用するチャネルを設定
  ledcAttachPin(SERVO_PIN, SERVO_CH); // PWMを出力するピンにチャンネルを設定

  // サーボモーター動作
  delay(500);
  ledcWrite(SERVO_CH, duty_set(0)); // 0°へ移動
  delay(500);
  ledcWrite(SERVO_CH, duty_set(90)); // 90°へ移動
  delay(500);
  ledcWrite(SERVO_CH, duty_set(180)); // 180°へ移動
  delay(500);
  
  ledcWrite(SERVO_CH, 0); // モーターへの出力停止
}

// メインループ
void loop() {
  // なにもしない
  delay(1000);
}

 

サーボモーターが動くことが確認できました。

後は、電源ボタンに取り付けて動作角度を調整する必要があります。

 

おわりに

今回はシステムの構成とサーボモーターの動作確認を行いました。

次回は構成の通りにサーバーや通信部分のプログラムを書いていく予定です。