はじめに
Raspberrypi5でラジコンサーボを使う方法を解説します。
ラジコンサーボには低価格でコスパの良い「SG90」を、サーボ用の電源にはくり返し使えるエネループを使用します。
プログラム言語はPythonを使い、ライブラリにはRaspberryPi 5の公式ドキュメントに紹介されている「gpiozero」を使用します。
これまで、RaspberryPiのライブラリとして「RPi.gpio」を紹介してきましたが、2024年3月現在、Pi5ではRPi.gpioが使えない状態が続いています。
そのため、今回は現時点で使用可能な「gpiozero」を使う方法を解説します。
~ この記事の内容 / Contents ~
環境
この記事で使用する環境は以下の通りです。
環境 | バージョンなど | 備考 |
RaspberryPi | 最新の「5」を使用します | |
RaspberryPi OS | Debian version 12 (bookworm) | 64bit版です |
言語 | Python 3.11.2 | |
ライブラリ | gpiozero |
サーボモーター(ラジコンサーボ) SG90
今回の記事で使用するサーボーモーター(ラジコンサーボ)「SG90」です。
ラジコンサーボは、モータ・ギアボックス・制御基板などが1つのケースにまとめられたモーターで、ラジコンカーのステアリング・ラジコン飛行機の翼の操作・ホビーロボットの関節軸など、1回転中の特定の範囲を繰り返し動かすために使います。
配線も「電源・GND・PWM信号」の3本だけです。
SG90の電源は4.8Vですが、PWM信号は3.3Vでも反応してくれるので、RaspberryPiシリーズからPWM信号を直接接続できます。
項目 | スペック |
電圧 | 4.8V |
動作範囲 | 180度(±90度) |
トルク | 1.8kgf・cm |
付属品 | サーボホーン3種 |
サーボ固定ねじ×2、ホーン固定ねじ×1 |
RaspberryPi 5との接続
RaspberryPi 5とSG90を以下のように接続します。
ピンアサイン
※ RaspberryPi 公式のGitHubより引用
使用する部品
RaspberryPi 5
RaspberryPi 5本体です。技適や流通経路が不安な方は、日本の老舗店マルツオンライン(楽天)のページが安心です(現在は4GB版のみの販売)。
※ どの購入先でも、本体に電源やケーブルは含まれていないので注意してください
RaspberryPi 5 用電源
スマホ用(PD対応品)も使用できますが、仕様によってはUSBの出力電流が制限されたり、電源が落ちたりすることもあります。5V5A対応品の使用がおすすめです。
公式品は少々値段が高いので、私は以下から購入・使用しています。
サーボモータ(ラジコンサーボ) SG90
冒頭でも紹介した、RaspberryPiシリーズで使えるサーボモータ(ラジコンサーボ)です。 人気のため、コピー品も多いようです。私は以下の正規販売元のページから購入しました。
ブレッドボード(ハーフサイズ)
サンハヤト製のブレッドボードです。今回は簡単な回路なので小さいサイズのものを使っています。
ジャンプワイヤ (オス-メス タイプ)
RaspberryPiで使う場合は、以下のオスーメスタイプがおすすめです。
エネループ
使い捨ての乾電池もいいですが、エネループなら4本充電時の電気代が約1円。モーター・ポンプなどの電池が消耗しやすい実験・工作におすすめです。
※ はじめて使う方は充電器とのセットがおすすめです
電池ボックス
電源に使用する乾電池用のボックスとスナップです。記事では単4を使っていますが、容量の大きい単3タイプをお勧めします。単3でも単4でも電圧は変わりません。
プログラム概要
今回のプログラムの概要は以下の通りです。
- SG90の設定をする
- サーボを最小角度に動かす
- サーボを中間の角度に動かす
- サーボを最大角度に動かす
- サーボを指定の角度に動かす
実行結果
後述するプログラムの実行結果は以下の通りです。
全体コード
全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。
from gpiozero import Servo
from time import sleep
#
# SG90の仕様に合わせてServoオブジェクトを生成します、引数は以下です
# pin: ピン番号(GPxx)
# initial_value: 初期角度をパルス幅で指定[秒]
# min_pulse_width: 最小角度をパルス幅で指定[秒]
# max_pulse_width: 最大角度をパルス幅で指定[秒]
# frame_width: PWMの周期を指定[秒]
# pin_factory: ベースライブラリを指定
#
servo = Servo( pin=13, initial_value=1.45/1000, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000, frame_width=20.0/10\
00,\
pin_factory=None )
for i in range(3):
# 最小の角度(-90)に動作します
print("min")
servo.min()
sleep(2)
# 中間の角度(0)に動作します
print("mid")
servo.mid()
sleep(2)
# 最大の角度(+90)に動作します
print("max")
servo.max()
sleep(2)
# 指定の角度(-45度)に動かします
print("value")
servo.value = -0.5
sleep(2)
実行方法
上述した全体コードを保存したディレクトリで、以下のコマンドを実行します。
sudo python gpiozero_servo.py
コードのポイント
SG90の設定をする
ラジコンサーボはPWM信号を使って制御を行いますが、制御の際の周期や、どのくらいのパルス幅で何度動くか、は使用するサーボによって異なります。
そのため、Servoオブジェクトを生成時にSG90に合わせた設定を行います。設定する項目と内容は以下の通りです。
引数名 | 内容 | コード |
pin | ピン番号(GPxx)を指定します | 13 |
initial_value | 初期角度をパルス幅で指定します[秒] | 1.45/1000 |
min_pulse_width | 最小角度をパルス幅で指定します[秒] | 0.5/1000 |
max_pulse_width | 最大角度をパルス幅で指定します[秒] | 2.4/1000 |
frame_width | PWMの周期を指定します[秒] | 20.0/1000 |
pin_factory | ベースライブラリを指定します | None |
Servoのパルス幅・周期の指定は「秒」での指定ですが、SG90のスペックシートでは「ミリ秒(ms)」表記なので、見やすい形(ミリ秒を1000で割る)にして記載しています。
「pin_factory」は、GPIOの拡張チップや、ライブラリの開発時に仮想のGPIOを使う場合のものなので、基本的には「None」を指定すれば問題ありません。
※ 下記の設定コードの実行が完了すると、サーボが設定した「初期角度」に動作するので注意してください。
#
# SG90の仕様に合わせてServoオブジェクトを生成します、引数は以下です
# pin: ピン番号(GPxx)
# initial_value: 初期角度をパルス幅で指定[秒]
# min_pulse_width: 最小角度をパルス幅で指定[秒]
# max_pulse_width: 最大角度をパルス幅で指定[秒]
# frame_width: PWMの周期を指定[秒]
# pin_factory: ベースライブラリを指定
#
servo = Servo( pin=13, initial_value=1.45/1000, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000, frame_width=20.0/1000,\
pin_factory=None )
サーボを最小角度に動かす
Servoオブジェクト生成時にSG90用の設定は完了しているため、あとはmin関数を呼び出すだけで、サーボを最小角度に動作させることができます。
min・mid・max関数は「サーボが指定した角度まで動いたか?」はチェックしません。
そのため、サーボが動作中でもプログラムは次の行へと進むので、sleepなどでサーボの動作完了待ちを行ってください。
# 最小の角度(-90)に動作します
print("min")
servo.min()
sleep(2)
サーボを中間・最大の角度に動かす
同様にmid関数・max関数により、サーボを中間・最大角度に動作させることができます。
# 中間の角度(0)に動作します
print("mid")
servo.mid()
sleep(2)
# 最大の角度(+90)に動作します
print("max")
servo.max()
sleep(2)
サーボを指定の角度に動かす
サーボを任意の角度に動かしたい場合はvalueプロパティに+1~-1の範囲で値を代入します。
SG90は「-90度から+90度まで」の範囲で動作するので、動作位置は以下のように指定してください。
動作位置 | サーボの動作角度 |
-1.0 | -90度 |
0.0 | 0度 |
+1.0 | +90度 |
# 指定の角度(-45度)に動かします
print("value")
servo.value = -0.5
sleep(2)
まとめ
Raspberrypi5でラジコンサーボを使う方法を解説しました。
RPi.gpioはパルス幅の指定で動かすため多少の計算が必要でしたが、gpiozeroでは初期設定さえしてしまえば、ライブラリ側が計算してくれます。
max関数やvalueプロパティで簡単に動かすことが出来るので、みなさんもぜひ使ってみてください。参考になればうれしいです。
おすすめ書籍
MicroPythonのプログラミングガイドブックがついに登場!
「MicroPython」の専門書がついに発売になりました!
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方までが、”ガッツリ”学べます!
別言語を使っている人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学びたい人におすすめの内容となっています。
全ての内容はここでは紹介しきれないので、詳細は以下からご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。