4脚ロボットの足動かすところまで /Raspberry pi pico /MS18

先日から始めている4脚ロボットの部品が大体そろったので足を動かすところまで持ってきました。もう少しで歩くのくらいまでできそうです。

回路図

まずは試作というところで簡易的に回路図を描きました。

電源として2つのDCDC(Raspberry pi pico W用とサーボモータ用)を用意する予定ですが、

今はUSBバスパワーと安定化電源とでそれぞれを動かしています。

サーボからのノイズが気になるので電源は別々にしようと思ってますが、ある程度大きめの電解コンデンサ入れておけば必要もなさそうではあるので、一つでOKそうならそうしたいです。

RMTは赤外線リモコン用の受信機。

あとまだつけてないですが距離センサ(HC-SR04)を搭載予定。

試作段階ということでユニバーサル基板で作ってます。

Program

from machine import Pin, PWM
import time

SV_FREQ = 50.0 #Hz
MAX_DUTY = 65535.0 #uint16 max 
MIN_SV_PULSE = 0.5 #ms
MAX_SV_PULSE = 2.5 #ms

def get_pulse_width(angle):
    pulse_ms = MIN_SV_PULSE + (MAX_SV_PULSE - MIN_SV_PULSE)*angle/180.0
    x = (int)(MAX_DUTY * (pulse_ms*SV_FREQ/1000.0))
    return x

correction = [0, 0, 10, 0, 0, 0, -10, -5] #ニュートラル位置にするための補正値
servo = []

servo.append(PWM(Pin(2))) #Front Right Leg
servo.append(PWM(Pin(3))) #Front Right Shoulder
servo.append(PWM(Pin(4))) #Front Left Leg
servo.append(PWM(Pin(5))) #Front Left Shoulder
servo.append(PWM(Pin(6))) #Rear Right Leg
servo.append(PWM(Pin(7))) #Rear Right Shoulder
servo.append(PWM(Pin(8))) #Rear Left Leg
servo.append(PWM(Pin(9))) #Rear Left Shoulder

snum = len(servo)

# 全サーボをニュートラル位置(90度)に持っていく
for i in range(snum):
    servo[i].freq(int(SV_FREQ))
    servo[i].duty_u16(get_pulse_width(90 + correction[i]))

time.sleep(0.5)
# 全サーボを60度と120度で交互に動かす
while True:
    for i in range(snum):
        servo[i].duty_u16(get_pulse_width(60))
    
    time.sleep(0.5)
    for i in range(snum):
        servo[i].duty_u16(get_pulse_width(120))

    time.sleep(0.5)

Miuzei MS18というサーボモータを使っています。

SG90よりも安いので飛びついてしまったのですが、マニュアルらしいものがパッケージにしかなく、加えてPWM周期が書いてなかったのでどうしたものかと思いました。

SG90の模倣品(言い方がよくないか)のようではあるので、50Hzで問題なく動いてはくれました。

次は歩行動作まで実現したいです。

Bitly

コメント

タイトルとURLをコピーしました