Last active
August 31, 2017 07:19
レゴカーコントローラーの抜粋(サーボモータ)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class NewServoMotor: | |
''' | |
サーボモータを制御するクラス | |
少しだけ仕組みを理解した上で、かいてみる | |
SG5010、SG90のサーボモータに対応している。 | |
具体的には以下の仕様に依存している。 | |
制御パルス:0.5ms〜2.4ms | |
PWMサイクル:20ms | |
''' | |
#制御パルス、PWMサイクル、pwmWrite関数の仕様により求められるduty比 | |
MIN_DUTY = 26; #-90度 | |
MAX_DUTY = 123; # 90度 | |
MID_DUTY = MAX_DUTY - MIN_DUTY # 0度 | |
#サーボモータを曲げる角度を定義しておく。 | |
# 大胆に曲げたい場合は、この数字を大きくしよう。最大90度かな。 | |
# 細かく制御したい場合は、この数字を小さくしよう。最小1度かな。 | |
ANGLE_BEND = 10; | |
#ANGLE_BENDが全体(180度)に対して占める割合 | |
RATIO_OF_ANGLE_BEND = int( 180 / ANGLE_BEND) | |
#ANGLE_BENDを実現するためduty比 | |
ANGLE_BEND_DUTY = int( (MAX_DUTY - MIN_DUTY) / RATIO_OF_ANGLE_BEND) | |
#もしduty比が1未満になっちゃったらduty比1としよう。 | |
if ANGLE_BEND_DUTY == 0 : ANGLE_BEND_DUTY = 1 | |
def __init__(self, servo_motor_pin1): | |
self.motor_pin1 = servo_motor_pin1 | |
#ピンの割り当て | |
pi.pinMode( self.motor_pin1, pi.GPIO.PWM_OUTPUT ) | |
#duty比を変更すると周波数がかわってしまうので、固定するための設定、あまりわかってない。 | |
pi.pwmSetMode( pi.GPIO.PWM_MODE_MS ) | |
#周波数を50Hzにすると、18750/周波数=375 あまりわかってない。 | |
pi.pwmSetClock(375) | |
#起動時にタイヤをまっすぐにしとく | |
self.dutyState = NewServoMotor.MID_DUTY; | |
pi.pwmWrite(self.motor_pin1,self.dutyState); | |
def minusRotation(self): | |
''' | |
マイナス側にサーボモータを回転させる。 | |
曲がる角度は、クラス変数 ANGLE_BENDで指定した角度。 | |
:return: | |
''' | |
self.dutyState -= NewServoMotor.ANGLE_BEND_DUTY; | |
print(NewServoMotor.ANGLE_BEND_DUTY) | |
print(self.dutyState) | |
#限界(-90度)を超える場合は、-90度とする | |
if(self.dutyState < NewServoMotor.MIN_DUTY): | |
self.dutyState = NewServoMotor.MIN_DUTY | |
pi.pwmWrite(self.motor_pin1,self.dutyState); | |
def plusRotation(self): | |
''' | |
プラス側にサーボモータを回転させる。 | |
minusRotationと同様。 | |
:return: | |
''' | |
self.dutyState += NewServoMotor.ANGLE_BEND_DUTY; | |
print(self.dutyState) | |
#限界(90度)を超える場合は、90度とする | |
if(self.dutyState > NewServoMotor.MAX_DUTY): | |
self.dutyState = NewServoMotor.MAX_DUTY | |
pi.pwmWrite(self.motor_pin1,self.dutyState); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment