0
1

More than 5 years have passed since last update.

らずぱいGPIOで動かすサーボについて

Last updated at Posted at 2018-01-11

今現状スイッチ2個使用して1軸のサーボを下記のコードを用いて動かしてますが、現実にはMeArmロボットというものを手動でうごかしたいので4軸すべて動かせるコードをわかるかたいれば教えてください。(もちろんのことですが、1軸に対して必ず90度作動するスイッチとー90度作動するスイッチの2個、計8個のスイッチ入力を使用します。またGPIOピン番号はどれをあてはめてもかまいません。変更はこちらで勝手にします。動かすときは必ず1軸だけしか動かしません。)

import RPi.GPIO as GPIO
from time import sleep

# ポート番号やサーボモーターの情報を指定
SV_PORT  = 14
SW1_PORT = 17
SW2_PORT = 18

SV_FREQ = 50 # 20ms(50Hz)
SV_DUTY_OFFSET = 0.025
SV_DUTY_RES = (2.4 - 0.5) / 20 / 180

# GPIOの設定
GPIO.setmode(GPIO.BCM)
GPIO.setup(SV_PORT , GPIO.OUT) # サーボモーターの設定
GPIO.setup([SW1_PORT , SW2_PORT],
    GPIO.IN,
    pull_up_down=GPIO.PUD_DOWN) # ボタンの設定

# PWMを利用する準備
servo = GPIO.PWM(SV_PORT, SV_FREQ)
servo.start(0)
sleep(0.3)

# サーボの角度を計算し変更する関数
def set_angle(angle):
    if angle < -130: angle = -130
    if angle >  60: angle =  60
    degree = (angle + 90)
    duty = (SV_DUTY_OFFSET + SV_DUTY_RES * degree) * 100
    print("angle=",angle,"duty=", int(duty))
    servo.ChangeFrequency(SV_FREQ)
    servo.ChangeDutyCycle(duty)

# ボタンに応じてサーボの角度を変える
angle = 0
set_angle(angle)
while True:
    try:
        # ボタンの状態を監視
        if GPIO.input(SW1_PORT) == GPIO.HIGH:
            angle -= 10
            set_angle(angle)
        if GPIO.input(SW2_PORT) == GPIO.HIGH:
            angle += 10
            set_angle(angle)
        sleep(0.1)
    except KeyboardInterrupt:
        break

GPIO.cleanup()
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1