Blanboom 发表于 2013-6-2 12:20:44

更简单的方法制作 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);
}


pumpitup 发表于 2013-6-2 13:11:40

列入制作清单2
页: [1]
查看完整版本: 更简单的方法制作 MakeyMakey