テキスト ボックス:  PCA9685

 

 

 

I2Cセンサーの種類

16ch PWMコントローラ

主な機能

一つのPCA968516chPWM信号を個別に出力可能です。

I2Cデバイス名

PCA9685

写真

 

開発したデバイスの入手先 

製品名 品番・型番

スイッチサイエンス

PCA9685搭載16チャネル PWM/サーボ
ドライバー(ADA-815

デバイスのData-Sheet

http://www.nxp.com/documents/data_sheet/PCA9685.pdf

デバイスの主な仕様

 

電源電圧

I2Cアドレス

 

チャンネル

分解能

I2C通信速度

2.3~5.5V   (接続するサーボ等の電源電圧にご注意)

040)  アドレスBit:A0~A5までPINで選択可能で最大62個のアドレスの選択可能です。

16ch

12bit

1Mbps

説明

アドレス選択がデバイスの6本のピンで選択ができます。最上位bitが1固定ですので

1000000~1111111を任意に選択可能です。1個で16chPWM出力ですので、1,000個近いPWM出力を一つのI2Cバスで実現できます。

しかしPCA9685I2Cの入力容量が10pFですので、62個を同一バスに接続すると配線容量を抜いても620pFとなり、I2Cでの規格の400pFを超える為、実際に接続する場合は、PCA9600D等でバスの駆動能力を増加させる、PCA9541APW等のI2Cバスマスタマルチプレクサ等でI2Cバスを分割する等が必要です。

また、PWM出力も1ch当たりTyp25mAの電流をシンク可能ですが、合計で400mAですので、16ch同時使用時に全chがシンクすると合計シンク電流の400Aとなりマージンが有りません。ご利用時はI2Cのバスラインのケーブルを含めた容量計算、負荷電流の最大値等を求め許容範囲内の安全な動作範囲での設計が必要です。

PWMの分解能もPCA96338bitに対し、12bitと高精度ですのでRCサーボ制御等にも十分適用可能と思います。

内部レジスタも分解能が12bitの為、1Byteのレジスタが2個で12bitを構成しています。更にON/OFF時の設定と16ch有りますのでレジスタの数は相当数になります。

I2Cセンサードライバーではレジスタ、上位・下位bit分割、レジスタ番号を気にせずプロパティで一発で設定が可能です。

 

通常のレジスタの読み書きは、register
address
を指定した後に処理を行いますが、I2Cセンサー・ドライバーを使用する場合は使用するプロパティにregister addressが紐づけして有る為レジスタアドレスの指定は不要でプロパティへ値の代入、読み出しのみで可能です。

 

 

 

 

開発・テスト風景

IMG_2438

RCサーボを接続して動作確認。

 

I2Cデバイス内部のレジスタ構成(レジスタに対する設定値、レジスタの内容等のご質問はお答えできません)

数が75個の8bitレジスタと数が多すぎる為、Data-Sheetの内容そのままです。

 

 

I2Cセンサー・ドライバーで準備済みのプロパティ・メソッド

プロパティ

機能名

機能説明

MODE1

MODE1レジスタを取得または設定します。

MODE2

MODE2レジスタを取得または設定します。

SUBADR1

I2C-bus
subaddress 1
を取得または設定します。

SUBADR2

I2C-bus
subaddress 2
を取得または設定します。

SUBADR3

I2C-bus
subaddress 3
を取得または設定します。

ALLCALLADR

ALLCALL
I2C-bus address register
を取得または設定します。

LED0_ON

LED0ONにするカウントを取得または設定します。

LED0_OFF

LED0OFFにするカウントを取得または設定します。

LED1_ON

LED1ONにするカウントを取得または設定します。

LED1_OFF

LED1OFFにするカウントを取得または設定します。

LED2_ON

LED2ONにするカウントを取得または設定します。

LED2_OFF

LED2OFFにするカウントを取得または設定します。

LED3_ON

LED3ONにするカウントを取得または設定します。

 

機能名

機能説明

LED3_OFF

LED3OFFにするカウントを取得または設定します。

LED4_ON

LED4ONにするカウントを取得または設定します。

LED4_OFF

LED4OFFにするカウントを取得または設定します。

LED5_ON

LED5ONにするカウントを取得または設定します。

LED5_OFF

LED5OFFにするカウントを取得または設定します。

LED6_ON

LED6ONにするカウントを取得または設定します。

LED6_OFF

LED6OFFにするカウントを取得または設定します。

LED7_ON

LED7ONにするカウントを取得または設定します。

LED7_OFF

LED7OFFにするカウントを取得または設定します。

LED8_ON

LED8ONにするカウントを取得または設定します。

LED8_OFF

LED8OFFにするカウントを取得または設定します。

LED9_ON

LED10ONにするカウントを取得または設定します。

LED9_OFF

LED10OFFにするカウントを取得または設定します。

LED11_ON

LED11ONにするカウントを取得または設定します。

LED11_OFF

LED11OFFにするカウントを取得または設定します。

LED12_ON

LED12ONにするカウントを取得または設定します。

LED12_OFF

LED12OFFにするカウントを取得または設定します。

LED13_ON

LED13ONにするカウントを取得または設定します。

LED13_OFF

LED13OFFにするカウントを取得または設定します。

LED14_ON

LED14ONにするカウントを取得または設定します。

LED14_OFF

LED14OFFにするカウントを取得または設定します。

LED15_ON

