Raspberry Pi Pico - SG90サーボ

2/12/2023

Pico Raspberry Pi

t f B! P L

サーボモータ『SG90』をPicoから動作させる。PWMで-90°⇒0°⇒+90°に相当するパルス幅を指示して、サーボモータがその通りに動くことを確認。とりあえず動かすまでは問題ないが、同じように指令を出してもモータの機差があるのか動作がズレることがあるのがちょっと納得いかない。何かものを作った際には気になりそう。

整理せずにどんどん部品を追加していったので、混とんとした状態に。
写真では配線を追いきれない…

使用した機材等

配線

SG90は手持ちで3個持っていたので、ひとまず全部繋げてみる。
モータ駆動となるとPCのUSB給電では心もとないので、別電源(乾電池)を接続


サーボモータはDC電源の(+)と(-)、PWMの3本を使用し、DC電源の基準電圧とPWMで入れた指令電圧の差をなくす方向にモータが動くような仕組みになっている。下記のデータシートに記載があるように、パルス幅に応じて動作する位置が決まる。

SG90  データシート (秋月電子通商より)
https://akizukidenshi.com/catalog/g/gM-08761/

コード

  • GPIO
    • GP6, GP7, GP8をPWMに割り当て
  • PWM周波数
    • 50Hz /20ms
  • max_duty
    • 16bit = 65,536
  • 指令位置に対応したDuty比 (データシートより)
    • -90°: 0.5ms/20ms = 2.5%
    •    0°: 1.45ms/20ms = 7.25%
    • +90°:  2.4ms/20ms = 12.0%

from machine import Pin, PWM
import utime
servo1 = PWM(Pin(6))
servo1.freq(50)
servo2 = PWM(Pin(7))
servo2.freq(50)
servo3 = PWM(Pin(8))
servo3.freq(50)
max_duty = 65536
pos_m90 = 0.025
pos_0 = 0.0725
pos_p90 = 0.12

while True:
    servo1.duty_u16(int(max_duty*pos_m90))
    servo2.duty_u16(int(max_duty*pos_m90))
    servo3.duty_u16(int(max_duty*pos_m90))
    print('Moved to -90deg')
    utime.sleep(1)
    servo1.duty_u16(int(max_duty*pos_0))
    servo2.duty_u16(int(max_duty*pos_0))
    servo3.duty_u16(int(max_duty*pos_0))
    print('Moved to Mid Position')
    utime.sleep(1)
    servo1.duty_u16(int(max_duty*pos_p90))
    servo2.duty_u16(int(max_duty*pos_p90))
    servo3.duty_u16(int(max_duty*pos_p90))
    print('Moved to +90deg')

結果

過去にRaspberry Pi 3Bで試した際は、理由は覚えていないが思いのほかうまくいかなかった記憶があるが、今回は悩むことはほとんどなく進められた。


参考にしたサイト


このブログを検索

ラベル

Outdoor (18) 3D Printer (12) Raspberry Pi (10) Learning (9) Movie (7) Pico (6) FreeCAD (5) Game (5) Blog (4) MSFS (4) Python (4) Gadget (1) Unity (1)

ブログ アーカイブ

About

思い付きで始めた様々なコトをやった感想やメモ、Web上で見つけた後々役立ちそうなコトなどをまとめてます。 万人の役に立つコンテンツではなく自分用メモ的な内容ですが、何かの役に立てば幸いです

人気の投稿

QooQ