class PWM

Constants

ALLCALL
ALL_LED_OFF_H
ALL_LED_OFF_L
ALL_LED_ON_H
ALL_LED_ON_L
INVRT
LED0_OFF_H
LED0_OFF_L
LED0_ON_H
LED0_ON_L
MODE1

Registers

MODE2
OUTDRV
PRESCALE
RESTART

Bits

SLEEP
SUBADR1
SUBADR2
SUBADR3

Public Class Methods

new(address=0x40, debug=false) click to toggle source
# File lib/adafruit-servo-driver/pwm.rb, line 28
def initialize(address=0x40, debug=false)
  @address = address
  @i2c = I2C.create(I2CDevice.detect)
  @debug = debug
  puts 'Reseting PCA9685 MODE1 (without SLEEP) and MODE2' if @debug
  setAllPWM(0, 0)
  @i2c.write(@address, MODE2, OUTDRV)
  @i2c.write(@address, MODE1, ALLCALL)
  sleep(0.005)           # wait for oscillator

  mode1 = @i2c.read(@address, 8, MODE1).unpack('C').first
  @i2c.write(@address, MODE1, ALLCALL)
  mode1 = mode1 & ~SLEEP # wake up (reset sleep)
  @i2c.write(@address, MODE1, mode1)
  sleep(0.005)           # wait for oscillator
end

Public Instance Methods

setAllPWM(on, off)
Alias for: set_all_pwm
setPWM(channel, on, off)
Alias for: set_pwm
setPWMFreq(freq)
Alias for: set_pwm_freq
set_all_pwm(on, off) click to toggle source
# File lib/adafruit-servo-driver/pwm.rb, line 77
def set_all_pwm(on, off)
  @i2c.write(@address, ALL_LED_ON_L, on & 0xFF)
  @i2c.write(@address, ALL_LED_ON_H, on >> 8)
  @i2c.write(@address, ALL_LED_OFF_L, off & 0xFF)
  @i2c.write(@address, ALL_LED_OFF_H, off >> 8)
end
Also aliased as: setAllPWM
set_pwm(channel, on, off) click to toggle source
# File lib/adafruit-servo-driver/pwm.rb, line 69
def set_pwm(channel, on, off)
  @i2c.write(@address, LED0_ON_L+4*channel, on & 0xFF)
  @i2c.write(@address, LED0_ON_H+4*channel, on >> 8)
  @i2c.write(@address, LED0_OFF_L+4*channel, off & 0xFF)
  @i2c.write(@address, LED0_OFF_H+4*channel, off >> 8)
end
Also aliased as: setPWM
set_pwm_freq(freq) click to toggle source
# File lib/adafruit-servo-driver/pwm.rb, line 45
def set_pwm_freq(freq)
  prescaleval = 25000000.0    # 25MHz
  prescaleval /= 4096.0       # 12-bit
  prescaleval /= Float(freq)
  prescaleval -= 1.0
  if @debug
    puts "Setting PWM frequency to #{freq} Hz"
    puts "Estimated pre-scale: #{prescaleval}"
  end
  prescale = (prescaleval + 0.5).floor
  if @debug
    puts "Final pre-scale: #{prescale}"
  end

  oldmode = @i2c.read(@address, 8, MODE1).unpack('C').first
  newmode = (oldmode & 0x7F) | 0x10    # sleep
  @i2c.write(@address, MODE1, newmode) # go to sleep
  @i2c.write(@address, PRESCALE, prescale)
  @i2c.write(@address, MODE1, oldmode)
  sleep(0.005)
  @i2c.write(@address, MODE1, oldmode | RESTART)
end
Also aliased as: setPWMFreq