【树莓派C语言开发】实验14:PS2游戏手柄模块(关联PCF8591)
本次实验还是需要用到PCF8591模数转换器,莫非它要取代双色LED成为新的常驻嘉宾吗?
本次实验是摇杆实验。这个玩意可以用于操控机器人或者是树莓派的遥控小车。当然,生活中最常见的用途还是在游戏手柄上。不知道你打不打游戏,有没有用过手柄玩游戏呢?
本人有一个游戏手柄,玩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的输出。移动操纵杆将导致输出在0v到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 charint 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; // upif (ain_y >= 225)makerobo_tmp = 2; // downif (ain_x >= 225)makerobo_tmp = 4; // leftif (ain_x <= 30)makerobo_tmp = 3; // rightif (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,地址0x48pcf8591Setup (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可以被正常检测到,其他的方位啥的都是毫无反应。
直接给这个模块下达了死亡通知书,拜拜了您嘞!
结语
通过学习这个模块的代码,可以看到实际上一些零部件的基本原理并不是非常难掌握。不过你想把一个摇杆变成一个完整的游戏手柄,那就需要更复杂的控制代码和手柄的内部芯片来转义这些数字值了。
有什么问题的话,可以在评论区提出呢
还是有所收获的,要是摇杆没坏就好了
【树莓派C语言开发】实验14:PS2游戏手柄模块(关联PCF8591)相关推荐
- 【树莓派C语言开发】实验12:PCF8591模数转换器模块
文章目录 前言 1.实验器材 2.实验原理 2.0 元件介绍 2.1 i2c总线 2.2 第一字节 2.3 控制字节 2.4 模块电路 2.5 电路接线 3.程序控制 3.1 在树莓派中开启I2C 3 ...
- 【树莓派C语言开发】实验01:双色LED
文章目录 前言 1.实验器材 2.实验原理 3.控制代码 3.1显示器的PWM调光和DC调光 3.2 编译代码 3.2.1直接使用Geany编译器内部选项 3.2.2 使用linux语言 4.如何在使 ...
- 【树莓派C语言开发】实验02:RGB小灯
文章目录 前言 1.实验器材 1.1树莓派运行库准备 2.元件接线 3.函数解释 3.1关于softPwmWrite的使用问题,大大的疑惑 4.代码样例 4.1初始化针脚 4.2颜色参数设置 4.3完 ...
- 【树莓派C语言开发】实验03:七彩LED模块
文章目录 前言 1.实验器材 2.实验接线 3.实验效果 结语 前言 学习太累,那就玩玩树莓派"陶冶情操"吧! 关注本专栏,和我一起学习树莓派开发板30+经典实验! C语言代码,0 ...
- 【树莓派C语言开发】实验10:干簧管传感器
文章目录 前言 1.实验器材 2.实验原理 2.1电路图 2.2接线图 3.代码示例 3.1编译代码 3.1.1 GCC中-Wall指令的作用 3.2实验效果 结语 前言 好像没啥可以说的,直接开始进 ...
- 【树莓派C语言开发】实验07:倾斜开关模块
文章目录 前言 1.实验器材 2.实验原理 2.1实验接线 2.2实物接线图 3.代码示例 3.1部分代码解释 去抖动操作 直接用`==`比较字符串 3.2 Linux编译运行代码 3.3运行效果 结 ...
- 【树莓派C语言开发】实验08:振动开关模块
文章目录 前言 1.实验器材 2.实验原理 2.1电路图 2.2接线图 3.代码示例 3.1代码思路讲解 参数`clb_tmp`问题 3.2linux运行代码 结语 前言 今天折腾vim编辑器折腾了老 ...
- 【树莓派C语言开发】实验09:有源和无源蜂鸣器模块
文章目录 前言 1.实验器材 2.实验原理 3.有源蜂鸣器模块 3.1代码示例 3.2编译代码 3.3实验效果 4.无源蜂鸣器 4.1代码示例 音符频率对照表 softTone软件音频库 4.2编译代 ...
- 【树莓派C语言开发】实验15:电位计传感器(关联PCF8951)
今天的这个实验需要用上两位常驻嘉宾! 它们就是PCF8591和双色LED! 文章目录 1.实验器材 2.实验原理 2.1基本原理 2.2接线图 3.实验效果 3.1代码示例 3.2实验效果 结语 1. ...
最新文章
- 16、设计模式-行为型模式-命令模式
- 智源论坛报名丨斯坦福大学马腾宇博士:为深度模型设计显示正则器
- 人人出售56不亏:三方得利
- Java利用POI生成Excel强制换行
- Docker 安装 Redis
- Raspberry Pi 4B安装 OpenVINO™ 工具包
- boost::hana::common用法的测试程序
- 某中学的排课管理系统_某中学的排课管理系统(SQL的简单应用)
- libsvm中数据归一化的重要性
- CentOS7.X安装Redis-4.0.8以及Redis集群搭建
- 电子计算机电缆用引流线,本质安全防爆电路用仪表计算机电缆
- “新基建”提速,数字化硬核人才,你们准备好了吗?
- 自定义键盘组件_WEB组件终极开发手册:让玩家没了鼠标也能操作
- 何时及为何使用代表? [重复]
- Java中创建子类实例时会创建父类实例?
- P-Called-Party-ID头域
- python 京东 价格监控_双十一购物 || Python监控商品价格 插件监控
- [漏洞分析] CVE-2021-3560 PolKit条件竞争本地提权分析
- Android电池信息
- 独孤思维:什么项目又好又赚钱?