スイッチを押し返すロボット（uselessbox）制作期

ESP32の使い方が分かってきて、そろそろハードウェア関係に手を出そうかなと思っていたところ簡単に作れそうでかつ面白そうなものがあることを思い出しました。
その名もuselessboxです！

昔ニコニコでバズってたそうですね、youtubeのものになりますが参考動画はこれです↓

https://www.youtube.com/watch?v=bOD2-mRphTI&t=1s

## 材料
制作には以下のものを使いました
- つめがついてなくてかつ大きめの箱（100均）
- 電池ボックス（サーボモータ用）
- ESP32-WROOM-32E
- [サーボモータ SG90](https://www.amazon.co.jp/gp/product/B0B2QW7WGY/)
- [トグルスイッチ](https://www.amazon.co.jp/gp/product/B01M170ZTF/)
- 紙粘土（100均）

3Dプリンターを使った方がいい気もしたのですが、単純に3Dプリンターをもっていないのと金欠だったので紙粘土で頑張りました。簡単な形でかつ負荷があまりかからないなら、紙粘土はいい選択肢だと思います()

## 制作
### 箱にトグルスイッチ用の穴をあける
彫刻刀を使って穴をあけました。位置はこの辺です
![箱穴.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550181/6d7ad7c6-c425-98d8-0f9c-6acc65179953.png)
ちょっとずつ穴を開けてトグルスイッチがちょうどハマるサイズになるようにしました

### トグルスイッチの取り付け
トグルスイッチには4つ部品があって始めどう使えばいいのかよくわからなかったので、後続の人のためにここに取り付け方の動画を置いておきます

https://youtu.be/52oHyD4YK-w

### サーボモータの取り付け
紙粘土を土台にしてサーボモータを取り付けました。蓋の高さギリギリに取り付けて蓋を開ける動作やトグルスイッチを押す動作をしやすくしています

### スイッチを押す腕を作る
これが結構難しく、大きさの調整や耐久性に色々悩みました。最終的には大きさを整えてそこそこの耐久性を持つ紙粘土の腕を作りました。（写真は撮り忘れたのでないです）

MDFで作った作成途中の腕です。サーボモータの部品にこんな感じで取り付けました。ただこのやり方は腕にそこそこ負荷がかかるので違うやり方の方がいいのかもしれません
<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550181/65022c76-459e-67f6-5abb-d1e7a66acc0e.jpeg">

負荷がかかるとこんな風にもげて壊れます。とほほ
<img width="240" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550181/1dc803ed-144c-839b-b680-5bc2a1c18437.jpeg">

### スケッチの作成
https://livingtips.blog/blog/useless-box-prototype/
を参考に作りました
サーボモータの制御ライブラリはこれのバージョン`1.1.1`を使いました
https://madhephaestus.github.io/ESP32Servo/annotated.html

```c++:uselessbox.ino
#include <ESP32Servo.h>
#define WAIT_TIME 50 // 500ms wait
#define SERVO_PIN_1  4    
#define SERVO_PIN_2 2                                                                                                                                                                                                                    
#define LED_PIN  32
#define SW_1  33

Servo sg90Lid;
Servo sg90Hand;
int opendelay;    // 蓋開けディレイ時間(*100ms)
int opendelayLimit = 2;
int closedelay;   // 蓋開けディレイ時間(*100ms)
int closedelayLimit = 2;

hw_timer_t * timer = NULL;

void Lidtimer() {
  opendelay++;
  closedelay++;
}

void setup() {
  Serial.begin(115200);
  sg90Lid.attach(SERVO_PIN_1, 510, 2400);
  sg90Hand.attach(SERVO_PIN_2, 510, 2400);
  pinMode(LED_PIN, OUTPUT);
  pinMode(SW_1, INPUT_PULLUP);

  timer = timerBegin(0, 80, true);
  timerAttachInterrupt(timer, &Lidtimer, true);
  timerAlarmWrite(timer, 1000000, true);
  timerAlarmEnable(timer);
  // 100msごとにLidtimerを呼び出し、タイマースタート
}



void loop() {
  if(digitalRead(SW_1) == HIGH) {
    digitalWrite(LED_PIN, HIGH);
    Serial.println("on");
    
    sg90Lid.write(110);
    if(opendelay > opendelayLimit) {
      Serial.println("move_on");
      sg90Hand.write(175);

      closedelay = 0;
    }
  }

  if(digitalRead(SW_1) == LOW) {
    Serial.println("off");
    digitalWrite(LED_PIN, LOW);
    sg90Hand.write(0);

    if(closedelay > closedelayLimit) {
      Serial.println("move_off");
      sg90Lid.write(10);
      opendelay = 0;
    }
  }

}

```

### 箱の中に組み込み
ブレッドボードなどを適当に組み込みました
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550181/df2fbf05-2f61-6727-50b0-826095187f15.png">

## 完成！

https://x.com/picuto0206/status/1708651297636028720?s=20