舵机的输入线共有三条,红色中间,是电源线,一边灰色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,即输出力矩不同,6.0V对应的要大一些,具体看应用条件;另外一根线是控制信号线,Futaba的一般为白色,JR的一般为桔黄色。另外要注意一点,SANWA的某些型号的舵机引线电源线在边上而不是中间,需要辨认。但记住红色为电源,灰色为地线,剩下的一根为信号线,一般不会搞错。本实验中,舵机红色接TPYBoard v102+的VIN引脚,灰色接TPYBoard v102+的GND引脚,剩下的橙色是信号线,接TPYBoard V102+的X3针脚。TPYBoard v102+ 的X1、X2、X3、X4为信号引脚。
3、舵机工作原理
控制电路板接受来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机转动的方向和速度,从而达到目标停止。其工作流程为:控制信号→控制电路板→电机转动→齿轮组减速→舵盘转动→位置反馈电位计→控制电路板反馈。
五、伺服电机的构造函数与方法
1.函数
pyb.Servo(id)
在这id为1-4,对应TPYBoard v102+的X1-X4。
2.方法
Servo.angle([angle,
time = 0 ])
如果没有给出参数,则该函数返回当前角度。
如果给出参数,则该函数设置伺服角度:
angle 是以度数移动的角度。
time是达到指定角度所需的毫秒数。如果省略,则伺服器尽可能快地移动到其新位置。
Servo.speed([speed, time=0])
如果没有给出参数,则该函数返回当前速度。
如果给出参数,则该功能设置伺服的速度:
speed 是在-100到100之间变化的速度。
time是达到指定速度所需的毫秒数。如果省略,则伺服器尽可能快地加速。
Servo.pulse_width([value ])
如果没有给出参数,该函数返回当前的原始脉冲宽度值。
如果给出参数,则该函数设置原始脉冲宽度值。
Servo.calibration([pulse_min,pulse_max,pulse_centre [,pulse_angle_90,pulse_speed_100 ]])
如果没有给出参数,则该函数返回当前的校准数据,作为5元组。
如果给出参数,该功能设置时序校准:
pulse_min 是允许的最小脉冲宽度。
pulse_max 是允许的最大脉冲宽度。
pulse_centre 是对应于中心/零位置的脉冲宽度。
pulse_angle_90 是对应于90度的脉冲宽度。
pulse_speed_100 是对应于速度100的脉冲宽度。
六、实验要求
本实验为智能避障小车的实验,主要实现小车的避障功能,当前方距离过近的时候,TPYBoard v102+会控制舵机转动超声波云台支架来判断前方、左前方、右前方的距离,从而控制小车向左转,向右转或者向前转,实现避障的功能。
七、实验效果
八、源代码
- # main.py -- put your code here!
- import pyb
- from pyb import Pin
- from pyb import Timer
- from pyb import servo
- x1 = Pin('X1', Pin.OUT_PP)
- x2 = Pin('X2', Pin.OUT_PP)
- y1 = Pin('Y1', Pin.OUT_PP)
- y2 = Pin('Y2', Pin.OUT_PP)
- Trig = Pin('X9',Pin.OUT_PP)
- Echo = Pin('X10',Pin.IN)
- num=0
- flag=0
- run=1
- zuo=0
- qian=0
- you=0
- distance=0
- def start(t):
- global flag
- global num
- if(flag==0):
- num=0
- else:
- num=num+1
- def stop(t):
- global run
- if(run==0):
- run=1
- start1=Timer(1,freq=10000,callback=start)
- stop1=Timer(4,freq=2,callback=stop)
- #小车左转
- def left():
- x1.high()
- x2.low()
- y1.high()
- y2.low()
- #小车前进
- def go():
- x1.high()
- x2.low()
- y1.low()
- y2.high()
- #小车后退
- def back():
- x1.low()
- x2.high()
- y1.high()
- y2.low()
- #小车右转
- def right():
- x1.low()
- x2.high()
- y1.low()
- y2.high()
- #小车停止
- def stop():
- x1.low()
- x2.low()
- y1.low()
- y2.low()
- #控制舵机向右、向左、向前
- def servo():
- global distance
- global zuo
- global you
- global qian
- servo3=pyb.Servo(3)
- #向右75旋转
- servo3.angle(-75,500)
- pyb.delay(1000)
- ceju()
- you=distance
- print('you',you)
- #向左转75度
- servo3.angle(75,500)
- pyb.delay(1000)
- ceju()
- zuo=distance
- print('zuo',distance)
- #转到0度
- servo3.angle(0,500)
- pyb.delay(1000)
- ceju()
- qian=distance
- print('qian',distance)
- #返回正前方、左前方、右前方的距离
- return qian,zuo,you
- #测距方法
- def ceju():
- global flag
- global num
- global run
- global distance
- if(run==1):
- Trig.value(1)
- pyb.udelay(100)
- Trig.value(0)
- while(Echo.value()==0):
- Trig.value(1)
- pyb.udelay(100)
- Trig.value(0)
- flag=0
- if(Echo.value()==1):
- flag=1
- while(Echo.value()==1):
- flag=1
- if(num!=0):
- #测距
- distance=num/10000*34299/2
- #print('Distance:')
- #print(distance,'cm')
- pyb.delay(500)
- flag=0
- run=0
- return distance
- def main():
- global distance
- global zuo
- global you
- global qian
- servo3=pyb.Servo(3)
- servo3.angle(0,500)
- pyb.delay(1000)
- ceju()
- while 1==1:
- ceju()、
- #前方距离大于40cm前进
- if distance > 40:
- go()
- ceju()
- print('juli',distance)
- #前方距离小于40cm
- if distance <= 40:
- stop()
- back()
- pyb.delay(500)
- stop()
- servo()
- #如果右前方距离大于左前方
- if you>zuo:
- right()
- pyb.delay(400)
- ceju()
- #如果左前方距离大于右前方
- if zuo>you:
- left()
- pyb.delay(400)
- ceju()
- #如果所有方向距离全部小于15cm
- if zuo<15 and you< 15 and qian<15 :
- stop()
- back()
- pyb.delay(800)
- stop()
- ceju()
- #有一个方向距离小于5CM
- if zuo<5 or you <5 or qian<5:
- stop()
- back()
- pyb.delay(800)
- stop()
- ceju()
- main()
复制代码
`