懸垂をすると掛け声が飛び交う装置を作った話

この記事は <a href="https://qiita.com/advent-calendar/2019/brainpad">Brainpad Advent Calender 2019</a> 18日目の記事です。
Brainpad Advent Calender 2019 の 20 日目で、後日談（開発環境詳細）をのせます。
（ @ushi_198 より）

...

## 我々はなにを作ったのか
やあ、みんな。切れてるかな!?
ITのお兄さんだよ。
IT系の会社ならどこにでもあるという「懸垂マシン」。
ひとり虚しく、懸垂している諸君に贈る、懸垂をすると掛け声が飛び交う装置を作ったぞ！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">懸垂をすると掛け声が飛び交う装置を作った話<a href="https://t.co/73ndOnjL3v">https://t.co/73ndOnjL3v</a> <a href="https://t.co/xM0uH1U3LK">pic.twitter.com/xM0uH1U3LK</a></p>&mdash; ウッディ川越 (@woody_kawagoe) <a href="https://twitter.com/woody_kawagoe/status/1207213027906338817?ref_src=twsrc%5Etfw">December 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

その名も、「***Dev Muscle***」だ!!!
さっそく作り方を見ていこう！
### 作り方
まずは装置を構成するBIG3の確認だ！

- <a href="https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5BDJ">Raspberry Pi Zero</a> 
    - 全体の仕組みを支える重要な部品だ。


<img width="320px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/e2cdb4ef-abc4-3e2d-4ed6-9c122f941589.png"><img width="20px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/1c435fbb-c586-6038-4242-7b02f0677a24.png">

- <a href="https://www.amazon.co.jp/dp/B01N4V4X5M/ref=cm_sw_em_r_mt_dp_U_3El-DbSB96E0E">bluetooth スピーカー</a>
    - 掛け声を放つ部品だ。

  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/371bd46b-3c03-dfc4-17f8-45b9aa29bee8.png)<img width="20px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/0178712d-c42a-21c4-2aa4-1e86501b5478.png">

- 人感センサー
    - 焦電型赤外線（人感）センサーモジュール　ＳＢ４１２Ａ
    - <a href="http://akizukidenshi.com/download/ds/senba/SB412A.pdf">データシート</a>
    <p><img width="320px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/432fbac7-e259-3478-940e-762fd1797eaa.png"></p>


- その他
    - 以下は、BIG3ではないが重要な部分だ。しっかり揃えていこう。
    - ジャンパー
<p><img width="320px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/0df4db8d-2103-d7af-379b-dc9c5559697a.png"></p>
    - バッテリー（なんでもOK）

### セットアップ
みんなも準備はできたかな？

つぎにセットアップをしていこう！基本姿勢から。機器の接続設定だ！

これが Rasberry PI ZERO のとても美しい腹直筋と斜腹筋だ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/8e443496-810d-f528-9cc6-30affac7da04.png)

<a href="https://github.com/boochow/micropython-raspberrypi/wiki/Quick-reference-for-the-Raspberry-Pi-Zero---W-MicroPython">画像引用</a>

センサーとGPIOの接続は、使うピンを意識しながら接続しよう！

![DSC_0315.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/4291c862-436c-e82b-5ef4-ca0c3433fafe.jpeg)

Raspberry Pi ZERO の環境設定は、筋肉で解決だ！ (※ 後日枠で詳細説明。)

```python
import glob

from gpiozero import MotionSensor
import random
import time

import pygame
from mutagen.mp3 import MP3 as mp3

# 使用するセンサ
sensor = MotionSensor(21)
# interval
interval = 0.1
# 音声リストを取得
cheer_music_list = glob.glob("./mp3/*")

pygame.mixer.init()
time.sleep(5) # エラー回避

def cheer_music():
    """ 応援音声を流す """
    file_name = random.choice(cheer_music_list)
    pygame.mixer.music.load(file_name)
    pygame.mixer.music.play(1)  # 一回実行
    time.sleep(mp3(file_name).info.length + 3)  # load の待機
    pygame.mixer.music.stop()


def detected():
    """ 焦電センサが検知したか """
    if (sensor.motion_detected):
    	return True

    return False


if __name__ == "__main__":
    try:
        print("終了キャンセル:CTRL+C")
        cnt = 1
        while True:
            if detected():
                cnt = cnt + 1
                cheer_music()
            # sleep 処理を挟む
            time.sleep(interval)

    except KeyboardInterrupt:
        print("終了処理中...")
    finally:
        print("終了...")
```

