ヘルニアクソ野郎エンジニアblog

~ヘルニアでHell near~

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

calendar

今回から、「ラズベリーパイを使った2足歩行ロボット」の作成をまとめていこうと思います。

おおまかな構成は、過去記事をご参照願います。↓

 

最終的には、ラズパイに立てたWEBサーバー(webiopi)にブラウザでアクセスし、そこからロボットを操作できるようなものに仕上げる予定です。↓

ラズパイ2足歩行ロボ構想

今回は、とりあえず「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とサーボモーターの接続

PCA9685接続

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

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

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

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

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

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

I2Cの設定

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

I2C有効

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

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

 

PCA9685接続の確認

I2C確認

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

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

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

70xはよく分かりません汗

とにかくOKです。

 

Pythonプログラムの作成

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

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

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

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

続いてインストール。

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

 

Pythonメインプログラム

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

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

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

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

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

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

450の場合は1.83ms

となってるはずです。

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

 

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

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

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

 

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

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