2つのボリュームで2つのサーボモーターを制御

2つのボリュームを使って2つのサーボモーターを制御します。

二つのボリューム(B型10kΩ)を指でつまんで回して別々のサーボモータを好きな角度に回せるようにします。

サーボモーター

 

■主な仕様
・PWMサイクル:20mS
・制御パルス:0.5ms~2.4ms
・制御角:±約90°(180°)
・配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]
・トルク:1.8kgf・cm
・動作速度:0.1秒/60度
・動作電圧:4.8V(~5V)
・温度範囲:0℃~55℃
・外形寸法:22.2×11.8x31mm
・重量:9g
 サーボモーターは、指示を出した通りに、位置/速度/回転力(トルク)などを正確に実現するサーボ機構に使用されるモーターのことです。
サーボモータの角度制御は、PWM信号で行います。

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

 

可変抵抗器(ボリューム抵抗)とは機械的な位置の変化をアナログ電気信号に変換する電子部品で英語ではPotentiometer(ポテンショメータ)です。日本では、昔からオーディオ機器のボリューム調整に使われていたことからボリュームとも呼んでいます。

配線図

 

サーボモーターの電源を別にしてサーボモーターを安定して動かします。

実際の配線

 

左のUSBコネクタに5Vの電源(モバイルバッテリーやPC)につなぎます。

MicroPythonプログラム

from machine import Pin, PWM
import time
# pico w 本体のLEDを点灯します
led= machine.Pin('LED', machine.Pin.OUT)
led.on()

pwm = PWM(Pin(16))
pwm.freq(50)
pwm2 = PWM(Pin(17))
pwm2.freq(50)

sensor_adc = machine.ADC(0)
sensor2_adc = machine.ADC(1)

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))
    pwm2.duty_u16(servo_value(sensor2_adc.read_u16() * 180 / 65535))
PWMパルスを受け取ります。
pwm = PWM(Pin(16)) pwm.freq(50)  GP16ピンに接続
pwm2 = PWM(Pin(17)) pwm2.freq(50) GP17ピンに接続
ボリュームの電圧をアナログ値で読み取ります。
sensor_adc = machine.ADC(0)   ADC(0)ピンに接続
sensor2_adc = machine.ADC(1)   ADC(1)ピンに接続
pwm.duty_u16(servo_value(sensor_adc.read_u16() * 180 / 65535))
sensor_ adc.read_u16() でボリュームの電圧をアナログ値 0-65535 の範囲で読込みます。そこからサーボモーターが動く角度(0°〜180°)のpwmパルスを発生させます。
パルス幅とは

パルスの矩形波が上にのびた状態「1(ON)」のときの時間の長さ(矩形波の幅)によってサーボモータの位置が決まります。
1(ON)のときの時間の長さで、どの角度にするかの指示します。
SG90の制御パルスは0.5ms~2.4msなので
角度を0°(-90°)にしたければ、ONのときのパルス幅を0.5ms
角度を90°(0°)にしたければ、ONのときのパルス幅を1.45ms
角度を180°(+90°)にしたければ、ONのときのパルス幅を2.4msに設定します。
その設定はduty_u16関数でDuty比で設定します。
Duty(デューティ)比はPWMの周期(20ms)とON時間の比率です。単位は%です。
0°はON時間が0.5msで0.5ms/20ms=0.025:デューティ比2.5%、
180°はON時間が2.4msで2.4ms/20ms=0.12:デューティ比12%
画像ではDuty=12%になっているので180°回転させた状態です。
def servo_value(degree):
return int((degree * 9.5 / 180 + 2.5) * 65535 / 100)
この式でdegree(角度)からPWMのデューティ比に変換してデューティ比からRaspberry Pi Picoが理解できる数値に変換しています。
(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%
* 65535 / 100
デューティ比からRaspberry Pi Picoが理解できる数値に変換する計算式の部分
PicoはDuty比を16ビット( 0~65536)で表します。そのためデューティ比0%は0を、デューティ比100%は65535になります。そのためDuty比を65535を100で割ってセットすることになります。
0°はデューティ比2.5%なので2.5*65535/100=1638.375ですがintがついているので1638になります。
180°はint(12*65535/100)=7864で7864です

実行

2つのボリューム抵抗のつまみを回すとそれぞれのサーボモーターが0°〜180°まで回ります。