资讯详情

【树莓派C语言开发】实验14:PS2游戏手柄模块(关联PCF8591)

本实验仍需使用,它必须取代双色吗?LED成为新的常驻嘉宾吗?

QQ图片20220424132543

这个实验是摇杆实验。这个东西可以用来控制机器人或者树莓派的遥控车。当然,生活中最常见的用途是不知道你玩不玩游戏,有没有用手柄玩游戏?

我有一个游戏手柄,玩3a还是挺爽的,哈哈


文章目录

  • 1.实验器材
  • 2.实验原理
    • 2.1电路图
    • 2.2接线图
  • 3.效果演示
    • 3.1代码示例
    • 3.2效果翻车
  • 结语

1.实验器材

  • 树莓派开发板
  • 40p软排线 T型转接板 面包板
  • PS2手柄模块
  • PCF8591模数转换器模块(实验12)
  • 一些跳线
  • 一个

2.实验原理

手柄模块通过在90度角安装两个电位计来判断当前的X和Y值,从而计算手柄的方向。添加一个按钮来判断手柄被按下(即游戏手柄上的L3和R3键的原理)

当该模块处于静态位置时,从X和Y产生约2.5V输出。移动操纵杆将导致0的输出v到5V它们之间的变化取决于它们的方向。如果该模块连接到微控制器,则可以在其静态位置读取约512个值(弹簧和机构的小误差)。移动操纵杆时,应看到该值从0变为1023,这取决于其位置。

该模块有两个模拟输出(对应X和Y在Z轴上按下坐标)和数字输出。

在这个实验中,我们将引脚X和Y连接到PCF8591A/D转换器的模拟输入端口,以便将模拟量转换为数字量。然后在树莓派上编程以检测操纵杆的移动方向

2.1电路图

2.2接线图

树莓派 T型转接板 PCF8591
SDA SDA SDA
SCL SCL SCL
5V 5V VCC
GND GND GND
PS2手柄模块 T型转接板 PCF8591
VRY * AIN 0
VRX * AIN 1
SW * ANI 2
5V 5V 5V
GND GND GND

这是我的接线图。可以直接用双母头跳线连接PCF8591和手柄模块,但还是借助T型转接板连接两者。

3.效果演示

3.1代码示例

//PS2操作杆实验 #include <stdio.h> #include <wiringPi.h> #include <pcf8591.h>  #define makerobo_PCF 120 // 基础管脚120 #define uchar unsigned char  int pcf_AIN0 = makerobo_PCF   0; // AIN0 端口 int pcf_AIN1 = makerobo_PCF   1; // AIN1 端口 int pcf_AIN2 = makerobo_PCF   2; // AIN2 端口  // 方向状态信息  char *state[7] = { 
        "home", "up", "down", "left", "right", "pressed"};

// 方向判断函数
int makerobo_direction(){ 
        
	int ain_x, ain_y, ain_b;       // X方向,Y方向,B 是否按下
	int makerobo_tmp=0;            // 状态值
	ain_x = analogRead(pcf_AIN1);  // X为AIN1端口
	ain_y = analogRead(pcf_AIN0);  // Y为AIN0端口
	ain_b = analogRead(pcf_AIN2);  // B按下为AIN2端口
	
	if (ain_y <= 30)
		makerobo_tmp = 1;		// up
	if (ain_y >= 225)
		makerobo_tmp = 2;		// down
	
	if (ain_x >= 225)
		makerobo_tmp = 4;		// left
	if (ain_x <= 30)
		makerobo_tmp = 3;		// right

	if (ain_b == 0)
		makerobo_tmp = 5;		// button 按下
	if (ain_x-125<15 && ain_x-125>-15 && ain_y-125<15 && ain_y-125>-15 && ain_b >= 60)
		makerobo_tmp = 0;		// home 位置
	
	return makerobo_tmp;
}

// 主函数
int main (void)
{ 
        
	int makerobo_tmp=0;       // 当前值
	int makerobo_status = 0;  // 状态值
	wiringPiSetup ();
	// 在基本引脚120上设置pcf8591,地址0x48
	pcf8591Setup (makerobo_PCF, 0x48);
	// 无线循环
	while(1) 
	{ 
        
		makerobo_tmp = makerobo_direction(); // 调用方向判断函数
		if (makerobo_tmp != makerobo_status) // 判断状态是否发生改变
		{ 
        
			printf("%s\n", state[makerobo_tmp]); // 打印出方向位
			makerobo_status = makerobo_tmp;      
            // 把当前状态赋给状态值,以防止同一状态多次打印
		}
	}
	return 0 ;
}

这部分比较好理解,代码也很直观。只有home位置需要我们单独进行计算(即手柄处于正中心区域且没有按下的情况,才是home的情况)

3.2效果翻车

不过轮到实际测试的时候,翻大车了。在我还没有动摇杆的时候,它就会显示出左和按钮被按下的提示。我尝试修改代码来修复这个错误,发现并不可行

于是我直接把代码给注释掉,加了一个打印X\Y\B当前值的代码

结果呢,在我没动摇杆的时候,打印出来的X和Y都是乱七八糟的。只有按下摇杆的B=0可以被正常检测到,其他的方位啥的都是毫无反应。

直接给这个模块下达了死亡通知书,拜拜了您嘞!

结语

通过学习这个模块的代码,可以看到实际上一些零部件的基本原理并不是非常难掌握。不过你想把一个摇杆变成一个完整的游戏手柄,那就需要更复杂的控制代码和手柄的内部芯片来转义这些数字值了。

有什么问题的话,可以在评论区提出呢

还是有所收获的,

标签: x9241ayp数字电位器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台