これは何?

Touch Keyboard とは、鍵盤にタッチセンサーを付けることで、独創的な演奏法を作り出すことが出来る、新しいタイプの電子キーボードです。
このキーボードでは、今のところ下にある3つの奏法を提供します。

タッチセンサー鍵盤

鍵盤の一つ一つに10個のタッチセンサーが付いています。そのため、鍵盤自体が電子基板になっています。

オクターブ単位で拡張可能

一つのユニットが一オクターブ(12鍵)で、ユニットを足すことで、オクターブ分鍵盤を増やすことが出来ます。

USB MIDIを出力

本作品は、音源を持たないUSB MIDI Keyboardとなります。

奏法1: 鍵盤前後でビブラート

鍵盤を弾きながら、鍵盤の上で前後に指を動かすと、ビブラートが奥にいくほど深くかかります。
和音で弾いた時、一音、一音、鍵盤別にビブラートをかけることが出来ます。

奏法2: 触れただけで音が出る

鍵盤に触れただけで音が出ます。オンドマルトノのように、音程移動にポルタメントがかかります。

奏法3: 鍵盤を押す場所で音が変わる

鍵盤には10個のセンサーがあり、押す場所によって音を変えることが可能です。

展示準備

自分への備忘録として、本作品の展示準備の方法、および展示時の注意点などについて説明します。

接続

本体とコントローラを写真のようにつなぎます。
白と灰色の線は、JoyStickのAD検出用のケーブルで、4pinのケーブルはI2Cの接続です。赤い丸印が合うようにつなぎます。
また、PCとの接続はUSB-Cで行います。

PCアプリ立ち上げ

PCにUSBを繋げた後、アプリを立ち上げます。
何となくですが、制作したアプリを立ち上げるのでなく、Xcode上で動作させています。
  1. まずxcodeを立ち上げる
  2. namiheySynthのプロジェクトを選ぶ
  3. ▶︎[play]ボタンを押す
  4. コンソールウインドウにMIDIの接続先として、Auduino Leonardoの番号を入力
  5. 終了するときは、quit と打ち込んでreturn

展示時に起こりそうなこと

MFTの時にあったこと:
  1. 激しく操作し過ぎて、アプリが反応しなくなった。(オーディオアウトが追いつかない?)

基板設計と発注

以降は、TouchKeyboard製作時の記録です。
まず、基板の設計で注意したことについて記述します。

回路図

ATmega32U4をマイコンにして、鍵盤のスイッチをGPIOに直接繋ぎます。
全Touch SensorをI2Cで接続します。
PDFはこちら。

基板設計

各鍵盤からのI2Cのコネクタは基板の裏側に、リード線のハンダスペースを作りました。そのリード線を通すための穴(白鍵用)を付けました。

基板作成

写真はFusionPCBから基板が届いた様子。ここから基板を作ります。

部品のリフロー

以下の部品を基板にリフローします
  • ATmega32U4
  • 16MHz発振子
  • 22pF SMD×2
  • Fuse
  • 22Ω SMD×2
  • 5.1kΩ(4.7kΩで代用)×2
  • 1μF SMD
  • 0.1μF SMD×2
  • 4.7kΩ SMD×2
  • 10kΩ SMD×14

USB-C端子のハンダ付け

秋月で販売しているUSB-CのDIP化キットを、はんだ付けします。

一度この状態でブートを書き込んでみて、CPU周りに接触不良がないか点検しておきます。

キースイッチのハンダ付け

基板の12ヶ所に写真のように、PCキーボード向けのメカニカルキースイッチをはんだ付けします。

外部接続用の端子やケーブル

基板後ろ側にある、2ヶ所の3ピンの穴にL型ピンヘッダをハンダ付け。
また、I2Cの4ヶ所の穴から4本のケーブルを、
さらに、D1,D2のカソード側の表面実装用の端子から2本、ケーブルを引き出します。この端子はLED用からJoyStickのAD値受信用に変更しました。

3Dプリントで部品出力

