极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23384|回复: 8

自制MakeyMakey

[复制链接]
发表于 2014-2-1 21:53:24 | 显示全部楼层 |阅读模式
本帖最后由 Keke 于 2014-2-1 22:02 编辑

看了MackeyMakey,动了仿制的念头,可能是原理超级简单吧,网上迅速出现复制品,目前我看到的最便宜的是一个sheild,因此买了一个,自己写了程序,分享一下,大家拍砖

材料
Arduino Leonardo(实验中我用了Yun,但只用了Leonardo部分)   一块
Mackey sheild [/td] 一块[/tr]
鳄鱼夹 [/td] 7个[/tr]



电路
超简单,就不上详细大图了,arduino通过USD接电脑,每个鳄鱼夹夹住了一个橙子或者苹果


代码
[pre lang="arduino" line="1" file="PianoKey"]


int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;  //触摸输入值暂存
int TouchSensitivity = 50; //触摸灵敏度。0~1023,越大越不灵敏
int cycle = 0;

void setup()
{
  Serial.begin(9600);

  for(int i = 6; i <= 12; i++)
    {
      pinMode(i, OUTPUT);                        
    }
   
  Keyboard.begin();
}

void loop()
{

  //读取所有引脚电压值,并且由于上拉电阻原因,
  //默认所有引脚为最高电平1023,通过触摸拉低引脚电平。
  //所以数值由1024-analogRead(A0);
  
  InData0 = 1024 - analogRead(A0);               
  InData1 = 1024 - analogRead(A1);
  InData2 = 1024 - analogRead(A2);
  InData3 = 1024 - analogRead(A3);
  InData4 = 1024 - analogRead(A4);
  InData5 = 1024 - analogRead(A5);
  
  //按照各种可能触发键盘事件
  if(InData0 >= TouchSensitivity)
   {
     Serial.print("InData0=");
     Serial.println(InData0);
     digitalWrite(6, HIGH);   
     Keyboard.press('a');   

   }
   else
     digitalWrite(6, LOW);

   
  if(InData1 >= TouchSensitivity)
   {
     Serial.print("InData1=");
     Serial.println(InData1);
     digitalWrite(7, HIGH);
     Keyboard.press('s');   
   }
   else
     digitalWrite(7, LOW);

     
  if(InData2 >= TouchSensitivity)
   {
     Serial.print("InData2=");
     Serial.println(InData2);
     digitalWrite(8, HIGH);
     Keyboard.press('d');   
   }
  else
    digitalWrite(8, LOW);
     
  if(InData3 >= TouchSensitivity)
   {
     Serial.print("InData3=");
     Serial.println(InData3);
     digitalWrite(9, HIGH);
     Keyboard.press('f');   
   }
  else
    digitalWrite(9, LOW);
      
  if(InData4 >= TouchSensitivity)
   {
     Serial.print("InData4=");
     Serial.println(InData4);
     digitalWrite(10, HIGH);
     Keyboard.press('g');   
   }
   else
     digitalWrite(10, LOW);
      
  if(InData5 >= TouchSensitivity)
   {
     Serial.print("InData5=");
     Serial.println(InData5);
     digitalWrite(11, HIGH);
     Keyboard.press('h');   
   }
   else
     digitalWrite(11, LOW);
     
  Serial.println("cycle");
  Serial.println(cycle++);
  delay(200);
  //
  
}
[/code]

调测
连接Arduino到电脑USB口,则Arduino自动成为一个键盘,Arduino的系统自带的Mouse Keyboard库目前只能支持Leonardo, Micro, 和Due,经我实测,Yun也是OK的,但Uno不行,我不知道为什么这个国内最流行的板子不能直接支持Mouse Keyboard库(之前我下了一个USBKeyboard库在Uno上基本调测不同,因此放弃,换了板子采用了Arduino自己的库)
连好之后再找一个钢琴或者琴键弹奏软件,琴键分别对应电脑的键盘 a,s, d, f, g, h 等按键,此类软件非常多,我在Mac上用的是CutieMelody

