RaspberryPi

Raspberry piで何かする サーボモータを動かす part2 複数のサーボーを動かす

準備する物(サーボと電池)

今回はサーボ モーター(SG90)を複数動かしていきます。前回の記事ではサーボ モータを一つ動かしたのですが、RaspberryPiと直接繋ぐ場合は1台ぐらいが限界です。理由としてはRaspberryPiで使う電力とサーボ モーターで使う電力を合わせると電源から供給される電力では足りないからです。解決策として以下の2つの物を準備します。

  1. PCA9685(サーボ ドライバー)
  2. 電池ボックス

サーボ ドライバーとは

サーボ ドライバーを説明するには長くなるので以下のサイトを参照してください。私はPCA9685を使っていきます。

https://www.fa.omron.co.jp/guide/technicalguide/14/186/index.html

実際に使用する時は下のような大まかな流れで使っていきます。

  1. RaspberryPiでコードを実行する
  2. ジャンパーピンで接続しているPCA9685に指令がいく
  3. PCA9685がPWM方式の信号をサーボモーターに送る
  4. サーボモータが動く

ちなみにPCA9685はこんな感じのやつです。

RaspberryPiでI2C(シリアル通信)の設定をする

Raspberry PiとPCA9685をジャンパーピンで繋ぐとそのまま直ぐに使えるという訳ではないです。接続するにはシリアル通信であるI2C(Inter-Integrated Cicuit)を使います。RaspberryPiでは設定の変更とライブラリをインストールすれば使えるので、その流れを説明していきます。またI2Cについての詳しい説明は以下のサイトを参照してください。

http://www.lapis-semi.com/jp/common/miconlp/tips/2-17-i2c%E3%81%A8%E3%81%AF/

  1. RaspberryPiの設定画面でI2Cを有効にする
  2. I2Cのライブラリをインストールする

RaspberryPiの設定画面を開いてI2Cの設定を有効にします。流れとしては以下の画像のようになります。

$ sudo raspi-config

次にI2Cのライブラリをインストールしていきます。以下のコードを実行してインストールしていきます。

$ sudo apt-get install i2c-tools python-smbus

PCA9685でPCA9685を接続する

PCA9685とRaspberryPiを接続していきます。RaspberryPiのピンとPCA9685のピンそれぞれどのように接続するかは下の表にします。シリアルデータとシリアルクロックはよくわからない….

RaspberryPiPCA9685役割
3.3VVCC電源
GPIO2SDAシリアルデータ
GPIO3SCLシリアルクロック
GNDGNDGND

表のようにそれぞれのピンを接続します。実際に接続したのか気に思うので、以下の2点を確認していきます。

  1. PCA9685の赤いランプが点灯しているか確認する
  2. RaspberryPiでコマンド(i2cdetect)でデバイス(PCA)が検出されているか調べる
//デバイス確認コマンド
//何かした表示されていれば成功です。検出されていない場合は全部「--」です。
$ sudo i2cdetect -y 1

コーディングする

コーディングする前にPCA9685を使う為のライブラリをインストールしていきます。インストール方法は公式のgithubに書いてある通りにやっていきますが一部python3用に書き換えています。

公式github: https://github.com/adafruit/Adafruit_Python_PCA9685

//PCA9685を使う為のライブラリをインストールしていきます。
//pipがない場合はpipを入れましょう
$ sudo pip3 install adafruit-pca9685

ライブラリのインストールが終わったらコーディングしていきます。下のコードを書いていきます。サーボ (sg90)はchannel0と1の場所に一つずつ繋げます。channel番号はPCA9685本体に書いてあります。ちなみに電池ボックスやPCA9685,RaspberryPiを繋げた全体の写真をのせておきます。

//サーボ 1回動した後にクールタイムをもうけ流のでtimeを使います
import time
import Adafruit_PCA9685

//pwmを使う為の初期設定です
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)

//-90度から90度動きます
//2台繋いでいます(channel0と1)

pwm.set_pwm(1, 0, 150)
time.sleep(1)
pwm.set_pwm(0, 0, 150)
time.sleep(1)
pwm.set_pwm(1, 0, 600)
time.sleep(1)
pwm.set_pwm(0, 0, 600)
time.sleep(1)

150-600で-90度から90度動く理由がわからない……????

Adafruit_PCA9685のexmples/simpletst.py見ながら調整したから自分の環境だけかもしれないです。

全体図

複数動かすのはムズイ

難しい…

設定も難しいけど、コーディング内部で何が起きてるかさっぱりです。

「150-600はどこから出てきた数字なんだ?」「サンプルにpulse lengthとあるがパルス幅なのか」

「データシートのパルス幅と違うし….?」とかなり悩むましたが一旦、先に進もうと思います。しっかり理解出来たら、また記事を書いていこうと思います。