本作品は基板そのものを筐体として生かしますが、その他の部品は3Dプリンターで出力します。
3Dプリントで出力するパーツは以下です。
  1. 白鍵アクション
  2. 黒鍵アクション
  3. サイドボード
  4. ストッパー

鍵盤アクションのプリント

白鍵アクションと黒鍵アクションを3Dプリントします。
白鍵アクションのSTLデータはこちら。
黒鍵アクションのSTLデータはこちら。

サイドボードとストッパーのプリント

サイドボード、ストッパー、さらに軸のスペーサを3Dプリントします。
サイドボードとスペーサのデータはこちら。
ストッパーのデータはこちら。

コントローラの製作

表示器と切替スイッチ、およびジョイスティックをこのキーボードのマイコンに繋ぐことで、より使いやすくなります。
上記のデバイスを搭載したコントローラを作成したので紹介します。

スイッチとLEDとJoyStick

スイッチとLED、JoyStickを外部コントローラとして繋げようと考えました。
JoyStickは2軸のADC、LEDはI2Cタイプだったので、スイッチもI2Cを送れるモジュールを入手。
まずは、ユニバーサル基板の上で、どんなふうに配置するか検討しました。

スイッチを基板に載せる

まずは、スイッチのみI2Cによる制御モジュールと込みで基板に取り付けました。

スイッチの基板にLEDを載せ、JoyStickの基板と一緒にMDFのボードの上にねじ止めします。
この上に、半透明のアクリルボードを載せて完成です。

鍵盤の作成


鍵盤の基板をリフロー

鍵盤裏にCY8CMBRの静電センサチップとSMDの抵抗、コンデンサをリフローでハンダ付けします。白7枚、黒5枚です。

ケーブルのはんだ付け

I2Cの4本のケーブルを8cmの長さで用意します。
このケーブルをJ11端子にハンダ付けします。
内側から、電源、GND、SCL、SDAの順になります。
これを12鍵盤分行います。

アクションと基板の貼り付け

基板と3Dプリンタで作った鍵盤アクションを接着剤で貼り付け、接着されるまで強く押さえます。
接着の際は、基板の切り欠きのあるところとアクションの出っ張りを合わせ、アクションが基板の中央に接着されるように注意深く押さえ込みます。

ケーブルを束ねる

ケーブルをハンダ付けした部分をハックルーで保護します。
白いテープで4本のケーブルをアクションに貼り付けることで束ねます。

筐体と鍵盤を組み上げ

メインの基板にサイドボード、ストッパーをネジ止めし、横棒で鍵盤を固定していきます。
鍵盤からの信号線をメイン基板にハンダ付けします。

サイドボード、ストッパーのねじ止め

基板に3Dプリントしたサイドボード、ストッパーをねじ止めします。

白鍵の取り付け

  1. 白鍵から出ている4つのリード線を該当する基板の穴に通します。
  2. 鍵盤アクションの爪の部分をストッパー縦長の穴に差し込みます。
  3. 横から横棒をアクションの穴に通し、鍵盤を固定させます。鍵盤間にはスペーサを入れます。

白鍵全鍵の固定

上記を7回繰り返して、二つのサイドボードの穴に横棒が通ると、写真のように白鍵が固定されます。
また、このとき基板の裏面では、基板の7つの穴からI2Cの4つのリード線が飛び出している状態です。

白鍵のリード線をハンダ付け

穴から出ている4つのリード線を基板にハンダ付けします。
写真のように、赤、黒、黄、青の順にハンダ付けしていきます。

黒鍵の取り付け

まず、横棒をサイドボードから穴を通します。
その後、白鍵と同様、黒鍵アクションの爪をストッパーの穴に入れて、横棒を通して一つ一つ固定していきます。

黒鍵のリード線をハンダ付け

白鍵と同様、黒鍵から出るリード線を5鍵分、メイン基板にハンダ付けしていきます。

配線保護する

配線が終わったら、導通チェック、および静電センサのセットアップ時の書き込みなどを行い、最後にハンダ付け部分をハックルーで覆い、配線の保護をしておきましょう。

ファーム&Touch Sensor書き込み

