Trinket MIDI Controller

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仕様です。


写真は3.3vバージョンです。

Adafruit Trinket SWITCHSCIENCEの商品紹介ページ

Arduino IDEの設定

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のピン配置は以下の通りです。


cdn-learn.adafruit.com

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)に置いておきます。

菓子箱で実装した例を以下に示します。




MCP9808 with Trinket

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.
ハードウエアの接続