本帖最后由 iooops 于 2016-4-1 00:09 编辑
这个项目的诞生来源其实是这样的:
近半年以来楼主从各方面接触了一下makeymakey,然后发现makeymakey好则好矣,就是还是要依赖电脑(操作系统),不能以特别独立的方式给人玩耍。
然后楼主恰巧在蘑菇云激光切割的余料里发现了一块好用的板子,正好又在附近的五金店买到了细钢丝,就心想做个触摸竖琴好了~~ 又想起半年前乐乐曾经给过我一段仅用导线实现触摸传感器的代码,于是这个小制作项目就这么速度地开展下来了~~~
【材料清单】
Arduino开发板
细钢丝 X 10
DFPlayer Mini 播放器模块 X 1
SD卡
小喇叭 X 1
导线若干
【制作过程】
1. 把钢丝剪到合适的尺寸,然后分别黏上去。
2. 把钢丝连上导线。
3. 把导线连上Arduino。
4. 做测试。代码如下:
- int ledPin = 13;
- int capval;
- void setup()
- {
- pinMode(ledPin, OUTPUT);
- Serial.begin(9600);
- Serial.println("Touch senser");
- }
-
- void loop ()
- {
- digitalWrite(ledPin,LOW);
- capval = readCapacitivePin(6); //各个引脚都尝试一下
- Serial.println(capval, DEC);
- if (capval > 2) {
- // turn LED on:
- digitalWrite(ledPin, HIGH); // 如果该引脚有反应的话,Arduino上的13号灯会亮
- delay(10);
- }
- }
-
- uint8_t readCapacitivePin(int pinToMeasure) {
- // Variables used to translate from Arduino to AVR pin naming
- volatile uint8_t* port;
- volatile uint8_t* ddr;
- volatile uint8_t* pin;
- // Here we translate the input pin number from
- // Arduino pin number to the AVR PORT, PIN, DDR,
- // and which bit of those registers we care about.
- byte bitmask;
- port = portOutputRegister(digitalPinToPort(pinToMeasure));
- ddr = portModeRegister(digitalPinToPort(pinToMeasure));
- bitmask = digitalPinToBitMask(pinToMeasure);
- pin = portInputRegister(digitalPinToPort(pinToMeasure));
- // Discharge the pin first by setting it low and output
- *port &= ~(bitmask);
- *ddr |= bitmask;
- delay(1);
- // Make the pin an input with the internal pull-up on
- *ddr &= ~(bitmask);
- *port |= bitmask;
-
- // Now see how long the pin to get pulled up. This manual unrolling of the loop
- // decreases the number of hardware cycles between each read of the pin,
- // thus increasing sensitivity.
- uint8_t cycles = 17;
- if (*pin & bitmask) { cycles = 0;}
- else if (*pin & bitmask) { cycles = 1;}
- else if (*pin & bitmask) { cycles = 2;}
- else if (*pin & bitmask) { cycles = 3;}
- else if (*pin & bitmask) { cycles = 4;}
- else if (*pin & bitmask) { cycles = 5;}
- else if (*pin & bitmask) { cycles = 6;}
- else if (*pin & bitmask) { cycles = 7;}
- else if (*pin & bitmask) { cycles = 8;}
- else if (*pin & bitmask) { cycles = 9;}
- else if (*pin & bitmask) { cycles = 10;}
- else if (*pin & bitmask) { cycles = 11;}
- else if (*pin & bitmask) { cycles = 12;}
- else if (*pin & bitmask) { cycles = 13;}
- else if (*pin & bitmask) { cycles = 14;}
- else if (*pin & bitmask) { cycles = 15;}
- else if (*pin & bitmask) { cycles = 16;}
-
- // Discharge the pin again by setting it low and output
- // It's important to leave the pins low if you want to
- // be able to touch more than 1 sensor at a time - if
- // the sensor is left pulled high, when you touch
- // two sensors, your body will transfer the charge between
- // sensors.
- *port &= ~(bitmask);
- *ddr |= bitmask;
-
- return cycles;
- }
复制代码
楼主测试下来发现,2、3、4、5、8、9、10、11是能用的。
5. 接DF mini player模块和小喇叭,如下所示
6. 把准备好的音乐放入SD卡,注意格式,楼主发现用wav文件好像还不行,得用MP3。
问 :SD卡中的文件和文件夹名字有什么格式要求吗?
答:函数mp3_play (1); 播放文件的格式为"0001***.mp3(或支持其他格式)". 您可能需要注意这些:
(1). 该音频文件的名称应该命名一个四位数字开始,如:
0001.mp3
0002Chasing The Sun.mp3
0003.mp3
0004Try.mp3
0010FourFiveSeconds.mp3
(2).该音频文件应该放在“MP3”'它坐落在TF卡的根目录'文件夹;
7. 安装Arduino的DFPlayer_Mini MP3库
(上述两个步骤详细内容查阅DFPlayer Mini WIKI - - 这链接死活传不上来啊你们看着办吧直接在产品资料库里面搜就行)
8. 在Arduino文件中把每根钢丝触摸开关对应到不同的MP3文件。
复制代码
OK!大功告成!!
其实它最后应该是这样玩的(哎呀手不够拍了 - - ):
【制作心得】
楼主表示应该去买个好点的功放和喇叭 - - 这夜晚打更的喇叭效果实在是有点呵呵……
参考:
用arduino直接检测电容值:http://www.geek-workshop.com/thread-3335-1-1.html
DFPlayer Mini WIKI
|