RaspberryPiでサーボモーター(SG90)

RaspberryPiからサーボモーターをつかってみました。とりあえず、RasPiにつないでごにょごにょ動かしてみるところまで。

 

参考にさせていただいたサイト:

 

環境

  • Raspberry pi Type B 512MB
  • OS: raspbian jessie lite
  • python3.4
  • サーボモーター: SG90 (秋月電子 商品ページ | SG-90)
    • ebay.comで1つあたり160円ほどで購入
  • その他, ブレッドボードとかジャンプワイヤーとか。

 

環境構築

とりあえず、Rasbianのインストールが完了している状態でsshでログインして作業していきます。

パッケージのインストール

原因はあまり特定していませんが、python2.Xだといまいちうまく動かなかったので、python3でインストールしていきます。(どちらかとゆーとPython3が好きだし…)

参考: RPIO does not work on Python 3, only in Python 2.7 | http://raspberrypi.stackexchange.com/

sudo apt-get install python3 python3-setuptools
sudo easy_install3 -U RPIO

 

WebIOPiのインストール

こちらのサイト(Raspberry PIでLED点灯コントロール、Part3 ネット経由(WebIOPi)でコントロール)に書いてある通り、のコマンドでインストールすることができました。

最新版はこちら(https://sourceforge.net/projects/webiopi/files/) のサイトから最新版を選択し、%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-18-22-24-56

ダウンロード開始後のこのような画面でdirect linkを右クリックからリンクのアドレスをコピーして利用しました。(リンクアドレスの後ろになんだかいろいろ付いてたのは削除しました)

wget http://downloads.sourceforge.net/project/webiopi/WebIOPi-0.7.1.tar.gz
tar xvf WebIOPi-0.7.1.tar.gz
cd WebIOPi-0.7.1
sudo ./setup.sh
# このsetupがそれなりに時間がかかった。(15分くらい?)
Do you want to access WebIOPi over Internet ? [y/n] n
# 最後にインターネットからアクセスするか?と聞かれるので、とりあえずそのつもりなはいので n

このセットアップスクリプトはpython3がインストールされている場合にはpythonコマンド(python2)とpython3コマンドの両方で実行されるようです。

自分の環境では、RasPiを外部に公開する予定はなかったのでufwなどのファイヤウォールは設定されていなかったので、ufwについては触っていません。

 

ハマったところ

WebIOPiのインストール(sudo ./setup.sh実行時)に謎のエラーが出ました。。。

You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 libpython3-dev : Depends: libpython3.4-dev (>= 3.4.2-0) but it is not going to be installed
 python3.4-dev : Depends: libpython3.4-dev (= 3.4.2-1) but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

とりあえずメッセージ通り apt-get -f install を実行

apt-get -f install

その後、sudo ./setup.sh をやると、どうやらうまくいきました。めでたし。(なぜだろ…

 

サーボモーターの制御

このサーボモーターは秋月電子のデータシート(SG90)からざっくり読み取ると…

  • 4.8〜5[V] で動作
  • 0.1秒で60度動く
  • 制御するときにPWMの1周期は50Hz(20ms)で、Duty(電圧がHigh)の時間の長さによって、停止する一が異なる。
    • 0.5ms : -90度
    • 1.45ms: 0 度
    • 2.4ms : +90度

みたいな感じです。

また、Pythonで制御に使用した関数RPIO.PWMのマニュアルによると、

Example of using PWM.Servo (with the default subcycle time of 20ms and default pulse-width increment granularity of 10µs):RPIO.PWM, PWM via DMA for the Raspberry Pi | https://pythonhosted.org/RPIO/pwm_py.html

デフォルトの周期は20msでちょうどいい感じです。また、最小分解能?は10us単位なので、一番下の桁は0以外は指定できません(指定するとエラーを吐かれる)

from RPIO import PWM
servo = PWM.Servo()
# Set servo on GPIO17 to 1200µs (1.2ms)
servo.set_servo(17, 1200)

1つめの引数にピン番号、2つめにDutytime?(電圧がHighの時間[us)を指定します。

つまり、

...
# 0.5ms : -90度
servo.set_servo(17, 500)
# 1.45ms : 0度
servo.set_servo(17, 1450)
# 2.4ms : +90度
servo.set_servo(17, 2400)
# 0.975.ms : -45度
servo.set_servo(17, 970)
# (975は指定できない)

といった感じで指定することができます。

 

プログラムの作成

とりあえず動かしてみる

適当なディレクトリでtest.pyを作成します。

import webiopi
from RPIO import PWM
import time

GPIO = webiopi.GPIO
servo = PWM.Servo()
SERVO_PIN = 14

servo.set_servo(SERVO_PIN, 600)
time.sleep(1)
servo.set_servo(SERVO_PIN, 1450)
time.sleep(1)
servo.set_servo(SERVO_PIN, 950)
time.sleep(1)
servo.set_servo(SERVO_PIN, 1450)
time.sleep(1)

servo.set_servo(SERVO_PIN, 600)
time.sleep(0.2)
servo.set_servo(SERVO_PIN, 1450)
time.sleep(0.2)
servo.set_servo(SERVO_PIN, 600)
time.sleep(0.2)
servo.set_servo(SERVO_PIN, 1450)
time.sleep(0.2)
servo.set_servo(SERVO_PIN, 600)
time.sleep(0.2)
RasPiとサーボモーターの接続

raspi-sarvo

 

RaspberryPiのピン配置はこちら(Raspberry Pi Pin assign ピンアサイン一覧表 | 街角のリブロガー)を参考にさせていただきました。

※サーボモーターから出ている配線の順番と異なるので注意してください。

参考サイトには「RaspberryPiのみの電源では、電源関連で動作が不安定になる」とのことが書いてありましたが、自分の場合は問題ありませんでした。(ちなみに、電源は1.8Aまで対応のものを利用しています。)

 

実行結果

ダンボーの腕が動いた〜♪

 

まとめ

無事にRaspberry Piからサーボモーターを動かすことができました〜!

サーボモーターを始めて触ってからこのブログを書き終えるまで2日。クオリティーはアレですが、短期間で面白いものが出来た気がします^^

次は何を作ろうか。。。

 

Pocket
Bookmark this on Google Bookmarks

2 thoughts on “RaspberryPiでサーボモーター(SG90)

  1. MRI

    servo.set_servo(SERVO_X, 600)となっていますが,
    servo.set_servo(SERVO_PIN 600)の間違えではないでしょうか.

    プログラムを実行したところ,SERVO_Xが無いとおこられました

    1. takunoko Post author

      プログラムの作成 の部分
      確かに、プログラムが間違っています。ブログの記事を修正させていただきます。

      ご指摘ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です