Master BoardのマイコンはATmega32U4になります。このマイコンに、ブートローダとMaster用のファームを書き込みます。
ファームを書き込むために、専用の書き込み機を用意します。写真の書き込み機は、Pro Microに書き込み機用のファームを書き、SPI端子を引き出して基板のコネクタに接続できるように製作したものです。

Arduino IDEの設定

Arduino IDEに「Adafruit NeoPixel」「MsTimer2」「MIDI Library」のLibraryをインストールします。

ブートローダーの書き込み

基板を作って最初にATmega32U4にファームを書き込む時は、まずブートを書き込みます。

書き込み時のツールメニューの設定は、
「ボード:"Arduino Leonardo"」
「書込装置:"Arduino as ISP(ATmega32U4)"」
としてください。
その後、ツールメニューの「ブートローダを書き込む」を選ぶと書き込みが始まります。

ファームウェアの用意

ファームウェアはGithubに置いてありますので、これをダウンロードしてください。
その後、Arudino IDEで開いてみて、コンパイルを通してみます。

ファーム書き込み

デバッグ、動作確認用に、I2C端子(J5)にAdafruitの8*8 LED Matrixを接続します。
次に、J4端子に書き込み確認用のLEDのアノード側を接続します。

また最初にファームを書き込む際、configuration.h のSETUP_MODE を 1にしておきます。
最新ファームを書き込みます。IDEのボタンではなく「書き込み装置を使って書き込む」を選んで書き込んでください。

最初の立ち上げ

Cypress CY8CMBR3110チップに対して、本製品用の設定を書き込みます。鍵盤分チップがあるので12回行います。
立ち上がると、エラーLEDがしばらく点灯した後、3回点滅します。8*8LED Matrixは、下二行の12個のLEDが点灯します。

一つ目のTouch Sensor設定

JP1にハンダを盛って導通させます。
ここでUSBを接続し電源を入れると、Cの鍵盤のTouch Sensorへの設定書き込みが行われます。他のICはエラーになるので、エラーLEDがしばらく点灯した後、3回点滅します。
その時、8*8LED Matrixには、写真のように表示されるはずです。これは、12 個のセンサーのうち、一つだけ正常に動いている状態を表しています。

二つ目以降

同様にC#の鍵盤のTouch Sensorの書き込みが終わると、LED Matrixは写真のようになります。
これを、残りの鍵盤だけ行います。

LED Matrixが全く光らないようになれば、Touch Sensorへの書き込み終了です。

通常ファームの書き込み

Touch Sensorへの書き込みが終わったら、configuration.h の SETUP_MODE = 0 にして、再びファームを書き込みます。

プログラミング覚書

ファームおよび、音源プログラムで本作品のために何をどのようにしたか、今後にも役立ちそうな情報を書いてみます。

二つのボードを繋げる仕組み

いつも通り、シリアルMIDIの数珠繋ぎなんですが、ATmega32U4同士の接続は初めて。
やってみたら、少々トラブルはありましたが、システム的な問題はなく無事接続できました。

ハマったこと
  • MIDI ch=1-16 はプログラム中は 0-15 であることを期待するけれど、ArduinoのMIDI Libraryは 1-16 だった。最初はなぜ0で送れないのか悩んだ。
  • 送り側が1オクターブ高くなるので、その値で送ったら、受け側のオフセットノート値を足し込んで、とんでもないノート番号になった。

静電センサ12個接続

I2Cで繋げる静電センサが12個というのは初めて。
I2Cアドレスを全部変えねばならず、静電センサのセットアップは12回、センサへの書き込みが必要になった。アドレスとchecksumを変えるだけのテーブルを、Cypressのツールで作成。
数は多かったが、特に問題なく動作している。

チェック用LEDをJoyStickに

基板製作当初は、チップLEDを載せて、デバッグなどに使おうとしていたが、途中でJoyStickを付けたくなり、幸いチップLED用の端子でADが取れるため、この二つの端子をJoyStickに接続するよう仕様を変更。
ADは特に問題なく繋がり、JoyStickとして利用することに成功。