今回は、仕事やら入院やら仕事やらでしばらく放置していた Raspberry-Piのサーボモータのこと

こんな感じで構成

GDP Micro PC (コンソール USB – TTLで接続)

PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール

マイクロサーボ SG90

SG5010 デジタルサーボ

Raspberry Pi 2B (なんか、値段が高くなった気がする)

・電池

今回は、PCA9685のライブラリ(python)を、使用してサクっと作成

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import Adafruit_PCA9685
import time

#SG92Rをコントロールするためのクラス
class SG90_92R_Class:
    def __init__(self, Channel, ZeroOffset):
        self.mChannel = Channel
        self.m_ZeroOffset = ZeroOffset

        #Adafruit_PCA9685の初期化
       #address:PCA9685のI2C Channel 0x40
        self.mPwm = Adafruit_PCA9685.PCA9685(address=0x40) 
        self.mPwm.set_pwm_freq(60) 

    """位置セット"""
    def SetPos(self,pos):
        pulse = (650-150)*pos/180+150+self.m_ZeroOffset
        self.mPwm.set_pwm(self.mChannel, 0, pulse)

    def Cleanup(self):
        #サーボを10degにセットしてから、インプットモードにしておく
        self.SetPos(90)
        time.sleep(1)

if __name__ == '__main__':
    Servo = SG90_92R_Class(Channel=0, ZeroOffset=-10)
    try:
        while True:
            Servo.SetPos(0)
            time.sleep(1)
            Servo.SetPos(90)
            time.sleep(1)
    except KeyboardInterrupt  :         #Ctl+C(signal 2)割り込みで、ループを終了
        print("\nCtl+C")
    except Exception as e:
        print(str(e))
    finally:
        Servo.Cleanup()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import Adafruit_PCA9685
import time

#SG92Rをコントロールするためのクラス
class SG90_92R_Class:
    def __init__(self, Channel, ZeroOffset):
        self.mChannel = Channel
        self.m_ZeroOffset = ZeroOffset

        #Adafruit_PCA9685の初期化
        #address:PCA9685のI2C Channel 0x40
        self.mPwm = Adafruit_PCA9685.PCA9685(address=0x40) 
        self.mPwm.set_pwm_freq(60)

    """位置セット"""
    def SetPos(self,pos):
        #pulse = 150~650 : 0 ~ 180deg
        pulse = (650-150)*pos/180+150+self.m_ZeroOffset
        self.mPwm.set_pwm(self.mChannel, 0, pulse)

    def Cleanup(self):
        #サーボを10degにセットしてから、インプットモードにしておく
        self.SetPos(90)
        time.sleep(1)

if __name__ == '__main__':
    Servo = SG90_92R_Class(Channel=1, ZeroOffset=-10)
    try:
        while True:
            Servo.SetPos(0)
            time.sleep(1)
            Servo.SetPos(90)
            time.sleep(1)
    except KeyboardInterrupt  :         #Ctl+C(signal 2)割り込みで、ループを終了
        print("\nCtl+C")
    except Exception as e:
        print(str(e))
    finally:
        Servo.Cleanup()

実際に動かしみました。

チャネルの番号かえただけなのですが、同じクラス(SG90_92R_Class)で動いたよ。

ちなみに、Raspberry Pi OSは、公式のを使用しています。