20ms周期のパルス、つまり50Hzで制御し、 制御パルスは0.5ms~2.4ms

こんにちは、MIDORIです。
今回はボリュームでサーボモータを好きな角度に回す実験をやってみます。
サーボモータを使えるようになると、ロボットを作れるようになります。
お世話になっている砂川先生は、
なんと23個のサーボモータを使ったロボットを作ったりしています。すごすぎる…。

※動画 動くサーボモータ

■ぐるぐる回らない!角度を決めて回すサーボモータ

●0~180°回るサーボモータ

サーボモータって何?ということですが、
扇風機の羽を回すような360度ぐるぐる回る、
動力源としてのモータではなく、制御機構を持っていて
例えば10°、45°、90°といった任意の角度だけ回転して、
正確な位置でピタリと止まることができる特徴を
持っているモータが、サーボモータです。

任意の角度に動くサーボモータ

世の中ではいろんなサーボモータが市販されていますが、
今回は、SG90という、ラジコンやロボットに使われる
ホビー用の小型サーボモータを使って説明します。
日本の電子部品屋である秋月電子でも売っていたので、買いました。
このSG90の仕様を秋月電子のウェブサイトで確認してみましょう。
https://akizukidenshi.com/catalog/g/gM-08761/

0~180°回転する 図1 0~180°回転する

●PWMで角度を決める

サーボモータの角度制御は、PWM信号で行います。
PWMについては、別の動画で詳しく説明していますので、参考にしてみてください。

SG90の仕様書では、PWMサイクル20msと書いてあります。
20ms周期のパルス、つまり50Hzで制御し、
制御パルスは0.5ms~2.4msとありますので、
そのパルス幅の変化で角度が決まります。
制御角は±約90°、つまり0°~180°になります。
20ms周期のパルス、つまり50Hzで制御し、 制御パルスは0.5ms~2.4ms

トルクは、1.8kgf・cm(キログラム・センチメートル)となっていて、
簡単にいうと1.8kgのものを持ち上げられると思ってください。力持ちですね。

もう少し詳しく説明します。
仕様のとおり、このサーボモータには50Hzのパルス入力信号を入れると動きます。
そのパルス波形が1(ON)のときの時間の長さによって、
サーボモータの位置が決まります。
言い換えると、1(ON)のときの時間の長さで、
どの角度にするかの指示ができるのです。
サーボモータに入力するパルス信号

角度を0°(-90°)にしたければ、1のときのパルス幅を0.5msに、
角度を90°(0°)にしたければ、1のときのパルス幅を1.45msに、
角度を180°(+90°)にしたければ、1のときのパルス幅を2.4msに設定します。

パルス波形が1(ON)のときの時間は、0ms~20msの範囲で設定できます。
このサーボモータSG90は、0.5ms~2.4msのパルス幅で動く仕様なので、
このいずれかの値に設定します。
つまり、これ以外のパルス値を入れても動かないし、
熱をもって熱くなっちゃうことがあるかもしれませんので気をつけてくださいね。

●プログラムに設定する入力値の考え方

PWMの周期とON時間の比率、言い換えるとパルス幅の比を
「デューティ比」と呼びます。単位は%です。
このデューティ比によってサーボモータに指示する角度(向く方向)を決めます。
0.5msはデューティ比2.5%、
2.4msはデューティ比12%です。

■実験①1秒ごとにサーボモータを-90°→0°→90°(ループする)

それではサーボモータを動かしてみましょう。
準備するものは下記のものです。

道具①Raspberry Pi Pico

道具②ブレッドボード

道具③USBケーブル

道具④ジャンパー線

道具⑤サーボモータSG90

道具⑥ボリューム(B型10kΩ)

道具⑦テスター(もしあればでOK)

●回路

※回路図

ボリュームはまだ使わずに、回るかの確認実験をしてみましょう。
まず回路図を組み立てます。
はじめにRaspberry Pi Picoのサーボモータを接続します。
GNDにサーボモータの茶色の線、
VBUSにサーボモータの赤い線、
GPIO0にサーボモータのオレンジ色の線を接続しましょう。

●プログラム

————————————————————-

from machine import Pin, PWM
import utime

pwm = PWM(Pin(0))

pwm.freq(50)

sensor_adc = machine.ADC(0)

def servo_value(degree):
    return int((degree * 9.5 / 180 + 2.5) * 65535 / 100)

while True:
    #reading = sensor_adc.read_u16()
    pwm.duty_u16(servo_value(0))
    print(servo_value(0))
    utime.sleep(1)
    pwm.duty_u16(servo_value(90))
    print(servo_value(90))
    utime.sleep(1)
    pwm.duty_u16(servo_value(180))
    print(servo_value(180))
    utime.sleep(1)

