カシオの名作ミニキーボードSA-46(UK-01)をハックする話—どうにかしてサステインペダルを付けたい—

さてさて、カシオの「SA-46」という、低価格ながら最高に遊べる32鍵のミニキーボードがありまして...

カシオといえば、まず時計や計算機が思い浮かびますが、キーボード・電子ピアノ界隈でもけっこう大きいシェアを握っているそうです。

個人的な偏見ですが、鍵盤のタッチはヤマハかカワイ、コルグとローランドは遊び心、コスパ(価格×音)ならカシオ。

聞いた話、時計や電卓で培われた組み込み技術によって、低価格でもクオリティの高い電子楽器を作ることができるとか。

そんなカシオのキーボードの最廉価モデルが、このSA-46です。

100種類の音色と、50種類のリズムパターンを内蔵しながら、安くてコンパクトで軽いので、ゴロゴロしながら気軽にピロピロと遊べる、最高なキーボードです。

しかしながら、物足りないことがひとつだけあって、サステイン機能(ペダルで音を伸ばす)がありません。サステインペダルが付けば、もっともっと楽めるんだけどなぁ...。

魔改造 あぁ魔改造

と、ここからが本題です。

鍵盤とコントローラーの間にマイコンを挟んで、ペダルのON/OFFに応じてキーの長押しをシミュレートすることができれば、サステイン機能を実現できるはずです。

キー入力をジャックすることになるので、うまくやればMIDIキーボード化なんかもできるかもしれません。

ところで、正確には、これから改造するのはSA-46の色違い限定モデル、UK-01です。

f:id:at_you_key:20200628004454j:plain

色違いなだけなのに、3倍近い値段するんですが、この可愛さは衝動買いしちゃっても仕方ないですよね。

まずは開けてみよう

まずは、どんな仕組みで動いているのか、中身を見てみるところから始めましょう。

裏面のネジを外すだけで、パカッと簡単に開けることができます。ネジは全部プラスネジです。

f:id:at_you_key:20200627234916j:plain

基板が複数に分かれているので、この記事の中での呼び名を決めておきます。

鍵盤の基板はそのまま鍵盤の基板、操作パネルが載っている基板はメイン基板、今回新しく作る基板のことはハック基板と呼ぶことにします。

鍵盤周り

鍵盤とメイン基板は、12Pのフラットケーブルで繋がっていました。

フラットケーブルの取り付けは、コネクタではなく2.54mmピッチのハンダ付けです。

マイコンを挟む改造には、とても都合の良いつくりですね。

f:id:at_you_key:20200627235045j:plain

鍵盤の基板にはダイオードが載っていて、4×8のキーマトリックスになっています。

電源周り

供給電源は単3電池6本の9Vですが、メイン基板にLD1117ALという三端子レギュレータが載っていました。その横にあるA1273という部品はPNPトランジスタで、電源のスイッチング用だと思われます。 f:id:at_you_key:20200627235232j:plain

データシートを探すと、レギュレーターは5V出力モデルで、ピンアサインが左からGND/OUT/INだということがわかりました。

f:id:at_you_key:20200627235304j:plain

f:id:at_you_key:20200627235300j:plain

ここからマイコンの電源も取ることができそうです。

とりあえず、配線で引き出しておきましょう。

f:id:at_you_key:20200627235338j:plain

改造の準備

さて、色々実験しやすいように、ピンヘッダーを立てておきます。ハンダ吸い取り線を使って、フラットケーブルを取り外してから。

f:id:at_you_key:20200627235418j:plain

ピンヘッダーを取り付けます。

f:id:at_you_key:20200627235437j:plain

ここは、改造がうまくいったら、もっと堅牢なコネクタ(XHなど)に差し替えようと思います。

動きを解析する

ダイオードの接続からして、写真左(高音側)から4ピンがLOW側、残り8ピンがHIGH側ということはわかっています。

8ピンのほうは、おそらくプルアップ入力になっていると予想して、LOW側の4ピンにオシロスコープを当ててみると。

f:id:at_you_key:20200627235742j:plain

ピンゴ!キースキャンのパルスが見えますね。

この4ピンはセレクトラインと呼ばれ、32個の鍵盤を8キーづつに分割したブロックを、順に選択するパルスを出しています。

あとの8ピンはデータラインといって、選択中のブロック内で押されているキーを、ここで読み取ります。

パルスの幅は約0.4ms、間隔が5ms空いているので、44鍵のSA76と共通だとして、6ブロックスキャンしても5-(0.4*6)=2.6msの空白が空きます。

f:id:at_you_key:20200628000037j:plain

鍵盤以外のボタンも共通のマトリックスで読み取っているようで、空白部分はそれらのスキャン時間と思われます。

