找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23511|回复: 7
打印 上一主题 下一主题
收起左侧

用Arduino自制鼠标(游戏控制杆)

[复制链接]
跳转到指定楼层
楼主



上个月,又有一个鼠标在我手底下阵亡了,作为一个DIY达人,我从盒子里拿出好几个不太好用的鼠标,准备自己攒一个。突然发现手边有一块基于Arduino Leonardo的小型控制板——DFRobot生产的Dreamer Nano,我早就看资料知道Arduino Leonardo能当鼠标或键盘用,一直也没机会试试,正好就用这块控制板自己制作一个鼠标吧!



图1 制作所需的材料
q  1、Dreamer Nano或Arduino Leonardo              1个
q  2、面包板                                                       1块
q  3、按键                                                           5个
q  4、面包板U型线                                            1盒

制作鼠标要用的元件如图1所示,准备好材料后,就可以搭建硬件。Dreamer Nano(如图2所示)的核心是Arduino Leonardo,I/O接口采用Nano的形式,方便与面包板配合使用,USB接口采用带直插定位脚的Mirco USB插座。

图2 Dreamer Nano
制作步骤
1.将Dreamer Nano插在面包板上,这里它的位置比较偏左,是因为之后我们会在其右侧添加一个按键。

2.添加5个按键,摆成上下左右的样子,分别控制鼠标的上下左右移动,另外在控制板的右侧添加一个按键,作为鼠标左键,用来实现鼠标点击功能。

3.我使用Fritzing软件绘制了一个连接效果图,看起来按键的连接很杂乱,其实这是为了迁就U型面包线的长度才这么做的,反正改程序是一件比较容易的事。大家也可以将这些按键连接到其他引脚。
4.按照效果图,用U型面包线将实物连接起来。这样我们的硬件就搭建完了,接下来看看程序部分。

程序设计
1.打开Arduino开发环境,首先要将Tools菜单下的Board选项改为Arduino Leonardo。

2.打开开发环境中鼠标的例子,在File→Examples中专门有一个USB(Leonardo)的选项,在这里面找到Mouse→ButtonMouseControl。这是一个用按键当作鼠标的例子。

3.修改程序中的引脚变量。在原代码中,使用的是引脚2、3、4、5、6作为5个按键的输入。
// set pin numbers for the five buttons:
const int upButton = 2;   
const int downButton = 3;      
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;
这里因为本人在硬件搭建上偷懒的原因,所以使用的引脚有所变化,可根据原理图来修改这段代码,其中引脚4对应按键“上”,引脚6对应按键“下”,引脚7对应按键“左”,引脚9对应按键“右”,引脚3对应鼠标左键。
const int upButton = 4;   
const int downButton = 6;        
const int leftButton = 7;
const int rightButton = 9;
const int mouseButton = 3;


4.修改setup()函数。当Arduino的控制板引脚作为输入时,通常要小心电压、电流的极限值,过大的电压、电流会造成控制板的损坏。为避免这种情况,一般会在引脚的电路上加一个上拉电阻,这里要加就加在按键和Arduino引脚的连接线上,电阻值一般为10kΩ。但其实Arduino控制板内引脚是具有内部上拉功能的,内部上拉相当于是在芯片内集成了一个电阻接+5V电源,不过这需要在程序中进行设定。假设要设定x引脚的模式为输入,且使用内部上拉,则代码为:
pinMode( x ,INPUT);
digitalWrite( upButton , HIGH);
由原理图能够看出,我们使用的按键均没有添加上拉电路,所以需要使用的这5个引脚要使能内部上拉功能。将这段代码添加到Mouse.begin()函数之前。
void setup() {
  // initialize the buttons' inputs:
  pinMode(upButton, INPUT);      
  pinMode(downButton, INPUT);      
  pinMode(leftButton, INPUT);      
  pinMode(rightButton, INPUT);      
  pinMode(mouseButton, INPUT);

  digitalWrite(upButton, HIGH);      
  digitalWrite(downButton, HIGH);      
  digitalWrite(leftButton, HIGH);      
  digitalWrite(rightButton, HIGH);      
  digitalWrite(mouseButton, HIGH);

  // initialize mouse control:
  Mouse.begin();
}

5.完成最后的调试。将修改完之后的代码下载到Arduino中,使用一下,我们发现鼠标左键总是处于按下的状态,通过阅读代码发现,这是因为程序中将引脚为高电平认定为鼠标按下。
if (clickState == HIGH)
{
......
而我们的硬件上,鼠标按下时引脚电平为高,未按下时引脚电平为低。大家可以直接使用“Ctrl+F”搜索“clickState == HIGH”这段字符,将其中的HIGH改为LOW。再下载一遍程序,我们的鼠标就完成了,和原来的鼠标合个影吧。

细心的读者可能会发现,我们这个鼠标只能完成左键的功能,那么右键应该如何实现呢?请大家注意示例代码中关于MOUSE_LEFT的部分(可以直接使用“Ctrl+F”搜索),比如Mouse.press(MOUSE_LEFT)实现的功能就是发送一个鼠标左键按下的信息。我们将MOUSE_LEFT全部换成MOUSE_RIGHT试试,就会发现原来的鼠标左键变成了鼠标右键,所以只需要在硬件上再添加一个按钮,并在代码中使用MOUSE_RIGHT这个定义,就可以实现鼠标右键的功能了。
另外,在示例程序中可以看到还有JoystickMouseControl、Keyboard以及KeyboardAndMouseControl等例子,大家感兴趣的话可以自己试试,比如找一个摇杆来制作一个摇杆式的鼠标,或者用Arduino制作一个游戏专用手柄等等。下图就是本人利用安卓平板电脑、Arduino、按键以及面包板制作的一个老式任天堂游戏机,现在正在玩的游戏是经典的《魂斗罗》。更多的乐趣期待大家去发现。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:138671 发表于 2016-9-7 02:17 | 只看该作者
如何实现滚轮和位移呢
回复

使用道具 举报

板凳
ID:138602 发表于 2016-9-7 09:32 | 只看该作者
能按出来上上下下左右左右BA吗?
回复

使用道具 举报

地板
ID:146030 发表于 2016-11-6 22:41 | 只看该作者
程序在哪啊
回复

使用道具 举报

5#
ID:198286 发表于 2017-6-13 21:47 | 只看该作者
魂斗罗是安卓下的吗?这个按键寿命不咋的,你这个打法一会就挂了
回复

使用道具 举报

6#
ID:104472 发表于 2018-9-25 22:27 | 只看该作者
不错,感觉很新奇,科技就在手中。
回复

使用道具 举报

7#
ID:300101 发表于 2019-9-25 10:10 | 只看该作者
支持楼主再做个真正意义上的摇杆
回复

使用道具 举报

8#
ID:106272 发表于 2020-9-10 13:32 | 只看该作者
可以实现滚轮和位移吗?怎么实现呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表