————————————————————-

プログラムは、Python専用開発環境Thonnyに書き込みます。
Thonnyを立ち上げたら、上の枠に実験①のプログラムを張り付けてください。
貼り付けたら実行ボタンを押します。
すると下のshell枠に、PWMにセットする値が表示され、
その隣の枠に値に対応したグラフが表示されます。
グラフの表示がない場合は、
Thonnuyのメニュータグの[表示]から[Plotter]をクリックすると現れます。

●ちょっとした改造を試す

pwm.duty_u16(servo_value(0))の0が角度を表します。
0度、90度、180度に1秒ごとに変化します。
数字を0~180の間で変えてみて、角度を変える実験を試してみてください。

●プログラムの解説

▲角度からPWMのデューティ比に変換する計算
————————————————————-

def servo_value(degree):
    return int((degree * 9.5 / 180 + 2.5) * 65535 / 100)

————————————————————-
degreeは引数で、何°という角度のことです。
(degree * 9.5 / 180 + 2.5)の式は、
角度からPWMのデューティ比に変換する計算式です。
2.5~12%は、12%-2.5%=9.5%の幅があります。
9.5%の幅が180度なので、角度を9.5倍して180で割って、
それに2.5を足すことによってデューティ比が求まります。

0°*9.5%/180°+2.5%=2.5%
180°*9.5%/180°+2.5%=12%

0°~180°が2.5%~12%に変換されていますね。

*65535/100の部分で、
デューティ比からRaspberry Pi PicoのPWMにセットする値を計算しています。
デューティ比0%は0を、デューティ比100%は65535をセットすることになります。

▲角度を変える表記
————————————————————-

    pwm.duty_u16(servo_value(0))

————————————————————-
この行は0°を入れているので、
PWMにデューティ比2.5%を表す1638を入れているということです。

▲1秒後の角度を設定する表記
————————————————————-

    print(servo_value(0))
    utime.sleep(1)
    pwm.duty_u16(servo_value(90))

————————————————————-
この部分は、1秒経ったあとに90°になるように設定しています。
ここの数字を変えることによって、0°にしたり180°にしたりしています。

■実験②ボリュームを使って好きな角度に回す

それでは、ボリューム(B型10kΩ)を指でつまんで回して、
サーボモータを好きな角度に回す実験をしてみましょう。
プログラムは、関数を使って角度を決めます。
Thonnyを立ち上げたら、上の枠に実験②のプログラムを張り付けてください。
貼り付けたら実行ボタンを押します。
そしてボリュームのつまみを回してみると、
回した分だけサーボモータが回るはずです。
回りましたか?
————————————————————-

from machine import Pin, PWM

pwm = PWM(Pin(0))
pwm.freq(50)

sensor_adc = machine.ADC(0)

def servo_value(degree):
    return int((degree * 9.5 / 180 + 2.5) * 65535 / 100)

while True:
    pwm.duty_u16(servo_value(sensor_adc.read_u16() * 180 / 65535))

————————————————————-

●うまく動かないときは原因究明!テスターで電圧を測る

実は実験②をおこなったら、私ははじめうまく動きませんでした。
そこで電圧や抵抗値などを測れる測定器「テスター」(アナログ)で、
どこに原因があるのか測ってみました。

今回はちゃんと電圧が出力されているのかを測定するため、
レンジをDCVの10Vに合わせて、
黒いリード棒をGND、赤いリード棒をGPIO26に接続します。
うまく固定できなかったので、マスキングテープでぐるぐる巻きにして固定しました。

ボリュームをじわじわ回していくと、
いきなりテスターの針が大きく動くところがあります。
回し切ると、ちゃんと3.3Vで針がとまりました。
電圧はちゃんと出ていることが確認できました。
ちゃんと動かないなと思っていた原因は、
回していくとあるところでいきなり電圧が出力されるというボリュームの特性でした。
この特性を理解していれば、どんな感じで回したらサーボモータが動くかわかるので、
回し方に注意すればいいだけです。
もしくは新しいボリュームを買ってくるか…。

* * *
余談ですが、
このような針が動くアナログテスターは、
日本では三和電気計器株式会社しか作っていないそうです。
以前取材にお邪魔したのですが、
この針を校正することができるのは長年お勤めの女性の方のお二人のみとのことでした。
鋭い眼光で校正するお姿は忘れられません。

それでは、またね!

コメントを残す

メールアドレスが公開されることはありません。