skule.sormo.no

ORG NR 885 947 522

Arduino programmmering

PCA9685-Arduino-Library gjør seriekobling av lysdioder enkelt

{jcomments on}I utgangspunktet skulle det være enkelt å bruke denne enheten for å styre opp til 16 lysdioder og servoer. Den kobles enkelt til I2C-bussen, det vil si SDA til A4 og SCL til A5 på en Arduino UNO. Da skulle man tro at de ulike 16 portene på PCA9685-enheten hadde en egen I2C-adresse fra 0 til 15,  og deretter skrive dataverdien på PWM-porten. Men slik fungerer den ikke 

Adressen til hver port adresseres først med en kommandosekvens til I2C-adresse 0x40, deretter sendes en adresse og så en 12 bits dataverdi mellom 0 og 4096 i form at fire byte, to for 0-verdien og to for 1-verdien. Til hver port sendes alstå først en tidskonstant for 0-verdi og deretter en tidskonstant for 1-verdi.

På GitHub finnes et Arduino-bibliotek for enhenten som kan lastes ned her. Der brukes kun to funksjoner, en PWM-frekvens som settes med  pwm.setPWMFreq(f);  der f kan være opp til 1000 (Hz). I tillegg vil funksjonen  pwm.setPWM(servonum, 0, pulselen); sette pulsbreddeverdien på pulstoget der servonum er  adressen til portene, mellom 0 og 15. Pulselen er  verdien på pulsbredden som kan anta verdi mellom 0 og 4096. 

Dersom du bruker RGB-lysdioder, må felleskoblingen være negativ. PCA9685 driver den positive tilkoblingen på lysdioder, så de tre RGB-tilkoblingene på diodene må være være anoder.PCA9685-enheten har innebyggede seriemotstander, så seriemotstander ut over det, skal ikke brukes.

Denne kretsen kan også brukes til å styre servoer på samme måte som man styrer lysdioder. Men her må man bruke MAP-funksjonen for å bruke de riktige minimum og maksimumsgrensene for servoen.

 setPWM-funksjonen fungere ikke sammen ,med TimerOne-biblioteket dersom man ønsker en timerinterrupt-setting med  setPWM-funksjonen.

Flere PCA9685-kretser kan kobles i serie. Da addresseres hvert kort med en loddekobling på kortet der to punkt kortsluttes. Kortsluttes loddepunktet A0, gir det startadressen 0x41. A2 gir adressen 0x42, både A0 og A1 gir 0x43, osv. Men da må man deklarere en egen variabel for hvert kort. Dersom man kobler sammen to kort, må man deklarere:

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x41);