wl 2 лет назад
Родитель
Сommit
11c07001ad
1 измененных файлов с 116 добавлено и 59 удалено
  1. 116 59
      script/libs/pca9685.lua

+ 116 - 59
script/libs/pca9685.lua

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