32915浏览
查看: 32915|回复: 24

【EvilMK】“Orchid”像样的Arduino架子鼓

[复制链接]
来参加上海创客嘉年华的伙伴们有没有看到这个作品:lol

几位小伙伴问我开不开源,那不是必须的嘛~制作过程送上!

不好意西啦,交这个作业迟了点,都一个多月了...真的抱歉:shutup:




送上活动时候的照片(明和电机的社长大大真的好萌:loveliness:)
【EvilMK】“Orchid”像样的Arduino架子鼓图1

virtualwiz  中级技匠
 楼主|

发表于 2015-11-3 17:31:12

  1. /*EvilMaker Orchid (Opensource) 2015 v1.00-d
  2. by Virtualwiz
  3. */
  4. void midiSend (int cmd, int pitch, int velocity) {
  5.   Serial.write(cmd);
  6.   Serial.write(pitch);
  7.   Serial.write(velocity);
  8. }
  9. const byte buzzer=50;
  10. //Serial to MIDI or Native MIDI?
  11. boolean debug_mode=true;
  12. const unsigned char kick=36;
  13. const unsigned char snare=38;
  14. const unsigned char tom_high=50;
  15. const unsigned char tom_low=45;
  16. const unsigned char tom_bass=41;
  17. const unsigned char crash_left=49;
  18. const unsigned char crash_right=57;
  19. const unsigned char hat_open=51;   //46
  20. const unsigned char hat_close=42;
  21. char adc_channel[7] ={
  22.   'A0','A1','A2','A3','A4','A5','A6'
  23. };
  24. void setup() {
  25.   pinMode(buzzer,OUTPUT);
  26.   pinMode(7,OUTPUT);
  27.   pinMode(6,INPUT);
  28.   pinMode(3,INPUT);
  29.   digitalWrite(3,HIGH);
  30.   digitalWrite(6,HIGH);
  31.   //3 is for Kick and 6 is for hi-hat
  32.   //Startup tone
  33.   tone(buzzer,1397,130);
  34.   delay(130);
  35.   tone(buzzer,1568,130);
  36.   delay(130);
  37.   tone(buzzer,1760,150);
  38.   delay(1500);
  39.   pinMode(7,OUTPUT);
  40.   if(debug_mode)
  41.   {
  42.     Serial.begin(115200);  //Debug mode baud rate
  43.     tone(buzzer,1397,120);
  44.     delay(300);  
  45.     tone(buzzer,1397,120);
  46.     delay(1000);
  47.   }
  48.   else
  49.   {
  50.     Serial.begin(31250);  //MIDI baud rate
  51.     tone(buzzer,1397,120);
  52.     delay(1000);  
  53.   }
  54.   tone(buzzer,1397,300);
  55.   delay(1000);
  56. }
  57. unsigned char adc_sample[7];
  58. boolean kick_trig_flag=false;  //Is Kick already triggered?
  59. //IMPORTANT!
  60. //Adjust this if your pads are dull or too sensitive
  61. //{crash,  hat,  snare,  tom_bass,  crash_right,  tom_high,  tom_low}
  62. unsigned char adc_cutoff[7]=  //minimum strength
  63. {
  64.   3,            3,      10,        7,              3,                3,                 3};
  65. unsigned char adc_limit[7]=   //maximum strength
  66. {
  67.   40,         10,    30,        50,              40,                10,              10};
  68. void loop() {
  69.   digitalWrite(7,HIGH);
  70.   for(byte count=0;count<=6;count++)
  71.   {
  72.     adc_sample[count]=map(analogRead(adc_channel[count]),0,1023,0,254);
  73.   }
  74.   //Here is a strange problem
  75.   //0 and 6 can't get their correct value if following code was not written
  76.   adc_sample[6]=map(analogRead(A6),0,1023,0,254);
  77.   adc_sample[0]=map(analogRead(A0),0,1023,0,254);
  78.   //Pls contant me if you know why,thx
  79.   digitalWrite(7,LOW);
  80.   if(adc_sample[0]>=adc_cutoff[0])
  81.   {
  82.     if(adc_sample[0]>=adc_limit[0])
  83.       adc_sample[0]=adc_limit[0];
  84.     midiSend(0x99,crash_left,map(adc_sample[0],adc_cutoff[0],adc_limit[0],0x00,0x7f));
  85.     // Serial.print("\t");
  86.     //Serial.println(adc_sample[0]);
  87.   }
  88.   if(adc_sample[1]>=adc_cutoff[1])
  89.   {
  90.     if(adc_sample[1]>=adc_limit[1])
  91.       adc_sample[1]=adc_limit[1];
  92.     if(digitalRead(6)==HIGH)
  93.       midiSend(0x99,hat_open,map(adc_sample[1],adc_cutoff[1],adc_limit[1],0x00,0x7f));
  94.     else
  95.       midiSend(0x99,hat_close,map(adc_sample[1],adc_cutoff[1],adc_limit[1],0x00,0x7f));
  96.   }
  97.   if(adc_sample[2]>=adc_cutoff[2])
  98.   {
  99.     if(adc_sample[2]>=adc_limit[2])
  100.       adc_sample[2]=adc_limit[2];
  101.     midiSend(0x99,snare,map(adc_sample[2],adc_cutoff[2],adc_limit[2],0x00,0x7f));
  102.     delay(13); //sorry that my snare pad is too bouncy
  103.   }
  104.   if(adc_sample[3]>=adc_cutoff[3])
  105.   {
  106.     if(adc_sample[3]>=adc_limit[3])
  107.       adc_sample[3]=adc_limit[3];
  108.     midiSend(0x99,tom_bass,map(adc_sample[3],adc_cutoff[3],adc_limit[3],0x00,0x7f));
  109.   }
  110.   if(adc_sample[4]>=adc_cutoff[4])
  111.   {
  112.     if(adc_sample[4]>=adc_limit[4])
  113.       adc_sample[4]=adc_limit[4];
  114.     midiSend(0x99,crash_right,map(adc_sample[4],adc_cutoff[4],adc_limit[4],0x00,0x7f));
  115.   }
  116.   if(adc_sample[5]>=adc_cutoff[5])
  117.   {
  118.     if(adc_sample[5]>=adc_limit[5])
  119.       adc_sample[5]=adc_limit[5];
  120.     midiSend(0x99,tom_high,map(adc_sample[5],adc_cutoff[5],adc_limit[5],0x00,0x7f));
  121.   }
  122.   if(adc_sample[6]>=adc_cutoff[6])
  123.   {
  124.     if(adc_sample[6]>=adc_limit[6])
  125.       adc_sample[6]=adc_limit[6];
  126.     midiSend(0x99,tom_low,map(adc_sample[6],adc_cutoff[6],adc_limit[6],0x00,0x7f));
  127.   }
  128.   if(digitalRead(3)==HIGH)
  129.   {
  130.     kick_trig_flag=false;
  131.   }
  132.   if(digitalRead(3)==LOW)
  133.   {
  134.     if(kick_trig_flag==false)
  135.     {
  136.       midiSend(0x99,kick,0x7f);
  137.       kick_trig_flag=true;
  138.     }
  139.   }
  140.   delay(5);  //This is the total sensitivity for all the pads
  141. }
  142. /*ADC Test
  143. int val;
  144. for(int i = 0; i < 8; i++) {
  145. val = analogRead(i);
  146. Serial.print("CH");
  147. Serial.print(i);
  148. Serial.print("\t Value=");
  149. Serial.print(val);
  150. Serial.print("\n");
  151. delay(20);
  152. }
  153. Serial.print("\n");
  154. delay(1000);
  155. */
  156. /*MIDI Send Test
  157. //This is a simple loop for you to check your MIDI bridge and synthesizer.
  158.   
  159. midiSend(0x99,hat_close, 0x45);
  160. midiSend(0x99,kick, 0x45);
  161. delay(300);
  162. midiSend(0x99,hat_close, 0x45);
  163. delay(300);
  164. midiSend(0x99,hat_close, 0x45);
  165. midiSend(0x99,snare, 0x45);
  166. delay(300);
  167. midiSend(0x99,hat_close, 0x45);
  168. midiSend(0x99,kick, 0x45);
  169. delay(300);
  170. midiSend(0x99,hat_close, 0x45);
  171. midiSend(0x99,kick, 0x45);
  172. delay(300);
  173. midiSend(0x99,hat_close, 0x45);
  174. delay(300);
  175. midiSend(0x99,hat_close, 0x45);
  176. midiSend(0x99,snare, 0x45);
  177. delay(300);
  178. midiSend(0x99,hat_close, 0x45);
  179. delay(300);
  180.   
  181. */
