本次实验还是需要用到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)相关推荐

  1. 【树莓派C语言开发】实验12:PCF8591模数转换器模块

    文章目录 前言 1.实验器材 2.实验原理 2.0 元件介绍 2.1 i2c总线 2.2 第一字节 2.3 控制字节 2.4 模块电路 2.5 电路接线 3.程序控制 3.1 在树莓派中开启I2C 3 ...

  2. 【树莓派C语言开发】实验01:双色LED

    文章目录 前言 1.实验器材 2.实验原理 3.控制代码 3.1显示器的PWM调光和DC调光 3.2 编译代码 3.2.1直接使用Geany编译器内部选项 3.2.2 使用linux语言 4.如何在使 ...

  3. 【树莓派C语言开发】实验02:RGB小灯

    文章目录 前言 1.实验器材 1.1树莓派运行库准备 2.元件接线 3.函数解释 3.1关于softPwmWrite的使用问题,大大的疑惑 4.代码样例 4.1初始化针脚 4.2颜色参数设置 4.3完 ...

  4. 【树莓派C语言开发】实验03:七彩LED模块

    文章目录 前言 1.实验器材 2.实验接线 3.实验效果 结语 前言 学习太累,那就玩玩树莓派"陶冶情操"吧! 关注本专栏,和我一起学习树莓派开发板30+经典实验! C语言代码,0 ...

  5. 【树莓派C语言开发】实验10:干簧管传感器

    文章目录 前言 1.实验器材 2.实验原理 2.1电路图 2.2接线图 3.代码示例 3.1编译代码 3.1.1 GCC中-Wall指令的作用 3.2实验效果 结语 前言 好像没啥可以说的,直接开始进 ...

  6. 【树莓派C语言开发】实验07:倾斜开关模块

    文章目录 前言 1.实验器材 2.实验原理 2.1实验接线 2.2实物接线图 3.代码示例 3.1部分代码解释 去抖动操作 直接用`==`比较字符串 3.2 Linux编译运行代码 3.3运行效果 结 ...

  7. 【树莓派C语言开发】实验08:振动开关模块

    文章目录 前言 1.实验器材 2.实验原理 2.1电路图 2.2接线图 3.代码示例 3.1代码思路讲解 参数`clb_tmp`问题 3.2linux运行代码 结语 前言 今天折腾vim编辑器折腾了老 ...

  8. 【树莓派C语言开发】实验09:有源和无源蜂鸣器模块

    文章目录 前言 1.实验器材 2.实验原理 3.有源蜂鸣器模块 3.1代码示例 3.2编译代码 3.3实验效果 4.无源蜂鸣器 4.1代码示例 音符频率对照表 softTone软件音频库 4.2编译代 ...

  9. 【树莓派C语言开发】实验15:电位计传感器(关联PCF8951)

    今天的这个实验需要用上两位常驻嘉宾! 它们就是PCF8591和双色LED! 文章目录 1.实验器材 2.实验原理 2.1基本原理 2.2接线图 3.实验效果 3.1代码示例 3.2实验效果 结语 1. ...

最新文章

  1. 16、设计模式-行为型模式-命令模式
  2. 智源论坛报名丨斯坦福大学马腾宇博士:为深度模型设计显示正则器
  3. 人人出售56不亏:三方得利
  4. Java利用POI生成Excel强制换行
  5. Docker 安装 Redis
  6. Raspberry Pi 4B安装 OpenVINO™ 工具包
  7. boost::hana::common用法的测试程序
  8. 某中学的排课管理系统_某中学的排课管理系统(SQL的简单应用)
  9. libsvm中数据归一化的重要性
  10. CentOS7.X安装Redis-4.0.8以及Redis集群搭建
  11. 电子计算机电缆用引流线,本质安全防爆电路用仪表计算机电缆
  12. “新基建”提速,数字化硬核人才,你们准备好了吗?
  13. 自定义键盘组件_WEB组件终极开发手册:让玩家没了鼠标也能操作
  14. 何时及为何使用代表? [重复]
  15. Java中创建子类实例时会创建父类实例?
  16. P-Called-Party-ID头域
  17. python 京东 价格监控_双十一购物 || Python监控商品价格 插件监控
  18. [漏洞分析] CVE-2021-3560 PolKit条件竞争本地提权分析
  19. Android电池信息
  20. 独孤思维:什么项目又好又赚钱?

热门文章

  1. Q:python编码
  2. 不稳定就是人生常态,要坚信未来一定会非常美好
  3. 做人最重要的是学会珍惜,爱情如此,人生又何尝不是呢?
  4. Hibernate简单配置
  5. 项目管理之关键链法VS关键路径法
  6. 高级计算机软考科目,软考高级中哪个科目好考
  7. 网传人人车破产,或是改变销售模式?-千氪
  8. K660E I7 D4 clover 引导黑苹果完美驱动
  9. 工程机械远程监控系统
  10. 如何把PDF中一些页面拆分成每一页单独的文件