分享

创客生活|谢作如老师教你自制MaKeyMaKey

 长沙7喜 2016-10-08


MaKeyMaKey是大众融资平台Kickstarter上的一个项目,由两位MIT在读博士设计。它能将日常物品变成触摸板,然后连上电脑和网络。

MaKeyMaKey由三个部分组成:MaKey MaKey主板,鳄鱼夹和数据线。对于任何导体(表面湿润的绝缘体也可以)来说,只要用鳄鱼嘴导线将物体与电路板上的各个金属触点相连,然后再连接电脑,就可达到触摸板的效果,成为一个计算机输入设备。


MaKeyMaKey能够模拟键盘和鼠标的信号,结合电脑中现成的游戏和媒体播放器之类的软件,不用编程,就能够设计简单的互动媒体作品了,常见的是用来做水果键盘,如图1所示。MaKeyMaKey 的意义在于它可以用极其简单的方法让艺术家创造艺术,让孩子体验技术带来的乐趣,因而称为是孩子们21世纪的发明工具包。


图1:MaKeyMaKey连接水果

MaKeyMaKey并不贵,淘宝上能买到,大概500左右。但是作为一名创客,当然要试着自己来做一块。论技术难度倒真不高,只要稍微懂一点Arduino的基础知识就能实现。


1
设计输入模块

MaKeyMaKey的神奇在于能够把任何导体,包括人体)、表面湿润的绝缘体变成输入设备。对照运行图2所示的工作原理,我们可以发现,人体无非是一个选择性的开关,让不同的“键”(引脚)和“Gnd”连接起来,形成一个回路,让单片机能识别,如图3所示。

图2:MaKeyMaKey运行图示

图3:MaKeyMaKey运行图示

作为输入设备,我们知道最基础的电路如图4所示。这其实就是一个典型的分压电路,Vout的电压是受R1和R2的电阻值大小影响。R2的电阻越大,Vout分到的电压也就越大。但是,由于作为人体的电阻很大,如何选择合适的电阻是重点。

图4:输入模块的电路示意图

如果熟悉计算分压电路,可以试着计算一下。一般在干燥环境中,人体电阻大约在2千欧-20兆欧范围内,那么作为匹配的电阻,应该选择这一范围的中间值,即10兆欧。经过测试,一般来说,1-10兆欧的电阻基本上都能比较敏感地测出是否形成了回路。


2
控制板的选择

控制板方面,我们当然要选择开源硬件Arduino。MaKeyMaKey本身就和Arduino有着密不可分的关系。不信你可以查看MaKeyMaKey板子的背后,是否写着Arduino的字样?


Arduino也有多种型号,我们用Leonardo还是UNO?因为Leonardo直接使用了ATmega32u4的USB通信功能,取消了USB转UART芯片,这使得Leonardo不仅可以作为一个虚拟的(CDC)串行/ COM端口,还可以作为鼠标或者键盘连接到计算机。


那么,第一选择肯定是Leonardo了。其实,国内有很多Arduino的兼容产品,有些用的芯片就是ATmega32u4。只要是用这一芯片的,都可以改造为键盘和鼠标。

图5:Leonardo


3
 Arduino编程

Arduino IDE中直接了提供模拟键盘、鼠标功能的范例,在“示例”-“09 USB”中,如图所示。范例中有英文的注释,很容易看懂。要实现键盘和鼠标功能,只要关注以下两点。


1、在setup函数中,加上“Mouse.begin();Keyboard.begin();”的声明。

2、输入按键信息,直接用“Keyboard.press('l');”即可。“Keyboard.releaseAll();”为释放按键。特殊字符,可以用KEY_LEFT_ALT之类的常量来代替。

图6:Arduino自带的范例文件

依样画葫芦,我写了如下的代码,其中TouchSensitivity用来调节输入模块的敏感度的。代码中我定义了A0到A5口,分别对应“右、左、下、上”的方向键,以及空格和鼠标左键。

int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;  

int TouchSensitivity = 300;

void setup()

{ Mouse.begin();

  Keyboard.begin();

}

 void loop()

{ InData0 = analogRead(A0);

  InData1 = analogRead(A1);

  InData2 = analogRead(A2);

  InData3 = analogRead(A3);

  InData4 = analogRead(A4);

  InData5 = analogRead(A5);

  if(InData0 >= TouchSensitivity)

  {    Keyboard.press(KEY_RIGHT_ARROW); //right

  }

  if(InData1 >= TouchSensitivity)

  {    Keyboard.press(KEY_LEFT_ARROW);  //left

  }

  if(InData2 >= TouchSensitivity)

  {    Keyboard.press(KEY_DOWN_ARROW); //down

  }

  if(InData3 >= TouchSensitivity)

  {    Keyboard.press(KEY_UP_ARROW);  //up

  }

  if(InData4 >= TouchSensitivity)  //空格键

  {    Keyboard.press(32);

  }

  if(InData5 >= TouchSensitivity) //鼠标左键

  {    Mouse.click(MOUSE_LEFT);

  }

  Keyboard.releaseAll();

  delay(100);


4
对MaKeyMaKey的改进


      测试一下这块自制的MaKeyMaKey,除了我仅仅写了最常用的6个键外,其他几乎一模一样。既然是自制的MaKeyMaKey,我们总要做点改进:

1、解放另一只手。

      总是一只手接上Gnd线,另一只手触碰导体,才可以模拟出按键或者鼠标的动作,还是不方便。如何做才能更方便?很简单,换成触摸传感器作为输入设备,就可以解放另一只手了。当然,我们也可以用红外测距传感器、红外遥控之类,连手都不用碰,也能和电脑交互,不是更有趣了吗?


2、远程控制。

      用蓝牙把两块Arduino连接起来,其中一块接电脑做接收端,模拟鼠标键盘,另一块加上特定的传感器做控制。哦,这不是无线鼠标了吗?是啊,如果加上三轴加速度传感器,就是空中飞鼠了。我看过有人把板子缝在帽子上,实现了用头部控制鼠标来玩游戏。


      其实,这款自制的Arduino能做的很多,只要你大胆想象。那么,是不是只能用Leonardo之类带ATmega32u4芯片的板子,才能模拟MaKeyMaKey?答案当然是否定的。在创客们的眼里,一件事情往往有很多种解决方案。比如,我们可以编一个客户端,用串口和Arduino连接,然后把串口的信息转化为模拟按键。


来源:中国信息技术教育

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多