Node-REDで簡単にカメラマウントを動かしてみた

アドベントカレンダーの最終日です。これで25記事無事公開されました！最後は個人的にただやりたかったことを前日にやってみた話です。

ついこの間aliexpressの独身の日セールで安かったので、前から興味があったRaspberry Piのカメラモジュールに使えるカメラマウントを買ってみました。amazonでも売られていますが、1000円以上かかるものがありなんとなく買う気がなかったのですが、aliexpressは送料無料でなんと200円でしたw。組み立てたときに多少隙間がありますが、とりあえずできました。

![Changed.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/a5ec3dd0-9875-15e9-d262-453e17b1d1db.jpeg)


早速動かそうと思いましたが、せっかくなのでこれをNode-REDで動かす記事を書こうと思います。

# 用意するもの

- Raspberry Pi 3 Model B+
- カメラマウント（事前に組み立てておきます）
- サーボモータ(SG-90)×２

# 最新のNode-REDを用意
まずは最近Ver.1.0にアップデートされたので、[日本のユーザー会のページ](https://nodered.jp/docs/getting-started/raspberrypi)を参考にNode-REDのアップデートから始めます。とはいってもターミナルで以下のコマンドを実行すればインストールできます。

```
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
```
# サーボモータの用意
## 配線
本当はRaspberry Piに直付けするのはあまり良くありませんが、今回は試しにサーボモータを動かすので以下の図のように配線しました。
![raspi_servo_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/88ed6612-c621-33c9-a3e4-bffd1b9c9d53.png)

## pigpioを有効にする
今回インストールするgpioノードには、pigpioが使われており、こちらを常時実行させておきます。以下のコマンドを実行してpigpio有効にしておきましょう。

```
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
```


# サーボモータを動かす
## ノードのインストール
インストールが終わったら、タスクバーのNode-REDのロゴをクリックするか、ターミナルで```node-red-start```を実行し、ブラウザで```localhost:1880```と入力してNode-REDを立ち上げます。右上のメニューアイコンから「パレットの管理」を選択して、パレットの設定画面を開きます。「ノードを追加」タブをクリックして検索窓に```node-red-node-pi-gpiod```と入力します。このパレットにサーボモータを動かすためのノードが含まれています。

## とりあえず動かしてみた
とりあえずinjectノードで数字を渡して適当な角度に動くかを試してきます。具体的には、以下のフローです。
![2019-12-25-033642_1280x652_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/bc556e1d-703a-8d5a-95a9-a89a0128e7f4.png)

pi gpiodノードの中身は以下の通りです。GPIOピンを直感的に選択できる様になっています。信号入力のコードの接続先のピン番号を指定します。（今回の場合は一つはGPIO18、もう一つはGPIO23）
![2019-12-25-013659_1280x652_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/7dfe58fa-a21c-3c27-c48b-fc8e350a08ea.png)

以下のjsonをコピーして、フローエディタにインポートしても上記のフローを作成できます。

```json
[{"id":"dd72fea1.3d2ae","type":"tab","label":"Controller","disabled":false,"info":""},{"id":"e6a7e276.5e46d","type":"ui_slider","z":"dd72fea1.3d2ae","name":"","label":" Base","tooltip":"","group":"924a74e0.66f208","order":0,"width":0,"height":0,"passthru":true,"outs":"all","topic":"","min":0,"max":"100","step":1,"x":170,"y":120,"wires":[["1d6e4033.0e87a"]]},{"id":"1d6e4033.0e87a","type":"pi-gpiod out","z":"dd72fea1.3d2ae","name":"","host":"localhost","port":8888,"pin":"23","set":"","level":"0","out":"ser","sermin":"1000","sermax":"2000","x":400,"y":140,"wires":[]},{"id":"17359fef.1088f","type":"pi-gpiod out","z":"dd72fea1.3d2ae","name":"","host":"localhost","port":8888,"pin":"18","set":"","level":"0","out":"ser","sermin":"1000","sermax":"2000","x":400,"y":220,"wires":[]},{"id":"77c93e16.a8624","type":"ui_slider","z":"dd72fea1.3d2ae","name":"","label":"Head","tooltip":"","group":"924a74e0.66f208","order":0,"width":0,"height":0,"passthru":true,"outs":"all","topic":"","min":0,"max":"100","step":1,"x":170,"y":200,"wires":[["17359fef.1088f"]]},{"id":"924a74e0.66f208","type":"ui_group","z":"","name":"controler","tab":"22edabf4.879ca4","disp":true,"width":"6","collapse":false},{"id":"22edabf4.879ca4","type":"ui_tab","z":"","name":"  AdventCalender","icon":"dashboard","disabled":false,"hidden":false}]
```

injectノードのボタン左側のボタンをクリックすると、接続を間違えてなければ任意の角度にモータが動作します。

## もう少しアレンジしてみた
今度はもっと自由自在に動かせるようにアレンジしてみます。そこでせっかくNode-REDを使っているので、ダッシュボードノードでUIを足してコントローラを作ってみます。gpiodノードの時と同様にパレットの管理画面から検索で```node-red-dashboard```と入力して、ダッシュボードのノード一式をインストールします。インストールを終えたら以下のjsonをコピーしてをフローエディタにインポートします。

```json
[{"id":"dd72fea1.3d2ae","type":"tab","label":"Controller","disabled":false,"info":""},{"id":"e6a7e276.5e46d","type":"ui_slider","z":"dd72fea1.3d2ae","name":"","label":" Base","tooltip":"","group":"924a74e0.66f208","order":0,"width":0,"height":0,"passthru":true,"outs":"all","topic":"","min":0,"max":"100","step":1,"x":170,"y":120,"wires":[["1d6e4033.0e87a"]]},{"id":"1d6e4033.0e87a","type":"pi-gpiod out","z":"dd72fea1.3d2ae","name":"","host":"localhost","port":8888,"pin":"23","set":"","level":"0","out":"ser","sermin":"1000","sermax":"2000","x":400,"y":140,"wires":[]},{"id":"17359fef.1088f","type":"pi-gpiod out","z":"dd72fea1.3d2ae","name":"","host":"localhost","port":8888,"pin":"18","set":"","level":"0","out":"ser","sermin":"1000","sermax":"2000","x":400,"y":220,"wires":[]},{"id":"77c93e16.a8624","type":"ui_slider","z":"dd72fea1.3d2ae","name":"","label":"Head","tooltip":"","group":"924a74e0.66f208","order":0,"width":0,"height":0,"passthru":true,"outs":"all","topic":"","min":0,"max":"100","step":1,"x":170,"y":200,"wires":[["17359fef.1088f"]]},{"id":"924a74e0.66f208","type":"ui_group","z":"","name":"controler","tab":"22edabf4.879ca4","disp":true,"width":"6","collapse":false},{"id":"22edabf4.879ca4","type":"ui_tab","z":"","name":"  AdventCalender","icon":"dashboard","disabled":false,"hidden":false}]
```

読み込むと、以下のフローが表示されます。ダッシュボードのスライダーノードを使って数字を出力しその値を先程のgpiodノードに渡す単純な仕組みです。

![2019-12-25-040800_1280x652_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/02455b16-424d-7335-d0d4-1ecd91c38696.png)

# 動作確認
新しいタブで```localhost:1880/ui```と入力すると、以下の画面が表示されます。
![2019-12-25-041210_1280x652_scrot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/7fca9bcd-a705-415d-638d-def5173f5ade.png)

表示したスライダーバーをスライドさせると先程よりもスムーズにサーボモータが動作します。以下はその実行結果です。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">アドベントカレンダーの最後のネタ出来た！<br>短時間で出来てしまうのもNode-REDのいいところw<a href="https://twitter.com/hashtag/NodeRED?src=hash&amp;ref_src=twsrc%5Etfw">#NodeRED</a> <a href="https://twitter.com/hashtag/RaspberryPi?src=hash&amp;ref_src=twsrc%5Etfw">#RaspberryPi</a> <a href="https://t.co/pJCX7N1ijS">pic.twitter.com/pJCX7N1ijS</a></p>&mdash; K.Miura (@k_miura_io) <a href="https://twitter.com/k_miura_io/status/1209530076158541824?ref_src=twsrc%5Etfw">December 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# まとめ
というわけでRaspberry PiのNode-REDでサーボモータを動かしてカメラマウントをコントロールする仕組みを作りました。モーターの動作からコントロールのフロントエンドまでをNode-REDだけで完結でき、うまくNode-REDを活かせたと思います。Node-REDは頭の中で思いついたものをすぐに形にできるので、Raspberry Piと合わせると短時間でアイデアが形になる最強のツールになると思います。何よりアドベントカレンダーに間に合うかどうか不安でしたが間に合ってよかったです（笑）。