Current section
Files
Jump to
Current section
Files
lib/pca9685.ex
defmodule PCA9685 do
@moduledoc """
Driver for PCA9685 based 16 channel, 12 bit PWM driver connected over I2C.
## Usage
# Start a device
{:ok, pid} = PCA9685.acquire(bus: "i2c-1", address: 0x40)
# With optional PWM frequency and output enable pin
{:ok, pid} = PCA9685.acquire(bus: "i2c-1", address: 0x40, pwm_freq: 100, oe_pin: 17)
# With a name for supervision
{:ok, pid} = PCA9685.acquire(bus: "i2c-1", address: 0x40, name: MyPWM)
# Control channels
PCA9685.Device.channel(pid, 0, 0, 2048)
PCA9685.Device.all(pid, 0, 4095)
# Release when done
PCA9685.release(pid)
## Supervision
Add the device to your supervision tree:
children = [
{PCA9685.Device, bus: "i2c-1", address: 0x40, name: MyPWM}
]
Then use the registered name:
PCA9685.Device.channel(MyPWM, 0, 0, 2048)
"""
@doc """
Acquire a connection to a PCA9685 device.
## Options
* `:bus` - (required) the I2C bus name, e.g. `"i2c-1"`
* `:address` - (required) the I2C address, e.g. `0x40`
* `:pwm_freq` - PWM frequency in Hz (default: 50, range: 24-1526)
* `:oe_pin` - GPIO pin for output enable (optional)
* `:name` - GenServer name for registration (optional)
## Examples
{:ok, pid} = PCA9685.acquire(bus: "i2c-1", address: 0x40)
{:ok, pid} = PCA9685.acquire(bus: "i2c-1", address: 0x40, name: MyPWM)
"""
@spec acquire(keyword()) :: GenServer.on_start()
def acquire(opts) when is_list(opts) do
PCA9685.Device.start_link(opts)
end
@doc """
Release a PCA9685 device connection.
## Examples
:ok = PCA9685.release(pid)
:ok = PCA9685.release(MyPWM)
"""
@spec release(GenServer.server()) :: :ok
def release(server) do
GenServer.stop(server)
end
end