0

我正在尝试用我的树莓派控制激光笔。为此,我购买了 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_setPWMFreqsetServoDegree来自 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 所需的知识。

4

0 回答 0