更简单的方法制作 MakeyMakey
本帖最后由 Blanboom 于 2013-6-2 13:32 编辑制作 MakeyMakey,论坛里已经有比较简单的做法:http://www.geek-workshop.com/thread-1192-1-1.html 。其实,制作方法还可以继续简化:去掉USB部分,直接用串口向电脑发送数据,在电脑上将串口信号转为按键输入即可。
制作方法:
按原帖连接USB部分以外的电路,然后下载下面的的程序:
//串口版 MakeyMakey
//by Blanboom, http://blanboom.org/a-easier-way-to-make-a-makeymakey.diy
//修改自:http://www.geek-workshop.com/thread-1192-1-1.html
int InData1 = 0, InData2 = 0, InData3 = 0, InData4 = 0, InData5 = 0, InData0 = 0;//触摸输入值暂存
int TouchSensitivity = 80; //触摸灵敏度。0~1023,越大越不灵敏
void setup()
{
Serial.begin(9600);
}
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.write('a'); //发送字符,支持 ASCII 码
}
if(InData1 >= TouchSensitivity)
{
Serial.write('s');
}
if(InData2 >= TouchSensitivity)
{
Serial.write('d');
}
if(InData3 >= TouchSensitivity)
{
Serial.write('w');
}
if(InData4 >= TouchSensitivity)
{
Serial.write(' ');
}
if(InData5 >= TouchSensitivity)
{
Serial.write(13);//Enter
}
delay(100); //可根据实际情况增加或减少
}
然后下载运行附件中的串口键盘转换工具即可。不过这个软件只支持 ASCII 字符,所以上下左右键无法发送。
当然也可以让串口输出 MIDI 信号,代码如下:
//MakeyMakey MIDI 版本
//by Blanboom, http://blanboom.org/a-easier-way-to-make-a-makeymakey.diy
//参考了以下两个程序:
//http://www.instructables.com/id/Arduino-Xylophone/
//http://www.geek-workshop.com/thread-1192-1-1.html
//2013.6.1
byte PadNote =
{60,61,62,63,64,65}; //定义音符
int MaxPlayTime =
{90,90,90,90,90,90}; //最长播放时间
int Hitavg = 127; //音量,127最大
int TouchSensitivity = 80; //灵敏度,越大越不灵敏
int Midichannel = 9; //MIDI通道,9为打击乐器
boolean activePad =
{0,0,0,0,0,0}; //记录对应音符是否正在播放
int pinPlayTime =
{0,0,0,0,0,0}; //记录对应音符播放时间
int inData = 0;
void setup()
{
Serial.begin(9600); //串口波特率,根据 MIDI 设备调整
}
void loop()
{
for(int pin = 0; pin < 6; pin++)
{
inData = 1024 - analogRead(pin);
if(inData >= TouchSensitivity)
{
if((activePad == false))
{
MIDI_TX(144,PadNote,Hitavg); //发送音符
pinPlayTime = 0;
activePad = true;
}
else
{
pinPlayTime = pinPlayTime + 1;
}
}
else if((activePad == true))
{
pinPlayTime = pinPlayTime + 1;
if(pinPlayTime > MaxPlayTime)
{
activePad = false;
MIDI_TX(144,PadNote,0);//停止播放该音符
}
}
delay(10);//根据情况增加或减少
}
}
//发送 MIDI 信号
void MIDI_TX(byte MESSAGE, byte PITCH, byte VELOCITY)
{
int status1;
status1 = MESSAGE + Midichannel;
Serial.write(status1);
Serial.write(PITCH);
Serial.write(VELOCITY);
}
列入制作清单2
页:
[1]