masimaro blog

menu

home > 電子工作:Raspberry pi > Raspberry piで2足歩行ロボットの作成①「とりあえずI2Cでサーボモーターを動かしてみる」

Raspberry piで2足歩行ロボットの作成①「とりあえずI2Cでサーボモーターを動かしてみる」


Raspberry pi
2021-07-22


今回は、とりあえず「I2Cで複数のサーボモーターを動かす」をやってみようと思います。

サーボモーターはPWMで回転角度を制御しますが、ラズパイには正確にPWM制御ができる「ハードウェアPWM」のGPIO出力ピンが1つ(2つだっけ?)しかありません。

今回作成しようとしている2足歩行ロボットは、最低でも4つのサーボモーターを使用する予定ですので、これをハードウェアPWMで制御する為に「サーボモータードライバ」を使用することにしました。↓

I2Cのシリアル通信を有効にすれば、上の図のように、サーボドライバ経由で複数のサーボモータをハードウェアPWMで制御可能になります。

それではまず、今回使用したものを下記にまとめます。

①raspberry pi4B

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

③サーボモーター × 10個(Quimat)

④ジャンパワイヤ 複数

⑤電源 5V 2A~ (ラズパイ用電源)

⑥電源 5V 1A~(サーボモーター用電源)

  

③のサーボモーターは評判がすこぶる悪いですが、10個入りで¥1000程度でしたので、安さに負けて購入しました。一応運よく?10個とも動きましたが、あまりおすすめはしません。サーボモーターの規格は下記の通り

 

では、サーボモーターを動かす下準備をしていきます。

ハードウェアの接続

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

図の通り結線していきます。

I2Cはシリアルの半二重通信なので、SDAとGNDの2本だけで双方向に通信が可能です。

SCLはタイミングを合わせるクロック信号になります。わずか3本だけでドライバに接続できるのはありがたいですね。

サーボモーターに関しては、図の左から順にチャンネルが割り当てられ、0~15の最大16個の接続が可能です。

PCA9685のVCC(ロジック側の電源)は、ラズパイから3.3Vを拝借します。

サーボモーターの電源(PCA9685のV+)は、ラズパイから引き回すとラズパイ自体の消費電力供給に影響を及ぼすので、別の電源を用意します。

I2Cの設定

ラズパイのGUIからI2Cの設定をON

ターミナルからも設定変更可能ですが、GUIでI2Cを有効にできます。

ラズベリーパイの設定から、インターフェイスを選択し、I2C項目にチェックを入れればOKです。

 

PCA9685接続の確認

ターミナルで以下コマンドを入力します。

sudo i2cdetect -y 1

上記のような表が表示されるので、40xと70xの値があれば、I2Cが接続できていることになります。

40xが、PCA9685が接続されているチャンネルになります。

Pythonプログラムの作成

PCA9685パッケージのダウンロード

今回、Pythonでプログラムを作成しますが、PCA9685を制御するにあたって専用のパッケージがWEB上に用意されています。

まずはそれをgithubのレポジトリからDLします。

git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git

git clone https://github.com/adafruit/Adafruit_Python_GPIO.git

git clone https://github.com/adafruit/Adafruit_Python_PureIO.git

PCA9685パッケージのインストール

続いてインストール。

pi@raspberrypi:~ $ cd Adafruit_Python_PCA9685/

pi@raspberrypi:~/Adafruit_Python_PCA9685 $ sudo python3 setup.py install

pi@raspberrypi:~/Adafruit_Python_PCA9685 $ cd ../Adafruit_Python_GPIO/

pi@raspberrypi:~/Adafruit_Python_GPIO $ sudo python3 setup.py install

pi@raspberrypi:~/Adafruit_Python_GPIO $ cd ../Adafruit_Python_PureIO/

pi@raspberrypi:~/Adafruit_Python_PureIO $ sudo python3 setup.py install

あとはメインプログラムの作成です。

Pythonメインプログラム

Thonny Python IDEなどでPythonのプログラムを作成します。

#! /usr/bin/env python

import time
import Adafruit_PCA9685        

pwm = Adafruit_PCA9685.PCA9685()     
pwm.set_pwm_freq(60)                

while True:                           
    pwm.set_pwm(0, 0, 300)            
  pwm.set_pwm(1, 0, 300)
  pwm.set_pwm(2, 0, 300)
  pwm.set_pwm(3, 0, 300)
  pwm.set_pwm(4, 0, 300)
  time.sleep(1)                    
  pwm.set_pwm(0, 0, 450)
  pwm.set_pwm(1, 0, 450)
  pwm.set_pwm(2, 0, 450)
  pwm.set_pwm(3, 0, 450)
  pwm.set_pwm(4, 0, 450)
    time.sleep(1)

とりあえず、0~4CHにサーボを接続し、5つのサーボモーターを動かしてみます。

角度の制御については、サーボに与えるパルスの幅で決まりますが、詳細は確認中です。。

一応、パルスの長さは、「周波数の1周期(s)/4096 x パルス幅 ( ms) 」で求める事ができるみたいです。

とりあえず、今回は300と450で設定しているので

300の場合のパルスの長さは1.22ms

450の場合は1.83ms

となってるはずです。

プログラムを実行すると、下記のように動作しました。↓

ちなみに、プログラム実行時に、「Adafruit_PCA9685〇〇のファイルが無い」みたいなエラー表示が出た場合、一度下記のpipインストールを試して下さい。

sudo pip install adafruit-pca9685

※パッケージ名は、エラーが出ている名前に変更してください。

続いて、10個のサーボを動かしてみました。プログラムは、上記のものに5つサーボを追加しただけですので割愛します。

PCA9685ライブラリを使えばかなり便利なもので、簡単にサーボの制御が出来ました。

次回は、ラズパイにWEBサーバーを立てて(webiopi)、ブラウザからサーボを動かしてみたいと思います。

コメントを残す

お名前

コメント



コメント一覧

コメントはまだありません
MENU