Raspberry Piでサーボをコントロールしてみます。
今回は上下・左右の2軸のサーボをRaspberry PiのGPIOから動かしてみます。
何はともあれ、サーボと2軸を動かすことができるカメラマウントを購入します。
一番安いサーボ、2個で910円
マイクロサーボ SG90 改良版 (2個入)
上下・左右の2軸を動かすためのカメラマウント、458円
SG90 Servo SG90サーボ用ミニ2軸 カメラマウント
このカメラマウントは海外からの発送になっているので、
注文して受け取るまでに2週間くらいかかります。なので、すぐに注文してしまいましょう。
Amazonで売っていない場合はebayで買うといいと思います。
ebayでSG90サーボ用ミニ2軸 オリジナル FPV カメラマウントを探す
ebayだと1個250円くらいで買えます。
安物サーボとカメラマウントを使って上下・左右の2軸をコントロールします。
あとカメラマウントを販売しているところが、格安なワイヤージャンパ(メス・メス)を売っています。
Arduino用の40個のカラー デュポン ワイヤー ジャンパ ケーブル 2.54MMメス→メス
40本で218円です。通常のメス・メスタイプのワイヤージャンパは10本で300円なので、作りはちゃっちいですが使えるので上記のワイヤージャンパはかなりお勧めです。(これも注文から届くまでに2週間くらいかかるので、とりあえず注文しておくと後々便利になると思います)
Raspberry PiのGPIOでサーボを動かす
カメラマウントは届くのに時間がかかるので、サーボが届いたら試しにRaspberry PiのGPIOにサーボをつなげて動かしてみます。
まずはRPIOをインストールします。
sudo apt-get install python-setuptools sudo easy_install -U RPIO
2015年2月28日現在、RPIOがRaspberry Pi 2に対応していません。Pi2を使っている人はRaspberry Piでサーボコントロール、Part3 Raspberry Pi 2に対応でRPIOなしでサーボをコントロールできるようにしてあるので、そこを合わせて参考にしてみてください。
webIOPiをインストールしていない場合は、下記を参考にインストールしてください。
Raspberry PIでLED点灯コントロール、Part3 ネット経由(WebIOPi)でコントロールする
Raspberry Piの5VとGND、GPIO23をサーボに直接つなげます。
(つなげるにはオス・メスタイプのワイヤジャンパが必要です)
簡単にサーボをちょっと動かすだけのプログラムを作成します。
sudo vim myOutput.py import webiopi from RPIO import PWM import time GPIO = webiopi.GPIO servo = PWM.Servo() SERVO_X = 23 def setup(): GPIO.output(SERVO_X, GPIO.LOW) servo.set_servo(SERVO_X, 1500) time.sleep(1) servo.set_servo(SERVO_X, 1100) time.sleep(1) servo.set_servo(SERVO_X, 800) def destroy(): GPIO.digitalWrite(SERVO_X, GPIO.LOW)
サーボを動かしてみるだけのプログラムです。
実行します。
sudo python myOutput.py
サーボが普通に動きました。
以上で、テスト完了・・・、と思いきや罠がありました。
何度か実行してみるとRaspberry Piが突然死します。
Raspberry Piの電源を引っこ抜いて再度電源を入れると元に戻ります。
再度myOutput.pyを何度か実行するとやはりRaspberry Piが無反応になって動かなくなります。
考えられる原因は2つ
電圧不足、ノイズ
仮説:サーボを動かすときに急激な電圧降下が発生して、Raspberry Piが死ぬ場合がある。
Raspberry Pi B+で電源は5V1Aのものを使っています。
ちっこいサーボだから電流は300mAくらい?起動時だともっと使う?
B+は最低600mA、最高1Aの電流を食べる。
手持ちに5V2Aの電源を持っていれば試せるんですが、持ってない。
大き目の電解コンデンサ(1000uF)を取り付ければ安定するかもしれない。
仮説:サーボのノイズがRaspberry Piをクラッシュさせる
サーボのノイズから高周波が発生して、それが原因でRaspberry Piがクラッシュしている可能性がある。
小さいコンデンサ(1uF、0.1uFなど)を入れればノイズを軽減できるかもしれない。
小さいコンデンサ持ってない・・・。
手っ取り早くサーボの電源を他から持ってくることにしました。
USB電源から5VとGNDを引っ張ってきてサーボにつなげます。
Raspberry PiからはGPIO23をサーボにつなげます。
USB電源のGNDとRaspberry PiのGNDをつなげます。
以上でサーボ用の別電源の確保完了です。
これでRaspberry Piからサーボをコントロールしても、
電圧不足やノイズでクラッシュしなくなりました。
上下・左右の2軸を動かす
注文していたカメラマウントがようやく届いたので、サーボ2つとカメラマウントを使って上下・左右の2軸を動かしてみます。
SG90 Servo SG90サーボ用ミニ2軸 カメラマウント
カメラマウントの中身
サーボについてきたサーボホーンを削ります。
ニッパーで先っぽを切り取って、ヤスリで削る。
削ったホーンをカメラマウントの部品にはめ込みます。
カメラマウントの部品同士をくっつけるのに先っぽのとがったネジを使う。
ネジ穴は1.5mmのドリルで拡張してあげる必要がある。
もう一個、サーボホーンを削ります。
ニッパーで両端を切り取って、ヤスリで削る。
削ったホーンをカメラマウントの部品にはめて、ネジでとめます。
ネジでとめるとき、1.5mmのドリルが必要になります。
これをRYOBIのドライバドリルにはめて、穴を開けてネジでとめる。
一家に一台、RYOBIのドライバドリルがあると便利だと思う。
高くて買いたくない人は、ピンバイスでがんばって穴を開ければいいと思う。
サーボとカメラマウントをネジでとめる
そのままでは穴が小さすぎるので、1.5mmのドリルで穴を拡張する必要がある。
最後にいくつかネジをとめて仕上げる。
左右を動かすサーボにはGPIO23につなげます。
上下を動かすサーボにはGPIO24をつなげます。
2軸を動かすテスト用のPythonプログラムに修正します。
最初に左右のサーボを動かして、次に上下のサーボを動かして、最後に所定の位置に戻すプログラム。
sudo vim myOutput.py import webiopi from RPIO import PWM import time GPIO = webiopi.GPIO servo = PWM.Servo() SERVO_X = 23 SERVO_Y = 24 def setup(): GPIO.output(SERVO_X, GPIO.LOW) GPIO.output(SERVO_Y, GPIO.LOW) servo.set_servo(SERVO_X, 1500) time.sleep(1) servo.set_servo(SERVO_X, 1100) time.sleep(1) servo.set_servo(SERVO_X, 800) time.sleep(1) servo.set_servo(SERVO_Y, 1400) time.sleep(1) servo.set_servo(SERVO_Y, 1800) time.sleep(1) servo.set_servo(SERVO_Y, 600) time.sleep(1) servo.set_servo(SERVO_X, 1500) time.sleep(1) servo.set_servo(SERVO_Y, 1400) def destroy(): GPIO.digitalWrite(SERVO_X, GPIO.LOW) GPIO.digitalWrite(SERVO_Y, GPIO.LOW)
全部つなげた全体図
プログラムを実行
sudo python myOutput.py
ちゃんと動きました。
[…] Raspberry Piでサーボコントロール、Part1 上下・左右の2軸を動かす […]