Raspberry Pi カメラのパン・チルトをサーボで遠隔制御する

Raspberry Pi カメラのパン・チルトをサーボで遠隔制御する

カメラのパン・チルト(上下・左右方向に首を振る)をサーボモータ2個で制御します。さらに、この制御をスマホのアプリからジョイスティックのインターフェースでWiFi通信で遠隔制御する方法を解説します。カメラの基本的な使用方法は前回記載しましたので、そちらを参照してください。

環境

ハード

ラズパイ本体Raspberry Pi4 ModelB 4GB 技適対応品
カメラRaspberry Pi Camera Module V2 カメラモジュール
パン・チルトキットPan Tilt HAT
サーボ制御のボードSparkFun Pi Servo HAT (PCA9685)
バッテリAnker Power Core Fusion 5000

ソフト

OSRaspbian Buster with desktop and recommended software (2020-02-13)
PythonPython 3.7.3

カメラ パン・チルトの組み立て

パン・チルトのキット組み立ては、同梱の説明書を見れば10分程度組み立てられます。もし分かりにくければ、製造元のsparkfunのHPに記載がありますので、参考にしてください。

PCA9685でサーボを制御

PCA9685は高機能で、16個のサーボモータをI2Cで制御することができます。このICはNXP製で、データシートはここにあります。今回はSparkfun製のボードを使用しますが、Adafruitからも製造販売されています。

PCA9685のボードは、USB-Type Cのポートが付属しており、ここに電源を供給することで、Raspberry Pi本体にも電源供給することができるので、電源周りをコンパクトに纏められます。ただし、サーボモータ多く動かす場合は、消費電力が大きくなるので、接続する電源の供給電流をよく確認してください。もし、電流量が足りない場合は、ボードの電源ジャンパー配線を切断して、ボードとRaspberry Piに別電源を供給できるようになっています。詳細はここを見てください。

サーボ制御プログラムは、AdafruitのCircuitPythonライブラリを使用します。そのため、まずはCircuitPythonをインストールします。

次に、Adafruitのライブラリをインストールします。

これで準備は完了です。試しに、サーボモータをボードに接続して動かしてみます。上下方向に動かすサーボモータをチャネル2に接続し、左右方向に動かすサーボモータをチャネル3に接続します。

プログラムは下記の通り、「kit.servo[チャネルNo.].angle = 角度(°)」とするだけなので簡単ですね。

Blynkで遠隔操作

ここまでで、サーボモータをプログラムで制御できる状態になりました。しかし、制御するたびにコードを書いてられないので、スマホで制御できるようにしましょう。使用するアプリは、Arduinoでも使用したBlynkです。ライブラリは、以下のコマンドでインストールしてください。

BlynkアプリとスマホをWiFiで接続し、JOYSTICKを配置します。設定は、「MERGE」で、値の範囲を-100~+100にします。「WRITE INTERVAL」は100msにします。

Pythonプログラムは、下記のとおりです。BLYNK_AUTHは、ご自身の認証トークン(Auth Token)に書き換えてください。

Adafruitのサーボライブラリを読み込んで、角度制御に使用する変数を初期化しています。angleXとangleYは、Joystickで動かす角度です。ki.servo[*].angle=90で、サーボの初期角度を90°とし、カメラが真正面を向くようにセットします。

次に、Blynkライブラリの読み込みとタイマーライブラリを読み込みます。limit関数は、サーボモータが回りすぎないように、角度の上限と下限を決めています。Joystickの値は、v1_write_handlerで取得しています。Joystickが-30~+30の範囲のときは「不感帯」とし、その範囲を超えている場合は、angleX, angleYの値を+4または-4にします。

panTiltMoveは、今のサーボ角度から、angleX, angleYの角度で回転させたときに、角度の上下限を超えていない場合は回転し、角度の上下限を超える場合は回転させないように、limit関数で制限しています。

timer.set_intervalでは、0.1秒(100ms)ごとに、panTiltMoveを実行するようにしています。この100msというのは、Blynkで設定したインターバルの100msに合わせています。

最後に

これでカメラの向きを自由自在に操れます。しかし、操るだけでは、本当に向けたい向きにカメラが向いているかどうかわかりません。やはり、カメラに写っている映像をリアルタイムで確認して、カメラの向きを制御したいですよね。次回は、その方法について記事を書きたいと思います。

(参考にしたサイト)
https://intellectualcuriosity.hatenablog.com/entry/2020/03/16/053146

Raspberry Piカテゴリの最新記事