皆さんこんにちは。yossyです。
最近、

ラズピコを使ってロボットを作りたいな~
と考えています。
ロボットを作るときに使う部品の一つに、サーボモーターがあります。
サーボモーターは、ロボットや電子工作などで広く使われる重要な部品のひとつで、特定の角度に正確に動かせるため、ロボットの関節やカメラの向きを調整する装置など、さまざまな用途で活躍しています。
この記事では、サーボモーターの基本的な仕組みや特徴、実際にRaspberry Pi Picoを使って制御する方法について詳しく解説します。
サーボモーターとは
サーボモーターは、モーター、制御回路、ギアボックスが一つになったパーツで、特定の角度に回転させることができます。
サーボモーターの特徴
- 角度制御が可能:一般的なサーボモーターは 0°〜180° の範囲で回転します。
- PWM信号で制御:マイコンから送られるPWM信号によって動作します。
- トルクが強い:小型でも比較的強い力で動かせます。
サーボモーターの使い道
サーボモーターは、決められた角度に動かせるモーターです。
そのため、さまざまなものを動かすのに使われています。
いくつか例を紹介します。
- ロボットの腕や足を動かす
サーボモーターはロボットの関節部分に使われることが多く、腕を動かしたり、足を前後に動かしたりできます。 - ラジコンカーやドローンの動きを制御する
ラジコンカーのハンドルを左右に動かしたり、ドローンのカメラの角度を調整したりするのにも使われます。小さくてもパワーがあるので、正確に動かすことができます。 - カメラの角度を変える
自動で動く防犯カメラや、ライブ配信で使うカメラの向きを変える装置にも使われています。
このように、サーボモーターはものを動かす色々な場面で使われています。
次の章では、実際にサーボモーターを動かす方法を詳しく解説していきます!
サーボモーターの使い方
それでは、サーボモーターを使う方法について解説します。
必要なものは次の通りです。
- サーボモーター(今回はSG90を使用します)
- ジャンパーワイヤー
- ブレッドボード
言語はMicroPythonを使用します。
まだRaspberry Pi Picoのセットアップが完了していない場合は、こちらの記事をご覧ください!


サーボモーターを購入する際の注意
サーボモーターはAmazonなどに有名な製品の互換品が出回っています。
互換品は安価ですが、本物に比べて精度や仕様などの品質が悪い場合があるので、購入する際は気をつけましょう。



今回使用しているSG90も、Tower Proの記載がありますが本物ではない気がします。
SG90の本物
SG90の互換品


PWMについて
SG90などの一般的なサーボモーターは、PWMという方法で制御します。
PWMはパルス幅変調といい、電気のON / OFFを高速で切り替えて、信号を調節するしくみです。
サーボモーターでは50HzのPWM信号(1秒間に50回のパルス)を受けとり、パルスの長さによって回転する角度を決めます。50Hzのときは、1回のパルスの長さは20ms(0.02秒)で、そのうち信号が「ON」になっている時間の割合で動作する角度がきまります。
パルスの長さ・duty比・動く角度の関係はこんな感じです。
パルスの長さ | duty比 | 動く角度 |
---|---|---|
0.5ms | 2.5% | 0° |
1.45ms | 7.25% | 90° |
2.4ms | 12.0% | 180° |
この関係を式に表すと
duty比(%) = ( 角度 ÷ 180 ) × 9.5 + 2.5
このような式になります。
ラズピコのPWMはduty比を0(=0%)~65535(=100%)で設定するので、この式に角度を入れて計算した値を小数に直し、65535に書けると角度を指定できます。
回路