复制代码


可以选择串口转MIDI(9600bps)或真MIDI(31250bps)两种波特率,看你怎么方便连接了~
各个板子的灵敏度在程序中也可以调节。
回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2015-11-3 17:25:35

连接件要打印一下,能装个M10的螺帽进去就行。这个难不倒伙伴们吧:lol【EvilMK】“Orchid”像样的Arduino架子鼓图3

然后装在木板上,自攻螺丝拧进去

【EvilMK】“Orchid”像样的Arduino架子鼓图1


为了防止敲击的时候产生“剁馅”的声音,木板的正面要贴一层橡胶(P.S.我用的木板太厚了,大家要是想做可以用薄一点的,8mm就行)
【EvilMK】“Orchid”像样的Arduino架子鼓图4



这是压电陶瓷,很便宜,用于测出震动大小。焊接的时候要小心,需要助焊剂
【EvilMK】“Orchid”像样的Arduino架子鼓图2


回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2015-11-3 17:34:25

因为Windows有MIDI延迟的Bug,实时性相当不好(有专业声卡除外~)
Linux和Mac都没有这个问题

如果用Linux,可能需要这些软件(根据需要大胆配置~多种组合方案)
统统是免费或者开源软件哦:$
  1. jackd
  2. qjackctl   //jack的GUI
  3. fluidsynth
  4. qsynth     //fluidsynth的GUI
  5. fluid-soundfont-gm     //音色库,内有多种鼓的声音
