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);

}