電子鍵盤
今更だが、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で撮影し、実家のストーブの側だった為、画質も音質も酷いが、こんなもんかというのは分かってもらえると思う。
送信者 工作 |