サーボモーター側 | Raspberry Pi Pico側 |
---|---|
GND(茶色の線) | GND |
VCC(赤色の線) | VBUS |
PMW(オレンジ色の線) | 15番ピン |
上の図のように配線します。
今回使用するサーボモーターは3.3V~6Vで動くので、3.3Vでも使用できます。
ですが5Vのほうが性能を発揮することができるので、ラズピコのVBUSピンから5Vを供給します。
プログラム
from machine import Pin, PWM
import time
servo = PWM(Pin(15))
servo.freq(50)
def move_servo(pwm, angle):
if not (0 <= angle <= 180):
raise ValueError("角度は0〜180°の範囲で指定してください")
duty = int(65535 * ((angle / 180) * 9.5 + 2.5) / 100)
pwm.duty_u16(duty)
while True:
move_servo(servo, 0)
time.sleep(1)
move_servo(servo, 90)
time.sleep(1)
move_servo(servo, 180)
time.sleep(1)
プログラムはこのようになります。
各部分を解説していきましょう。
from machine import Pin, PWM
import time
この部分では、ラズピコのピンとPWMの機能を使うためにmachineモジュールからPinとPWMを読み込んでいます。
また、時間を使った制御をするためにtimeモジュールを読み込んでいます。
servo = PWM(Pin(15))
servo.freq(50)
最初の行では、ラズピコの15番ピンをPWMで使用する設定をして、servoという名前をつけています。
次の行では、servoのPWMの周波数を50Hzに設定しています。
def move_servo(pwm, angle):
if not (0 <= angle <= 180):
raise ValueError("角度は0〜180°の範囲で指定してください")
duty = int(65535 * ((angle / 180) * 9.5 + 2.5) / 100)
pwm.duty_u16(duty)
この部分では、サーボモーターを動かす関数を作成しています。
関数とは、処理を一つにまとめたものです。
関数の中身を解説します。
まず、def move_servo(pwm, angle):
では、move_servo(pwm, angle)
という関数を作成し、
pwm
→ どのピンのPWMを使うかangle
→ サーボモーターを何度に動かすか
をそれぞれ指定するようにします
例えば、pwm
に先ほどのservo
を、angle
に90
を指定すると、中のコードのpwm
とangle
がそれぞれservo
と90
に置き換わるイメージです。
次に、if not (0 <= angle <= 180):
では、if文を使って角度が不正な値にならないようにします。
if文は指定した条件を満たしたときにプログラムを実行する構文です。
今回は、条件がanlge
の値が0~180ではないとなっています。
この条件を満たしたときにraise ValueError("角度は0〜180°の範囲で指定してください")
というコードが実行されます。
これは、角度は0〜180°の範囲で指定してくださいというエラーを出すものです。
こうすることで、角度を200°のような値に設定してもエラーが出てプログラムを止めることができます。



わかりやすいエラーが出てくれれば、プログラムが動かない原因を特定しやすいですね。
duty = int(65535 * ((angle / 180) * 9.5 + 2.5) / 100)
この部分は先ほど紹介した角度からduty比を計算する式です。
duty比は整数値で指定する必要があるため、int()
を使って小数を整数に変換しています。
最後にpwm.duty_u16(duty)
で先ほど計算したduty比を指定します。
while True:
move_servo(servo, 0)
time.sleep(1)
move_servo(servo, 90)
time.sleep(1)
move_servo(servo, 180)
time.sleep(1)
最後に、この部分で実際にサーボモーターを動かします。
先に作ったmove_servo関数に使うPWM(今回はservo)と動かす角度を入れると、サーボモーターが動きます。
while True:
で中のプログラムを無限に繰り返します。いわゆる「無限ループ」というものですね。
今回、ループの中身は0°→1秒待つ→90°→1秒待つ→180°→1秒待つ→0°→…のような動作を繰り返すようになっています。
まとめ
サーボモーターは、特定の角度に正確に動かせる便利なモーターで、ロボットの関節やラジコン、カメラの角度調整など、さまざまな場面で使われています。
この記事では、サーボモーターの基本的な特徴や使い道を紹介し、Raspberry Pi Picoを使って実際に動かす方法を解説しました。PWM信号を使った角度制御の仕組みや、MicroPythonでのプログラムも紹介したので、ぜひ試してみてください!
電子工作やプログラミングの学習にもぴったりなので、サーボモーターを活用して、ぜひいろんな装置を作ってみてください!