思いのほか簡単に制御ができたので、
Arduino UNOで使えるPWM出力6つを全部使ってみよう。
ってできたー!
後ろの画面が6ポート分のMIDI信号で、
一番上の信号が一番左のLEDに対応、
よく見るとそれぞれのカーブとLEDの光りが
一致していることがわかる。
回路はLED(と抵抗)を6つつないだだけ。
以下コード。
#include <MIDI.h> //MIDIライブラリ読み込み MIDI_CREATE_DEFAULT_INSTANCE(); #define P3 17 #define P5 18 #define P6 19 #define P9 20 #define P10 21 #define P11 22 void setup() { MIDI.begin(); //MIDIライブラリを使う MIDI.turnThruOff(); //MIDI IN-OUTのループ防止 pinMode(3,OUTPUT); //ポートの設定 pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); } void loop() { uint8_t data1,data2; if (MIDI.read() and MIDI.getType() == midi::ControlChange) //MIDIコントロールチェンジを受信したら { data1 = MIDI.getData1(); //CC No取得 data2 = MIDI.getData2(); //CC 値を取得 switch(data1) { //CC Noに応じたポートにPWM送信 case P3: //CC No data2 = data2*2; //CCの値を2倍(0-254)に変換 analogWrite(3,data2); //ポートに送る break; case P5: data2 = data2*2; analogWrite(5,data2); break; case P6: data2 = data2*2; analogWrite(6,data2); break; case P9: data2 = data2*2; analogWrite(9,data2); break; case P10: data2 = data2*2; analogWrite(10,data2); break; case P11: data2 = data2*2; analogWrite(11,data2); break; } } }
3ポートからはCC17で…えーと5は18で…
といちいち考えるのは面倒なので、#defineで
ポート(Pいくつ)に応じたコントロールナンバーを定義。
あとはコードに解説してある通り。
caseのところもdefineをうまく使えば簡単に書けそうな気もするけど
まあそこは今後の成長に期待するとして今回は縦にズラーっと。
13行目のMIDI.turnThruOff();
これが前回ちょっとトラブったMIDI信号のループを防止する
命令らしい。今回の発見。
ついでなので5Vのリレーをつないで早めのオンオフを
してみたが、追従性に問題なし。
(音声をオンにするとリレーのカチカチが聞こえる)
できればもっとたくさんのポートを制御したいんだけど、
Arduinoを何台も並べないとだめかなー、
という調査を次回する。
〈Arduino関連〉Arduino UNO |
コメントを残す