PWM/サーボシールド(PCA9685)を動かしてみます(1/2)

(2/2) (XBeeラジコン) 〔マイコンのトップに戻る〕


前にPICを使ったサーボモータの基本動作と制御方法の話は記事にしたのでまずはそちらを一読願います。
I2C接続16チャンネル12ビットPWMサーボシールド このページでは、複数個のサーボモータを接続可能なシールドの
記事を書きます。(左図はマニュアルからの拝借です)
これは、AdafruitI2C接続16チャンネル12ビットPWMサーボシールドです。
使われているチップはPCA9685で、16個のPWM出力が出来ます
PCA9685は元々LEDを制御する為の物の様ですが、
PWMで制御する物であれば動作させるのは可能でしょう。

シールドのマニュアルは、Adafruitのこちら頁内左側メニューの[Download PDF]をクリックしましょう。

スイッチサイエンスのこちらのページにシールドタイプではない通常の基板タイプが販売されていました、
こちらが他のマイコンを使うならお勧めです、私もチョットぉ後悔しています。○| ̄|_
なのでぇ、PICでの記事は有りません。m(_ _)m

PS.
PICでこの"PWM/サーボシールド"を動作させるプログラムを こちらで追加して置きました。 *1)

シールドの電源について

このシールドには2つの電源が有ます。
 ・1つはVCCです、これはArduinoからの5V電力でPCA9685に制御電力を供給し、
  I2CロジックレベルとPWM出力信号ロジックレベルを決定します。(赤色LEDが点灯します)
電圧選択パッド 尚、VCC電源はArduinoからの5V/3.3Vを切替える事が出来る様に、
基板にハンダジャンパーパッドが有ります。
(デフォルトは5V側に配線して有り)


 ・2つめはV+外部電源です、これはサーボ用の電源です。(緑色LEDが点灯します)
  この電源は5または6VDCでなければなりません、又、逆極性保護が有ります。
  4サーボまでは、5v 2Aスイッチング電源。
  16サーボまでは、5v 10Aスイッチング電源を用意しましょう。

コンデンサスポット サーボが動いた時に大きく落ち込む電源から多くのサーボを駆動している場合等に
基づいて、基板に電解コンデンサを追加出来る様にスポットが設けられています。
容量はサーボ個数x100uF(例えば5サーボの場合は470uF以上です)です。

 同時に動く多くのサーボ(特に強力なサーボ)は多くの電流を必要とする事を覚えて置いて下さい。
  マイクロサーボでも、移動すると数百mAの電流が流れます。
  いくつかの高トルクサーボは、負荷がかかった状態でそれぞれ1A以上を引き出します。

《 PCA9685 》

PCA9685のデータシートはこちらです。

PCA9685はI2Cバスで制御出来る16チャネルLEDコントローラで、I2Cアドレスが6bitで選択出来るので
最大62シールド接続可能です。って事はぁ、16*62=992個サーボやね。 ( д) ゚ ゚
各PWM出力は、標準24Hz-1526Hzの設定した周波数で動作し、デューティサイクルは
12ビット分解能(4096step)で設定可能です。

出力ドライバは、5Vで25mA出力(シンク)、Totalで400mA出力出来ますが、大電流(サーボ)又は
高電圧LED用には外付けドライバが必要でしょうね。(ソースなら10mA)
又、出力ドライバは、オープンドレイントーテムポール(デフォルト)のいずれかを選択出来ます。
オープンドレインとトーテムポールの違いは何ぞやと言う人は、Kdms勉強会(open drain)又は こちら
参照下さい。

PCA9685のクロックは、内部25MHz発振器と外部クロックピン(EXTCLK)から最大50MHzまで入力可能。
(今回のシールドは、内部25MHz発振器を利用しています)

OEピン
チップのOE(出力イネーブル)ピンはアクティブLOWなので通常は10K抵抗を介してGNDに配線します。

EXTCLKピン
外部クロックを接続しない場合はGNDに配線します。

I2Cのアドレスについて

