【初心者OK】Raspberry Pi PicoでサーボモーターをPWMで制御する方法!

  • URLをコピーしました!

皆さんこんにちは。yossyです。

最近、

yossy

ラズピコを使ってロボットを作りたいな~

と考えています。

ロボットを作るときに使う部品の一つに、サーボモーターがあります。

サーボモーターは、ロボットや電子工作などで広く使われる重要な部品のひとつで、特定の角度に正確に動かせるため、ロボットの関節やカメラの向きを調整する装置など、さまざまな用途で活躍しています。

この記事では、サーボモーターの基本的な仕組みや特徴、実際にRaspberry Pi Picoを使って制御する方法について詳しく解説します。

MicroPythonを使ったプログラムの例も紹介するので、初心者の方でも簡単に試すことができます!
サーボモーターを使った電子工作に興味がある方は、ぜひ最後まで読んでみてください。

目次

サーボモーターとは

サーボモーターは、モーター、制御回路、ギアボックスが一つになったパーツで、特定の角度に回転させることができます。

サーボモーターの特徴

  • 角度制御が可能:一般的なサーボモーターは 0°〜180° の範囲で回転します。
  • PWM信号で制御:マイコンから送られるPWM信号によって動作します。
  • トルクが強い:小型でも比較的強い力で動かせます。

サーボモーターの使い道

サーボモーターは、決められた角度に動かせるモーターです。
そのため、さまざまなものを動かすのに使われています。

いくつか例を紹介します。

  • ロボットの腕や足を動かす
    サーボモーターはロボットの関節部分に使われることが多く、腕を動かしたり、足を前後に動かしたりできます。
  • ラジコンカーやドローンの動きを制御する
    ラジコンカーのハンドルを左右に動かしたり、ドローンのカメラの角度を調整したりするのにも使われます。小さくてもパワーがあるので、正確に動かすことができます。
  • カメラの角度を変える
    自動で動く防犯カメラや、ライブ配信で使うカメラの向きを変える装置にも使われています。

このように、サーボモーターはものを動かす色々な場面で使われています。

次の章では、実際にサーボモーターを動かす方法を詳しく解説していきます!

サーボモーターの使い方

それでは、サーボモーターを使う方法について解説します。

必要なものは次の通りです。

  • サーボモーター(今回はSG90を使用します)
  • ジャンパーワイヤー
  • ブレッドボード

言語はMicroPythonを使用します。

まだRaspberry Pi Picoのセットアップが完了していない場合は、こちらの記事をご覧ください!

サーボモーターを購入する際の注意

サーボモーターはAmazonなどに有名な製品の互換品が出回っています。

互換品は安価ですが、本物に比べて精度や仕様などの品質が悪い場合があるので、購入する際は気をつけましょう。

yossy

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

SG90の本物

¥1,175 (2025/02/15 11:32時点 | Amazon調べ)

SG90の互換品

PWMについて

SG90などの一般的なサーボモーターは、PWMという方法で制御します。
PWMはパルス幅変調といい、電気のON / OFFを高速で切り替えて、信号を調節するしくみです。

サーボモーターでは50HzのPWM信号(1秒間に50回のパルス)を受けとり、パルスの長さによって回転する角度を決めます。50Hzのときは、1回のパルスの長さは20ms(0.02秒)で、そのうち信号が「ON」になっている時間の割合で動作する角度がきまります。

パルスのうち信号がオンになっている時間の割合のことをduty比(デューティー比)といいます!

パルスの長さ・duty比・動く角度の関係はこんな感じです。

パルスの長さduty比動く角度
0.5ms2.5%
1.45ms7.25%90°
2.4ms12.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を、angle90を指定すると、中のコードのpwmangleがそれぞれservo90に置き換わるイメージです。

次に、if not (0 <= angle <= 180): では、if文を使って角度が不正な値にならないようにします。

if文は指定した条件を満たしたときにプログラムを実行する構文です。

今回は、条件がanlgeの値が0~180ではないとなっています。
この条件を満たしたときにraise ValueError("角度は0〜180°の範囲で指定してください")というコードが実行されます。

これは、角度は0〜180°の範囲で指定してくださいというエラーを出すものです。
こうすることで、角度を200°のような値に設定してもエラーが出てプログラムを止めることができます。

yossy

わかりやすいエラーが出てくれれば、プログラムが動かない原因を特定しやすいですね。

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でのプログラムも紹介したので、ぜひ試してみてください!

電子工作やプログラミングの学習にもぴったりなので、サーボモーターを活用して、ぜひいろんな装置を作ってみてください!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次