Raspberry piで2足歩行ロボットの作成①「とりあえずI2Cでサーボモーターを動かしてみる」
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個とも動きましたが、あまりおすすめはしません。サーボモーターの規格は下記の通り
- 動作電圧:4.2V~6V
- トルク:1.5kg/cm
- 動作速度:0.3sec/60deg
- 信号線:茶GND/赤VCC/橙Signal
- 制御角度:0~180deg (レビューでは180°まで制御できないなどの意見が散見していました。)
では、サーボモーターを動かす下準備をしていきます。
ハードウェアの接続
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)、ブラウザからサーボを動かしてみたいと思います。