サーボモータの制御

サーボモーター はPWM制御を用いて、任意の角度まで回転させることができるモーターで、ロボットアームなど精密な動作が必要な時に使われます。ロボットアームは複数のサーボモーターを組み合わせることにより、自由度が増え、複雑な動きをすることが可能となります。

ロボットの動きが複雑になるほど、必要なサーボモーターの数が5個、10個と増えてきますが、1つのサーボモーターに対し1つのPWMピンで制御するのは限界があります。

PCA9685のすすめ

そこで、i2c通信とPCA9685という複数のPWM制御ができるコントローラを用いて、2つのピンを用いるだけで数十個のサーボモータ を制御する方法を解説します。

購入はこちらから

 

i2c通信とはSCLとSDAの2つのピンだけで複数のモジュールと通信ができるインターフェースで、モジュールを増やしていく際にピンの数を増やさないで済ませられるメリットがあります。

Raspberry Piでのi2c通信有効化については、下記記事をご参考ください。

i2c通信とは i2c通信とは、フィリップス社が提唱したシリアル通信のインターフェースで、SDAとSCLの2つのピンだけで、複数のモジュールとの通信が可能になっています。 i2cを使うメリットとしては下記が挙げられます。 2つの汎用ピンだけを用いて、アドレスが余っている限り、デバイスやセンサを無数に接続することが可能 マイコンに繋がっているデバイスやセンサのうち1つがクラッシュしても他のデバイスやセンサと通信を継続することが可能 センサから値を取得したり、マイコン間での通信をしたり、デバイスへの命令を送ったりすることが2つのピンだけで完結するという非常に素晴らしい通信方式です。 Raspberry Piでi2c通信を有効化する Ra

 

PCA9685の各部位の説明

上図の下側に0から15の番号がついており、これらがPWM制御用の端子となっていて、サーボモータを繋いでいく形となります。

各接続部の用途は下記になります。

  • SCL/SDA: i2c通信用のピンです。Raspberry Pi側のSCL/SDAに繋ぎましょう。
  • VCC/GND: Raspberry Piの電源とGNDに繋ぎましょう。
  • PWM/V+/GND: 16対あるPWM制御のピンです。ピンの隣に0〜15の数値が記載されており、これがチャンネルの番号になります。サーボモーターの駆動電圧が5Vの場合は、このV+/GNDに繋ぎ、それ以上の電圧の場合は、別途駆動電源を用意すると良いかと思います。

PCA9685とサーボモータ ーの接続

上記はサーボモーターを2つ繋いだ時の回路の例になります。駆動電圧は5Vを例としているので、PWMピンの隣にあるV+/GNDをサーボモーターの駆動電圧として用いています。

PCA9685の制御コード

Adafruit社が下記レポジトリにて公開しているpythonのライブラリを使いましょう。

https://github.com/adafruit/Adafruit_Python_PCA9685

README.mdに従い、インストール

sudo apt-get install git build-essential python-dev
cd ~
git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
cd Adafruit_Python_PCA9685
sudo python setup.py install

 

i2c通信時のアドレスは下記コマンドで確認できます。調べた際は0x40になりましたので、0x40をコード上で指定していきます。

sudo i2cdetect -y 1

 

servo_motor.py

import Adafruit_PCA9685

class ServoMotor:

    def __init__(self, Channel, ZeroOffset):
        self.mChannel = Channel
        self.m_ZeroOffset = ZeroOffset

        #initialize PCA9685
        self.mPwm = Adafruit_PCA9685.PCA9685(address=0x40) 
        self.mPwm.set_pwm_freq(60) # 60Hz

    def setAngle(self, angle):
        pulse = int((650-150)*angle/180+150+self.m_ZeroOffset)
        self.mPwm.set_pwm(self.mChannel, 0, pulse)

    def cleanup(self):
        self.setAngle(10)

main.py

from servo_motor import ServoMotor

servoMotors = []

servoMotors.append(ServoMotor(Channel=0, ZeroOffset=0))
servoMotors.append(ServoMotor(Channel=1, ZeroOffset=0))

servoMotors[0].setAngle(60)
servoMotors[1].setAngle(100)

こちらは、サーボモーターを2つ接続し、それぞれの角度を60 度と100度に回転させるというコードになっています。

サーボモータ

Related Posts

VMWare FusionでUbuntu 18.04のディスク容量を上げる方法
VMWare FusionでUbuntu 18.04のディスク容量を上げる方法
概要 VMWare FusionでUbuntu 18.04の仮想ディスクを起動する際に、ハードディスクの容量を上げる方法について解説します。 手順 1. 仮想ディスクの電源をOFFにする 2. 設定ボタンを押して設定画面を開いた後に、...
Read More
超音波センサHC-SR04とArduinoで距離を測定する
超音波センサHC-SR04とArduinoで距離を測定する
概要 超音波センサHC-SR04は、超音波の反射時間を利用して非接触で距離を測定することができる距離センサです。このHC-SR04を使ってArduinoで距離を測定する方法についてコードのサンプルを交えて解説します。 超音波センサH...
Read More
Jetson TX2でスイッチボタンを押さずに電源を入れる
Jetson TX2でスイッチボタンを押さずに電源を入れる
概要 Jetson TX2の開発ボードは電源を入れる際、スイッチを長押ししないと電源がつきません。しかし、ロボットの中に組み込んだり、スイッチを直接押して起動することが難しい場合もあります。本記事では、そのような場合にスイッチを押さず...
Read More