アドレス設定  通常のアドレスは7ビットで表します、左図の1〜7ビットです。
 0ビット目はR/Wでこれはデバイスに対する読書き指示ビットです。
 R/W=0 : 書き込み要求です(デバイスは受信モード)
 R/W=1 : 読み込み要求です(デバイスは送信モード)

I2Cアドレススポット PCA9685はこの様にアドレスを6ビットで選択出来る様に
ハンダジャンパーパッドが有ります。


[1][A5][A4][A3][A2][A1][A0][RW]となり7ビット目は"1"固定です。
デフォルトは、"1000000"+RW となりますので
R/W=0 書込みなら"1000000"+"0"で0x80、R/W=1 読込みなら"1000000"+"1"で0x81となりますが
ここでは7ビットで指定なので "1000000":0x40 を指定します。
(シールド内で10K抵抗を介してGNDに接続されているので半田盛りしない場合は"0"となります)
もし、"A0"を半田付けした場合は、1+[0][0][0][0][0][1]+RW となり0x41を指定します。

PCA9685には予約されていて指定不可のアドレスが存在します
接続されたこのサーボシールドのすべてにコールが出来るアドレス"1110 000"
ソフトウェアリセットで使用するアドレス"0000 0110"
I2Cが将来用に予約しているアドレスで"11111XX"と"11110XX"も避けた方が良いでしょう。

又、PCA9685には"サブアドレス1"/"サブアドレス2"/"サブアドレス3"/”ALLCAL”のアドレスを
レジスタに登録できる様になっています。
もし、"サブアドレス1"を使用すると許可すると行った場合、
この"サブアドレス1"とハンダジャンパーアドレスの2個に反応させる事も出来る様です(未実験)。
又、この際の"サブアドレス1"のアドレス値も他のスレーブ機器アドレスで使用出来なくなります。

尚、今回は半田付けしたく無いのでアドレスは0x40としサブアドレスもALLCALアドレスも使いません。

レジスタについて

大まかな物のみ書いて置きます、詳しくはデータシートを見ましょう。
赤色数値がデフォルト値です、LEDn_xxxの n には0から16が入ります。

MODE1レジスタ(address 00h)
PCA9685に設定を行う為の設定1レジスタです。

ビット
7
6
5
4
3
2
1
0
機能
RESTART
EXTCLK
AI
SLEEP
SUB1
SUB2 SUB3 ALLCAL

bit7:RESTART    再スタートロジックの状態を示します。
                                 0 = 再 スタート禁止(ロ ジック0のユーザー書込みは無効です)
                                 1 = 再 スタート指示(再スタートするとRESTARTビットはクリアされます)
                             RESTARTビットをクリアするその他のアクションは次のとおりです。
                             1. 電源ONの時
                             2. I2Cソフトウェアリセットコマンド発行時
                             3. OCH=0 の場合は、任意の4つのPWMレジスタ(LEDn_ON_L〜LEDn_OFF_H)に
                                 書込み、次にI2CバスSTOPを発行された時
                             4. OCH=1 の場合、任意のPWMチャネルの4つのPWMレジスタ全てに書込んだ時
bit6:EXTCLK     外部クロック使用の有無を選択します。
                                 0 = 内部クロックを使用
                                 1 = 外部クロックを使用
                             EXTCLKピンを使用するには、このビットを次の順序で設定する必要があります。
                             1. SLEEP=1 を設定します、これにより、内部発振器がオフになります。
                             2. SLEEPビットとEXTCLKビットの両方にロジック1を書き込みます。
                             このビットは、電源ONの時かソフトウェアリセットによってのみクリアされます。
bit5:AI                レジスタアドレスの自動インクリメント機能を使用するのかを選択します。
                                 0 = 使用しない
                                 1 = 使用する
bit4:SLEEP         消費電力モードの有無を選択します。
                                 0 = 通常モード
                                 1 = 低消費電力モード。 内部発振器がオフします
                             SLEEPビットが"0"に設定されると、内部発振器は起動して動作します。
                             それには最大500usかかります。
                             オシレータがオフのときPWM制御は不可能です。
