arduino I2c 六路舵机控制板程序如前文所示已能够正常使用树莓派控制使用,但是使用起来比较麻烦。本文通过编写myI2Cservo.py使使用更加方便。

库程序myI2Cservo.py内容如下:

import smbus
import time

bus = smbus.SMBus(1)
add = 0x08
pos = [255, 0, 0, 0, 0, 0, 0]  # 定义六个舵机,255为数据头


def run_servo():
    for x in pos:
        bus.write_byte(add, x)  # 向地址8发送数据
        time.sleep(0.002)


class MyI2Cservo():
    def __init__(self, channel, min_theta, max_theta, init_theta=0):
        """
        构造函数:
            channel: 舵机信号线所连接的端口
            min_theta: 舵机转动的最小角度
            max_theta: 舵机转动的最大角度
            init_theta: 舵机的初始角度
        """

        self.channel = channel
        if min_theta < 0 or min_theta > 180:
            self.min_theta = 0
        else:
            self.min_theta = min_theta

        if max_theta < 0 or max_theta > 180:
            self.max_theta = 180
        else:
            self.max_theta = max_theta

        if init_theta < min_theta or init_theta > max_theta:
            self.init_theta = (self.min_theta + self.max_theta) / 2
        else:
            self.init_theta = init_theta  # 初始角度

    def setup(self):
        """
        servo180初始化
        """
        pos[self.channel] = int(self.init_theta)
        run_servo()

    def turn_to(self, angle):
        if angle > self.max_theta:
            angle = self.max_theta
        elif angle < self.min_theta:
            angle = self.min_theta
        pos[self.channel] = int(angle)
        run_servo()

class MyI2Cservo270():
    def __init__(self, channel, min_theta, max_theta, init_theta=0):
        """
        构造函数:
            channel: 舵机信号线所连接的端口
            min_theta: 舵机转动的最小角度
            max_theta: 舵机转动的最大角度
            init_theta: 舵机的初始角度
        """

        self.channel = channel
        if min_theta < 0 or min_theta > 270:
            self.min_theta = 0
        else:
            self.min_theta = min_theta

        if max_theta < 0 or max_theta > 270:
            self.max_theta = 270
        else:
            self.max_theta = max_theta

        if init_theta < min_theta or init_theta > max_theta:
            self.init_theta = (self.min_theta + self.max_theta) / 2
        else:
            self.init_theta = init_theta  # 初始角度

    def setup(self):
        """
        servo270初始化
        """
        pos[self.channel] = int(self.init_theta)
        run_servo()

    def turn_to(self, angle):
        if angle > self.max_theta:
            angle = self.max_theta
        elif angle < self.min_theta:
            angle = self.min_theta
        pos[self.channel] = int(angle * 180 / 270)
        run_servo()

1,2两端口接180舵机,3-6端口接270舵机,测试程序可使六个舵机同步运行。test.py如下:

import myI2Cservo
from time import sleep

if __name__ == "__main__":
    s1 = myI2Cservo.MyI2Cservo(1, 20, 180, 60)
    s2 = myI2Cservo.MyI2Cservo(2, 20, 180, 80)
    s3 = myI2Cservo.MyI2Cservo270(3, 20, 180, 100)
    s4 = myI2Cservo.MyI2Cservo270(4, 20, 180, 120)
    s5 = myI2Cservo.MyI2Cservo270(5, 20, 180, 140)
    s6 = myI2Cservo.MyI2Cservo270(6, 20, 180, 160)
    s1.setup()
    s2.setup()
    s3.setup()
    s4.setup()
    s5.setup()
    s6.setup()
    sleep(2)
    while True:
        s1.turn_to(30)
        s2.turn_to(30)
        s3.turn_to(30)
        s4.turn_to(30)
        s5.turn_to(30)
        s6.turn_to(30)
        sleep(1)
        s1.turn_to(120)
        s2.turn_to(120)
        s3.turn_to(120)
        s4.turn_to(120)
        s5.turn_to(120)
        s6.turn_to(120)
        sleep(1)

发表评论