I2Cセンサーの種類 |
16ch PWMコントローラ |
|
主な機能 |
一つのPCA9685で16chのPWM信号を個別に出力可能です。 |
|
I2Cデバイス名 |
PCA9685 |
|
写真
|
|
|
開発したデバイスの入手先 製品名 品番・型番 |
スイッチサイエンス PCA9685搭載16チャネル PWM/サーボ |
|
デバイスのData-Sheet |
||
デバイスの主な仕様
|
電源電圧 I2Cアドレス
チャンネル 分解能 I2C通信速度 |
2.3V~5.5V (接続するサーボ等の電源電圧にご注意) (0X40) アドレスBit:A0~A5までPINで選択可能で最大62個のアドレスの選択可能です。 16ch 12bit 1Mbps |
説明 |
アドレス選択がデバイスの6本のピンで選択ができます。最上位bitが1固定ですので 1000000~1111111を任意に選択可能です。1個で16chのPWM出力ですので、1,000個近いPWM出力を一つのI2Cバスで実現できます。 しかしPCA9685のI2Cの入力容量が10pFですので、62個を同一バスに接続すると配線容量を抜いても620pFとなり、I2Cでの規格の400pFを超える為、実際に接続する場合は、PCA9600D等でバスの駆動能力を増加させる、PCA9541APW等のI2Cバスマスタマルチプレクサ等でI2Cバスを分割する等が必要です。 また、PWM出力も1ch当たりTypで25mAの電流をシンク可能ですが、合計で400mAですので、16ch同時使用時に全chがシンクすると合計シンク電流の400mAとなりマージンが有りません。ご利用時はI2Cのバスラインのケーブルを含めた容量計算、負荷電流の最大値等を求め許容範囲内の安全な動作範囲での設計が必要です。 PWMの分解能もPCA9633が8bitに対し、12bitと高精度ですのでRCサーボ制御等にも十分適用可能と思います。 内部レジスタも分解能が12bitの為、1Byteのレジスタが2個で12bitを構成しています。更にON/OFF時の設定と16ch有りますのでレジスタの数は相当数になります。 I2Cセンサードライバーではレジスタ、上位・下位bit分割、レジスタ番号を気にせずプロパティで一発で設定が可能です。
通常のレジスタの読み書きは、register |
|
|
|
|
開発・テスト風景
RCサーボを接続して動作確認。 |
I2Cデバイス内部のレジスタ構成(レジスタに対する設定値、レジスタの内容等のご質問はお答えできません)
数が75個の8bitレジスタと数が多すぎる為、Data-Sheetの内容そのままです。
|
|
|
|
I2Cセンサー・ドライバーで準備済みのプロパティ・メソッド
プロパティ
機能名 |
機能説明 |
MODE1 |
MODE1レジスタを取得または設定します。 |
MODE2 |
MODE2レジスタを取得または設定します。 |
SUBADR1 |
I2C-bus |
SUBADR2 |
I2C-bus |
SUBADR3 |
I2C-bus |
ALLCALLADR |
ALLCALL |
LED0_ON |
LED0をONにするカウントを取得または設定します。 |
LED0_OFF |
LED0をOFFにするカウントを取得または設定します。 |
LED1_ON |
LED1をONにするカウントを取得または設定します。 |
LED1_OFF |
LED1をOFFにするカウントを取得または設定します。 |
LED2_ON |
LED2をONにするカウントを取得または設定します。 |
LED2_OFF |
LED2をOFFにするカウントを取得または設定します。 |
LED3_ON |
LED3をONにするカウントを取得または設定します。 |
機能名 |
機能説明 |
LED3_OFF |
LED3をOFFにするカウントを取得または設定します。 |
LED4_ON |
LED4をONにするカウントを取得または設定します。 |
LED4_OFF |
LED4をOFFにするカウントを取得または設定します。 |
LED5_ON |
LED5をONにするカウントを取得または設定します。 |
LED5_OFF |
LED5をOFFにするカウントを取得または設定します。 |
LED6_ON |
LED6をONにするカウントを取得または設定します。 |
LED6_OFF |
LED6をOFFにするカウントを取得または設定します。 |
LED7_ON |
LED7をONにするカウントを取得または設定します。 |
LED7_OFF |
LED7をOFFにするカウントを取得または設定します。 |
LED8_ON |
LED8をONにするカウントを取得または設定します。 |
LED8_OFF |
LED8をOFFにするカウントを取得または設定します。 |
LED9_ON |
LED10をONにするカウントを取得または設定します。 |
LED9_OFF |
LED10をOFFにするカウントを取得または設定します。 |
LED11_ON |
LED11をONにするカウントを取得または設定します。 |
LED11_OFF |
LED11をOFFにするカウントを取得または設定します。 |
LED12_ON |
LED12をONにするカウントを取得または設定します。 |
LED12_OFF |
LED12をOFFにするカウントを取得または設定します。 |
LED13_ON |
LED13をONにするカウントを取得または設定します。 |
LED13_OFF |
LED13をOFFにするカウントを取得または設定します。 |
LED14_ON |
LED14をONにするカウントを取得または設定します。 |
LED14_OFF |
LED14をOFFにするカウントを取得または設定します。 |
LED15_ON |
LED15をONにするカウントを取得または設定します。 |
LED15_OFF |
LED15をOFFにするカウントを取得または設定します。 |
ALL_LED_ON |
LED0~LED15をONにするカウントを取得または設定します。 |
ALL_LED_OFF |
LED0~LED15をOFFにするカウントを取得または設定します。 |
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
|