Adafruit Trinketで作成したMIDI Controllerの紹介です。 Trinketには3.3V動作と、5.0V動作の製品があります。 MIDIは5Vが標準規格(今は3.3V-MIDIも規格化されています)ですので、5Vの製品を選びました。 Trinketは切手サイズのArduinoですので、お菓子の箱に入れたMIDIコントローラを作成することも可能です。
(注)商品コード"ADA-1501"は5V仕様、商品コード"ADA-1500"は3.3V仕様です。
Adafruit Trinket SWITCHSCIENCEの商品紹介ページ
Adafruit TrinketをWindowsで開発するために、2つの事を行います。 一つはドライバーのインストール、もう一つはArduino IDEのボードマネージャを更新します。 ドライバーは開発元である、Adafruitのサイトhttps://learn.adafruit.com/ からダウンロードできます。画面の緑の"Download Latest Adafruit Windows Driver Installer"を押すとインストーラがダウンロードできます。 もしくは、AdafruitのGuihubからもダウンロードできます。
次にファイル > 環境設定で、追加のボードマネージャのURLに次のように入力します。
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json
ツール > ボードから、Adafruit Trinketを選びます。
書き込み装置を"USBtinyISP"を選びます。 Arduino UnoはComポートしてWindowsから見えますが、MacではComポートとしては見えませんでした。 Windowsで書き込むのが無難なようです。
スケッチの書き込み時に以下のようなエラーが出ることがあります。 この場合には、スケッチの書き込みボタンを押すした直後に、Trinketのボード上のリセットボタンを押します。 Trinketの赤いLEDが点滅し、書き込みモードとなります。点滅すれば書き込むことができます。 Macはこの方法でも認識できませんでした。
avrdude: error: usbtiny_transmit: libusb0-dll:err [control_msg] sending control
message failed, win error: ?V?X?e???????????f?o?C?X???@?\??????????B avrdude: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check. シリアルポート「Double check connections and try again, or use -F to override 」が選択されていますが、そのポートは存在しないか、ボードが接続されていません。 avrdude: error: usbtiny_transmit: libusb0-dll:err [control_msg] sending control
message failed, win error: ?V?X?e???????????f?o?C?X???@?\??????????B
Adafruit Trinketのピン配置は以下の通りです。
Adafruit Trinketは手足が限られていますので、コントローラとしては小型アナログジョイスティックと、スイッチを1つ搭載することにします。アナログジョイスティックは、こちらもスイッチサイエンスさんで扱っているものを使いました。
小型アナログジョイスティック SWITCHSCIENCEの商品紹介ページ
Adafruit TrinketにはUARTはついていませんので、GPIOポートをシリアル通信に使います。回路の例を掲示いたします。
GPIO1をRXに、GPIO2をTXに使います。MIDIを出力するには、以下のようなプログラムを書きます。
#include <SoftwareSerial.h> SoftwareSerial mySerial(0, 1); // RX, TX void setup() { // ソフトウェアシリアルの初期化 // 31.25kbps mySerial.begin(31250); } int data=0; void loop() { char data1=data%128; char data2=(data+17)%128; char CHx = data%16; //チャンネル番号 mySerial.write((uint8_t)(0xB0+CHx)); // ステータス mySerial.write((uint8_t)data1); // データバイト1 mySerial.write((uint8_t)data2); // データバイト2 data++; if(data>=256) data=0; delay(1000); }
ジョイスティックの水平方向、垂直方向はAD2,AD3で読み込んでいます。スイッチの情報はGPIO2で読んでいます。 読み込んだ情報から、MIDIを出力するArduinoのスケッチファイルの例をこちら(TrinketMIDIController.ino)に置いておきます。
菓子箱で実装した例を以下に示します。
Adafruit MCP9808は高精度な温度・湿度計です。インターフェースはI2Cです。 このモジュールをTrinketに繋ぎ、温度と湿度の値をシリアルで出力します。 シリアルはFT232RLを使って、USBに変換します。
プログラムを開発する準備として、ライブラリマネジャーを使ってTrinyWireMライブラリをインストールします。 私の場合はDocuments/Arduino/librariesのフォルダにTinyWireMがインストールされます。
もう一つ、Adafruit MCP9808 Libraryとして2つのファイル、 Adafruit_MCP9808.cppとAdafruit_MCP9808.h が必要です。 ライブラリマネジャーを使ってダウンロードしたファイルはTrinketではそのままでは使えません。 また修正したとしても、汎用のライブラリをいくつか使っているため、コンパイル結果が大きくなってしまい、Trinketのメモリーを 超えてしまってやはり使うことができませんでした。
そこで、過去にダウンドードしたファイルをTrinket用の修正したもの とArduinoのスケッチファイルmcp9808_trinket.inoを、 こちらのGithubに置きました。
このスケッチをコンパイルしてみると、Trinketのプログラムメモリの81%を使っていることがわかります。 Trinketのプログラムメモリは流石に小さいことがわかります。
Sketch uses 4326 bytes (81%) of program storage space. Maximum is 5310 bytes.