Keke 发表于 2014-2-1 21:53:24

自制MakeyMakey

本帖最后由 Keke 于 2014-2-1 22:02 编辑

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

材料

Arduino Leonardo(实验中我用了Yun,但只用了Leonardo部分) 一块
Mackey sheild 一块
鳄鱼夹 7个



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


代码



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);
//

}


调测
连接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

不废话了,上一段视频
http://v.youku.com/v_show/id_XNjY4MzY1ODg4.html

Keke 发表于 2014-2-1 22:07:14

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


int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;//触摸输入值暂存
int aKeyPressed = 0, sKeyPressed = 0, dKeyPressed = 0, fKeyPressed = 0, gKeyPressed = 0, hKeyPressed = 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()
{
//UsbKeyboard.update();
//读取所有引脚电压值,并且由于上拉电阻原因,
//默认所有引脚为最高电平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);   
   if(aKeyPressed == 0){
      Keyboard.write('a');
   }
   aKeyPressed = 1;
   }
   else{
   aKeyPressed = 0;
   digitalWrite(6, LOW);
   }

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

   
if(InData2 >= TouchSensitivity){
   Serial.print("InData2=");
   Serial.println(InData2);
   digitalWrite(8, HIGH);
   if(dKeyPressed == 0){
      Keyboard.write('d');
   }   
   dKeyPressed = 1;
   }
else {
    dKeyPressed = 0;
    digitalWrite(8, LOW);
}
   
if(InData3 >= TouchSensitivity){
   Serial.print("InData3=");
   Serial.println(InData3);
   digitalWrite(9, HIGH);
   if(fKeyPressed == 0){
      Keyboard.write('f');
   }      
   fKeyPressed = 1;
   }
else{
    fKeyPressed = 0;
    digitalWrite(9, LOW);
}
      
if(InData4 >= TouchSensitivity){
   Serial.print("InData4=");
   Serial.println(InData4);
   digitalWrite(10, HIGH);
   if(gKeyPressed == 0){
      Keyboard.write('g');
   }      
   gKeyPressed = 1;
   }
   else{
   gKeyPressed = 0;
   digitalWrite(10, LOW);
   }
      
if(InData5 >= TouchSensitivity){
   Serial.print("InData5=");
   Serial.println(InData5);
   digitalWrite(11, HIGH);
   if(hKeyPressed == 0){
      Keyboard.write('h');
   }   
   hKeyPressed = 1;
   }
   else{
   hKeyPressed = 0;
   digitalWrite(11, LOW);
   }
   
Serial.println("cycle");
Serial.println(cycle++);
delay(100);
//

}

MoonSet 发表于 2014-2-1 22:45:35

嗯。。。关于楼主提到的UNO不能使用Mouse功能的现象,可能Leonardo使用的ATmega32u4处理器有关,这个处理器集成了USB——UART的功能所以可以当作电脑的输入设备使用。但是UNO不是这种处理器,所以不可以当作鼠标使用。本人新手,如果有错请多多指教!

Keke 发表于 2014-2-2 22:55:16

MoonSet 发表于 2014-2-1 22:45 static/image/common/back.gif
嗯。。。关于楼主提到的UNO不能使用Mouse功能的现象,可能Leonardo使用的ATmega32u4处理器有关,这个处理器 ...

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

[email protected] 发表于 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 static/image/common/back.gif
。有没有大神能改一下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
之后就可以。。。

mylemonjuice 发表于 2014-9-30 09:29:56

不支持uno是因为uno没带usb芯片,你查看一下uno跟leonardo的区别就知道了

千堂武士 发表于 2015-5-6 15:01:17

樓主你好,想問下怎樣弄方向鍵{:soso_e117:}

Keke 发表于 2016-2-23 04:45:34

千堂武士 发表于 2015-5-6 15:01 static/image/common/back.gif
樓主你好,想問下怎樣弄方向鍵

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

常量列表可以参考如下链接:
https://www.arduino.cc/en/Reference/KeyboardModifiers
页: [1]
查看完整版本: 自制MakeyMakey