ハック基板を設計する

さて、相手の素性が見えてきたので、これを思い通り操るための仕掛けを設計していきます。

マイコンの選定

まずはマイコン選びから、必須の条件はこんな感じ。

  • I/Oは最低12×2+1(ペダル)=25個必要
  • 電源は5V
  • Arduino環境で開発したい(自分のスキル的に)

選定のあれこれは割愛するとして、最近流行りのマイコンモジュール「M5Atom Lite」を使うことにしました。流行ってたから使いたかったという気持ちが大きいです。

www.switch-science.com

M5Atomに積まれているマイコンESP32は、WifiやBluetoothが使えて、BLE MIDIライブラリがあるようなので、MIDIキーボード化も簡単にできそうで夢が広がる!

もちろんI/Oが全然足りないので、16chのI/Oエキスパンダーを2つ付けて拡張します。

akizukidenshi.com

(後述しますが、i2c接続では速度が足りなかったので、SPI版のMCP23S17へと変更することになりました)

回路図

雰囲気重視のゆるふわ回路図ですが、こんな感じです。MCP23S17のリファレンス通り繋ぐだけです。

f:id:at_you_key:20200628000617j:plain

図に書き忘れましたが、RESETピンは10kΩでプルアップしておく必要があります。

あと、これも書き忘れですが、今回は2つ使うので、A0~A2ピンのHIGH/LOWで別々のアドレスを設定する必要があります。

サステインペダルは、市販のものを使えるよう、モノラルフォーンプラグを付けておきます。

基板を作る

まずは試作ということで、ユニバーサル基板に手配線で作りました。

f:id:at_you_key:20200628000744j:plain

M5Atomがまだ届いていないので、手持ちのESP32 Devボードで代用します。

akizukidenshi.com

キー読み取りのテスト

キーマトリックスを読み取るだけなので、MCP23017さえうまく動かせれば、簡単なことです。

f:id:at_you_key:20200628001956p:plain

MCP23017を使うにあたっては、Adafruitのライブラリを利用します。

github.com

このライブラリ、READMEがちょっと不親切なので、Arduino公式ライブラリのDoxygen作成 – Lang-shipでDoxygen化してくれているドキュメントが、かなり役立ちました。

lang-ship.com

ハック基板を鍵盤側の基板に接続して。

f:id:at_you_key:20200628001806j:plain

セレクトラインを順にLOWにしつつ、データラインを読み取ってみると。

f:id:at_you_key:20200628001802j:plain

よし、バッチリ読み取れました!

MIDIキーボード化は、この読み取り結果の変化に応じて、ノートオン/オフを出すだけでできそうですね。

github.com

と、ここまでは簡単でしたが、問題はここからです。

送信のテスト(失敗)

続いてメイン基板へのデータ送信、こんどはセレクトラインのパルスを読み取って、鳴らしたいキーに相当するデータラインをLOWにします。

f:id:at_you_key:20200628002033p:plain

...が、やってみると全然だめで、壊れちゃったんじゃないかって思うような、めちゃくちゃな音が鳴ります。

まあ、これはなんとなく予想はしていたんですが、波形を見てみると...

これがオリジナルの波形

f:id:at_you_key:20200628002323j:plain

そしてこっちが、ハック基板から出ている波形です

f:id:at_you_key:20200628002331j:plain

パルス幅が全然違いますね、オリジナルの約0.4msに対して、ハック基板の出力は1.5msに間延びしてしまっています。

ためしに、読み書き1サイクルだけを繰り返してみると、これだけで0.95msもかかっています。

f:id:at_you_key:20200628002610j:plain

ESP32はクロック周波数240MHzで動いているはずなので、処理にこんな時間がかかるとは考えられません。

やっぱり、i2cでは速度が足りないか...。

プランB、プランC

さあ、ここまで来て諦めるわけにはいきません。速度が足りないなら、速いパーツを買えば良いじゃないか。

都合の良いことに、ピン配列が共通のSPI通信版、「MCP23S17」というチップがあります。

akizukidenshi.com

SPIなら、i2cの20倍近いスピードが出るらしいので、こっちに載せ換えれば応答速度の問題は一発解決!のはず。

通信部分のピン配置が違うだけなので、いまの基板を少し手直しするだけで使えるはずです。

f:id:at_you_key:20200628002738j:plain

公式ライブラリは無かったので、GitHubから使えそうなものを探してみると、これが一番使えそう。

github.com

あとは、プランBもだめだった時のためのプランCとして、I/Oエキスパンダー3個とフォトカプラ32個で、数にモノ言わす案も検討しておきます。(やりたくないけど)

f:id:at_you_key:20200628004006j:plain

↓ハマりまくってます。

つづく...