ゆるエンジニアはいろいろ遊びたい

FAエンジニアが週末にいろいろ遊ぶブログです

ラズパイカーにカメラ上下機構を追加した

ラズパイゼロ2Wを使ってラズパイカーを製作しています。
前回、カメラをブラウザでモニターしながらPS4コントローラでタイヤの操作ができるようになりました。
今回はカメラを上下に首振りする機能を追加します。
電子工作ではおなじみの、マイクロサーボSG90とサーボドライバPCA9685を使用しました。
PCA9685ドライバは、I2Cという通信でサーボを16台制御することができるようです。
そんなにたくさん制御する気はありませんが、360°サーボを使えばL298Nを使わなくてもラジコンが作れそうです。
あいにく360°サーボは持っていないので、首振り機能だけのためにドライバーを使います。
回路図は以下

ラズパイ側は、事前にI2Cを有効にしておきます。デスクトップからラズベリーパイの設定の項目で変更するのが簡単です。
Pythonプログラムは、adafruit-pca9685というモジュールを使うと動きました。
似たようなものに、Adafruit-CircuitPythonというモジュールもあるようで、我が家のチャッピーはこちらを使ったコードを書いてくれたのですが、全然動きませんでした。デューティー比関係の書き方がおかしかったみたいですが、よくわからなかったので動いた方を使います。
まずは、モジュールのインストール。

sudo pip install adafruit-pca9685

サンプルコードは以下

import Adafruit_PCA9685
import time

# PCA9685初期設定
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)


def main():
    while True:
        pwm.set_pwm(0, 0, 150)
        time.sleep(1)
        pwm.set_pwm(0, 0, 650)
        time.sleep(1)


if __name__ == '__main__':
    main()

サーボモーターのPWM制御については、過去にrpi_hardware_pwmを使用したことがあります。
slowtech.hateblo.jp
この時は、デューティー比を直接入力したのですが、今回は少し違っています。

pwm.set_pwm(チャンネル番号, ON, OFF)

この部分がPWM制御の文ですが、「指定したチャンネル番号のPWM出力を、ONで指定したカウント目でHIにし、OFFで指定したカウントでLOWにする」
という意味です。PCA9695の内部クロックは1周期が0~4095カウントあるので、その中でどのくらいの時間ONにするかを設定するイメージです。

1カウント = 20ms / 4096 ≒ 0.00488ms
角度 パルス幅 カウント
0°  0.5ms   102
90°  1.5ms    307
180° 2.5ms   512

なんかきれいな数字にならないのはモヤっとしますが、気にしないでおきます。
ラズパイカーに実装する際は、PS4コントローラーのL2,R2トリガーで上下できるようにしてみました。


カメラを上下に動かせるようになったので、より周りを良く見れるようになりました。
とてもいい感じです。

やっぱりラズパイは手返しが早くて良い。
Arduinoはいちいちコンパイルしなくてはならず、その分待ち時間が発生してしまいますからね。