5
6

More than 3 years have passed since last update.

Raspberry Piに360度回転するサーボモーターを取り付けて移動できるようにする

Last updated at Posted at 2019-01-15

趣旨 : ラズパイを移動できるようにしよう!

Raspberry Piを移動できるようにすると、作れるモノが増えて楽しいです。移動できるようにするためには、ロボットキットなどを購入する方法もありますが、部品をいくつか購入して、自作することもできます。

作業手順

  1. Raspberry Piの初期設定 (他にたくさん記事があるので、ここでは書きません)
  2. 必要な部品をそろえる
  3. ボディの作成
  4. GPIOの制御
  5. おまけ (Flaskでウェブから操作できるようにする)

2. 必要な部品をそろえる

必要な部品
- Raspberry Pi
- MicroSDカード
- Raspberry Pi用ケース
- バッテリー(Anker PowerCore 10000)
- MicroUSBケーブル
- MDF4mm
- タイヤ付き360度サーボモーター(FS90R)
- M3-10mmトラスネジ x 4
- M3ナット x 4
- M2-10小ネジ x 4
- M2ナット x 4

Raspberry Piを持っていれば、追加で購入するのは、Raspberry Pi用のケース、モバイルバッテリー、360度サーボモーター、ネジ類です。

3. ボディの作成

Githubのページにボディのデータを置いているのでお使いください。ボディのデータはpdfになっているので、このデータをレーザー加工業者に渡すか、レーザー加工サービスが利用できる場所で加工します。素材は厚さが4mmであれば何でもよいです。上の写真はMDFを利用しています。デザインデータは上の部品表に載せているバッテリーとRaspberry Pi用のケースを利用してつくるように設計しています。他のケースやバッテリーを使うとサイズが合わないのでご注意ください

レーザー加工ができるサービスの例
- グラフィック
- FabCafe
- MakerSpace / HackerSpace

4. GPIOの制御

Raspberry PiのGPIOをPythonで制御するようにしました。PythonでGPIOを制御するためのライブラリはいくつかあるようで、最初Rpi.GPIOライブラリを利用しましたが、360度サーボの正転、逆転が指定した方向と逆に動くことがありました。そのためpigpioというライブラリを利用します。pigpioのインストール手順は以下の通り。

sudo apt install pigpio
sudo pip3 install pigpio
# デーモンを動かす
sudo pigpiod

pigpioはデーモンを動かす必要があるので、sudo pygpiodを実行して、デーモンを動かした状態でPythonから利用します。

以下のようなスクリプトを書いてテストします。Python3を使ってます。2秒間正転、2秒間逆転して、止まります。

import pigpio
import time

# サーボモーターをGPIOの18につないで使います
servo = 18

pi = pigpio.pi()

# ピンを出力に設定
pi.set_mode(servo, pigpio.OUTPUT)

# 2秒間正転 (FS90Rは1msのパルスで正転)
pi.set_servo_pulsewidth(servo, 1000)

time.sleep(2)

# 2秒間逆転 (FS90Rは2msのパルスで逆転)
pi.set_servo_pulsewidth(servo, 2000)

time.sleep(2)

# 停止 (FS90Rは1.5msのパルスで停止)
pi.set_servo_pulsewidth(servo, 1500)

# 終了
pi.stop()

サーボモーターの仕様はAdafruitのページに載ってます。
https://www.adafruit.com/product/2442

5. おまけ (Flaskでウェブから操作できるようにする)

import pigpio
import time

from flask import Flask, redirect, render_template, url_for

app = Flask(__name__)


@app.route('/')
def home():
    return render_template('index.html')


@app.route('/forward')
def forward():
    pi.set_servo_pulsewidth(left_out, 1000)
    pi.set_servo_pulsewidth(right_out, 2000)
    time.sleep(2)
    pi.set_servo_pulsewidth(left_out, 1480)
    pi.set_servo_pulsewidth(right_out, 1480)
    return redirect(url_for('home'))


@app.route('/backward')
def backward():
    pi.set_servo_pulsewidth(left_out, 2000)
    pi.set_servo_pulsewidth(right_out, 1000)
    time.sleep(2)
    pi.set_servo_pulsewidth(left_out, 1480)
    pi.set_servo_pulsewidth(right_out, 1480)
    return redirect(url_for('home'))


@app.route('/right')
def right():
    pi.set_servo_pulsewidth(left_out, 2000)
    pi.set_servo_pulsewidth(right_out, 2000)
    time.sleep(0.3)
    pi.set_servo_pulsewidth(left_out, 1480)
    pi.set_servo_pulsewidth(right_out, 1480)
    return redirect(url_for('home'))


@app.route('/left')
def left():
    pi.set_servo_pulsewidth(left_out, 1000)
    pi.set_servo_pulsewidth(right_out, 1000)
    time.sleep(0.3)
    pi.set_servo_pulsewidth(left_out, 1480)
    pi.set_servo_pulsewidth(right_out, 1480)
    return redirect(url_for('home'))


if __name__ == '__main__':
    pi = pigpio.pi()

    left_out = 18
    right_out = 19

    pi.set_mode(left_out, pigpio.OUTPUT)
    pi.set_mode(right_out, pigpio.OUTPUT)

    app.run(host='0.0.0.0', port=80)

終わりに

Githubにデータとスクリプトを置いてます。

5
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6