ps2摇杆传感器控制舵机实验

    ps2摇杆传感器组合PCF8591数模转换模块,从而获取方向信息,然后通过PCA9685驱动板,驱动两个方向的舵机进行转动。
组合效果如图:
组装示例

如图所示,需要用到的模块有:

模块数量
ps2摇杆传感器1
PCF8591数模转换模块1
树莓派Zero1
PCA9685舵机驱动板1
MG966R舵机3
电源(此处是充电宝)1
特别说明:

1、由于ps2摇杆和PCA9685都需要用到SCL和SDA引脚,所以需要提前焊接PCA9685舵机驱动板尾部串联引脚。(可参考文章:https://www.shumeijiang.com/2021/08/29/多个pca9685舵机驱动板一起执行实验(含地址修改).html)。

2、实验前需要手工打开树莓派I2c协议支持(可参考文章:https://www.shumeijiang.com/2019/12/08/基于命令行打开i2c协议支持.html)。

接线说明:

引脚连接引脚
摇杆GND树莓派GND
摇杆+5V树莓派5V
摇杆VRXPCF8591的AIN0
摇杆VRYPCF8591的AIN1
摇杆SWPCF8591的AIN2
PCF8591的SDAPCA9685的SDA
PCF8591的SCLPCA9685的SCL
PCF8591的VCCPCA9685的VCC
PCF8591的GNDPCA9685的GND
PCA9685的SCL树莓派SCL
PCA9685的SDA树莓派SDA
PCA9685的VCC树莓派5V
PCA9685的GND树莓派GND
视频效果:
关键代码:

#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''

import time
from board import SCL, SDA
import busio
from PCF8591 import getDirection #引入读取ps2摇杆数据

from adafruit_pca9685 import PCA9685 #引入舵机控制
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#控制第一块板子
pca = PCA9685(i2c, address=0x40)  #地址可以修改  默认0x40
pca.frequency = 50

#初始化两个舵机驱动
servo_x = servo.Servo(pca.channels[0])
servo_y = servo.Servo(pca.channels[1])

#设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
servo_x.set_pulse_width_range(min_pulse=500, max_pulse=2500)
servo_y.set_pulse_width_range(min_pulse=500, max_pulse=2500)

#获取摇杆数据
try:
    while True:
        xN = getDirection('x')
        yN = getDirection('y')
        print(xN)
        print(yN)

        #control x
        if xN == '向前':
            servo_x.angle = 60
        elif xN == '向后':
            servo_x.angle = 140
        else:
            servo_x.angle = 100

        #control y
        if yN == '向左':
            servo_y.angle = 40
        elif yN == '向右':
            servo_y.angle = 140
        else:
            servo_y.angle = 90

        time.sleep(0.2)

except KeyboardInterrupt:
    print('stop')

pca.deinit()
其他参考:
1、PCF8591数模转换实验参考文章:https://www.shumeijiang.com/2022/10/30/pcf8591-da数模转换实验.html

自制防止电脑掉线小工具

     最近家里新添加了一位吃奶小战士,所以事情比较多;经常会被打断去忙别的事情;导致电脑长时间没有动静从而出现微信等工具掉线情况;所以自制了一个小工具,在忙别的事情的时候能保证电脑不会掉链子。
     下面将通过树莓派Zero、PCA9685舵机驱动、MG996舵机组合实现鼠标的定期或随机移动,组合如下图:
组合效果
实现原理:
    树莓派连接PCA9685舵机驱动板,驱动板连接MG996舵机;舵机转轴连接一个驱动臂;将鼠标用胶带跟驱动臂连接起来;接下来写程序,让舵机每隔一段时间执行转动-复位动作,然后驱动臂顺带带动鼠标移动一下;从而实现,电脑检测鼠标在使用的情况,从而防止电脑程序不掉线的目的。
视频效果如下:
实现代码如下:

#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''

import time
from board import SCL, SDA
import busio
from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#控制第一块板子
pca = PCA9685(i2c, address=0x40)  #地址可以修改  默认0x40
pca.frequency = 50

default_angle = {0:113, 1:0, 2:80}

#开始执行
while True:
    i = 2
    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #初始化度数
    servo_o.angle = default_angle[i]
    time.sleep(1)

    #再执行移动
    servo_o.angle = 65
    time.sleep(1)

    #再恢复
    servo_o.angle = default_angle[i]  
    time.sleep(60) #一分钟执行一次  可随机数

pca.deinit()
舵机驱动部分参考文章:https://www.shumeijiang.com/2021/08/29/舵机的新驱动方式.html

多个PCA9685舵机驱动板一起执行实验(含地址修改)

    以前的实验我们实验过了单个pca9685驱动板,同时驱动多个舵机的实验;但是有些情况下,可能一个板子无法满足我们的驱动需求;我们知道一个板子最大可驱动16个舵机,但是如果我们想同时驱动 17个舵机,这个时候就遇到问题;本篇文章就实验一下如何解决这个问题。
    为了解决这个问题,先得解决地址冲突问题;因为板子默认地址都是0x40,那么我们无法辨别哪个是哪个板子,这个时候就需要修改板子的地址;如下图:
地址修改
 地址修改后,连接树莓派,执行如下命令:

i2cdetect -y 1
    可见下图,由于树莓派连接了两个pca9685驱动板,所以可见两个地址,分别为0x40和修改地址后的0x41;
地址修改后效果
#解决地址冲突后,接下来看一下树莓派如何同时接多块板子,见下图:
接线效果
    由上图可见,由于板子默认没有焊接尾部扩展针脚,因此需要我们先焊接针脚;然后用杜邦线连接第二个板子;电源部分两者共用即可。
 #实验代码:

#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

import time
from board import SCL, SDA
import busio

from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#控制第一块板子
pca = PCA9685(i2c, address=0x40)  #地址可以修改  默认0x40
pca.frequency = 50

print("执行第一块板子")

for i in [0]:

    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo_o.angle = 0
    time.sleep(1)

    #再执行90度
    servo_o.angle = 90
    time.sleep(1)

    #再执行180度
    servo_o.angle = 180
    time.sleep(1)

    #再恢复90度
    servo_o.angle = 90
    time.sleep(1)

pca.deinit()

#控制第二块板子
pca = PCA9685(i2c, address=0x41)
pca.frequency = 50

print("执行第二块板子")

for i in [0, 1]:
    servo_o = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo_o.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo_o.angle = 0
    time.sleep(1)

    #再执行90度
    servo_o.angle = 90
    time.sleep(1)

    #再执行180度
    servo_o.angle = 180
    time.sleep(1)

    #再恢复90度
    servo_o.angle = 90
    time.sleep(1)

pca.deinit()
#实验效果,可见三个舵机依次转动,如下图:

舵机的新驱动方式

    去年曾经写过舵机的驱动方式,文件见链接:https://www.shumeijiang.com/2020/05/06/舵机(伺服电机)驱动实验/;在那篇文章内我们采用的是外置的驱动文件,其原理还是利用的led的驱动方式;今天我们将切换另一种驱动方式,无需再每次使用时额外引入驱动程序,而是直接调用即可。
    调用之前,我们先认识一下今天的主角CircuitPythonCircuitPython初学者友好的Python开源版本,适用于称为微控制器的小型廉价计算机。微控制器是许多电子产品的大脑,包括用于构建业余项目和原型的各种开发板。

    CircuitPython是正在快速发展一种兼容标准Python的嵌入式系统编程语言,目前已支持树莓派(Raspberry Pi)、ARM Cortex-M0/M0+、 ARM Cortex-M4/M4F等;它具有统一的 Python核心API和收纳了越来越多的150多个与之配合使用的设备库和驱动程序;因此我们在驱动硬件设备时,可以直接通过命令调用它的内置驱动,从而不用再每次引入其他驱动程序。

    CircuitPython是由著名开源软件硬件商--Adafruit发起,得到全球开源社区的支持与维护,作为支持嵌入式计算机系统Python解释器的后起之秀,CircuitPython具备很多适合小体积、低功耗、有限资源系统的特征,尤其是在开放性和安全性方面。

    CircuitPython的大部分内建库完全兼容标准的Python3,因此这次调用我们也使用的是Python3。
#实验准备,开始之前需要安装依赖包,命令如下(直接执行即可):

pip3 install --upgrade throttle  adafruit-circuitpython-motor adafruit-circuitpython-pca9685 inputs smbus RPi.GPIO pick board
#实验代码如下:

#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''

import time
from board import SCL, SDA
import busio

from adafruit_pca9685 import PCA9685
from adafruit_motor import servo

#引入i2c
i2c = busio.I2C(SCL, SDA)

#实例化 此处是0x41 驱动板地址修改过导致
pca = PCA9685(i2c, address=0x41)  #地址可以修改  默认0x40
pca.frequency = 50

for i in [0,1,2]:

    servo = servo.Servo(pca.channels[i]) #i是舵机在pca9685上的编号

    #设置脉冲宽度 500到2500是正常的 这个可以自己调整 不设置默认只到135度
    servo.set_pulse_width_range(min_pulse=500, max_pulse=2500)

    #先0度
    servo.angle = 0
    time.sleep(1)

    #再执行90度
    servo.angle = 90
    time.sleep(1)

    #再执行180度
    servo.angle = 180
    time.sleep(1)

    #再恢复90度
    servo.angle = 90
    time.sleep(1)

pca.deinit()
#注意:如果报错board模块的 SCL或者SDA找不到,可以将board文件替换一下,见下面的下载文件; 文件替换地址/home/pi/.local/lib/python3.7/site-packages;地址仅做参考,楼主是这个地址。
#其中关于脉冲宽度部分不同的舵机有不同的设置,具体可参考下图:
#实验效果:
执行效果
#参考文章:https://circuitpython.readthedocs.io/projects/motor/en/latest/index.html#

多个舵机组合驱动实验

#实验目的:测试PCA9685驱动板同时驱动多个不同类型舵机,实现组合动作或者其他自定义动作的效果。
#接线效果如图:
接线示例
#注:S90舵机褐色接GND,红色接VCC,黄色接PWM;MG995舵机黑色接GND。
#关键代码
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
https:://www.shumeijiang.com
'''

from PCA9685 import PCA9685 ##引入驱动类
import time   ##引入time库

pwm = PCA9685()  ##实例化
pwm.setsq(50)    ##设置输出频率50HZ
pwm.init()       ##初始化
pwm.setallangle(0)   ##驱动所有舵机归0

#执行动作
serv = [0, 1, 2, 4 ,5]  #已连接的舵机
for i in serv:
    pwm.setangle(i, 90) #首先到90度
    time.sleep(0.4)     #停顿
    pwm.setangle(i, 0)  #执行到0度
    time.sleep(0.4)

#执行第二套动作
for i in serv:
    pwm.setangle(i, 45) #逐一到45度
    time.sleep(0.4)

for i in serv:
    pwm.setangle(i, 0)  #逐一归0
    time.sleep(0.4)

#最后动作
pwm.setallangle(90)  #所有舵机执行到90度
time.sleep(0.4)
pwm.setallangle(0)   #所有舵机归0
time.sleep(0.4)
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见舵机由左向右,依次完成从0度到90度再到0度的动作;
3、完成动作2后,可见舵机依次先从0度执行到45度;当最后一个舵机执行完成后,从左边向右再依次从45度执行到0度;
4、完成动作3后,所有舵机一起从0度执行到90度,然后再一起执行到0度。
#视频效果如下:

舵机(伺服电机)驱动实验

#实验目的:实验采用树莓派+PCA9685驱动板+MG995舵机组合而成;同时封装一个驱动类,通过命令行接收输入的度数从而让舵机转到到指定位置。
#接线效果如图:
接线示例
#其中驱动板接线示例:
PCA9685
#注:舵机型号不限,只要可外接PCA9685驱动板即可。
#实验代码:
代码示例

#!/usr/bin/env python
#coding:utf-8

'''
from JiuJiang
树莓酱的操作实例
http:://www.shumeijiang.com
'''

from PCA9685 import PCA9685 ##引入驱动类
import time   ##引入time库

pwm = PCA9685()  ##实例化
pwm.setsq(50)    ##设置输出频率50HZ
pwm.init()       ##初始化
pwm.setpwm(0, 0, 4000)

angle = input("angle is:")  ##接收用户指令
pwm.setangle(4, angle)   ##驱动第四个口的舵机执行命令
#pwm.setallangle(50)     ##驱动所有舵机执行命令
#实验效果:
1、执行代码 Python jiujiang.py;
2、可见屏幕输入需要指定度数,输入指定的度数然后回车执行;
3、可见舵机快速转动到指定的位置。
#视频效果如下: