自制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
经过调测,发现上面的代码有一个小问题,就是如果拿着橙子不松手,则会出现琴键的“连击”现象,说起来也不算问题,但还是做了优化,修改一下,代码如下,另外,顺便说一句,通过手感来感觉,苹果比橙子电阻更大,触摸时不如橙子灵敏。/* 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);
//
}
嗯。。。关于楼主提到的UNO不能使用Mouse功能的现象,可能Leonardo使用的ATmega32u4处理器有关,这个处理器集成了USB——UART的功能所以可以当作电脑的输入设备使用。但是UNO不是这种处理器,所以不可以当作鼠标使用。本人新手,如果有错请多多指教! MoonSet 发表于 2014-2-1 22:45 static/image/common/back.gif
嗯。。。关于楼主提到的UNO不能使用Mouse功能的现象,可能Leonardo使用的ATmega32u4处理器有关,这个处理器 ...
多谢指点,看来板子的功能总是严重依赖芯片,其实大家能做的也就是在芯片之上加上一层中间件,便于实现各种应用以及方便移植。什么时候芯片能够DIY就好了 。有没有大神能改一下uno的串口芯片硬件?这个芯片基本上跟ATmega32u4是同一个系列,改好了也应该能用这种功能的 本帖最后由 专业打酱油 于 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
之后就可以。。。 不支持uno是因为uno没带usb芯片,你查看一下uno跟leonardo的区别就知道了 樓主你好,想問下怎樣弄方向鍵{:soso_e117:} 千堂武士 发表于 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]