MIDIスライドホイッスル ”MEMIDION” 完結編
以前作ったMIDIスライドホイッスルをカッコよく改修しました!
アクリルで筐体作ってMIDIコントローラ内蔵してLEDで装飾しました!結構(ムダに。。)頑張ったので詳細記載します。
目次
構成
USBホストシールドをArduino Pro Miniに載せてMIDIコントローラの信号を直接受けれるようにしました。Moco for LUFA でMIDIデバイス化したArduino UNOも載せているのでDAWで制御も可能です。
乾電池2個で動きます。
部品
- マイコン Arduino Pro Mini 328 – 3.3V/8MHz
USBホストシールドを載せてMIDIコントローラの信号を直接受信します。
- ミニUSBホストシールド
- マイコン Arduino UNO
USB-MIDIデバイス化してDAWに接続して使用します。
- スライドホイッスル
- モーター シングルギヤボックス
モータでスライドホイッスルをスライドさせます。ギア比は38.2:1で使用。
- モータドライバDRV8835
- トラック&ホイールセット
キャタピラをホイッスルのスライド部に固定しました。
-
赤外線近接距離センサモジュール VL6180X
- LEDテープ NeoPixel RGB/W テープLED 144LED/1m
ピッチの狭いLEDテープを使用したかったので手元にあったRGBWのNeoPixelを使用しました。
- 5V出力コイル一体型昇圧DCDCコンバーター
電池の電圧を5Vに昇圧してMIDIコントローラとArduino Pro Mini用の電源に使用
- MIDIコントローラ KORG nanoKEY2
LED装飾
LEDテープを追加して距離センサの結果を使用して、スライド量に応じて点灯するようにしました。だって綺麗でしょ 🙄 。
MIDIスライドホイッスル “MEMIDION” USBホストシールドでコントローラ直接接続出来るようにしました。あとLEDで装飾。#MIDI #neopixel #Arduino #タミヤ pic.twitter.com/E7a2lX03Wg
— HomeMadeGarbage (@H0meMadeGarbage) 2018年9月9日
MIDI音源モード
前回と同じモードです。
Moco for LUFA でMIDIデバイス化したArduino UNOを用いてMEMIDIONをMIDI音源化します。DAWソフトの入ったPCをUSB接続してシーケンスで自動演奏可能です。
UNOで受けたDAWからのMIDI信号をSoftwareSerialでArduino Pro Miniに送信してモータとLEDを制御します。USBを差すと直ぐにMIDI音源モードになります。
MIDIスライドホイッスル “MEMIDION”
DAW音源モード#arduino #LED #MIDI #daw #losingobernablesdejapon #stardust pic.twitter.com/GHrylmmHTF— HomeMadeGarbage (@H0meMadeGarbage) 2018年9月25日
息は人力です。。。。
楽器モード
USBホストシールドを採用してMIDIコントローラを直結してMEMIDION単体で演奏できるようにしました。
ミニUSBホストシールドをArduino Pro Miniに載せてMIDIコントローラの信号を直接受けてモータとLEDを制御します。
ミニUSBホストシールドの詳細とArduino Pro Miniとの接続方法は以下を参考にしました。
オリジナル楽器 MIDI スライドホイッスル 演奏
「The Fool On The Hill」 / The Beatles pic.twitter.com/bEpCMAB5g3— HomeMadeGarbage (@H0meMadeGarbage) 2018年10月12日
電源スイッチONで単体で気軽に演奏が楽しめます♪
乾電池駆動
利便性を追求して乾電池単体で動かせるようにしました。モータ駆動ノイズを完全に除去するのは難しかったので制御系電源は5V DC/DC昇圧とマイコン内の3.3V LDOに踏ん張ってもらうことにしました。
アクリルで筐体作成
アクリルで筐体をこしらえてかっこよくしてみました。
アクリルで見栄え良くの予定 pic.twitter.com/aOMYohMgCw
— HomeMadeGarbage (@H0meMadeGarbage) 2018年9月22日
アクリル内に諸々部品を配置・配線。
天板にはLEDとMIDIコントローラを配置。
天板にカッコよく黒カッティングシート貼れば完成!あと仮で nanoPAD2 付けてるけど本当は nanoKEY2 にしたい。現在購入中。#KORG #はよ来い #1か月待ち #Amazon pic.twitter.com/tL9MAZrDNr
— HomeMadeGarbage (@H0meMadeGarbage) 2018年9月24日
ダイソーのベルト切ってネジ止め。メロディオン(鍵盤ハーモニカ)感強まる pic.twitter.com/WJwlFCXzUc
— HomeMadeGarbage (@H0meMadeGarbage) 2018年9月27日
Arduino IDEコード
USBホストシールド用のライブラリは以下を使用しました(ver. 1. 3. 2)。
https://github.com/felis/USB_Host_Shield_2.0
MIDI信号を取り扱うコードは以下を参考にしました。
https://github.com/felis/USB_Host_Shield_2.0/tree/master/examples/USBH_MIDI/USBH_MIDI_dump
距離センサVL6180X用のライブラリは以下です。
https://github.com/pololu/vl6180x-arduino
テープLED NeoPixelライブラリは以下
https://github.com/adafruit/Adafruit_NeoPixel
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
#include <usbh_midi.h> #include <usbhub.h> #include <SPI.h> #include <Wire.h> #include <VL6180X.h> #include <Adafruit_NeoPixel.h> USB Usb; USBH_MIDI Midi(&Usb); uint8_t Note, oldNote; VL6180X sensor; int meas; int aim = 50; int diff = 5; #define PIN A3 #define NUM_LEDS 24 #define BRIGHTNESS 30 int num; Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800); void MIDI_poll(); void setup() { Serial.begin(115200); Wire.begin(); pinMode(2, OUTPUT); pinMode(3, OUTPUT); digitalWrite(2, LOW); digitalWrite(3, LOW); sensor.init(); sensor.configureDefault(); sensor.setTimeout(500); strip.setBrightness(BRIGHTNESS); strip.begin(); strip.show(); if (Usb.Init() == -1) { while (1); //halt } delay( 200 ); } void loop() { Usb.Task(); if ( Usb.getUsbTaskState() == USB_STATE_RUNNING ) { MIDI_poll(); } } // Poll USB MIDI Controler and drive motor void MIDI_poll() { char buf[20]; uint8_t bufMidi[64]; uint16_t rcvd; if (Midi.RecvData( &rcvd, bufMidi) == 0 ) { if(bufMidi[0] == 9){ Note = bufMidi[2]; Serial.println(Note); //モータ初期動作 if(Note > oldNote){ digitalWrite(2, HIGH); digitalWrite(3, LOW); }else{ digitalWrite(2, LOW); digitalWrite(3, HIGH); } delay(50); digitalWrite(2, LOW); digitalWrite(3, LOW); } } //スライド距離設定 if(Note == 57) aim = 19; //A if(Note == 58) aim = 29; //A# if(Note == 59) aim = 39; //B if(Note == 60) aim = 49; //C if(Note == 61) aim = 59; //C# if(Note == 62) aim = 67; //D if(Note == 63) aim = 78; //D# if(Note == 64) aim = 85; //E if(Note == 65) aim = 93; //F if(Note == 66) aim = 102; //F# if(Note == 67) aim = 109; //G if(Note == 68) aim = 112; //G# if(Note == 69) aim = 120; //A if(Note == 70) aim = 124; //A# if(Note == 71) aim = 129; //B if(Note == 72) aim = 131; //C //距離センサ測定 meas = sensor.readRangeSingleMillimeters(); Serial.println(meas); //LED点灯 num = map(meas, 22, 133, 4, 23); for(int i=num; i<strip.numPixels(); i++) { strip.setPixelColor(i, Wheel(255/strip.numPixels() * i)); //delay(100); } strip.show(); //モータスライド動作 if(meas > (aim - diff) && meas < (aim + diff)){ digitalWrite(2, LOW); digitalWrite(3, LOW); }else if(meas > aim){ digitalWrite(2, LOW); digitalWrite(3, HIGH); }else if(meas < aim){ digitalWrite(2, HIGH); digitalWrite(3, LOW); } //LED消灯 strip.clear(); oldNote = Note; } // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0); } uint8_t red(uint32_t c) { return (c >> 8); } uint8_t green(uint32_t c) { return (c >> 16); } uint8_t blue(uint32_t c) { return (c); } |
結び
もうこれでスライドホイッスルをスライドする必要はなくなりました!制御はMIDI信号ですが息は人間によるものですので あたたか味は損なわれません!
Playing the MEMIDION#MIDI #スライドホイッスル #キラキラ星 pic.twitter.com/pAmKR7QOAZ
— HomeMadeGarbage (@H0meMadeGarbage) 2018年10月12日
追記
Adafruitのブログで紹介いただきました(2018/10/29)