复制代码



回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2015-11-3 17:21:08

拿快递很开心,直径28的有机玻璃管,金属三通,丝杆,螺帽,木(cai)板【EvilMK】“Orchid”像样的Arduino架子鼓图1【EvilMK】“Orchid”像样的Arduino架子鼓图2


管子很脆,钻孔要小心(拖鞋不是我的,请无视:curse:)
【EvilMK】“Orchid”像样的Arduino架子鼓图3


略微设计一下,架子完工~这个结构仅供参考
【EvilMK】“Orchid”像样的Arduino架子鼓图4

回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2015-11-3 17:29:00

电子设备,要是328p系列的arduino模拟口不够用,建议用Mega。(我最终用的就是)

【EvilMK】“Orchid”像样的Arduino架子鼓图1


装好的效果
【EvilMK】“Orchid”像样的Arduino架子鼓图2

回复

使用道具 举报

virtualwiz  中级技匠
 楼主|

发表于 2015-11-3 17:37:30

本帖最后由 virtualwiz 于 2015-11-3 17:59 编辑

剩下的就是自由发挥了:D,想怎么玩都可以


【EvilMK】“Orchid”像样的Arduino架子鼓图1

回复

使用道具 举报

丄帝De咗臂  高级技匠

发表于 2015-11-3 18:18:17

碉堡了6666666666666
回复

使用道具 举报

栽培者  初级技师

发表于 2015-11-3 20:08:52

去的时候看到了。牛人一枚
回复

使用道具 举报

dsweiliang  初级技神

发表于 2015-11-4 08:22:43

我也要做一个~
回复

使用道具 举报

Phoebe  高级技匠

发表于 2015-11-4 09:56:18

32个赞
回复

使用道具 举报

swanglei  中级技神

发表于 2015-11-4 18:19:02

好赞~~~~顶一个先。。。。

后面仔细看了一下,原理没怎么讲,一般人是看不明白的,可能只多放了些照片。。。。。希望稍微具体些,就更完美了~~~~

视频也不错的~~~
回复

使用道具 举报

Juice  高级技师

发表于 2015-11-5 10:04:22

好期待好期待!!!!蘑菇云来一套~~~来一套~~~~哟哟~切克闹!!
回复

使用道具 举报

luna  初级技神

发表于 2015-11-5 14:49:55

又会玩音乐、又会造乐器、又长的帅~~简直就是:完!美!(请自行脑补金星老师动作)
回复

使用道具 举报

hnyzcj  版主

发表于 2015-11-5 16:22:07

luna 发表于 2015-11-5 14:49
又会玩音乐、又会造乐器、又长的帅~~简直就是:完!美!(请自行脑补金星老师动作) ...

哈哈哈,这算是表扬他吗?
回复

使用道具 举报

大连林海  初级技神

发表于 2015-11-7 09:17:53

碉堡了6666666666666
回复

使用道具 举报

marcusme  中级技师

发表于 2016-1-27 10:26:00

arduino架子鼓,简直帅气!
回复

使用道具 举报

Tikoyoo  学徒

发表于 2016-3-2 13:41:56

MIDI那部分接线怎么弄啊 都看不到 请赐教啊
回复

使用道具 举报

z550316  学徒

发表于 2016-5-23 21:46:46

你好能给我一分电路图吗      ?      
550316019@QQ.COM
回复

使用道具 举报

liqunlong  见习技师

发表于 2017-2-24 21:47:51

fluidsynth is difficult.tell me how to use it please.:'(
回复

使用道具 举报

liqunlong  见习技师

发表于 2017-2-24 21:48:54

Chinese without Chinese.:o
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail