さてさて、カシオの「SA-46」という、低価格ながら最高に遊べる32鍵のミニキーボードがありまして...
カシオといえば、まず時計や計算機が思い浮かびますが、キーボード・電子ピアノ界隈でもけっこう大きいシェアを握っているそうです。
個人的な偏見ですが、鍵盤のタッチはヤマハかカワイ、コルグとローランドは遊び心、コスパ(価格×音)ならカシオ。
聞いた話、時計や電卓で培われた組み込み技術によって、低価格でもクオリティの高い電子楽器を作ることができるとか。
そんなカシオのキーボードの最廉価モデルが、このSA-46です。
100種類の音色と、50種類のリズムパターンを内蔵しながら、安くてコンパクトで軽いので、ゴロゴロしながら気軽にピロピロと遊べる、最高なキーボードです。
しかしながら、物足りないことがひとつだけあって、サステイン機能(ペダルで音を伸ばす)がありません。サステインペダルが付けば、もっともっと楽めるんだけどなぁ...。
魔改造 あぁ魔改造
と、ここからが本題です。
鍵盤とコントローラーの間にマイコンを挟んで、ペダルのON/OFFに応じてキーの長押しをシミュレートすることができれば、サステイン機能を実現できるはずです。
キー入力をジャックすることになるので、うまくやればMIDIキーボード化なんかもできるかもしれません。
ところで、正確には、これから改造するのはSA-46の色違い限定モデル、UK-01です。
色違いなだけなのに、3倍近い値段するんですが、この可愛さは衝動買いしちゃっても仕方ないですよね。
まずは開けてみよう
まずは、どんな仕組みで動いているのか、中身を見てみるところから始めましょう。
裏面のネジを外すだけで、パカッと簡単に開けることができます。ネジは全部プラスネジです。
基板が複数に分かれているので、この記事の中での呼び名を決めておきます。
鍵盤の基板はそのまま鍵盤の基板、操作パネルが載っている基板はメイン基板、今回新しく作る基板のことはハック基板と呼ぶことにします。
鍵盤周り
鍵盤とメイン基板は、12Pのフラットケーブルで繋がっていました。
フラットケーブルの取り付けは、コネクタではなく2.54mmピッチのハンダ付けです。
マイコンを挟む改造には、とても都合の良いつくりですね。
鍵盤の基板にはダイオードが載っていて、4×8のキーマトリックスになっています。
電源周り
供給電源は単3電池6本の9Vですが、メイン基板にLD1117ALという三端子レギュレータが載っていました。その横にあるA1273という部品はPNPトランジスタで、電源のスイッチング用だと思われます。
データシートを探すと、レギュレーターは5V出力モデルで、ピンアサインが左からGND/OUT/INだということがわかりました。
ここからマイコンの電源も取ることができそうです。
とりあえず、配線で引き出しておきましょう。
改造の準備
さて、色々実験しやすいように、ピンヘッダーを立てておきます。ハンダ吸い取り線を使って、フラットケーブルを取り外してから。
ピンヘッダーを取り付けます。
ここは、改造がうまくいったら、もっと堅牢なコネクタ(XHなど)に差し替えようと思います。
動きを解析する
ダイオードの接続からして、写真左(高音側)から4ピンがLOW側、残り8ピンがHIGH側ということはわかっています。
8ピンのほうは、おそらくプルアップ入力になっていると予想して、LOW側の4ピンにオシロスコープを当ててみると。
ピンゴ!キースキャンのパルスが見えますね。
この4ピンはセレクトラインと呼ばれ、32個の鍵盤を8キーづつに分割したブロックを、順に選択するパルスを出しています。
あとの8ピンはデータラインといって、選択中のブロック内で押されているキーを、ここで読み取ります。
パルスの幅は約0.4ms、間隔が5ms空いているので、44鍵のSA76と共通だとして、6ブロックスキャンしても5-(0.4*6)=2.6msの空白が空きます。
鍵盤以外のボタンも共通のマトリックスで読み取っているようで、空白部分はそれらのスキャン時間と思われます。
ハック基板を設計する
さて、相手の素性が見えてきたので、これを思い通り操るための仕掛けを設計していきます。
マイコンの選定
まずはマイコン選びから、必須の条件はこんな感じ。
- I/Oは最低12×2+1(ペダル)=25個必要
- 電源は5V
- Arduino環境で開発したい(自分のスキル的に)
選定のあれこれは割愛するとして、最近流行りのマイコンモジュール「M5Atom Lite」を使うことにしました。流行ってたから使いたかったという気持ちが大きいです。
M5Atomに積まれているマイコンESP32は、WifiやBluetoothが使えて、BLE MIDIライブラリがあるようなので、MIDIキーボード化も簡単にできそうで夢が広がる!
もちろんI/Oが全然足りないので、16chのI/Oエキスパンダーを2つ付けて拡張します。
(後述しますが、i2c接続では速度が足りなかったので、SPI版のMCP23S17へと変更することになりました)
回路図
雰囲気重視のゆるふわ回路図ですが、こんな感じです。MCP23S17のリファレンス通り繋ぐだけです。
図に書き忘れましたが、RESETピンは10kΩでプルアップしておく必要があります。
あと、これも書き忘れですが、今回は2つ使うので、A0~A2ピンのHIGH/LOWで別々のアドレスを設定する必要があります。
サステインペダルは、市販のものを使えるよう、モノラルフォーンプラグを付けておきます。
基板を作る
まずは試作ということで、ユニバーサル基板に手配線で作りました。
M5Atomがまだ届いていないので、手持ちのESP32 Devボードで代用します。
キー読み取りのテスト
キーマトリックスを読み取るだけなので、MCP23017さえうまく動かせれば、簡単なことです。
MCP23017を使うにあたっては、Adafruitのライブラリを利用します。
このライブラリ、READMEがちょっと不親切なので、Arduino公式ライブラリのDoxygen作成 – Lang-shipでDoxygen化してくれているドキュメントが、かなり役立ちました。
ハック基板を鍵盤側の基板に接続して。
セレクトラインを順にLOWにしつつ、データラインを読み取ってみると。
よし、バッチリ読み取れました!
MIDIキーボード化は、この読み取り結果の変化に応じて、ノートオン/オフを出すだけでできそうですね。
と、ここまでは簡単でしたが、問題はここからです。
送信のテスト(失敗)
続いてメイン基板へのデータ送信、こんどはセレクトラインのパルスを読み取って、鳴らしたいキーに相当するデータラインをLOWにします。
...が、やってみると全然だめで、壊れちゃったんじゃないかって思うような、めちゃくちゃな音が鳴ります。
まあ、これはなんとなく予想はしていたんですが、波形を見てみると...
これがオリジナルの波形
そしてこっちが、ハック基板から出ている波形です
パルス幅が全然違いますね、オリジナルの約0.4msに対して、ハック基板の出力は1.5msに間延びしてしまっています。
ためしに、読み書き1サイクルだけを繰り返してみると、これだけで0.95msもかかっています。
ESP32はクロック周波数240MHzで動いているはずなので、処理にこんな時間がかかるとは考えられません。
やっぱり、i2cでは速度が足りないか...。
プランB、プランC
さあ、ここまで来て諦めるわけにはいきません。速度が足りないなら、速いパーツを買えば良いじゃないか。
都合の良いことに、ピン配列が共通のSPI通信版、「MCP23S17」というチップがあります。
SPIなら、i2cの20倍近いスピードが出るらしいので、こっちに載せ換えれば応答速度の問題は一発解決!のはず。
通信部分のピン配置が違うだけなので、いまの基板を少し手直しするだけで使えるはずです。
公式ライブラリは無かったので、GitHubから使えそうなものを探してみると、これが一番使えそう。
あとは、プランBもだめだった時のためのプランCとして、I/Oエキスパンダー3個とフォトカプラ32個で、数にモノ言わす案も検討しておきます。(やりたくないけど)
↓ハマりまくってます。
あきらめ悪く、MCP23S17使うのも夜な夜な試しているんだけど、相変わらずウンともスンとも言わない。
— アツユキ (@aaa_tu) 2020年6月25日
何を見落としてるんだろうか。 pic.twitter.com/EVfE33TmXk
つづく...