<img width="320px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/18d0ef73-fa27-ef37-5abd-ba8432e565b9.png">

## 筋肉のPDCA

ここまでついてこられたのなら大したものだ！しかし、言うは易し、行うは難し。さあ、全体を俯瞰し、実際に装置を作成したら、一緒に筋肉のPDCAをまわそう！

 全体像（筋肉のPDCA図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/8e93afb0-4e27-a45e-defb-ea938895df50.png)

PDCAに合わせて投げてくれる掛け声一覧だ！

1. 10 step 3 epoch！
1. 腹筋DataFrame！
1. 背中にtouristが宿ってる！
1. 型メロン！
1. きれてるよ!
1. 効いてるよ!
1. 外転筋の子!
1. さぁ筋肉のPDCAを回そう!
1. 大胸筋がResNet！
1. クロス集計、8LDKかい！？
1. 泣く子も黙るmaster push！
1. ナイスバルク!!
1. 筋肉外注した？
1. 肩にちっちゃいgpu積んでんのかい!？
1. 仕上がってるよ！
1. ナイスプルリク!!
1. 出ましたマージ!
1. 大胸筋が過学習!
1. 腹筋バッチ処理!
1. 僧帽筋が歌ってる!
1. 僧帽筋が跳ねてる!
1. 新時代の幕開けだ!
1. プルリクきれてるよ!
1. 二頭がチョモランマ!
1. 僧帽筋が叫んでる!
1. 僧帽筋が威嚇してる!
1. 僧帽筋が飛んでる!
1. 背中がフルスタック!
1. 背中に鬼が宿ってる!
1. 前処理仕上がってるよ!
1. 変数変換はいズドン！
1. 秀逸極まりない背中だ!
1. 背中に鬼神が宿ってる!
1. 腹筋マイクロサービス!
1. 僧帽筋が並じゃないよ!
1. 筋肉のウォーターフォール!
1. 背中に羽根が生えてるよ!
1. 肩にコンテナのってんのかい!
1. 二頭がアジャイル回してる!
1. 秀逸極まりないプルリクだ!
1. クラウドサーバはいズドン！
1. 出たな！プロポーザルおばけ！
1. フロントエンドダブルバイセップス！
1. プロテインにできることは、まだあるかい！？
1. そのクオリティでは眠れないデスマもあっただろう！
1. そこまで仕上げるためには眠れない夜もあっただろうに！

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/e96d0c9c-94e1-bc63-62ff-3e7d4048eb84.png"><img width="300" alt="スクリーンショット 2019-12-18 1.58.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309546/1a8c1204-b7ee-d48f-45cc-4aa55bf7c68a.png">
音声の収録：音作りに余念が無いメンバー。


## まとめ

懸垂すると掛け声をかけてくれるシステムが完成したぞ！

今後は懸垂をカウントして記録したり、回数や頻度によって異なる掛け声をかけてくれるなどの機能で、さらに筋肉を盛り上げていくぞ！

「懸垂がたくさんできるんだけど、誰も掛け声をくれない！(´；ω；｀)」という人はぜひ<a href="http://www.brainpad.co.jp/recruit/">ブレインパッド</a>で一緒に働きましょう！

## 参考記事

- <a href="https://qiita.com/Nyanpy/items/cb4ea8dc4dc01fe56918">Raspberry Piで音楽(wav/mp3)ファイルを再生する方法 python編</a>
- <a href="https://chasuke.com/motionsensor/"> 【Raspberry Pi】自作人感センサーの使い方と活用法</a>
- <a href="https://muscle-history.net/kakegoe/">【全57個！】ボディビル大会でのかけ声まとめ！【2018年最新版！】｜マッスルヒストリー</a>
- <a href="https://www.amazon.co.jp/dp/4905158583?tag=maftracking200380-22
">筋肉を称える神資料</a>