系列文章
- 树莓派4B-Python-控制舵机
- 树莓派-Pico控制舵机
- 树莓派4B-Python-使用PCA9685控制舵机云台+跟随人脸转动(本文章)
目录
- 系列文章
- 前言
- 一、SG90s舵机是什么?
- 二、PCA9685与舵机信号线的接线图
- 三、控制SG90s云台(也可用来测试舵机转动的范围)
- 四、给树莓派注入灵魂(代码)
- 五、给电脑注入灵魂(代码)
- 总结
前言
先说明一下哈,本人用的是树莓派4B,Python的版本为3.7,OpenCV的版本为3.2.0
计划了好久的舵机云台终于有机会做出来了!原先一开始用的是塑料的云台+SG90舵机,但效果有点怪,云台会乱抽搐,于是换了金属的云台+SG90s舵机,嘿嘿,现在就没啥问题。
后来想了一下,还是觉得是以下的问题导致云台抽搐的:
- 舵机线靠近其他正在通电的电源线,受到电磁的干扰,导致舵机信号被干扰;
- PCA9685舵机控制板的问题。
1、与舵机的接线接触不良;
2、控制板与树莓派的接线接触不良。一般为通信线接触不良。
3、控制板的5V供电有问题。输出电压不够5V或输出电流小于1A。
- 云台顺滑度的问题。本人的就是云台的上下转动的舵机那里卡了,导致变换不了舵机的角度,最后舵机发热严重,排查了好久才发现这个问题。
一、SG90s舵机是什么?
简单的说,就是SG90舵机的齿轮换成了金属齿轮而已,扭力增加了而已。可以理解为SG90舵机的升级版吧。
还是不知道的可以参考之前写的关于舵机的内容:
树莓派4B-Python-控制舵机
树莓派-Pico控制舵机
二、PCA9685与舵机信号线的接线图
简单说明一下接线:
PCA9685 树莓派4B GND GND DE 空着 SCL SCL SDA SDA VCC 3.3V V+ 5V(5V1A) 一定要接V+到5V,不然板子达不到控制舵机的效果。
若想外接5V1A的电源,那最好是将那个电源的GND与树莓派的GND连上,也就是共地。
提示:使用下面的代码前,记得先测试好舵机的转动角度哦,若转动的角度会卡死的话,舵机轻则发热,重则爆炸,所以切记切记,一定要先确定好舵机转动的范围。
三、控制SG90s云台(也可用来测试舵机转动的范围)
import time # 引入time库 from adafruit_servokit import ServoKit # 引入刚刚安装的PCA9685库并将名字缩写成ServoKit方便后续调用 # from Adafruit_PCA9685 import ServoKit kit = ServoKit(channels=16) # 明确PCA9685的舵机控制数 Servo1 = kit.servo[0] # 左右转向的舵机 Servo2 = kit.servo[1] # 上下移动的舵机 Servo3 = kit.servo[2] # 前后伸缩的舵机 Servo4 = kit.servo[3] # 夹子舵机 Servo5 = kit.servo[14] Servo6 = kit.servo[15] Servo = [Servo1, Servo2, Servo3, Servo4, Servo5, Servo6] def servo_start(servo_number, start_angle, stop_angle, angle_sleep, time_sleep): """ servo_number:设置想要控制的舵机通道 start_angle:设置起始的角度 stop_angle:设置终止的角度 angle_sleep:设置角度变换的步长 一般设为10 time_sleep:设置角度变换的间隔 数字越小越快,但最好不要设置太快,舵机会反应不过来然后抽搐。 最快0.005s,但是到达指定角度位置后需要等待1s左右让程序反应过来,否则会抽搐。 """ for speed in range(start_angle, stop_angle, angle_sleep): servo_number.angle = speed print(speed) time.sleep(time_sleep) def servo_dongzuo1(): """ 先让机械臂向后缩,然后向前伸,再向下移动,最后向上移动,这就回到了原点 """ time_sleep = 0.01 servo_start(Servo3, 110, 41, -1, time_sleep) servo_start(Servo3, 40, 111, 1, time_sleep) time.sleep(0.1) servo_start(Servo2, 130, 31, -1, time_sleep) servo_start(Servo2, 30, 131, 1, time_sleep) time.sleep(0.1) def aa(): time_sleep = 0.01 servo_start(Servo3, 40, 181, 1, time_sleep) servo_start(Servo3, 180, 41, -1, time_sleep) servo_start(Servo1, 90, 0, -1, 0.01) servo_start(Servo1, 0, 180, 1, 0.01) servo_start(Servo1, 180, 0, -1, 0.01) servo_start(Servo1, 0, 90, 1, 0.01) servo_start(Servo2, 80, 170, 1, 0.01) servo_start(Servo2, 170, 80, -1, 0.01)
四、给树莓派注入灵魂(代码)
注入的灵魂如下(示例):
# -*- coding: utf-8 -*- import cv2 import time # 引入time库 from adafruit_servokit import ServoKit # 引入刚刚安装的PCA9685库并将名字缩写成ServoKit方便后续调用 class Follow_the_face: def __init__(self): kit = ServoKit(channels=16) # 明确PCA9685的舵机控制数 self.Servo1 = kit.servo[0] # 左右转向的舵机 self.Servo2 = kit.servo[1] # 上下移动的舵机 self.Servo3 = kit.servo[2] # 前后伸缩的舵机 self.Servo4 = kit.servo[3] # 夹子舵机 self.Servo5 = kit.servo[14] self.Servo6 = kit.servo[15] self.Servo = [self.Servo1, self.Servo2, self.Servo3, self.Servo4, self.Servo5, self.Servo6] self.l_r_number_of_degrees = 110 # 左右电机初始化的角度 self.u_d_number_of_degrees = 150 # 上下电机初始化的角度 self.range_value = 30 # 在人脸检测中,设置人脸框的中心坐标与屏幕中心坐标的可接受偏移的范围 def servo_start(self, servo_number, start_angle, stop_angle, angle_sleep, time_sleep): """ servo_number:设置想要控制的舵机通道 start_angle:设置起始的角度 stop_angle:设置终止的角度 angle_sleep:设置角度变换的步长 一般设为10 time_sleep:设置角度变换的间隔 数字越小越快,但最好不要设置太快,舵机会反应不过来然后抽搐。 最快0.005s,但是到达指定角度位置后需要等待1s左右让程序反应过来,否则会抽搐。 """ for speed in range(start_angle, stop_angle, angle_sleep): servo_number.angle = speed print(speed) time.sleep(time_sleep) def Inittalize(self): """ 初始化云台的各个位置,也算是一个启动前的角度自检和归位 """ self.servo_start(self.Servo1, 111, 110, -1, 0.01) # 可转动的角度为:0~180 self.servo_start(self.Servo2, 180, 40, -1, 0.01) # 可转动的角度为:40~180.40度时为垂直向上看 self.servo_start(self.Servo2, 40, 150, 1, 0.01) def Auto_Angle(self, direction, offset_number): # , auto_angle """ 自动偏移指定度数 direction:选择方向 offset_number:偏移数 auto_angle:自动角度 """ if direction == "左": self.l_r_number_of_degrees -= offset_number if 1
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...