日本語が、大好きです。(Sorry, Japanese Only.)
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31       
<< 2024 March >>

no fun nolife
NEW ENTRIES
RECENT COMMENTS
CATEGORIES
rss
 はてなアンテナに追加
 はてなRSSに登録
 Bloglinesで閲読登録
 Subscribe with livedoor Reader
 Add to Google
 My Yahoo!に追加
LINK
ARCHIVES
music
LOGIN
現在のモード: ゲストモード
USER ID:
PASS:
logout
 Arduinoでmidi制御をしたい!っていうのであれば、シリアル通信の次に必要なのはタイマ割り込みです。これがないと、正確なクロック信号は出せない。と言うわけで、タイマ割り込みの使い方なんぞを。

■タイマ割り込みってなんぞ?
 タイマ割り込みっていうのは、CPU(コンピュータ)に「一定の間隔で」仕事をさせるための仕組みになります。例えば、あなたがまんじゅうを作って箱詰めをする仕事をしています。仕事はめいっぱいのパワーでやって頂いて構わないのですが、1時間置きに上司に進捗を電話する必要があります。ところが、上司は13時であれば13時から13時3分の3分間しか電話の前に居ません。そうすると、あなたは、まんじゅうの箱詰めをやりながら常に時間を気にしなくちゃいけない。あなたがまんじゅうの仕事に集中するには、1時間毎に時刻を知らせてくれる腕時計が必要になります。この腕時計の仕事をするのがタイマ割り込みです。

 midiコントローラを作るのであれば、基本bpm制御は必要。このbpm制御に使用するわけです。



■Arduinoのタイマ割り込み
 じゃ、Arduinoのタイマ割り込みを見てみましょう。Arduinoには、「timer1」と「MsTimer2」の2つ。大まかな事はdenkitribeさんのブログで紹介されています。

□Arduino のタイマー割り込みライブラリ
http://d.hatena.ne.jp/KZR/20090804/p1

つまり大まかに言えば
 ・timer1の方が精度が高い(μ:m)
 ・どちらもPWMの影響を受ける(与える)
 ・Timer1は9,10、MsTimer2は3,11ピンのPWM制御に使っている

 の3点。PWMっていうのは、「パルス幅変調」の事でアナログの出力に使用してます。詳しくはwikiでも見て欲しいんだけど、おおざっぱに言えば、on/offの2値しかなくても、スッゲェ速度でon/offをくり返せば、on/offの間の値を表現できるんじゃね?っていう事。たぶん。

 midiコントローラ作るんだから精度は必要だろ!っていう訳で、ここではtimer1を使う事にしましょう。

□タイマ割り込みの仕組み
 じゃあ、プログラム上ではタイマ割り込みはどうやって設定されるのかっつーと、「コールバック関数」っていう仕組みを使う。「コールバック関数って?」って言われると、今度は関数ポインタとかなんやら色々説明しなくちゃいけないので、詳細は「ぐぐって」欲しい。


■Timer1を使う

□前準備
 Timer1はArduinoのplaygroundからダウンロードすることができます。
http://www.arduino.cc/playground/Code/Timer1

 ダウンロードしたファイルはライブラリ用のディレクトリにコピーすれば使えます。詳しくは以下。
http://extend.ore.to/index.php?e=1348


□コーディング
・コールバックを設定
 Timer1はそのまま「Timer1」っていうオブジェクトを使って処理を書く。オブジェクトはTimer1のヘッダファイルで宣言されています。

やりたいことは、bpmに合わせてmidiを出力するタイマ割り込みなので、それ用の関数を作ります。

// タイマ割り込み設定(bpm)
void setTimerBpm(void (*isr)(),int bpm)
{
// bpmから割り込み時間を計算、割り込み関数を定義する
// = 1分/bpm    (1分間に刻むビート)
//   * 1000000  (μ秒)
// = *4 (1拍を4分割)

    long time = (60 * 1000000) / bpm / 4 ;

    Timer1.initialize(time);        // 割り込み間隔を設定
    Timer1.attachInterrupt(isr);    // コールバック関数を設定

}


 あとは、これを関数setup()で設定してあげればOK

// タイマ割り込み設定。
    setTimerBpm(callback,140);
    Timer1.pwm(9, 512);


 「Timer1.pwm(9, 512);」に関しては、すでにタイマ1を使ってるpwmに対して、制度を再設定する関数らしい。ただ、どれぐらいに下げればタイマ割り込みの制度がどの程度あがるのか、そもそもどの程度の影響があるのかは謎。それは別でまた調べてみたい。


Recent Entries from Same Category









    
処理時間 0.664738秒