Raspberry Pi PR

【ラズパイ】Raspberrypi5でラジコンサーボ「SG90」を使う方法【gpiozero】

記事内に商品プロモーションを含む場合があります

はじめに

Raspberrypi5でラジコンサーボを使う方法を解説します。

ラジコンサーボには低価格でコスパの良い「SG90」を、サーボ用の電源にはくり返し使えるエネループを使用します。

プログラム言語はPythonを使い、ライブラリにはRaspberryPi 5の公式ドキュメントに紹介されている「gpiozero」を使用します。

これまで、RaspberryPiのライブラリとして「RPi.gpio」を紹介してきましたが、2024年3月現在、Pi5ではRPi.gpioが使えない状態が続いています。
そのため、今回は現時点で使用可能な「gpiozero」を使う方法を解説します。

gpiozero公式リファレンス: https://gpiozero.readthedocs.io/en/latest/

環境

この記事で使用する環境は以下の通りです。

環境 バージョンなど 備考
RaspberryPi 最新の「5」を使用します
RaspberryPi OS Debian version 12 (bookworm) 64bit版です
言語 Python 3.11.2
ライブラリ gpiozero

サーボモーター(ラジコンサーボ) SG90

SG90と付属品の画像
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 5 とサーボの接続を設営する画像(実物)
RaspberryPi 5 とサーボの接続を設営する画像(イメージ図)

ピンアサイン

RaspberryPi 公式のGitHubより引用

使用する部品

RaspberryPi 5

RaspberryPi 5本体です。技適や流通経路が不安な方は、日本の老舗店マルツオンライン(楽天)のページが安心です(現在は4GB版のみの販売)。

※ どの購入先でも、本体に電源やケーブルは含まれていないので注意してください

RaspberryPi 5 用電源

スマホ用(PD対応品)も使用できますが、仕様によってはUSBの出力電流が制限されたり、電源が落ちたりすることもあります。5V5A対応品の使用がおすすめです。

公式品は少々値段が高いので、私は以下から購入・使用しています。

サーボモータ(ラジコンサーボ) SG90

冒頭でも紹介した、RaspberryPiシリーズで使えるサーボモータ(ラジコンサーボ)です。 人気のため、コピー品も多いようです。私は以下の正規販売元のページから購入しました。

¥820 (2023/08/25 06:08時点 | Amazon調べ)

ブレッドボード(ハーフサイズ)

サンハヤト製のブレッドボードです。今回は簡単な回路なので小さいサイズのものを使っています。

ジャンプワイヤ (オス-メス タイプ)

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

SG90の仕様 秋月電気公開のデータシートより抜粋

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関数を呼び出すだけで、サーボを最小角度に動作させることができます。

minmidmax関数は「サーボが指定した角度まで動いたか?」はチェックしません。

そのため、サーボが動作中でもプログラムは次の行へと進むので、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です。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。
Index