LED15ONにするカウントを取得または設定します。

LED15_OFF

LED15OFFにするカウントを取得または設定します。

ALL_LED_ON

LED0LED15ONにするカウントを取得または設定します。

ALL_LED_OFF

LED0LED15OFFにするカウントを取得または設定します。

PRE_SCALE

PRE_SCALEレジスタを取得または設定します。

TestMode

TestModeレジスタを取得または設定します。

メソッド

機能名

機能説明

Init

I2Cバスコントローラに指定された接続設定を使って非同期的に接続します。

Read

指定レジスタ読込

Write

指定レジスタ書込

定数

機能名

機能説明

定数値

REG_ADDR.MODE1

レジスタMODE1

0x00

REG_ADDR.MODE2

レジスタMODE2

0x01

REG_ADDR.SUBADR1

レジスタSUBADR1

0x18

REG_ADDR.ALLCALLADR

レジスタALLCALLADR

0x1B

REG_ADDR.LED0

レジスタLED0_ON_L

0x06

REG_ADDR.LED1

レジスタLED1_ON_L

0x0A

REG_ADDR.LED2

レジスタLED2_ON_L

0x0E

REG_ADDR.LED3

レジスタLED3_ON_L

0x12

REG_ADDR.LED4

レジスタLED4_ON_L

0x16

REG_ADDR.LED5

レジスタLED5_ON_L

0x1A

REG_ADDR.LED6

レジスタLED6_ON_L

0x1E

REG_ADDR.LED7

レジスタLED7_ON_L

0x22

REG_ADDR.LED8

レジスタLED8_ON_L

0x26

REG_ADDR.LED9

レジスタLED9_ON_L

0x2A

REG_ADDR.LED10

レジスタLED10_ON_L

0x2E

REG_ADDR.LED11

レジスタLED11_ON_L

0x32

REG_ADDR.LED12

レジスタLED12_ON_L

0x36

REG_ADDR.LED13

レジスタLED13_ON_L

0x3A

REG_ADDR.LED14

レジスタLED14_ON_L

0x3E

REG_ADDR.LED15

レジスタLED15_ON_L

0x42

REG_ADDR.ALL_LED

レジスタALL_LED_ON_L

0xFA

REG_ADDR.PRE_SCALE

レジスタPRE_SCALE

0xFE

REG_ADDR.TestMode

レジスタTestMode

0xFF

 

 

I2Cセンサードライバーを使ったVBでのサンプルソース

     

Imports I2CLibrary

Public NotInheritable Class PCA9685Page

 Inherits Page

 

 Private Const PCA9685_Address As Byte = &H40

 Private PCA9685 As PCA9685 = New PCA9685()

 

 Private dOscillator As Double = 25000000 オシレータクロック 25MHz

 Private dResolution As Double = 4096 分解能

 Private dCycleTime As Double = 20 ‘ SG90 サイクルタイム

 Private dHz As Double = 50 ‘ SG90 周波数

 

 Private dMinDutyCycle As Double = 0.5 ‘ ms

 Private dMaxDutyCycle As Double = 2.4 ‘ ms

 Private dStd As Double = dResolution / dCycleTime

 

 Public Sub New()

  InitializeComponent()

  Call Init()

 End Sub

 

 Private Async Sub Init()

  Await PCA9685.Init(PCA9685_Address)

 

  Dim iDutyCycle As Integer = 0

 

  PCA9685.MODE1 = &H31

  PCA9685.Write(I2CLibrary.PCA9685.REG_ADDR.MODE1)

 

  PCA9685.PRE_SCALE = (dOscillator / (dResolution * dHz)) – 1

  PCA9685.Write(I2CLibrary.PCA9685.REG_ADDR.PRE_SCALE)

 

  PCA9685.MODE1 = &H21

  PCA9685.Write(I2CLibrary.PCA9685.REG_ADDR.MODE1)

 

 End Sub

 Private Sub btnHome_Click(sender As Object, e As RoutedEventArgs)

  Dim iDutyCycle As Integer = 0

 

  iDutyCycle = ((dMaxDutyCycle – dMinDutyCycle) / 2 + dMinDutyCycle) * dStd

 

  PCA9685.LED0_ON = 0

  PCA9685.LED0_OFF = iDutyCycle

 

  PCA9685.Write(I2CLibrary.PCA9685.REG_ADDR.LED0)

 End Sub

 

 Private Sub btnLeft_Click(sender As Object, e As RoutedEventArgs)

  Dim iDutyCycle As Integer = 0

 

  iDutyCycle = dMinDutyCycle * dStd

 

  PCA9685.LED0_ON = 0

  PCA9685.LED0_OFF = iDutyCycle

 

  PCA9685.Write(I2CLibrary.PCA9685.REG_ADDR.LED0)

 End Sub

 

 Private Sub btnRight_Click(sender As Object, e As RoutedEventArgs)

  Dim iDutyCycle As Integer = 0

 

  iDutyCycle = dMaxDutyCycle * dStd

 

  PCA9685.LED0_ON = 0

  PCA9685.LED0_OFF = iDutyCycle

 

  PCA9685.Write(I2CLibrary.PCA9685.REG_ADDR.LED0)

 End Sub

 

 

 Private Sub btnBack_Click(sender As Object, e As RoutedEventArgs)

  PCA9685.close()

  App.rootFrame.Navigate(GetType(MenuPage))

 End Sub

 

End Class