bit3:SUB1           サブアドレス1使用の有無を選択します。
                                 0 = I2Cバスのサブアドレス1に応答しません
                                 1 = I2Cバスのサブアドレス1に応答します
bit2:SUB2           サブアドレス2使用の有無を選択します。
                                 0 = I2Cバスのサブアドレス2に応答しません
                                 1 = I2Cバスのサブアドレス2に応答します
bit1:SUB3           サブアドレス3使用の有無を選択します。
                                 0 = I2Cバスのサブアドレス3に応答しません
                                 1 = I2Cバスのサブアドレス3に応答します
bit0:ALLCAL     LEDオールコールアドレス使用の有無を選択します。
                                 0 = I2CバスのLEDオールコールアドレスに応答しません
                                 1 = I2CバスのLEDオールコールアドレスに応答します

MODE2レジスタ(address 01h)
PCA9685に設定を行う為の設定2レジスタです。

ビット
7
6
5
4
3
2
1
0
機能
reserved
INVRT
OCH
OUTDRV OUTNE

bit7-5:reserved    将来用に予約
bit4   :INVRT       出力するPWM波形の状態を設定します。
                                 0 = 出力論理状態は反転しない(外部ドライバを使用する時に使用する値)
                                 1 = 出力論理状態が反転する(外部ドライバが使われていない時に使用する値)
bit3   :OCH          出力するPWMの開始タイミングを設定します。
                                 0 = I2CのSTOPコマンドで出力
                                 1 = I2CのACK返答で出力
                               STOPコマンドで出力すると、複数のPCA9685の出力を同期させる事が出来ます。
                               06h(LED0_ON_L)から45h(LED15_OFF_H)までのレジスタにのみ適用されます。
                               ACKの更新では、最後のACKで出力が変化する前に、4つのPWMチャネルレジスタ
                               (LEDn_ON_L/HとLEDn_OFF_L/H)をすべてロードする必要があります。
bit2    :OUTDRV  出力を構成する出力方式を選択できます。
                                 0 = オープンドレイン構造で構成されます
                                 1 = トーテムポール構造で構成されます
bit1-0:OUTNE     OE(出力イネーブル)が"1"(出力ドライバが無効)の場合時の動作を選択します。
                                 00 = 出力はLEDn=0 となります
                                 1x = 出力はLEDn=ハイインピーダンスとなります
                                 01 = 出力はOUTDRVの状態で異なります
                                         OUTDRV=1 ならLEDn=1 となり、
                                          OUTDRV=0
ならLEDn=ハイインピーダンスとなります。

PWMレジスタ(address 06h-45h)
出力する周波数のデュティ比を定義します。

デュティ比のONとOFF PWMレジスタは、一つのチャンネル当り
"LEDn_ON_L"/"LEDn_ON_H"/"LEDn_OFF_L"/"
LEDn_OFF_H"の4つが有り、其々波形のON(立上り)と
OFF(立下り)を開始するタイミングを設定出来ます。
16チャンネル有るので、"LED0_xxx"から"LED15_xxx"まで有り
全部で64レジスタ(address 06h-45h)となります。
と言う事は、出力したいチャンネルに設定すれば出力されます。

デュティ比の設定方法 デュティ比は12ビット分解能(0-4095)なので
"xxxx_L"側に下位8ビット、"xxxx_H"側に上位4ビットを
セットします。
セット後、I2CマスターからのSTOPコマンド発行で
PWMの出力が開始されます。
だから全チャンネルを同時に出力するには、
全部セット後、STOPコマンド発行を行いましょう。
LEDn_ON_Hのビット目が"1"で有れば、出力が常にONになりますので通常は"0"です。
LEDn_OFF_Hのビット目が"1"で有れば、出力が常にOFFになりますので通常は"0"です。
尚、LEDn_OFF_H[4]ビットのデフォルトは"1"になっています注意しましょう。

