Loopian::ORBITとは

Loopian::ORBITは、円環状に配置されたデバイスの上のへりに触れることでピアノの音を奏でる楽器です。PC上で動作するLoopian::APPとMIDI接続することで、PCの音源で音を鳴らすことができます。
以下の特徴があります。

自動伴奏のためのLoopian用デバイス

動画内で動作している Loopian というアプリを同時に作っています。
このアプリではループしながら、少しずつ音楽を作ったり、変容させたりするパフォーマンスが可能です。
Loopian::ORBITはこのアプリと接続することで、タッチした音程が和音に合わせて変わっていきます。

ヘリを撫でると音が鳴るタッチ式楽器

鍵盤のようなスイッチではなく、上部の山の頂上を撫でることで発音するタッチ式の楽器です。音だけでなく、触れた場所のLEDが優しく光り視覚的にも楽しめます。

タッチセンサを円環状に配置

このタッチ式のデバイスは緩やかにカーブしています。これを6個連結すると、90°分の円弧が完成。そして24個連結すると円環になります。
円環状にすることで、同時に複数人が演奏を楽しむことができます。

部品入手

このプロジェクトを制作するにあたり、入手に注意すべき部品について、ここで紹介します。
なお、ORBITの筐体一つで角度が15度となるので、90度分では6個必要。一回り分制作すると24個必要になります。

透明電極

今回は、LEDの光を3Dプリントした筐体の中で光らせて、そのまま全体が光るようにしたいため、タッチセンサーが透明である必要があります。
Bit Trade One の透明電極を使用しています。
購入はこちら。

白色LED

いくつかのLEDを入手し値段と性能を比べた結果、以下の型番のLEDを使うことにしました。
基板一つあたり16個、90度分で96個必要です。
Inolux IN-S126AT5UW

IC

以下のICを使用します。
CY8CMBR3110 : 静電センサ(90度分で6個必要)
TCA9544A : I2Cマルチプレクサ(90度分で6個必要)
PCA9685 :  I2C PWMコントローラ(90度分で6個必要)

Control基板向け部品

NJM7805S(5V, 1.5A) : レギュレータ
1N4148W : レギュレータ保護用ダイオード(DIP)
リセッタブルヒューズ
2.1mm DCジャック

Raspberry Pi pico

Control基板に搭載するマイコンボードとしてRaspberry Pi picoを使用します。

<ProMicro版>マイコンボード

Raspberry Pi picoを使用する前は、Sparkfun pro microボードを利用していました。

Control基板の作成

センサー基板、LED基板を動作させるためのコントロール基板を作成します。
先にコントロール基板の作成を紹介するのは、LED基板やセンサ基板を作る過程で動作チェックをしたいからです。
コントロール基板には、Raspberry Pi picoをマイコンとして使用します。
それ以前には、Sparkfun pro micro(ATmega32U4)を使用しましたので、その情報も下の方に載せておきます。

基板設計

こちらが回路図となります。
Raspberry Pi picoをメインのマイコンボードとし、各デバイスをI2Cに繋いでいます。また、ジョイスティックをADCに、LEDなどをポートに接続しています。

設計のポイント
  • picoの電源はVDDと切り離してあり、基板上の電源を使わない選択も可能
  • LEDは、外部電源と切り離してあり、3.3Vで動作
  • 20pinのGPIO15はアナログスイッチで、5VでLED用のトランジスタを制御する

基板への部品実装

右の写真が基板に部品を実装した状態となります。

実装時以下の点に注意
  • J14のVDDを、J1のVSYSに繋げること
  • 8×8LED Matrixのコネクタ部のSCL, SDAが逆になっているため、4ピンのピンヘッダを使わず、2ピンのピンヘッダを使い、SCL/SDAはリード線を手ハンダで逆に付け替える(基板修正の必要あり)
  • R3をつけずに直結、U2の4pinをJ2の5pinに直接繋がず、途中に1kΩの抵抗を入れる(基板修正の必要あり)

<ProMicro版>基板設計

Pro Micro版の基板は、左の通りです。
LEDが16×6個あるので、1A程度は出力できる電源ICを搭載してあります。

<ProMicro版>部品実装

この基板を設計する段階では、右上の3つのLED、88matrixLEDの搭載は予定していなかったので、写真のようにユニバーサル基板を切断して必要な部品を実装します。
  • 88matrixLEDを接続する際、VDDとGNDが、SCLとSDAが位置が逆になっているので、子基板で配線を逆にしてデバイスに繋ぎます。
  • pro microのGPIO出力を3つのLEDに繋ぐための子基板を右上のように作ります。VDDを近くの端子から取ってきます。

<ProMicro版>Control基板のファーム書き込み

Sparkfun pro microをマイコンとして使用した時のファーム開発および、プログラムの書き込み方法について説明します。

ファームウェアの在処と設定

ファームウェアはGithubに置いてあります。
また、Arduino IDEに「MsTimer2」「MIDI Library」「MIDIUSB」のLibraryをインストールします。

書き込み機の準備

