ラズパイゼロ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トリガーで上下できるようにしてみました。
ラズパイゼロ2Wでラジコンカー製作中。今日はカメラの首振りを実装。
— slowtech (@slowtech) 2026年1月18日
L2,R2トリガーで動きます。 pic.twitter.com/6B5lvIXvoN
カメラを上下に動かせるようになったので、より周りを良く見れるようになりました。
とてもいい感じです。
やっぱりラズパイは手返しが早くて良い。
Arduinoはいちいちコンパイルしなくてはならず、その分待ち時間が発生してしまいますからね。