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)