趣旨 : ラズパイを移動できるようにしよう!
Raspberry Piを移動できるようにすると、作れるモノが増えて楽しいです。移動できるようにするためには、ロボットキットなどを購入する方法もありますが、部品をいくつか購入して、自作することもできます。
作業手順
- Raspberry Piの初期設定 (他にたくさん記事があるので、ここでは書きません)
- 必要な部品をそろえる
- ボディの作成
- GPIOの制御
- おまけ (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用のケースを利用してつくるように設計しています。他のケースやバッテリーを使うとサイズが合わないのでご注意ください
レーザー加工ができるサービスの例
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にデータとスクリプトを置いてます。