<前の記事 : 次の記事>
サーボを回す
前の記事ではステッピングモータを回したが、今回は定番サーボSG90を回してみた。
最初は電源をrp2040-zeroからUSB経由で取っていたのだが、ボードが暴走して煙が出たw。サーボ電源はボードから取っちゃダメぜったい。PWMのピーク電圧は3.3V、サーボ電源は5Vでも問題なく動いたが(当たり前だけど)外部電源のGNDとボードのGNDは共通化しないとダメだ(繋がないと電源を入れただけでガチャガチャ動き出した!)。
スクリプトは単純
データシートを参照するとパルスを送れば対応する角度まで動くみたいなことが書いてある。だが、そもそも配線の色はどう見ても「黄色、オレンジ、茶色」なんだが、データシートには「Orange, Red, Brown」とある。色覚異常か?
50Hz(20ms)のPWMでパルス幅が0.5msから2.4msなんだから2.5%から12%の狭い幅で制御されるらしい。角度分解能は頑張っても1度以上らしいし、速度の制御はやりにくい。ゆっくり回したい場合は位置指定をちょっとずつ送るような形になる。
PWMの1周期を0-65535とすると1638から7864までになる。これを順に送ってやればゆっくり回せる。
from machine import Pin, PWM
import time
freq=50
dt=1/freq
servo = PWM(Pin(0))
servo.freq(freq)
min_u16=int((0.0005*freq)*65535)
max_u16=int((0.0024*freq)*65535)
skip=10
while True:
for i in range(min_u16,max_u16-1,skip):
servo.duty_u16(i)
time.sleep(dt)
for i in range(max_u16,min_u16-1,-skip):
servo.duty_u16(i)
time.sleep(dt)
角度精度って悪そう
0°のパルス幅を0.5ms、180°を2.4msと定義しても実際にその角度にはならない。なるべく正確にするには補正というかキャリビュレーションを行う必要があるが、角度分解能はどうやっても1°程度になるらしいから、あまり頑張っても意味はないかもそれない。90°ずつビュっビュっと回すサンプルは以下のようになる。
しかしデューティを設定する関数がduty_u16とduty_nsの二つしかないのか。。。
from machine import Pin, PWM
import time
servo = PWM(Pin(0))
servo.freq(50)
def set_angle(angle):
min_ns = 500_000
max_ns = 2_400_000
pulse_ns = int(min_ns + (angle / 180) * (max_ns - min_ns))
servo.duty_ns(pulse_ns)
while True:
set_angle(0)
time.sleep(1)
set_angle(90)
time.sleep(1)
set_angle(180)
time.sleep(1)
set_angle(90)
time.sleep(1)
何に使おうかな
角度制御なので滑らかに回そうとしてもカクカクするし、0°から180°程度までしか回せない。しかし何に使おうかな。。。
<前の記事 : 次の記事>
投稿者の人気記事

-
akira.kei
さんが
前の木曜日の11:24
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の木曜日の12:12
に
編集
をしました。
-
akira.kei
さんが
前の木曜日の12:20
に
編集
をしました。
ログインしてコメントを投稿する