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
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