思いのほか簡単に制御ができたので、
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 |


コメントを残す