PRE_SCALEレジスタ(address FEh)
このレジスタは、出力する周波数(24Hz〜1526Hz)を定義します。
PRE_SCALEレジスタが "0x03h"に設定されている場合、最大PWM周波数は1526 Hzです。
PRE_SCALEレジスタが "0xFFh"に設定されている場合、最小PWM周波数は24 Hzです。

次の式で計算します。(12ビット分解能=4096step)
ROUND((発振器のクロック周波数/(4096*出力する周波数))−1 )
例えば、発振器のクロック周波数が25MHzの200Hzの出力周波数(デフォルト)の場合は、
ROUND((25000000/(4096*200))−1 ) = 30(1Eh)

このレジスタは、MODE1レジスタのSLEEPビットが"1"に設定されている場合にのみ設定出来ます。

《 PWMサーボシールドのライブラリ 》

本シールドの動作確認を行う為にGitHubのこちらからダウンロードしましょう。
ライブラリ(Adafruit-PWM-Servo-Driver-Library-master.zip)の登録は、こちらを参照下さい。
ライブラリの関数等の説明は、シールドのマニュアルを見ましょう。

《 動作確認 》

LEDを使った配線図 シールドは半田付け箇所が多いので少し大変ですがぁ、
頑張れぇ。 !(`・ー・´)b
電源は、USBからの5.0Vです。
LEDは10mA以上流さない様にしましょう。

左のFritzing用のシールド部品は、GitHubのこちらから
ダウンロード出来ます。

動作確認用のスケッチは、
ArduinoIDEのメニューバーから
「スケッチ」→「スケッチ例」→「Adafruit PWM Servo
Driver Library」→「pwmtest
を順にクリック操作します。
コンパイルしArduinoへ書き込みましょう。

起動させるとLEDが点灯(段々明るくなるを繰返す)します、スケッチはチャンネル0〜15まで同時出力を
行っています、なので配線をチャンネル0〜15へ順番に接続して行けばシールドの動作確認は出来ます。

《 サーボをつないで見る 》

サーボモータを使った配線図 今度はサーボモータを1個つないで
動作確認です。
制御用電源はUSBからの5.0Vです。
サーボ用電源は外部から5.0Vです。

上記のLED動作スケッチを実験した
人は一旦空のスケッチを書込んでから
配線を行った方が良いでしょう。
(サーボモータが誤作動しない様に)

サーボの接続でほとんどのサーボには、サーボドライバのヘッダーに直接接続する標準の
3ピンメスコネクタが付属しています、必ずプラグをアース線(GND:通常は黒または茶色)に合わせ、
底部の行と信号線(PWM:通常は黄色または白色)を上にして下さい。

動作確認用のスケッチは、ArduinoIDEのメニューバーから
「スケッチ」→「スケッチ例」→「Adafruit PWM Servo Driver Library」→「servo」を順にクリック操作
し、コンパイルしてArduinoへ書き込みましょう。

スケッチは、チャンネル0〜7を約1秒間隔で順番に出力します、チャンネル0のサーボが動いたら
約7秒後に再び動作します、これを繰り返し行う事でしょう。

スケッチの注意はPWM周波数は60Hzで、
出力の指定が0〜4095で行っていてサーボの最小カウントが150、最大カウントが600となっています。
150/600はサーボにより調整が必要な場合が有るでしょう。
尚、今回はこちら(S03N 2BBM/フタバ)のサーボモータを使いそのまま動作させました。
(このサーボの場合は、最小が135、最大が475なのでぇ600はやばめですね)
現在(2018/2月)は上の物は販売頁がなくなっているので、こちら(S03N 2BBM/JR)を載せて置きます。

《 その他 》

実験時の写真 シールドに付属のピンヘッダを半田付けしたがぁ、
これではサーボモータ以外配線出来ない。
他のセンサーやボリューム等の部品が
接続出来ない....し.しまったぁ il|li orz il|li
実験にはピンソケットの使用をお勧めします。
次回にジョイスティックを付けて見ようと思ったのにぃ (T_T)
どうしようかな (ー_ー;)。o O




一部追記(*1) 2018/03/20


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.