Switch配件joycon摇杆模块的各个IO定义和用法说明

前言:前段时间在研究CH552G这个单片机,就浅浅的学了一下鼠标键盘的HID模拟,之后就在想着找个摇杆模块做个摇杆鼠标之类的,找来找去就找到了joycon的摇杆,有一说一这个小摇杆手感真的舒服,但是在网上找相关资料的时候就犯了难,网上还真的没多少资料来让我研究。即使如此,我还是买来准备研究研究。

        注意!注意!本文中的图片和文本中的所有VCC与GND全部标反了,请在实际运用中注意这点,以免造成损失!!!

        具体原因请翻至本文末尾,有一些解释说明

买来之后发现,这个摇杆跟我想的一样,有5个引脚,标准的0.5间距FPC接口:

这样就方便了,因为以我对摇杆的理解,摇杆这东西,肯定是由两个电位器和一个button组成的,算上VCC和GND,正好是5个接口。

在理论基础打好后我就开始使用万用表一个个测阻值,来确定VCC和GND,确定这两个之后在以此为基础测量出X轴和Y轴两个引脚,最后按住用蜂鸣档测通路,于是便得到了下面这张IO引脚定义图(图中VCC与GND未更正,注意) 知道引脚定义了不就简单了嘛,简简单单通过ADC电路驱动就行了,但是别着急嘛,毕竟是我的教程,当然会给出一些额外参数的嘛。

以图片显示方向:

        右方向推动ADC-X增加;左方向推动ADC-X减少;

        上方向推动ADC-Y增加;下方向推动ADC-Y减少。

除此之外,通过STC15f2k60s2自带的ADC采集,定义使用8位分辨率来进行ADC采集,在摇杆不动的时候测得数据如下:

ADC值抖动范围
X轴128±2
Y轴123±2

 分别在摇杆上下左右推到底的时候在看测量值,得到数据如下(方向和图示一致):

X-MINXX-MAX
X轴42128±2234
Y轴33123±2225

注意:关于Key按键按下时IO口读取的问题

        因为有电位器的存在,如果使用传统8051引脚进行电平读取的话,是读取不到低电平的,我的理解是因为电位器上方接VCC,所以同等于对这个IO口进行了上拉操作(不知道这么理解对不对)。

        那么这个问题怎么解决呢?其实很简单,在初始化输入引脚为高电平后,同时在输入IO口加个4.7k的下拉电阻就可以让IO口读取到摇杆按下时候的低电平了。

分割线===========================================================

        上文写于2022年7月13日,由于当时购得的是便宜的碳膜摇杆,所以VCC与GND的定义本身很模糊,而前段时间在研究CH582的2.4G遥控又想起了这个小玩意儿,所以又拿出来尝试使用,结果竟然因为长时间不用而产生了阻值漂移的现象,所以花的贵一点的买了个霍尔摇杆,这时候也是在这时候发现,VCC和GND标反了,上电摇杆都在发烫,吓得我赶紧拔下来,经过思考后才感觉是接反了,实践后发现果然接反了。

        其次,Key键是没有上拉电阻的,其在没按下的时候是完全悬空的,按下时与GND接触,在实际使用时需要对VCC外加上拉电阻

  • 10
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在中,可以使用`Scanner`类或`BufferedReader`类来实现输入输出流的操作。在switch语句中,可以在每个case分支中使用`Scanner`类或`BufferedReader`类来获取用户输入的值,然后进行相应的处理。 例如,下面是一个使用`Scanner`类在switch语句中增加io流的示例代码: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请选择操作:"); System.out.println("1. 输入用户名"); System.out.println("2. 输入密码"); int choice = scanner.nextInt(); switch (choice) { case 1: System.out.println("请输入用户名:"); String username = scanner.next(); // 对用户名进行处理 break; case 2: System.out.println("请输入密码:"); String password = scanner.next(); // 对密码进行处理 break; default: System.out.println("无效的选择!"); break; } scanner.close(); } } ``` 在if else语句中,也可以使用类似的方式来增加io流。例如,下面是一个使用`BufferedReader`类在if else语句中增加io流的示例代码: ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入一个整数:"); int num = Integer.parseInt(reader.readLine()); if (num > 0) { System.out.println("这是一个正数。"); } else if (num < 0) { System.out.println("这是一个负数。"); } else { System.out.println("这是零。"); } reader.close(); } } ``` 需要注意的是,在使用io流时,需要及时关闭流对象,以释放资源。可以使用`close()`方法来关闭流对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值