我正在尝试用我的树莓派控制激光笔。为此,我购买了 2 个带有 PTZ 板的伺服系统,并将激光连接到伺服系统上。伺服器和 PTZ 板带有一些用 C 编写的代码来控制它们(完整的代码可以在这里找到:https ://github.com/arducam/pca9685 )
我的其余代码(与伺服控制一起使用)是用 Python (由我编写的)编写的,所以我试图让 PTZ 板提供的 C 函数与我的 Python 代码一起工作。
如果我在 C 中运行此代码:
#define I2C_ADDR 0x80 //i2c address
#define SERVO_UP_CH 0 //The upper servo Channel
#define SERVO_DOWN_CH 1 //The under servo Channel
uint8_t ServoUpDegree = 90;
uint8_t ServoDownDegree = 90;
int main(int argc, char *argv[]){
PCA9685_init(I2C_ADDR);
PCA9685_setPWMFreq(60); // Analog servos run at ~60 Hz updates
setServoDegree(SERVO_UP_CH, ServoUpDegree);
setServoDegree(SERVO_DOWN_CH, ServoDownDegree);
}
然后我的两个伺服器都设置为 90 度,一切都按预期工作。函数PCA9685_init
,PCA9685_setPWMFreq
和setServoDegree
来自 PTZ 板提供的代码。
但是,当我在 Python 中运行以下代码时,什么也没有发生(我的伺服系统不动)。
from ctypes import *
import os
servofile = "/home/pi/mu_code/PCA9685_servo_driver.so"
servodriver=CDLL(servofile, mode = os.RTLD_LAZY)
ServoDownDegree = 90
ServoUpDegree = 90
SERVO_UP_CH = 0
SERVO_DOWN_CH =1
I2C_ADDR = 0x80
servodriver.PCA9685_init(I2C_ADDR)
servodriver.PCA9685_setPWMFreq(60)
print("so far so good.")
servodriver.setServoDegree(SERVO_UP_CH, ServoUpDegree)
servodriver.setServoDegree(SERVO_DOWN_CH, ServoDownDegree)
print("still good.")
我的两条线都被打印出来了,我的 IDE 运行代码没有任何问题,所以我不明白为什么我的伺服系统不动。
我在 C 中创建了一个测试函数,在调用时只打印出“Hello word”:
void PrintHello(int n)
{
int i;
for (i = 0;i<=n; i++)
{
printf("Hello, World!");
}
}
当我在我的 Python 代码中编写时,servodriver.PrintHello(3)
我会在 Python 中得到正确的输出。所以看起来我的问题不一定在我的 C 函数和我的 Python 代码之间。
知道可能是什么问题吗?我希望能够使用提供的 C 函数,因为我严重怀疑我是否具备将它们从 C 转换为 Python 所需的知识。