真夜中の工作室 midnight craftcenter

電子工作とカメラ、写真の趣味のブログ

電子鍵盤

今更だが、CLKOUTの検討でtakkawの指摘を調べたメモがでてきた。

>8.9のOutput BufferにCLK0からsystem clockが出せると書いてありますが出てませんか?
=>ヒューズビットなので読み飛ばしてた。
 CLKOの設定をいじるにはヒューズビットの設定が必要だが、、
 Arduinoでは設定不可能(RESET後も記憶しているところ)。AVARライタ等を使ってICSP経由での書き込みが必要になってしまう。
 CLKOはAtmega168の14pinか・・と回路図を見るとNo.8に繋がっている。汎用pinに割り当てているのでCKOUTは使えないといことか。 
http://arduino.cc/en/uploads/Main/Arduino-Diecimila-schematic.pdf
 
 折角なのでヒューズビットの設定を確認してみた。
 Low:FF,High:DD,Ex'd:00
 だと思われる。
 参考:
 http://www.geocities.jp/arduino_diecimila/bootloader/index.html
 
  fuseは下記がわかりやすかったので、下記で各bitの設定内容を見てみた。
  やはりCLKOUTはしない設定になっている。

他に圧電ブザーを使った電子鍵盤が出てきたので記載。
ボタン8個で1オクターブしかないけど。
最初は16MHzでsketchしていたので、無音を表現するのに最高周波数をだして、ブザーの音域を越えることで表現していたのだが、8MHzに変えると最高周波数でも可聴域になってしまった。
CLK出力に判定を追加して、ボタンを押してないときはCLK極性を固定に変更。

/* 
  Atmega168 timer1 で電子鍵盤
  暫定版
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

// CLKOUT [kHz] 出力したいCLKの周波数
// F_CPU 8000000 (Arduino Pro mini)
//分周比 1  FDIV = 1
//分周比 8  FDIV = 2
//分周比 64  FDIV = 3
//分周比 256  FDIV = 4
//分周比 1024  FDIV = 5

#define F_DIV  1  //使いたい分周比をセット

// TCNT1_BOTTOM (65536-(F_CPU*(1/CLKOUT[kHz]/2)/(F_DIV*1000))

int B_CLK=12;
boolean out=false;
int i,j;
int inPin[] = {2,3,4,5,6,7,8,9}; 
long TCNT1_B = 65535;
long P_C5=57888;
long P_D5=58722;
long P_E5=59466;
long P_F5=59814;
long P_G5=60434;
long P_A5=60991;
long P_B5=61483;
long P_C6=61712;

void setup(){

  cli();  //全割り込み禁止
  TIMSK1 = (1<<TOIE1); //タイマ/カウンタ1割り込み使用
  TCCR1A = 0;//タイマ使用
  TCCR1B = F_DIV; //分周数
  TCNT1 = 0;//タイマ/カウンタ1初期化
  sei(); // 全割り込み許可
  
  pinMode(B_CLK,OUTPUT);

  for(i=0;i<8;i++){
      pinMode(inPin[i], INPUT); 
      digitalWrite(inPin[i], HIGH);  //SW pullup
  }

}

void loop(){

  if (digitalRead(inPin[0]) == LOW) {         // check if the input is HIGH (button released)
    
    TCNT1_B = P_C5; 
    } else {if (digitalRead(inPin[1]) == LOW){
           //sei();
           TCNT1_B = P_D5;
            }else {if (digitalRead(inPin[2]) == LOW){
  
              TCNT1_B = P_E5;
                  }else {if (digitalRead(inPin[3]) == LOW){

                    TCNT1_B = P_F5;
                     }else {if (digitalRead(inPin[4]) == LOW){

                       TCNT1_B =P_G5;            
                       }else {if (digitalRead(inPin[5]) == LOW){

                         TCNT1_B = P_A5;
                        }else {if (digitalRead(inPin[6]) == LOW){

                          TCNT1_B = P_B5;
                          }else {if (digitalRead(inPin[7]) == LOW){

                            TCNT1_B = P_C6;
                          }else{
                              TCNT1_B = 65335; 
                                               
                            }
                           }
                          }
                         }
                        }
                       }
                    }

    }
  
}
  
ISR(TIMER1_OVF_vect){
  TCNT1 = TCNT1_B; 
  digitalWrite(B_CLK,out); //CLK出力
  if(TCNT1_B == 65335){} //無音の判定
    else{out = ~out;}
}

写真はXactiが見あたらないので後で。

1/18 動画追記
ZERO3で撮影し、実家のストーブの側だった為、画質も音質も酷いが、こんなもんかというのは分かってもらえると思う。

送信者 工作