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.

