Make出展 7)すごいラムネ瓶 ver1.1
ミスター原案。
誕生日に一日で作ってあげた。
ダンボールキーボードのsketchを活かして、
Arduino Pro mini 5VとYMZ294、傾きセンサーを使って、飲もうと傾けると
曲が流れる。
机に置くと止まる。
飲むのが楽しくなるアイテム。
ブロック図は下記。
傾きによって、レベルアップ音+お正月、ドラ○もんの2曲。
記述は途中からだんだん汎用的に出来るように修正を続けた。
送信者 soda |
送信者 soda |
単音なら、
set_melody(オクターブ,音階,長さ);
で音を出せるようにした。
3音だと音符の長さが違うと記述が難しい。
電源はCR2032 2個でも、とても駆動できなかったので、
単4一本からDC-DCで5Vに昇圧している。
外装はなるべく目立たなくしたかったため、カメラのレンズキャップに収めた。
ArduinoとYMZ294は直接半田つけしている。
単4化で高さが足りなかったので、ジャンクカメラのKマウント部分をスペーサーにしている。
実は、一番苦労したのオールガラスのラムネ瓶の調達。
すでに生産しておらず、リサイクルで回っているものしかないものだ。
ミスターがこれにこだわっていたが、気をつけて探していてもなかなか見つからない。
あきらめ掛けていたが、なんと近所の居酒屋でたまたまソーダ割を頼んだらついて来た!
昔ながらの店がねらい目。
密閉してしまうので、展示の時は音が聞こえにくかった。
結局底の方に耳を持っていくことなり、狙った使い方にならなかったのが残念。
でも、ビー球が傾斜センサと錯覚するよう感じがし、ラムネ瓶は正しかったと思う。
底をみて、レンズキャップだ!と気づいてくださる方もいて嬉しかった。
レベルアップとお正月にしたのは、大晦日に飲んで、数えでみんな年を取ったね!
というメッセージがこめられているが、バイト君には「分かりづらい」と不評でした。
で、展示での反省を踏まえて、以下を改良した。
・起動が不安定なことがあった。
=>1.5Vからの昇圧がなだらかなので、リセットICを追加して急峻にリセット解除、Arduinoの起動を安定化させた。
抵抗でつってあるのでオープンドレインタイプでいいだろう。
・オクターブだ高すぎて聞き難い=>2オクターブ下げた
・音量小さい=>6dBup。まだ小さいかも。瓶をつけないオープンだと結構な音量なのだけど。今後の課題。
sketchはこちら
//YMZ294+傾きセンサ //ver 1.1 // int wait[65]; #define tempo 120 //tempo 120 wait(4)=tempo/60/4=500msec #define WAIT4 500 #define WAIT8 250 #define WAIT16 125 #define WAIT32 62 int tp[10][12] = { { 3822, 3608, 3405, 3214, 3034, 2863, 2703, 2551, 2408, 2273, 2145, 2025, }, { 1911, 1804, 1703, 1607, 1517, 1432, 1351, 1276, 1204, 1136, 1073, 1012 }, { 956, 902, 851, 804, 758, 716, 676, 638, 602, 568, 536, 506 }, { 478, 451, 426, 402, 379, 358, 338, 319, 301, 284, 268, 253 }, { 239, 225, 213, 201, 190, 179, 169, 159, 150, 142, 134, 127 }, { 119, 113, 106, 100, 95, 89, 84, 80, 75, 71, 67, 63 }, { 60, 56, 53, 50, 47, 45, 42, 40, 38, 36, 34, 32 }, { 30, 28, 27, 25, 24, 22, 21, 20, 19, 18 , 17, 16 }, { 15, 14, 13, 13, 12, 11, 11, 10,9,9,8,8 }, { 7,0,0,0,0,0,0,0,0,0,0,0 } }; int i=0,j=0,w=0; char a=0,o=0; void setup(){ #define WR 8 #define CS 9 #define A0 10 #define SW 11 #define SW2 12 #define SW3 18 #define C 0 #define Db 1 #define D 2 #define Eb 3 #define E 4 #define F 5 #define Fs 6 #define G 7 #define Ab 8 #define A 9 #define Bb 10 #define B 11 #define F1 0 #define F2 3 #define F4 5 #define F8 9 #define F16 17 #define F33 33 #define F65 65 wait[4] = 500; wait[5] = wait[4]*1.5; wait[1] = wait[4]*4; wait[0] = wait[1]*1.5; wait[2] = wait[4]*2; wait[3] = wait[2]*1.5; wait[8] = wait[4]/2; wait[9] = wait[8]*1.5; wait[12] = wait[4]/3; wait[16] = wait[4]/4; wait[17] = wait[16]*1.5; wait[32] = wait[4]/8; wait[33] = wait[32]*1.5; wait[64] = wait[4]/16; wait[65] = wait[64]*1.5; //SW 初期化 pinMode(SW, INPUT); digitalWrite(SW, HIGH); pinMode(SW2, INPUT); digitalWrite(SW2, HIGH); pinMode(SW3, INPUT); digitalWrite(SW3, HIGH); //YMZ294 init pins DDRD = 0xFF; PORTD = 0x00; pinMode(WR, OUTPUT); pinMode(CS, OUTPUT); pinMode(A0, OUTPUT); //YMZ294 write_data(0x06, 0x00); write_data(0x07, 0x38); write_data(0x08, 0x0f); write_data(0x09, 0x0f); write_data(0x0A, 0x0f); }//setup void set_melody(int i,int j ,int w) { write_data(0x00, tp[i][j]&0xff); write_data(0x01, (tp[i][j] >> 8)&0x0f); delay(wait[w]); set_chA(9,1); delay(4);//きれめ } void set_breath(int w) { set_melody(9,1,w); } void set_chA(int i,int j) { write_data(0x00, tp[i][j]&0xff); write_data(0x01, (tp[i][j] >> 8)&0x0f); } void set_chB(int i,int j) { write_data(0x02, tp[i][j]&0xff); write_data(0x03, (tp[i][j] >> 8)&0x0f); } void set_chC(int i,int j) { write_data(0x04, tp[i][j]&0xff); write_data(0x05, (tp[i][j] >> 8)&0x0f); } void write_data(unsigned char address, unsigned char data) { //write address digitalWrite(WR, LOW); digitalWrite(CS, LOW); digitalWrite(A0, LOW); PORTD = address; digitalWrite(WR, HIGH); digitalWrite(CS, HIGH); //write data digitalWrite(WR, LOW); digitalWrite(CS, LOW); digitalWrite(A0, HIGH); PORTD = data; digitalWrite(WR, HIGH); digitalWrite(CS, HIGH); } void loop(){ delay(100); /* CDE test int k=8; for (o=0;o<8;o++){ set_melody(o,C,k); set_melody(o,D,k); set_melody(o,E,k); set_melody(o,F,k); set_melody(o,G,k); set_melody(o,A,k); set_melody(o,B,k); } set_melody(8,C,k); */ if ( digitalRead(SW)==LOW && digitalRead(SW2)==LOW) { write_data(0x07, 0x38); //levelup intro o=3; set_chB(9,1); set_chC(9,1); set_chA(o,5); delay(wait[16]); set_chA(o,7); delay(wait[16]); set_chA(o,9); delay(wait[16]); set_chA(o,11); delay(wait[16]); set_chA(o+1,0); delay(wait[16]); set_chA(o+1,2); delay(wait[16]); set_chA(o+1,4); delay(wait[16]); set_chA(o+1,5); delay(wait[16]); set_chA(o+1,7); delay(500); set_chA(9,1); delay(WAIT16); //levelup o=4; set_chA(o,5); delay(WAIT32); set_chA(9,1); delay(WAIT32); set_chA(o,5); delay(WAIT32); set_chA(9,1); delay(WAIT32); set_chA(o,5); delay(WAIT32); set_chA(9,1); delay(WAIT32); set_chA(o,3); delay(WAIT16); set_chA(9,1); delay(WAIT16); set_chA(o,7); delay(WAIT16); set_chA(9,1); delay(WAIT16); set_chA(o,5); delay(WAIT4); set_chA(9,1); delay(WAIT4); delay(1000); //New Year intro o=3; set_melody(o,5,2); set_melody(o,7,4); set_melody(o,5,8); set_melody(o,7,8); set_melody(o,9,4); set_melody(o+1,0,4); set_melody(o,9,2); set_melody(o,7,4); set_melody(o,7,4); set_melody(o,9,4); set_melody(o,7,4); set_melody(o,5,2); delay(wait[4]); set_melody(9,1,4); //New Near while(digitalRead(SW)==LOW){ o=3; set_melody(o,5,2); set_melody(o,7,4); set_melody(o,5,8); set_melody(o,7,8); if ( digitalRead(SW)==HIGH ) break; set_melody(o,9,4); set_melody(o+1,0,4); set_melody(o,9,2); if ( digitalRead(SW)==HIGH ) break; set_melody(o,7,4); set_melody(o,7,4); set_melody(o,5,4); set_melody(o,7,4); if ( digitalRead(SW)==HIGH ) break; set_melody(o,9,2); delay(wait[4]); set_melody(9,1,4); if ( digitalRead(SW)==HIGH ) break; // set_melody(o,5,8); set_melody(o,5,8); set_melody(o,2,8); set_melody(o,2,8); set_melody(o,0,8); set_melody(o,0,8); set_melody(o,0,4); if ( digitalRead(SW)==HIGH ) break; set_melody(o,5,8); set_melody(o,5,8); set_melody(o,7,8); set_melody(o,7,8); set_melody(o,9,2); if ( digitalRead(SW)==HIGH ) break; set_melody(o,9,8); set_melody(o,9,8); set_melody(o,7,4); set_melody(o,5,8); set_melody(o,5,8); set_melody(o,5,8); set_melody(o,5,8); if ( digitalRead(SW)==HIGH ) break; set_melody(o,7,8); set_melody(o,7,8); set_melody(o,9,8); set_melody(o,9,8); set_melody(o+1,0,2); if ( digitalRead(SW)==HIGH ) break; // set_melody(o,5,2); set_melody(o,7,4); set_melody(o,5,8); set_melody(o,7,8); if ( digitalRead(SW)==HIGH ) break; set_melody(o,9,4); set_melody(o+1,0,4); set_melody(o,9,4); set_melody(o,9,4); if ( digitalRead(SW)==HIGH ) break; set_melody(o,7,4); set_melody(o,7,4); set_melody(o,9,4); set_melody(o,7,4); if ( digitalRead(SW)==HIGH ) break; set_melody(o,5,2); delay(wait[4]); set_melody(9,1,4); if ( digitalRead(SW)==HIGH ) break; } }else if (digitalRead(SW3)==LOW) { write_data(0x07, 0x38); while(digitalRead(SW3)==LOW){ //dora o=3; set_melody(o-1,G,8); set_melody(o,C,8); set_melody(o,C,8); set_melody(o,E,8); set_melody(o,A,8); set_melody(o,E,8); set_melody(o,G,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,G,8); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,E,8); set_melody(o,F,8); set_melody(o,E,8); set_melody(o,D,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o-1,A,8); set_melody(o,D,8); set_melody(o,D,8); set_melody(o,F,8); set_melody(o,B,8); set_melody(o,B,8); set_melody(o,A,8); set_melody(o,G,8); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,F,4); set_melody(o,F,8); set_melody(o,E,8); set_melody(o-1,A,8); set_melody(o-1,B,4); set_melody(o,C,8); set_melody(o,D,2); delay(wait[4]); set_melody(9,1,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o-1,G,8); set_melody(o,C,8); set_melody(o,C,8); set_melody(o,E,8); set_melody(o,A,8); set_melody(o,E,8); set_melody(o,G,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,G,8); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,E,8); set_melody(o,F,8); set_melody(o,E,8); set_melody(o,D,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o-1,A,8); set_melody(o,D,8); set_melody(o,D,8); set_melody(o,F,8); set_melody(o,B,4); set_melody(o,A,8); set_melody(o,G,8); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,F,8); set_melody(o,F,8); set_melody(o,E,8); set_melody(o,D,8); set_melody(o-1,B,4); set_melody(o,D,4); set_melody(o,C,2); delay(wait[4]); set_melody(9,1,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,A,4); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,F,12); set_melody(o,G,12); set_melody(o,A,12); set_melody(o,G,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,D,8); set_melody(o,E,8); set_melody(o,Fs,8); set_melody(o,D,8); set_melody(o,G,4); set_melody(9,1,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(9,1,1); set_melody(9,1,1); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,A,4); set_melody(o,G,4); set_melody(o,F,4); set_melody(9,1,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,D,4); set_melody(o,B,8); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,F,8); if ( digitalRead(SW3)==HIGH ) break; set_melody(9,1,4); set_melody(o,G,8); set_melody(o,A,8); set_melody(o,E,4); delay(wait[8]); set_melody(o,D,8); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,C,2); delay(wait[1]); set_melody(9,1,8); // if ( digitalRead(SW3)==HIGH ) break; set_melody(o,A,4); set_melody(o,G,4); set_melody(o,F,4); set_melody(9,1,4); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,D,4); set_melody(o,B,8); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,A,8); set_melody(o,G,8); set_melody(o,F,8); if ( digitalRead(SW3)==HIGH ) break; set_melody(9,1,4); set_melody(o,G,8); set_melody(o,A,8); set_melody(o,E,4); delay(wait[8]); set_melody(o,D,8); if ( digitalRead(SW3)==HIGH ) break; set_melody(o,C,2); delay(wait[1]); set_melody(9,1,4); if ( digitalRead(SW3)==HIGH ) break; } }else { write_data(0x07, 0x3F);} write_data(0x07, 0x3F); }