不废话了,上一段视频


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-2-1 22:07:14 | 显示全部楼层
经过调测,发现上面的代码有一个小问题,就是如果拿着橙子不松手,则会出现琴键的“连击”现象,说起来也不算问题,但还是做了优化,修改一下,代码如下,另外,顺便说一句,通过手感来感觉,苹果比橙子电阻更大,触摸时不如橙子灵敏。
  1. /* Date : Feb 2nd, 2014
  2.    Author : Zhou Keke
  3.    Description:
  4.    1.Simulate the keyboard to play the piano software by sending a, s,d,f,g,h key to the computer
  5.    2.Solve the problem of sending the one key to computer continuously.
  6. */


  7. int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;  //触摸输入值暂存
  8. int aKeyPressed = 0, sKeyPressed = 0, dKeyPressed = 0, fKeyPressed = 0, gKeyPressed = 0, hKeyPressed = 0;
  9. int TouchSensitivity = 50; //触摸灵敏度。0~1023,越大越不灵敏
  10. int cycle = 0;

  11. void setup()
  12. {
  13.   Serial.begin(9600);
  14.   
  15.   for(int i = 6; i <= 12; i++)
  16.     {
  17.       pinMode(i, OUTPUT);                        
  18.     }
  19.    
  20.   Keyboard.begin();
  21. }

  22. void loop()
  23. {
  24.   //UsbKeyboard.update();
  25.   //读取所有引脚电压值,并且由于上拉电阻原因,
  26.   //默认所有引脚为最高电平1023,通过触摸拉低引脚电平。
  27.   //所以数值由1024-analogRead(A0);
  28.   
  29.   InData0 = 1024 - analogRead(A0);               
  30.   InData1 = 1024 - analogRead(A1);
  31.   InData2 = 1024 - analogRead(A2);
  32.   InData3 = 1024 - analogRead(A3);
  33.   InData4 = 1024 - analogRead(A4);
  34.   InData5 = 1024 - analogRead(A5);
  35.   
  36.   //按照各种可能触发键盘事件
  37.   if(InData0 >= TouchSensitivity){
  38.      Serial.print("InData0=");
  39.      Serial.println(InData0);
  40.      digitalWrite(6, HIGH);   
  41.      if(aKeyPressed == 0){
  42.         Keyboard.write('a');  
  43.      }  
  44.      aKeyPressed = 1;
  45.    }
  46.    else{
  47.      aKeyPressed = 0;
  48.      digitalWrite(6, LOW);
  49.    }

  50.    
  51.   if(InData1 >= TouchSensitivity){
  52.      Serial.print("InData1=");
  53.      Serial.println(InData1);
  54.      digitalWrite(7, HIGH);
  55.      if(sKeyPressed == 0){
  56.         Keyboard.write('s');  
  57.      }   
  58.      sKeyPressed = 1;
  59.    }
  60.    else {
  61.      sKeyPressed = 0;
  62.      digitalWrite(7, LOW);
  63.    }

  64.      
  65.   if(InData2 >= TouchSensitivity){
  66.      Serial.print("InData2=");
  67.      Serial.println(InData2);
  68.      digitalWrite(8, HIGH);
  69.      if(dKeyPressed == 0){
  70.         Keyboard.write('d');  
  71.      }   
  72.      dKeyPressed = 1;
  73.    }
  74.   else {
  75.     dKeyPressed = 0;
  76.     digitalWrite(8, LOW);
  77.   }
  78.      
  79.   if(InData3 >= TouchSensitivity){
  80.      Serial.print("InData3=");
  81.      Serial.println(InData3);
  82.      digitalWrite(9, HIGH);
  83.      if(fKeyPressed == 0){
  84.         Keyboard.write('f');  
  85.      }      
  86.      fKeyPressed = 1;
  87.    }
  88.   else{
  89.     fKeyPressed = 0;
  90.     digitalWrite(9, LOW);
  91.   }
  92.       
  93.   if(InData4 >= TouchSensitivity){
  94.      Serial.print("InData4=");
  95.      Serial.println(InData4);
  96.      digitalWrite(10, HIGH);
  97.      if(gKeyPressed == 0){
  98.         Keyboard.write('g');  
  99.      }        
  100.      gKeyPressed = 1;
  101.    }
  102.    else{
  103.      gKeyPressed = 0;
  104.      digitalWrite(10, LOW);
  105.    }
  106.       
  107.   if(InData5 >= TouchSensitivity){
  108.      Serial.print("InData5=");
  109.      Serial.println(InData5);
  110.      digitalWrite(11, HIGH);
  111.      if(hKeyPressed == 0){
  112.         Keyboard.write('h');  
  113.      }     
  114.      hKeyPressed = 1;
  115.    }
  116.    else{
  117.      hKeyPressed = 0;
  118.      digitalWrite(11, LOW);
  119.    }
  120.      
  121.   Serial.println("cycle");
  122.   Serial.println(cycle++);
  123.   delay(100);
  124.   //
  125.   
  126. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2014-2-1 22:45:35 | 显示全部楼层
嗯。。。关于楼主提到的UNO不能使用Mouse功能的现象,可能Leonardo使用的ATmega32u4处理器有关,这个处理器集成了USB——UART的功能所以可以当作电脑的输入设备使用。但是UNO不是这种处理器,所以不可以当作鼠标使用。本人新手,如果有错请多多指教!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-2 22:55:16 | 显示全部楼层
MoonSet 发表于 2014-2-1 22:45
嗯。。。关于楼主提到的UNO不能使用Mouse功能的现象,可能Leonardo使用的ATmega32u4处理器有关,这个处理器 ...

多谢指点,看来板子的功能总是严重依赖芯片,其实大家能做的也就是在芯片之上加上一层中间件,便于实现各种应用以及方便移植。什么时候芯片能够DIY就好了
回复 支持 反对

使用道具 举报

发表于 2014-2-3 12:44:34 | 显示全部楼层
。有没有大神能改一下uno的串口芯片硬件?这个芯片基本上跟ATmega32u4是同一个系列,改好了也应该能用这种功能的
回复 支持 反对

使用道具 举报

发表于 2014-2-3 12:50:01 | 显示全部楼层
本帖最后由 专业打酱油 于 2014-2-3 12:52 编辑
[email protected] 发表于 2014-2-3 12:44
。有没有大神能改一下uno的串口芯片硬件?这个芯片基本上跟ATmega32u4是同一个系列,改好了也应该能用这种功 ...

参考这里应该可以的
https://code.google.com/p/unojoy/wiki/GettingStarted
http://arduino.cc/en/Hacking/DFUProgramming8U2

我的原来短接reset进不了dfu,直接编程器刷bootloader:
Arduino-COMBINED-dfu-usbserial-atmega16u2-Uno-Rev3.hex
之后就可以。。。
回复 支持 反对

使用道具 举报

发表于 2014-9-30 09:29:56 | 显示全部楼层
不支持uno是因为uno没带usb芯片,你查看一下uno跟leonardo的区别就知道了
回复 支持 反对

使用道具 举报

发表于 2015-5-6 15:01:17 | 显示全部楼层
樓主你好,想問下怎樣弄方向鍵{:soso_e117:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-23 04:45:34 | 显示全部楼层
千堂武士 发表于 2015-5-6 15:01
樓主你好,想問下怎樣弄方向鍵

使用Arduino自定义的常量:
KEY_UP_ARROW       
KEY_DOWN_ARROW
KEY_LEFT_ARROW
KEY_RIGHT_ARROW

常量列表可以参考如下链接:
https://www.arduino.cc/en/Reference/KeyboardModifiers
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 02:26 , Processed in 0.042245 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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