ps2摇杆传感器实验

实验目的:通过实验获取摇杆传感器对应的方向以及数值。从而为摇杆应用提供支持。
传感器示例
    因为摇杆获取的是模拟信号,我们需要将模拟信号转换为数字信号;因此传感器需要配合PCF8591数模转换模块使用。
接线示例:
引脚连接引脚
摇杆GND树莓派GND
摇杆+5V树莓派5V
摇杆VRXPCF8591的AIN0
摇杆VRYPCF8591的AIN1
摇杆SWPCF8591的AIN2

代码示例:


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

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

import time      ##引入time库
import smbus     ##引入控制总线

address = 0x48    ##传感器地址
xAddress = 0x40   ##x轴使用的地址 对应的AIN0
yAddress = 0x41   ##y轴使用的地址 对应的AIN1
zAddress = 0x42   ##z轴使用的地址 对应的AIN2

bus = smbus.SMBus(1)   ##开启总线

##定义监测方法
def getStatus(n):
    if not n: return
    global address

    map = {'x':xAddress, 'y':yAddress, 'z':zAddress}
    if n not in map.keys():
        return False

    #发送一个控制字节到设备 表示要读取n通道的数据
    bus.write_byte(address, map[n])

    #空读一次 消费掉无效数据(重要)
    bus.read_byte(address)

    #返回某通道输入的模拟值A/D转换后的数字值
    return bus.read_byte(address)

##获取方位信息
def getDirection(n):
    if not n: return
    num = getStatus(n)
    num = int(num)

    mess = ''
    if n == 'x':
        if num > 150: mess = 'backward'
        if num < 125: mess = 'forward'

    if n == 'y':
        if num > 150: mess = 'left'
        if num < 125: mess = 'right'

    if n == 'z':
        if num == 0: mess = 'pressed'

    return mess
其中PCF8591数模转换模块参考:https://www.shumeijiang.com/2022/10/30/pcf8591-da数模转换实验.html

PCF8591 DA数模转换实验

实验目的:实验采用PCF8591数模转换板,实现数字信号(Digital signal)到模拟信号(Analog signal)以及模拟信号到数字信号之间的转换。其中数字信号可以理解为”有无“(高电平或低电平),模拟信号则可以理解为”多少“(可以显示信号量多少)。
#传感器如图:
各引脚说明:
引脚含义接线
SDAI2C通信接口接树莓派SDA
SCLI2C通信接口接树莓派SCL
GND接地接口接树莓派GND
VCC电源接口(3.3V~5V)接树莓派5V(重要)
AOUTDA(数模)输出接口,输出模拟信号
AIN0模拟输入接口0
AIN1模拟输入接口1
AIN2模拟输入接口2
AIN3模拟输入接口3
此处用ps2摇杆传感器测试:
1、GND接树莓派GND;
2、+5V接树莓派5V;
3、VRX接PCF8591的AIN0;
4、VRY接PCF8591的AIN1;
5、SW接PCF8591的AIN3。
实验代码:

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

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

import time      ##引入time库
import smbus     ##引入控制总线

address = 0x48    ##传感器地址
xAddress = 0x40   ##x轴使用的地址 对应的AIN0
yAddress = 0x41   ##y轴使用的地址 对应的AIN1
zAddress = 0x42   ##z轴使用的地址 对应的AIN2

bus = smbus.SMBus(1)   ##开启总线

##定义监测方法
def getStatus(n):
    if not n: return
    global address

    map = {'x':xAddress, 'y':yAddress, 'z':zAddress}
    if n not in map.keys():
        return False

    #发送一个控制字节到设备 表示要读取n通道的数据
    bus.write_byte(address, map[n])

    #空读一次 消费掉无效数据(重要)
    bus.read_byte(address)

    #返回某通道输入的模拟值A/D转换后的数字值
    return bus.read_byte(address)

#获取数值
try:
    while True:
        xN = getStatus('x') #获取x轴
        yN = getStatus('y') #获取y轴
        zN = getStatus('z') #获取z轴

        print('x num is', xN)
        print('y num is', yN)
        print('z num is', zN)
        print("\n")

        time.sleep(0.3)

except KeyboardInterrupt:
    print('stop')
执行Python3 jiujiang.py
执行效果:
注意:其中PCF8591模块是8位的数模转换芯片,所以其输出的数字量是2的8次方也就是256种;也就是0到255区间范围。然后这个区间将5V电压平均分为255份。
实验前,需要先打开树莓派I2c协议支持。

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