ファームを書き込むときは、IDEのボタンではなく「書き込み装置を使って書き込む」を選んで書き込んでください。
ファームを書き込むために、専用の書き込み機を用意します。写真の書き込み機は、Pro Microに書き込み機用のファームを書き、SPI端子を引き出して基板のコネクタに接続できるように製作したものです。

書き込み準備

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

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

表示器の意味

表示器は全部で4つあります。
  1. LED1 緑
  2. LED2 緑
  3. LED Err 赤
  4. 88matrixLED 黄色

電源投入時、LED1,LED2,LED Errが3回点滅します。
その後、setup()関数を走っているとき、LED2のみ点灯します。
デバイスに一つでもエラーがあると、LED Errが点灯します。
setup()を抜けて、loop()に入ると、LED2は点滅します。

なお、88matrixLEDは、状況に応じて様々な情報を表示します。

LED基板の作成

白色LEDを16個搭載した基板を作成します。
今回使うLEDの型番は以下。(mouserで購入)
IN-S126AT5UW  size:1206  Vf: 3.6v, 20mA, 180mcd 

LED基板のリフロー

LEDを16個、120オームの抵抗を16個、0.1μのコンデンサを一つ、リフローではんだ付けします。

LEDの電流の流れる方向は、文字を読める向きにして、右から左となります。

追加のはんだ付け

基板表に、トランジスタ 2SA1313をはんだ付けします。 → リフローできるようになりました。
次に基板裏面に、LEDドライバ PCA9685を手ハンダします。先にボンドでチップを接着しておくと良いでしょう。

JP1-3の設定

ジャンパースイッチJP1-3に適切にはんだ付けして、アドレスを設定します。
実際には、センサー基板側のI2Cアドレスで設定するので、ここは全てLO,LO,LO(マークの付いているほう)に設定します。

基板動作チェック

LED基板をセンサーホルダーに取り付ける前に、この基板が正常に動作することを確かめておきたいはずです。Control基板のI2Cに仮繋ぎして、LED基板を動作チェックします。
[LED基板チェック方法]
  1. LED基板を仮繋ぎ後、88matrixLEDの右上のリード線をGNDに接続
  2. ジョイスティックを押したまま、電源投入
  3. 88matrixLEDに「B」(brightの意味)が表示
  4. LED基板のLEDが交互に光るはず

ケーブルのはんだ付け

J2の端子に裏側に伸びるようにリード線をはんだ付けします。
次に、J1に4本のケーブルをはんだ付けします。
ケーブルはあらかじめ20mmほどにカットし、両端共にケーブルストリッパーで銅線を出しておきます。

センサ基板の作成

静電センサCY8CMBR3110を使って、基板一枚につき8つのタッチセンサを実現しています。この基板を作成します。

センサ基板のリフロー

センサ基板に、静電センサ(CY8CMBR3110)、I2Cマルチプレクサ(TCA9544A)、10k抵抗、560抵抗、0.1μ、1μ、2.2nFをリフローします。
R1,R2,R11,R12: 10k
R3-R10: 560
C1,C2,C4: 0.1μ
C3: 2.2n
C5: 1μ
TCA9544Aは、端子が0.65mmと狭く、ブリッジすることも多いので、必要に応じてあとで修正します。

JP1-3の設定

ジャンパースイッチJP1-3に適切にはんだ付けして、アドレスを設定します。
3側がLO, 1側がHI になります。
adrs = JP1,JP2,JP3
0 = LO,LO,LO
1 = LO,LO,HI
2 = LO,HI,LO
3 = LO,HI,HI
4 = HI,LO,LO
5 = HI,LO,HI

基板動作チェック

センサ基板をセンサーホルダーに取り付ける前に、この基板が正常に動作することを確かめます。Control基板のI2Cに仮繋ぎして、センサ基板を動作チェックします。
[センサー基板チェック方法]
  1. センサ基板をI2Cに仮繋ぎする
  2. ジョイスティックを押したまま、電源投入
  3. 88matrixLEDに「Su」(Setupの意味)が表示
  4. 書き込みが成功すれば「Ok」失敗すれば「Er」が表示される
  5. もう一度電源を投入すると、Normal Modeで起動
  6. 起動時チェックが成功すると、失敗した基板だけbitが消える
  7. その後、一つ一つのタッチを触り動作チェック

透明電極接触部のはんだ付け

基板の裏側に8つの小さな丸い端子があります。ここにハンダを盛ります。
透明電極と接する部分ですので、8つのはんだの盛りが均等になるように注意します。接触が悪い場合、あとで調整する可能性があります。

センサー基板のリフロー(旧)

<古い基板の情報>
センサー基板に、静電センサ(CY8CMBR3110)、I2Cマルチプレクサ(TCA9544A)、10k抵抗6つ、0.1μ4つ、1μ3つをリフローします。
TCA9544Aは、端子が0.65mmと狭く、ブリッジすることも多いので、必要に応じて写真のようにあとで修正します。

センサーホルダーの組み立て1

センサーホルダーをプリントアウトし、ナットなどを装着します。
そのあと、LED基板をねじ止めします。

センサーホルダーを3Dプリント

このデータでセンサーホルダーを3Dプリントします。

