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

こんな感じで構成
・GDP Micro PC (コンソール USB – TTLで接続)
・PCA9685 16チャンネル 12-ビット PWM Servo モーター ドライバー IIC モジュール
・Raspberry Pi 2B (なんか、値段が高くなった気がする)
・電池
今回は、PCA9685のライブラリ(python)を、使用してサクっと作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#!/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() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#!/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は、公式のを使用しています。