|
|
@@ -14,17 +14,24 @@ VERSION = "1.0.0"
|
|
|
sys = require("sys")
|
|
|
pca9685=require("pca9685")
|
|
|
|
|
|
-local function pca9685_init()
|
|
|
- sys.wait(2000)
|
|
|
- log.info("--------------------------------------------")
|
|
|
- pca9685.Init(60,180)
|
|
|
- while true do
|
|
|
- pca9685.setPWM(0,0,2048);
|
|
|
- sys.wait(500)
|
|
|
- end
|
|
|
-end
|
|
|
-
|
|
|
-sys.taskInit(pca9685_init)
|
|
|
+local i2c_id = 1
|
|
|
+sys.taskInit(
|
|
|
+ function()
|
|
|
+ i2c.setup(i2c_id,i2c.SLOW)
|
|
|
+ sys.wait(1000)
|
|
|
+ pca9685.Init(i2c_id,60)
|
|
|
+ sys.wait(1000)
|
|
|
+ local i=0
|
|
|
+ while true do
|
|
|
+ pca9685.setPWM(i2c_id,0,i)
|
|
|
+ if i >= 100 then
|
|
|
+ i=0
|
|
|
+ end
|
|
|
+ i=i+10
|
|
|
+ sys.wait(2000)
|
|
|
+ end
|
|
|
+ end
|
|
|
+)
|
|
|
|
|
|
sys.run()
|
|
|
]]
|
|
|
@@ -34,7 +41,7 @@ sys.run()
|
|
|
|
|
|
|
|
|
local pca9685={}
|
|
|
-local i2cId =0 --i2c通道设置
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
@@ -46,79 +53,129 @@ local LED0_OFF_L= 0x08
|
|
|
local LED0_OFF_H =0x09
|
|
|
local PCA_Pre = 0xFE
|
|
|
|
|
|
-local function pca9685_Write(addr, data)
|
|
|
- i2c.send(i2cId, PCA_Addr, { addr, data })
|
|
|
- --log.info("PCA9685_Write发送成功:", aa)
|
|
|
+local function pca9685_Write(i2cId,addr, data)
|
|
|
+ local ret
|
|
|
+ ret=i2c.send(i2cId, PCA_Addr, { addr, data })
|
|
|
sys.wait(15)
|
|
|
+ if ret then
|
|
|
+ return 1
|
|
|
+ else
|
|
|
+ return 0
|
|
|
+ end
|
|
|
end
|
|
|
|
|
|
-local function pca9685_Read(addr)
|
|
|
+local function pca9685_Read(i2cId,addr)
|
|
|
i2c.send(i2cId, PCA_Addr, addr)
|
|
|
sys.wait(5)
|
|
|
local data = i2c.recv(i2cId,0x40, 1)
|
|
|
- return data
|
|
|
+ if #data==0 then
|
|
|
+ return 0
|
|
|
+ else
|
|
|
+ return data
|
|
|
+ end
|
|
|
end
|
|
|
-
|
|
|
-function pca9685.Init(hz, angle) --pcA9685初始化
|
|
|
- local off=0
|
|
|
- i2c.setup(i2cId, i2c.SLOW)
|
|
|
- pca9685_Write(PCA_Model,0x00)
|
|
|
- pca9685.setFreq(hz)
|
|
|
- off = 145+angle*2.4
|
|
|
- pca9685.setPWM(0,0,off);
|
|
|
- pca9685.setPWM(1,0,off);
|
|
|
- pca9685.setPWM(2,0,off);
|
|
|
- pca9685.setPWM(3,0,off);
|
|
|
- pca9685.setPWM(4,0,off);
|
|
|
- pca9685.setPWM(5,0,off);
|
|
|
- pca9685.setPWM(6,0,off);
|
|
|
- pca9685.setPWM(7,0,off);
|
|
|
- pca9685.setPWM(8,0,off);
|
|
|
- pca9685.setPWM(9,0,off);
|
|
|
- pca9685.setPWM(10,0,off);
|
|
|
- pca9685.setPWM(11,0,off);
|
|
|
- pca9685.setPWM(12,0,off);
|
|
|
- pca9685.setPWM(13,0,off);
|
|
|
- pca9685.setPWM(14,0,off);
|
|
|
- pca9685.setPWM(15,0,off);
|
|
|
+--[[
|
|
|
+pca9685 初始化
|
|
|
+@api pca9685.Init(i2cId,hz, angle)
|
|
|
+@int i2cid 使用的i2c id, 或者是软件i2c的实例
|
|
|
+@int hz pca9685的输出频率
|
|
|
+@int angle pca9685周期
|
|
|
+@return 成功返回1 失败返回0
|
|
|
+]]
|
|
|
+function pca9685.Init(i2cId,hz)
|
|
|
+ local ret=0
|
|
|
+ ret=pca9685_Write(i2cId,PCA_Model,0x00)
|
|
|
+ if ret==0 then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ ret=pca9685.setFreq(i2cId,hz)
|
|
|
+ if ret==0 then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ pca9685.setPWM(i2cId,0,0);
|
|
|
+ pca9685.setPWM(i2cId,1,0);
|
|
|
+ pca9685.setPWM(i2cId,2,0);
|
|
|
+ pca9685.setPWM(i2cId,3,0);
|
|
|
+ pca9685.setPWM(i2cId,4,0);
|
|
|
+ pca9685.setPWM(i2cId,5,0);
|
|
|
+ pca9685.setPWM(i2cId,6,0);
|
|
|
+ pca9685.setPWM(i2cId,7,0);
|
|
|
+ pca9685.setPWM(i2cId,8,0);
|
|
|
+ pca9685.setPWM(i2cId,9,0);
|
|
|
+ pca9685.setPWM(i2cId,10,0);
|
|
|
+ pca9685.setPWM(i2cId,11,0);
|
|
|
+ pca9685.setPWM(i2cId,12,0);
|
|
|
+ pca9685.setPWM(i2cId,13,0);
|
|
|
+ pca9685.setPWM(i2cId,14,0);
|
|
|
+ pca9685.setPWM(i2cId,15,0);
|
|
|
sys.wait(100)
|
|
|
+ return 1
|
|
|
end
|
|
|
|
|
|
|
|
|
-
|
|
|
-function pca9685.setFreq(freq) --PCA9685频率设置
|
|
|
+--[[
|
|
|
+pca9685 设置频率
|
|
|
+@api pca9685.setFreq(i2cId,freq)
|
|
|
+@int i2cid 使用的i2c id, 或者是软件i2c的实例
|
|
|
+@int freq pca9685的输出频率,范围为24HZ~1526HZ
|
|
|
+@return 成功返回1 失败返回0
|
|
|
+]]
|
|
|
+function pca9685.setFreq(i2cId,freq) --PCA9685频率设置
|
|
|
local prescale
|
|
|
local oldmode
|
|
|
local newmode
|
|
|
local prescaleval
|
|
|
-
|
|
|
+ local ret
|
|
|
prescaleval = 25000000;
|
|
|
prescaleval = prescaleval / 4096
|
|
|
prescaleval = prescaleval / freq
|
|
|
prescaleval = prescaleval - 1
|
|
|
prescale = math.floor(prescaleval + 0.5)
|
|
|
- oldmode = string.toHex(pca9685_Read(PCA_Model))
|
|
|
+ oldmode = string.toHex(pca9685_Read(i2cId,PCA_Model))
|
|
|
newmode = (oldmode & 0x7F)|0x10
|
|
|
- pca9685_Write(PCA_Model, newmode)
|
|
|
- pca9685_Write(PCA_Pre, prescale)
|
|
|
- pca9685_Write(PCA_Model, oldmode)
|
|
|
+ ret=pca9685_Write(i2cId,PCA_Model, newmode)
|
|
|
+ if ret==0 then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ ret=pca9685_Write(i2cId,PCA_Pre, prescale)
|
|
|
+ if ret==0 then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ ret=pca9685_Write(i2cId,PCA_Model, oldmode)
|
|
|
+ if ret==0 then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
sys.wait(5)
|
|
|
- pca9685_Write(PCA_Model, oldmode|0xa1)
|
|
|
+ ret=pca9685_Write(i2cId,PCA_Model, oldmode|0xa1)
|
|
|
+ if ret==0 then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ return 1
|
|
|
end
|
|
|
|
|
|
-
|
|
|
-function pca9685.setPWM(num, on, off)
|
|
|
- local cc = i2c.send(i2cId, PCA_Addr, { LED0_ON_L + 4 * num, on & 0xFF, on >> 8, off & 0xFF, off >> 8 })
|
|
|
- --log.info("PCA9685_setPWM发送成功:", cc)
|
|
|
+--[[
|
|
|
+pca9685 设置PWM占空比
|
|
|
+@api pca9685.setPWM(i2cId,num, duty_cycle)
|
|
|
+@int i2cid 使用的i2c id, 或者是软件i2c的实例
|
|
|
+@int num 通道号
|
|
|
+@int duty_cycle 占空比 0~100
|
|
|
+@return 成功返回1 失败返回0
|
|
|
+]]
|
|
|
+function pca9685.setPWM(i2cId,num, duty_cycle)
|
|
|
+ local on = 0
|
|
|
+ if duty_cycle==50 then
|
|
|
+ on=0
|
|
|
+ else
|
|
|
+ on=math.floor(4096*((100-duty_cycle)/100))
|
|
|
+ end
|
|
|
+ local off=on+math.floor(4096*(duty_cycle/100))
|
|
|
+ local ret = i2c.send(i2cId, PCA_Addr, { LED0_ON_L + 4 * num, on & 0xFF, on >> 8, off & 0xFF, off >> 8 })
|
|
|
sys.wait(5)
|
|
|
+ if ret==false then
|
|
|
+ return 0
|
|
|
+ end
|
|
|
+ return 1
|
|
|
end
|
|
|
-
|
|
|
-function pca9685.setAngle(num, angle)
|
|
|
- local off = 0
|
|
|
- off = 158 + angle * 2.2
|
|
|
- pca9685.setPWM(num, 0, off)
|
|
|
-end
|
|
|
-
|
|
|
return pca9685
|
|
|
|
|
|
|