センサー受け板を作成

このデータでセンサー受け板をレーザーカットします。
アクリルの2mm程度の厚さの板を使用します。
あるいはこのデータで3Dプリントします。

四角ナットの装着

5つの細い穴に四角ナットを縦に挿入します。
また、二つの四角い深い穴に、四角ナットを入れ、動かないように周囲を接着剤で固めます。

LED基板のねじ止め

LED基板をセンサホルダーに装着します。
リード線をネジ穴横にある小さな四角い穴に通します。また、ケーブルを真ん中の穴に通します。最後にネジで15mmのネジで、基板とホルダーをねじ止めします。

センサーホルダーの組み立て2

センサーホルダーに、透明電極、センサー基板を装着します。

透明電極の切り出し

シート上で販売されている透明電極を8mm×42.5mmに切り出します。
まずイラレで書いた切り出しの線をプリントアウトして、その上に透明電極シートをテープで貼り付けます。  
紙に印刷された線をなぞって透明電極をカットし、これを8枚用意します。この電極を導通側を山にして半分に折ります。

透明電極を接着剤で仮止め

透明電極を写真のように接着剤で貼ります。このとき、センサーの真ん中の折り目が8本とも一直線になるように、接着されるまでの間にセンサーの位置を調整します。

センサー基板をねじ止めする

センサー基板を8mmの長さのネジでセンサーホルダーにねじ止めします。  
この状態で、いったん透明電極の動作チェックをします。Control基板と接続し、透明電極に触れてセンサーが反応するかチェックします。もし反応しない場合、ハンダの山とセンサーの噛み合わせを調べ、ハンダを盛り直したり、削ったりして調整します。

ケーブルをセンサ基板にハンダ付け

LED基板から出ているケーブルを、センサー基板側に折り曲げて基板のホールに通した後、はんだ付けします。

透明電極をホルダーの反対側で抑える

8つの透明電極を、センサー基板の無い側に固定します。
まずは写真のように、薄い絶縁テープで軽く固定。その後、テープで仮止めした状態のまま、センサー受板で3箇所、ねじ止めして完全に固定します。

5pinコネクタ付きケーブル取り付け

5pinのメスコネクタのケーブルを5cmにカットします。なお、ケーブル1本のみ7cmでカットします。このケーブルをセンサー基板の4つの穴にハンダ付けし、長いケーブル一本をLED基板から出したリード線に繋ぎます。
これでセンサーホルダーの組み立て完です。

ORBITかまぼこ筐体への組み立て

ここでは、ORBITを構成する一つ一つの筐体がかまぼこに似ているため、かまぼこ筐体と呼ぶことにします。まず、かまぼこ筐体を3Dプリントし、その中にセンサーホルダーを取り付けていきます。

かまぼこ筐体の3Dプリント

このデータでかまぼこ筐体を3Dプリントします。
筐体の内側にある四角ナットのポケットに、四角ナットを挿入します。落ちそうであれば、接着剤で固定しておきます。
かまぼこの両端が少しでこぼこしているようなら、やすりがけして平らにし、両隣のかまぼこと隙間なく接するよう調整します。

センサーホルダーをバネで止める

組み立てたセンサーホルダーを中の空洞に入れ、ケーブルを筐体下の穴から出します。この状態で、バネを筐体下の窪みとセンサーホルダーの中に入れ、透明電極が下から筐体裏に押しつけられるようにホルダーを固定します。

再度動作チェック

透明電極がかまぼこ筐体の頂点に押し当てられた状態で、一度各接点がタッチで反応するか試しておきます。

かまぼこ筐体6つの連結


連結スタンドの3Dプリント

このデータでかまぼこ筐体を連結するための連結スタンドを3Dプリントします。

かまぼこ、連結スタンド、基板をねじ止め

かまぼこのケーブルを電気的に接続するための連結基板を作成します。
基板が用意できたら15mmの長さのネジで、6つのかまぼこ筐体、連結スタンド、連結基板をネジ止めします。

連結基板にピンソケット等をはんだ付け

連結基板にピンヘッダやピンソケットをはんだ付けします。
J7がピンソケット、J6, J8 がピンヘッダになります。
J6とJ7を接続するので、基板と連結スタンドをうまく位置合わせした上で、はんだ付けしてください。

6台連結して、ひとまず完成!

6つのかまぼこ筐体を連結させることで、ひとまず Loopian::ORBIT は完成。
最終的には、このユニットをさらに3つ作ることで、完全なORBIT(軌道)にすることを目指します!

Control基板へのファーム書き込み

Raspberry pi Picoは今回 Rust 言語にて開発しています。
リポジトリはこちらになります。まずは、このリポジトリをクローンします。

Rustの開発環境作成

この内容を参考に、Rustの開発環境を構築します。
環境を整えてから、ターミナルで "cargo build" を行い、エラーが無くなるまで環境の不備を直していきます。

Raspberry pi Picoへの書き込み

プログラムの書き込みは、まずラズパイpicoの白いボタンを押しながらPCにUSBケーブルを挿します。この状態で、cargo run と書くと、自動でファームがボードに書き込まれます。