アドベントカレンダーの最終日です。これで25記事無事公開されました!最後は個人的にただやりたかったことを前日にやってみた話です。
ついこの間aliexpressの独身の日セールで安かったので、前から興味があったRaspberry Piのカメラモジュールに使えるカメラマウントを買ってみました。amazonでも売られていますが、1000円以上かかるものがありなんとなく買う気がなかったのですが、aliexpressは送料無料でなんと200円でしたw。組み立てたときに多少隙間がありますが、とりあえずできました。
早速動かそうと思いましたが、せっかくなのでこれをNode-REDで動かす記事を書こうと思います。
用意するもの
- Raspberry Pi 3 Model B+
- カメラマウント(事前に組み立てておきます)
- サーボモータ(SG-90)×2
最新のNode-REDを用意
まずは最近Ver.1.0にアップデートされたので、日本のユーザー会のページを参考にNode-REDのアップデートから始めます。とはいってもターミナルで以下のコマンドを実行すればインストールできます。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
サーボモータの用意
配線
本当はRaspberry Piに直付けするのはあまり良くありませんが、今回は試しにサーボモータを動かすので以下の図のように配線しました。
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ノードで数字を渡して適当な角度に動くかを試してきます。具体的には、以下のフローです。
pi gpiodノードの中身は以下の通りです。GPIOピンを直感的に選択できる様になっています。信号入力のコードの接続先のピン番号を指定します。(今回の場合は一つはGPIO18、もう一つはGPIO23)
以下の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をコピーしてをフローエディタにインポートします。
[{"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ノードに渡す単純な仕組みです。
動作確認
新しいタブでlocalhost:1880/ui
と入力すると、以下の画面が表示されます。
表示したスライダーバーをスライドさせると先程よりもスムーズにサーボモータが動作します。以下はその実行結果です。
アドベントカレンダーの最後のネタ出来た!
— K.Miura (@k_miura_io) December 24, 2019
短時間で出来てしまうのもNode-REDのいいところw#NodeRED #RaspberryPi pic.twitter.com/pJCX7N1ijS
まとめ
というわけでRaspberry PiのNode-REDでサーボモータを動かしてカメラマウントをコントロールする仕組みを作りました。モーターの動作からコントロールのフロントエンドまでをNode-REDだけで完結でき、うまくNode-REDを活かせたと思います。Node-REDは頭の中で思いついたものをすぐに形にできるので、Raspberry Piと合わせると短時間でアイデアが形になる最強のツールになると思います。何よりアドベントカレンダーに間に合うかどうか不安でしたが間に合ってよかったです(笑)。