Raspberry Pi zeroのライブカメラの首振り

pi zeroにカメラをつけてケースに収めたものにサーボモーター(SG92R)をくっつけて、本体ごと回転させてカメラを首振りさせてみた。

pythonのソース

#!/usr/bin/python
import pigpio
import time
gpio_pwm = 18
pig = pigpio.pi()
pig.set_mode(gpio_pwm, pigpio.OUTPUT)

para_max = 110000
para_min = 70000
para = para_min
interval=20
delta=10000

try:
  while True:
    if para >= para_max:
        flag=-1
    elif para <= para_min:
        flag=1
    para = para + (delta*flag)
    pig.hardware_PWM(gpio_pwm, 50, para)
    time.sleep(interval)
except KeyboardInterrupt:
  pig.set_mode(gpio_pwm, pigpio.INPUT)
  pig.stop()



Piとの接続は、SG924Rの茶→GND、赤→5V、オレンジ→GPIO18

これを実行するためには pi gpio daemonが起動している必要がある。

sudo pigpiod

そして、motionをバックグラウンドで動かしておく。

libcamerify motion -b


このやり方はPWM制御といってduty比というものを指定する。

hardware_PWM に3つの引数を渡しているが順にGPIOのピン番号(今回は18を使用)、動作周波数(50Hz)、duty比である。

動作周波数はモータによるようだ。SG92RのデータシートがみつからないのだがSG90Rはあって、そこに50Hzと書いてあった。

duty比が大きいと大きく回転することはわかったがどこが基準でどれだけ大きくするとどれだけ回転するのかがいまいちよくわからない。

誰かのソースを動かしてみて、値を変えながら確認していった。

モーターをpi zeroのケースの下にくっつけたのだがその時の角度はテキトーである。

duty比は70000~110000の範囲で変えると、正確に測っていないが大体120度くらいの範囲で首振りできた。

初期値を70000にして、大きくしていくと半時計周りに回転する。そして11000を超えたら、こんどは小さくしていくと時計回りに回転する。70000を下回ったらまた大きくする。これを繰り返して「首振り」動作が実現できた。

モータを回してsleepする時間と、duty比の変化量を変えることでゆっくり首振りしたり、なめらかにさせたり、ガクンガクンと大幅に首振りさせることができる。


電源ケーブルやgpioと接続しているケーブルが邪魔にならないように余裕をもたせてたるみをもたせつつ固定しておく。ある程度重みのある台となるものにモーターを固定しpi zeroのケースをつけた。

仮なので両面テープやビニールテープを使っている。