RaspberryPiカメラの可動式雲台のプロトタイプ | オヤジのブログ

オヤジのブログ

Yahooからの避難組/FC2と2足のわらじ/趣味やら日々の出来事やら

庭にやってくる野良ネコを観察しようと作り始めたにゃんこカメラだったけど、その野良は今うちですっかり家猫をやっているので、今やただの庭木監視用のカメラと化している。
これはもったいないと思い、母の件など諸々落ち着いてき始めたので見直すことにした。

ラズパイ カメラモジュールの雲台というかフォルダ? | オヤジのブログ (ameblo.jp)
そもそもの目標だったパン&チルト機構。
機構自体はサーボモーターと3Dプリンタで作ったフレームで出来上がているのだけど、それを動かすプログラムがまだだった。


一応カメラの映像はmotionというソフトを使い、ネットワーク経由で見るようにしている。
具体的に言うと、カメラを付けたラズパイでmotionを立ち上げて置き、見る方はhttp://192.168.1.100:8081などとして、そのラズパイのIPとポートを指定してブラウザで開くと、カメラの映像が開く仕組みになっている。
操作はsshなどでダイレクトにプログラムを起動する方法もあるけれど、どうせならブラウザから操作できたらと思い、JavaScriptでCGIで制御プログラムを呼び出すことにした。

CGIはc言語。
ラズパイのGPIO(とげとげPIN)からサーボモーターの信号線をとっているのだが、そのGPIOを動かすにはroot権限(管理者権限)が必要なのだけれど、残念ながらweb経由では直接rootは取れないらしい。
従って、root権限で常駐するサーバープログラムを自前で用意するなどの必要があるのだが、良くしたもので、長いことGPIOを統括するライブラリだったwiringPiの、後継(?)であるpigpioには、pigpiodという常駐プログラムがあり、これがまさしく、外部からリクエストを受けてGPIOを動作するサーバープログラムなのであった。
これが使えるのは、今のところCとPythonだけ。
そうなると、Pythonでもいいけれど、やっぱりCなんだなあ・・・・・

いずれにせよpigpiodではサーボ動かす専用コマンドが用意されていて
set_servo_pulsewidth();でサーボ動作
get_servo_plusewidth();でサーボ周波数読み込み
この二つだけで完結してしまう。

プログラムなんか楽勝もいいところ・・・と思ったらハマったわけで・・・・

ハマったのは HTML & JavaScript の方。
fetch("/usr/lib/cgi-bin/pigpiod_left.cgi");
みたいにフルパスでCGIプログラムを指定していたのだけれど、どうにも動かない。
apacheの設定ファイルを見てたら、パスが aliasで /cgi-bin/ に置き換えられてて、そっちが優先される(?)らしい。
フルパスなら間違いないって思うじゃんねえ。

まあすったもんだしながら作ったプロトタイプ画面がこれ。
※カメラはまだもう一台のラズパイで設置したままなので、映像画面はない。
←↓↑→のボタンを押すと、それぞれの方向に雲台が首を振る。
 

自分で作っておきながら、これは結構面白い。

ちなみに、ここに現在設置してあるカメラの映像を<iframe>タグで持ってきたらこんな感じになった。


なぜかwidthやheightが効かず、でかい画像のまま貼られている。

多分こんなwebで操作できるwebカメラなんて、ドンキあたりにいったら3~4,000円くらいで売られている気がしないでもないけれど、自分でやるから面白い。
まあ、その時点で目的がすり替わっている気がしないでもないが。