极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8643|回复: 1

更简单的方法制作 MakeyMakey

[复制链接]
发表于 2013-6-2 12:20:44 | 显示全部楼层 |阅读模式
本帖最后由 Blanboom 于 2013-6-2 13:32 编辑

制作 MakeyMakey,论坛里已经有比较简单的做法:http://www.geek-workshop.com/thread-1192-1-1.html 。其实,制作方法还可以继续简化:去掉USB部分,直接用串口向电脑发送数据,在电脑上将串口信号转为按键输入即可。

制作方法:
原帖连接USB部分以外的电路,然后下载下面的的程序:
  1. //串口版 MakeyMakey
  2. //by Blanboom, http://blanboom.org/a-easier-way-to-make-a-makeymakey.diy  
  3. //修改自:[url]http://www.geek-workshop.com/thread-1192-1-1.html[/url]
  4. int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;  //触摸输入值暂存
  5. int TouchSensitivity = 80; //触摸灵敏度。0~1023,越大越不灵敏
  6. void setup()
  7. {
  8.   Serial.begin(9600);
  9. }

  10. void loop()
  11. {
  12.   //读取所有引脚电压值,并且由于上拉电阻原因,
  13.   //默认所有引脚为最高电平1023,通过触摸拉低引脚电平。
  14.   //所以数值由1024-analogRead(A0);
  15.   InData0 = 1024 - analogRead(A0);               
  16.   InData1 = 1024 - analogRead(A1);
  17.   InData2 = 1024 - analogRead(A2);
  18.   InData3 = 1024 - analogRead(A3);
  19.   InData4 = 1024 - analogRead(A4);
  20.   InData5 = 1024 - analogRead(A5);
  21.   //按照各种可能触发键盘事件
  22.   if(InData0 >= TouchSensitivity)
  23.   {
  24.     Serial.write('a'); //发送字符,支持 ASCII 码
  25.   }
  26.   if(InData1 >= TouchSensitivity)
  27.   {
  28.     Serial.write('s');  
  29.   }
  30.   if(InData2 >= TouchSensitivity)
  31.   {
  32.     Serial.write('d');  
  33.   }
  34.   if(InData3 >= TouchSensitivity)
  35.   {
  36.     Serial.write('w');  
  37.   }
  38.   if(InData4 >= TouchSensitivity)
  39.   {
  40.     Serial.write(' ');  
  41.   }
  42.   if(InData5 >= TouchSensitivity)
  43.   {
  44.     Serial.write(13);  //Enter
  45.   }
  46.   delay(100);   //可根据实际情况增加或减少
  47. }
复制代码

然后下载运行附件中的串口键盘转换工具即可。不过这个软件只支持 ASCII 字符,所以上下左右键无法发送。




当然也可以让串口输出 MIDI 信号,代码如下:
  1. //MakeyMakey MIDI 版本
  2. //by Blanboom, http://blanboom.org/a-easier-way-to-make-a-makeymakey.diy
  3. //参考了以下两个程序:
  4. //http://www.instructables.com/id/Arduino-Xylophone/
  5. //http://www.geek-workshop.com/thread-1192-1-1.html
  6. //2013.6.1

  7. byte PadNote[6] =
  8.         {60,61,62,63,64,65};          //定义音符
  9. int MaxPlayTime[6] =
  10.         {90,90,90,90,90,90};          //最长播放时间
  11. int Hitavg = 127;                 //音量,127最大
  12. int TouchSensitivity = 80;        //灵敏度,越大越不灵敏
  13. int Midichannel = 9;              //MIDI通道,9为打击乐器

  14. boolean activePad[6] =
  15.         {0,0,0,0,0,0};                //记录对应音符是否正在播放
  16. int pinPlayTime[6] =
  17.         {0,0,0,0,0,0};                //记录对应音符播放时间
  18. int inData = 0;                      

  19. void setup()
  20. {
  21.         Serial.begin(9600);                          //串口波特率,根据 MIDI 设备调整
  22. }

  23. void loop()
  24. {

  25.         for(int pin = 0; pin < 6; pin++)  
  26.         {
  27.                 inData = 1024 - analogRead(pin);
  28.                 if(inData >= TouchSensitivity)
  29.                 {
  30.                         if((activePad[pin] == false))
  31.                         {
  32.                                 MIDI_TX(144,PadNote[pin],Hitavg); //发送音符
  33.                                 pinPlayTime[pin] = 0;
  34.                                 activePad[pin] = true;
  35.                         }
  36.                         else
  37.                         {
  38.                                 pinPlayTime[pin] = pinPlayTime[pin] + 1;
  39.                         }
  40.                 }
  41.                 else if((activePad[pin] == true))
  42.                 {
  43.                         pinPlayTime[pin] = pinPlayTime[pin] + 1;
  44.                         if(pinPlayTime[pin] > MaxPlayTime[pin])
  45.                         {
  46.                                 activePad[pin] = false;
  47.                                 MIDI_TX(144,PadNote[pin],0);//停止播放该音符
  48.                         }
  49.                 }
  50.                 delay(10);  //根据情况增加或减少
  51.         }
  52. }

  53. //发送 MIDI 信号
  54. void MIDI_TX(byte MESSAGE, byte PITCH, byte VELOCITY)
  55. {
  56.         int status1;
  57.         status1 = MESSAGE + Midichannel;
  58.         Serial.write(status1);
  59.         Serial.write(PITCH);
  60.         Serial.write(VELOCITY);
  61. }
复制代码



本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2013-6-2 13:11:40 | 显示全部楼层
列入制作清单2
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-6-2 07:04 , Processed in 0.044711 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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