RaspberryPiからサーボモーターをつかってみました。とりあえず、RasPiにつないでごにょごにょ動かしてみるところまで。
参考にさせていただいたサイト:
- Raspberry Piでサーボコントロール、Part1 上下・左右の2軸を動かす | ものづくりエクスペリメント
- Raspberry PIでLED点灯コントロール、Part3 ネット経由(WebIOPi)でコントロール | ものづくりエクスペリメント
環境
- 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/) のサイトから最新版を選択し、
ダウンロード開始後のこのような画面で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のマニュアルによると、
デフォルトの周期は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とサーボモーターの接続
RaspberryPiのピン配置はこちら(Raspberry Pi Pin assign ピンアサイン一覧表 | 街角のリブロガー)を参考にさせていただきました。
※サーボモーターから出ている配線の順番と異なるので注意してください。
参考サイトには「RaspberryPiのみの電源では、電源関連で動作が不安定になる」とのことが書いてありましたが、自分の場合は問題ありませんでした。(ちなみに、電源は1.8Aまで対応のものを利用しています。)
実行結果
ダンボーの腕が動いた〜♪
まとめ
無事にRaspberry Piからサーボモーターを動かすことができました〜!
サーボモーターを始めて触ってからこのブログを書き終えるまで2日。クオリティーはアレですが、短期間で面白いものが出来た気がします^^
次は何を作ろうか。。。
servo.set_servo(SERVO_X, 600)となっていますが,
servo.set_servo(SERVO_PIN 600)の間違えではないでしょうか.
プログラムを実行したところ,SERVO_Xが無いとおこられました
プログラムの作成 の部分
確かに、プログラムが間違っています。ブログの記事を修正させていただきます。
ご指摘ありがとうございます。