West Gate Laboratory

人生を少しでも,面白く便利にするモノづくり

FusionPCBでプリント基板を作りました

はじめに

2年ぶりくらいにFusionPCBでプリント基板を作りました。

www.fusionpcb.jp

ちょうど3つ基板を設計していたので3つまとめて注文したのですが、短期間で非常に安く、かつ高品質な基板ができたので、紹介したいと思います。

3種のPCB、送料込みで27ドル(クーポン使用)

今回作ったのは、写真の3つの基板です。それぞれ10枚ずつ作りました。
注文は1/9、届いたのが1/22なので13日で注文から到着したことになります。
注文から製造完了まで、FusionPCBの注文履歴上で11日かかりましたが、その後出荷してから届くまでは2日でした。配送はDHLです。

f:id:kaname_m:20210123180641j:plain

気になるお値段ですが、手元にあった7ドルクーポンを使って送料込みで合計27ドルでした。3種類の基板をまとめて発注できたので、お得でした。
10枚ずつ作っているので、1枚あたり0.9ドル、約100円ですね。さらに左の基板はV-Cutで12枚まとめているので、1枚あたりは実質10円以下になります。めちゃめちゃ安いですね。

ちなみに、一種類ずつパックされて乾燥剤入りで届きます。

f:id:kaname_m:20210123183143j:plain

高品質なプリント基板

さて、これだけ安いと気になる品質ですが、これがとても良かったです。
2年くらい前に注文したときは、レジストのズレやシルクのかすれが結構気になったのですが、その後改善されたのか、レジストもシルクも非常にきれいでした。

f:id:kaname_m:20210123180605j:plain

気になっていた丸角基板やDCジャックの長穴も、きれーにできていました。

f:id:kaname_m:20210123181858j:plain
丸角基板

f:id:kaname_m:20210123181853j:plain
長穴

そして今回初めてやってみたV-Cutですが、これも完璧にできていました。
設計上パッドとの距離がギリギリで不安だったのですが、普通に手で割ることができました。
(ちなみに、V-Cut線とパッドの距離は最小0.4mmですが、これが0.45mmくらいで、デザインルール的にもギリギリです)

f:id:kaname_m:20210123180632j:plain
V-Cut

まとめ

FusionPCBで久々にプリント基板を注文し、とても高品質な基板を作ってもらうことができました。
近いうちに備忘録を兼ねてFusionPCBでのプリント基板の注文方法をはじめ、角丸基板の設計方法、長穴の入れ方、V-Cutの方法などをまとめておこうと思います。

最近はFusionPCBはPCBA(部品実装)も力を入れているみたいです。特に細かい部品が多かったりQFNみたいな手はんだが難しいパッケージを使ってる場合や、たくさん基板を作る必要があるときは使ってみたいと思います。

www.fusionpcb.jp

なんだかFusionPCBの回し者みたいな感じに記事になってしまいましたが、純粋な1利用者です。

さて、これから届いた基板のはんだ付けをしていきます。これからが本番。楽しみ楽しみ。

夢のCNC、Kitmill CL100を買いました

はじめに

以前から欲しかったCNCフライス、Kitmill CL100を昨年末ついに買いました。
私の主な用途は基板切削です。

年末年始の間にいくらか使ってみて、とても便利だったので、紹介しようと思います。

Kitmill CL100

Kitmillシリーズは、オリジナルマインド社が販売しているCNCフライスです。

www.originalmind.co.jp

私は電子工作でよくプリント基板を作りますが、以前はエッチングで作成していました。しかし、エッチング液を利用した基板制作は薬剤の有効期限であったり廃液処理だったり、どうにも面倒なことが多いです。
そこで、今回プリント基板の切削にも対応している、オリジナルマインドのKitmill CL100を購入しました。基板加工オプション、その他の細かいオプションを含めて30万強です。

www.originalmind.co.jp

Kitmill CL100は基板加工オプションを購入することで、プリント基板の加工が可能です。以前はKitmill CIP100というプリント基板加工専用のもう少し安価なシリーズがあったのですが、生産中止になってしまいました。

「なぜ自宅に基板加工用CNCが必要なのか?」と疑問の方も多いと思います。今どき基板制作の外注も安いですよね。
一方で、安いといっても送料含めて数千円にはなるし、安くしようと思ったら注文してから届くまで早くても1週間程度はかかるでしょう。しかも、欲しいのは1枚だけだとしても10枚程度は注文する必要があります。
プロトタイプを作ろうというときは、ぱっと設計してぱっと作ってぱっと動作確認したいところです。CNCによる基板加工はこれを実現します。
ブレッドボードが近い存在ですが、やはり最終的にケースに入れることを考えたり、大電流が流れるような回路ではブレッドボードとプリント基板上での動作特性は変わりますから、やっぱり外注前に一枚、プロトタイプ基板が欲しくなります。(購入前、こんなことをアレコレ考えて、悩んだ上で購入しました)

組み立て

Kitmill CL100は、自分で組み立てる必要があります。

注文するとダンボール3箱分くらいの部材が届きます。これを組み立てるのがなかなか骨で、結局「今日はX軸」「今日はY軸」といった感じに組み立てて、5日ほどかかりました。

f:id:kaname_m:20210111085019j:plain
組みたった!!

オリジナルマインドのKitmill シリーズ、実は仕事でも少し使っていて、これで組み立てるのは二度目になります。
この製品のすごいところって、組み立て説明書がものすごい丁寧なんですよね。
こうした機械加工系の製品って組み立て精度が加工精度に大きく影響しますが、Kitmillの組立説明書は私のような機械系素人が組み立てても極力加工精度に影響が出ないような書き方をしてくれています。これがとてもありがたい。
例えば、「AをBにネジ止めします」というのも、「Aの右側のネジを軽く留め、下に動かして壁に当てて並行にした状態で全体を仮止めします、その後上下に動かして引っかかりがないことを確認の上ネジを締めます」といった感じです。そのあたりの勘所が薄い人にはこれがとてもありがたい。
このおかげで、組み立てたその瞬間から高精度な基板加工が可能になります。試行錯誤がほとんど必要ないのがありがたい。

動作確認、の前に

組みたったら早速基板加工しようぜ!と言いたいところですが、加工を始める前にモーターの慣らし運転が必要です。15分程度空回しします。これをしないと空回しでも過負荷リミッタに引っかかってしまう場合があります。

動作確認

まずは付属のテストプログラムで捨板(ベーク版)に加工をします。

f:id:kaname_m:20210111090117j:plain
動作確認完了

いい感じですね。

生基板を加工する

Kitmillでプリント基板加工をするときは、生基板を加工します。
養生テープでピッタリ合わせた生基板と捨板を、ベースプレートの上に両面テープでしっかりはりつけます。
基板加工オプションのおかげで基板のそりなどの影響なく、一定のクオリティで切削できます。

Kitmillの基板加工オプションの詳細はこちらに公式の情報があります。

「KitMill」による基板加工

最初に作ったのは、ESP32のプログラム書き込み用のシリアルUART変換基板です。

f:id:kaname_m:20210111090724j:plain
表面実装パターンも問題なく行ける
f:id:kaname_m:20210111090811j:plain
部品実装済
f:id:kaname_m:20210111090826j:plain
無事プログラムを書き込めた

こうしたちょっとした基板が、「作ろうかな」と思ったその場で設計して、加工して、はんだ付けして、動いちゃう。このサイクルが数時間で回っちゃうわけです。最高ですね。

両面基板加工

片面基板が加工できるとなると、今度は両面基板加工したくなりますね。基本Kitmillは片面加工がベースですが、ちょっと工夫すれば両面加工もいけます。 色々方法はありますが、厳密な精度を求めなければ、片面加工後基板を外してひっくり返して両面テープで固定し、再度加工すれば、コンマ2,3mmくらいの精度では加工できます。
Kitmillでの両面基板加工はもう少し工夫の余地がありそうなので、いずれ試して記事にしようと思います。

CNC+3Dプリンタで最強の電子工作環境

現在、自宅では3DプリンタとKitmillが隣同士で稼働しています。

f:id:kaname_m:20210111092215j:plain
最強のふたり

この2つがあると、回路設計から基板加工、筐体制作まで部屋の中で手を汚すことなく一気通貫で行うことができます。

westgate-lab.hatenablog.com

まとめ

年末に購入したKitmill CL100の紹介でした。基板加工オプションを含めて30万強のこれを高いと思うか安いと思うか人によると思いますが、「素人でも説明書に従って組み立てればすぐに部屋で精度の高い基板加工ができる」これだけでも買う価値があると思います。

今後使っていくうちにいろんなノウハウが溜まってくると思うので、それはそれで別途記事にしたいと思います。

みなさんもCNCで良い電子工作ライフを!

2020年作ったもの振り返り

はじめに

気がついたら年の瀬です。早いものですね。

今年は振り返ると、個人事業主になったりベンチャーで副業を始めたりMaker Faireに初出展したり、ただモノを作るだけでなく外の人と関わりが増えたり、いろんな事がありました。
今年一年、作ってきたものを振り返ってみようと思います。

宅配便再配達防止システム

f:id:kaname_m:20191224225030j:plain

今年最初に作ったのはこれです。セキュリティの甘さから絶賛大炎上したやつです。
インターホンの音を検知してスマホに通知してくれます。通知が来たときにスマホを操作すれば家のインターホンをサーボモータで操作できます。そして、配達員が家の前の宅配ボックスに物を入れてくれて、不在時も荷物を受け取れる、というものです。

westgate-lab.hatenablog.com

はてぶのホットエントリに入ったり、10万アクセス来たりしました。

f:id:kaname_m:20201228105014j:plain

最終的にはIPA独立行政法人情報処理推進機構)から連絡が来ました。その後、認証機能を実装しました。

westgate-lab.hatenablog.com

このシステムはRaspberry Piで動いていて、約1年経った今も現役で動いています。
ただ、テレワークが増えて自宅で受け取れることが多くなったので、スマホに通知は来ますがスマホから解錠することはほとんどなくなりました。

CO2濃度監視モニタ

次に作ったのがこれです。

f:id:kaname_m:20200401221809j:plain

だいぶ前に千石電商で衝動買いした二酸化炭素センサが家に放置されていたのを見つけたので、これまた家に転がっていたM5Stackと組み合わせて作ってみたものです。
部屋の中の二酸化炭素濃度をリアルタイムに表示してくれます。

これを作ったことで換気の大事さがよくわかりました。二酸化炭素濃度が上がるとすぐに集中力が落ちますし、窓を開ければものの5分で二酸化炭素濃度はおよそもとに戻ります。

Twitterに載せたら結構盛り上がりました。

これは今も家の冷蔵庫にくっついていて現役です。家族もコレを見て意識的に換気してくれるようになりました。

電子ピアノ演奏可視化装置 Bright Note

次に作ったのがこれです。

westgate-lab.hatenablog.com

ピアノを弾くのがもともと趣味なので、ただ弾くだけじゃなくて演奏に応じて光ったら面白いだろうなぁーと思って作りました。
LEDはNeoPixelを使っています。Tsukuba Mini Maker Faireで@kasanetariumさんに教えていただきました。

電子ピアノのMIDI信号をESP32で読み取って、信号に応じてNeoPixelを流れるようなエフェクトを加えつつ光らせる、というものです。

Bright NoteはMaker Faire Tokyoにも出展しました。Maker Faireは初出展でした。めちゃめちゃ楽しかったです。

westgate-lab.hatenablog.com

Bright Noteは今も家で自分で使っています。最近はベートーヴェンテンペストがお気に入りです。

都市型自走式ロープウェイ Zippar

夏前あたりから、Zip Infrastructure株式会社で副業を始めました。このとき個人事業主なるものになりました。

zip-infra.co.jp

この会社では新交通システムとして、都市型自走型ロープウェイZipparを開発しています。私はここで電気系全般を担当しています。

最近よく小田原で実験しているのはこれです。ようやく人ひとり乗せて安定して動かせるようになりました。

本業もエンジニアではあるものの開発スパンが非常に長いので、こうしたベンチャー的な開発の早さは非常に良い経験になっています。

低酸素トレーニングシステム

これはまだ開発中ですが、@hiraspoさんと低酸素トレーニングシステムの開発をしています。
@hiraspoさんはトレーニングジムを経営されており、そこの低酸素トレーニングルームの酸素濃度自動制御装置を開発しています。

近いうちに完成すると思うので、そのときまた詳細をお見せしたいと思います!

終わりに

今年はMaker Faireに初出展したり、個人事業主になったり、副業始めたりいろんな個人的チャレンジがあってとても楽しい年でした。
やっぱり何かものを作るのが性に合ってるようなので、人生が少しでも楽しく、便利になるものを来年も作り続けようと思います。

Bright NoteをオリジナルハードウェアコンテストGUGEN2020に応募しました

今年10月のMaker Faire Tokyo2020で展示した、電子ピアノ演奏可視化ディスプレイのBright NoteをオリジナルハードウェアコンテストのGUGEN2020に応募しました。

gugen.jp

www.youtube.com

GUGENとは、「課題解決を主眼としたハードウェアのハッカソンやコンテスト等のイベントを通じて、ものづくり活動を支援する株式会社ピーバンドットコムの取り組み」です。

gugen.jp

実用性や商品性の高いハードウェアを募集しており、せっかくなので、展示するだけでなく、こうしたコンテストに応募してみることにしました。

Bright Noteとは

改めてBright Noteの概要を説明します。

f:id:kaname_m:20201103092655j:plain

”Bright Note”は、電子ピアノにつなげるディスプレイで、演奏をリアルタイムに可視化することができます。
音楽とは本来文字通り音を楽しむものですが、このBright Noteをつなげて演奏すれば、音と同時に光を楽しむことができます。

f:id:kaname_m:20201103092651j:plain

やっぱりピアノって弾くのは楽しいんですが、どうしたって飽きちゃう瞬間があるんですよね。
Bright Noteを使うと耳でも楽しめるし、目でも楽しめます。そうすると、やっぱり楽しくていくらでも弾けちゃいます。
もともとBright Noteは自分用に作りました。しばらく使ってるうちに電源入れるのもめんどくさくなって使わなくなるかなーと思っていましたが、半年以上経った今も毎日使ってます。やっぱり光ると楽しいです。

なお、動画では結構暗いところで弾いていますがこれはその方が映像的に映えるからで、通常の室内光の下でも十分使えます。

f:id:kaname_m:20201103092700j:plain

Maker Faire Tokyo2020でもこんな感じに展示していました。

f:id:kaname_m:20201010164333j:plain

f:id:kaname_m:20201010163233j:plain

技術的な記事は、過去記事をご参照下さい。

westgate-lab.hatenablog.com

westgate-lab.hatenablog.com

westgate-lab.hatenablog.com

Bright Noteの今後

今は、演奏のリアルタイム可視化、(ちょっとした)音ゲー機能などがついていますが、次に実装したいのは演奏の自動採点機能ですね。
現状実装している音ゲーのスコア機能と似ているのですが、一番の違いは、音ゲーは人間が音楽に合わせて演奏するのに対し、自動採点は人間が自由に弾くことができる点です。
プログラムが人間の演奏を自動追従して、弾き間違えや弾き飛ばしを識別して点数に反映します。

ただ、ソフトウェア的にはだいぶ複雑になるので、実装はまだ先になると思います。

最後に

この記事を最後まで見ていただいた皆さん、きっとBright Noteにご関心のあることでしょう。
GUGEN2020の選考にはGUGENウェブページ中の「ほしいね!」数も関わるらしいので、是非ボタンをポチって行って下さい!(以下のページでポチれます)

gugen.jp

Maker Faire Tokyo 2020に出展しました

はじめに

10月3,4日に開催されたMaker Faire Tokyo 2020(MFT2020)にWest Gate Laboratoryとして出展しました。
出展したのはピアノ演奏リアルタイム可視化装置のBright Noteです。

f:id:kaname_m:20201010154157j:plain

↓MFT2020出展者ページ

makezine.jp

私はMaker Faire歴は非常に浅く、今年の2月に開催されたつくばのMini Maker Faireを見に行ったのみでした。
MFT自体は参加も出展も初めてで、会場の雰囲気やロジ面など、わからないことばかりでした。
ここでは、備忘録も兼ねて出展に向けてやってきたことや、実際の展示内容の詳細について書いていきます。

Bright Noteの開発

出展申込締切が6月5日で、MFT2020まで約4ヶ月ありました。
実は、5月にオンラインで行われたMaker Faire KyotoでちょうどBright Noteのフルスケールができあがったので、申込み時点で8割方完成していました。

実際のところ上のツイートの時点ではメインの基板はブレッドボードで、このBright Noteの裏側にヒモでぶら下がっているだけの状態だったので、申込後、きちんと展示できるような基板・ケースを作成しました。

f:id:kaname_m:20201010155021j:plain

ケースは3Dプリンタで基板にピッタリ合うものを作りました。
基板に合わせたケースの設計方法は過去記事をご参照下さい。

westgate-lab.hatenablog.com

展示レイアウトを考える

何をどう展示するか考えるにあたって、まずは会場での展示レイアウトを考えました。

f:id:kaname_m:20201010155333p:plain

私は家具の配置やら何やらを考えるときはよくパワーポイントで図を作ります。今回は1:15の縮尺で作っています。
通常は机が前面に置かれてその上に展示物を置くのだと思いますが、私の場合は電子ピアノが主役なので、それを置いてその横に机を置く形になります。

メイン以外の展示物を考える

メインの展示物はBright Noteそのものなのですが、その面白さ・コンセプトを伝えるにはただ置いておくだけでは伝わりません。
特に来場者の方は各展示物の事前知識がないことが想定されるため、できるだけ短時間で面白さを伝える必要があります。
一方で、MFTにはこの道ウン十年という強者も多いと思われるので、フワッとした説明だけでは物足りないでしょう。

そこで、メインのBright Noteでは常に電子ピアノの内蔵曲を使って演奏を可視化させつつ、そのそばにポスターと、フルスケール前に作った1オクターブのプロトタイプモデルを展示することにしました。

f:id:kaname_m:20201010160250j:plain
会場での展示の様子。ポスターの手前にプロトタイプモデルを展示

MFTと似たイベントとしては、理系なら学会発表があります。
ただ、大きな違いは、学会では結果や提案のすごい点を完結にわかりやすく伝えるのがメインなのに対し、MFTではその展示物が出来上がるまでの過程や失敗談なども重要である点です。
今回、ポスターでもそれを意識し、内容は機能ではなく、中身を重点的に書いています。

ポスター

実際に作ったポスターはこんな感じです。

f:id:kaname_m:20201010160428p:plain
MFT2020で展示したポスター

ポスターは、サイズの面から目を引くこともできますし、強者向けに詳細な情報を詰め込むこともできます。
サイズは、机の横幅に合わせてA1としました。
印刷はビスタプリントさんで行いました。
ポスターは丸い筒に入れて運びますが、筒から出したときにもクルッと丸まらないような紙を使っているようで、助かりました。

プロトタイプモデル

実際に展示したプロトタイプモデルはこんな感じです。

f:id:kaname_m:20201010160640j:plain
Bright Noteプロトタイプモデル

会場では、各鍵盤に相当するLEDストリングをランダムで光らせることで、コンセプトを伝えると同時に内部構造を見せていました。

名刺を作る

今回、初めて趣味の名刺も作りました。 100枚1000円くらいです。安いですね。
Tsukuba Mini Maker Faireに行ったとき、ただ展示を見るだけでなく、面白いと思った展示をした人のTwitterなどをフォローするときに名刺のQRコードが便利だったので、作ってみました。

f:id:kaname_m:20201010162004j:plain

名刺は友人に超短納期でデザインしてもらいました。(感謝!)
くまちゃんはうちの子です。

搬入経路を考える

展示物ができたら、本番どうやって会場に持ち込むか考えます。
方法には、「公共交通機関で持ち込む」「事前に宅急便で送る」「レンタカーで運ぶ」などがあります。
今回、Bright Noteが長物で持ち方などにデリケートだったのと、電子ピアノが長い&重いだったので、レンタカーで運ぶこととしました。

今回使ったレンタカーはシエンタです。今回友人に協力してもらい4人で参加したので、座席と荷物でギリギリでした。

f:id:kaname_m:20201010162443j:plain

ピアノを練習する

これが一番大事ですね。

MFT本番ではBright Noteの生演奏デモンストレーションをするので、ピアノをひたすら練習しました。

↓MFTで生演奏デモをする私。

f:id:kaname_m:20201010163233j:plain

いざ、MFT本番!!

今回のMFTはコロナウイルスを考慮しブースの数も減らし、入場にも制限をかけています。
周りの人に聞いた感じ、普段のMFTは来場者でぎゅうぎゅうだということですが、今回はだいぶ余裕がありました。
それでもひっきりなしにいろんな方に見に来ていただいたので、あまり他の方の展示を見る時間はありませんでした。

会期中は、将来の発展版のヒントをもらったり、ピアノが超うまいお子さんに弾いてもらったり、普段Twitterでしか知らない人に会ったり、大変刺激的でした。

来年に向けて

今回初めてMaker Faireに出展しましたが、めっちゃ面白かったですね。
恐竜は歩いてるし、R2D2もいるし、文化祭のようなワクワク感が最高でした。

来年に向けてはまだ考え中です。何かまた作って出展したいなぁ。

f:id:kaname_m:20201010164333j:plain
Thank You!

ピアノ演奏可視化装置”Bright Note”のNeoPixel制御について

概要

無事Maker Faire Tokyo 2020に出展が決まったピアノ演奏可視化装置”Bright Note”。前回の記事ではそのMIDI信号入力について述べた。

westgate-lab.hatenablog.com

今回は、演奏の表示部分であるLEDディスプレイ部分におけるNeoPixelの使い方について解説する。
使っているマイコンはESP32、LEDはNeoPixelだ。

Youtubeチャンネル作りました

このBright Noteを使った演奏の様子を記録に残すためにYoutubeチャンネルを作った。
動画を投稿し始めたので、興味ある人は見てみてほしい。
初投稿はショパンエチュード、「別れの曲」だ。

www.youtube.com

今後、趣味のクラシックピアノの練習の記録も兼ねてちょこちょこアップロードしていこうと思う。

NeoPixel

NeoPixelはICが内蔵されたフルカラーLEDで、数珠つなぎにして所定の信号を流すことでひとつひとつ任意の色・明るさで光らせることができるLEDだ。しかも、信号線は1本。電源±と合わせてたったの3本で接続は完了する。

www.adafruit.com

NeoPixelはAmazonなどで購入可能だ。LED間隔や長さなど色々な種類がある。
Bright Noteで使ったのは以下の種類のもの。

ICが内蔵されているのが肝で、通常なら複数のLEDをマイコンから独立に制御しようと思ったら、普通IOをそれぞれにつないだりダイナミック制御をしなければいけなかったりするところを、ICがよしなにLEDを制御してくれる。
以下は、私が使っているWB2812Bを前提に述べる。が、NeoPixelならだいたい同じだろう。

NeoPixelに対し信号を送るときは、以下のように各LEDの色情報をシリアルで流す。信号を受け取ったNeoPixel内のICは信号の先頭の色情報だけを読み取り、自身のLEDを制御する。そして、後続のNeoPixelへは受け取った先頭の色情報を除いたデータ列を流す。これを順々に繰り返す。こうすることで全てのLEDを独立して制御できる。なお、WB2812Bでは色情報はGRBの順だ。

f:id:kaname_m:20200726224619p:plain
NeoPixel制御信号(LED0到達前)

f:id:kaname_m:20200726224659p:plain
NeoPixel制御信号(LED1到達前)

f:id:kaname_m:20200726224735p:plain
NeoPixel制御信号(LED2到達前)

なので、原理的には無数のNeoPixelをつないでも1マイコン・3線で制御できるということだ。(もちろん電源や処理時間の問題はあるが)

信号を更に詳しく見ていくと、NeoPixel上では0、1が以下のようにパルスのデューティで表され、GRBはそれぞれ8bit、全部で24bitで表現される。

f:id:kaname_m:20200726224827p:plain
WB2812Bのbit表現(データシートより)

1bitは1.25usのため、1LED=24bitで30usとなる。
上述のようにシリアルに信号を流すため、LEDの数が増えれば増えるほど制御周期は遅くなる。
30fpsで動かそうと思ったら、単純に計算すると(1/30[s])/30[us/LED] ≒ 1111[LED]となる。1信号線で1000個以上のLEDを30fpsで制御できるってすごいね。

Bright Noteでは、88鍵全てに対しそれぞれ15個のLEDを割り当てている。つまり合計1320個だ。上の計算をすると、約25fpsで制御できる。
テレビアニメが24fpsということなので、それに匹敵する周期で制御していることになる。

以下がBright Noteの内部の図だ。15×88個のLEDを、数珠つなぎで接続している。
信号線をできるだけ短くするため、信号方向は隣同士で上下入れ替えている。
また、NeoPixelのストリングの裏には両面テープが付いているため、ベースに使っているアクリル板に簡単に貼り付けることが可能だ。(鍵盤の寸法にピタリ合わせて貼り付けるのがめっちゃ大変だった)

f:id:kaname_m:20200726230041p:plain
内部のNeoPixelの接続。互い違いに信号線を接続していく

Adafruit NeoPixel vs FastLED

Bright NoteではESP32を使っているため、Arduino環境を使うことができる。
Arduino環境におけるNeoPixelのライブラリには主にAdafruit NeoPixelFastLEDの2種類がある。

少ないNeoPixelであればどちらでも構わないが、今回のように大量のNeoPixelをつないで使う場合は、FastLEDをオススメする。
Adafruit NeoPixelは、大量のLEDを使うとところどころ意図しない点灯をする。一方FastLEDは1320個をつないでも正しく点灯する。恐らくFastLEDは制御信号のタイミングをハードウェアを使って正しく生成しているのだろう。

FastLEDの使い方については、同GitHubのWikiが詳しい。

まずNeoPixelを光らせて見るなら、FastLEDをインストールしたら入ってくるExampleの”FirstLight”を試してみるといいだろう。それを見れば最低限の使い方がわかる。(LEDの数、データピンの指定、ICの指定をしたら色情報配列に任意の色情報を突っ込んでFastLED.show()するだけ。とっても簡単。)

簡易バスバーによる電圧降下対策

NeoPixelを大量に使う上で注意する必要があるのが、電源電圧降下だ。
1000個ものLEDを単純につないで点灯させると、電源から遠くなるほど電源電圧が落ち、意図した色が出ない。

NeoPixelのLEDの特性は以下の通りだが、緑・青LEDは赤LEDと比較して電圧降下が大きいため、電源電圧が落ちてくるとLEDが赤みがかってくる。

f:id:kaname_m:20200726221521p:plain
WB2812Bの特性(データシートより)

これを防ぐため、電源はストリングの途中途中から適切に供給してやる必要がある。感覚的にはざっくり100LEDごとに電源を供給すれば良さそう。

Bright Noteでは、上端と下端に銅テープでバスバーを作り、そこから各ストリングに電源を供給している。信号線を邪魔しないように、電源とGNDは互い違いにストリングに接続されている。

f:id:kaname_m:20200726225314j:plain

HSVによる色の割り当て

Bright Noteでは、動画映えするように、鍵盤の場所に応じて色相を割り当てている。
FastLEDではHSVによる色の指定が簡単にできるため、それを使っている。

具体的には、FastLEDではHSVを使う場合色相(Hue)を0-255で指定するため、鍵盤のMIDIノート番号(21-108)を0-255にマッピングして指定している。

各ストリングに色相を割り当てることで、こんなゲーミングピアノに仕立てることができる。

まとめ

長くなって息切れ間が否めないが、ピアノ演奏可視化装置”Bright Note”に使っているNeoPixelについて、使い方や注意点など述べた。

おまけ

Youtubeにアップロードした動画には、間接照明のバックライトが見えるが、それもNeoPixelを使っている。
電源はBright Noteとは全く別系統だ。

f:id:kaname_m:20200726230805p:plain
青いバックライトもNeoPixel

これはLEDコントローラとリモコンが付属していて、リモコンを使って好きな色に光らせることができる。便利。

マイコンで電子ピアノのMIDI信号を読み取る

概要

先日Maker Faire Tokyo 2020(MFT2020)に先日記事にしたピアノ演奏可視化装置で応募したら、この度めでたく出展できることとなった。初出展なのでとても楽しみだ。新型コロナが収束していることを願うばかりである。

せっかくなので、MFT2020までこのピアノ演奏可視化装置の技術的な解説記事を細々と書いていこうと思う。 ピアノ演奏可視化装置の概要は以下の記事参照。

westgate-lab.hatenablog.com

今回は、マイコンで電子ピアノから出力されるMIDI信号を読み取る話だ。
マイコンにはESP32を使っているが、基本的にはどのようなマイコンでもやり方は同じである。

MIDIとは

MIDI(ミディ、Musical Instrument Digital Interface)は、電子楽器の演奏データを機器間で転送・共有するための共通規格である。(Wikipediaより)

古くからある規格で、現行の電子ピアノの大体はMIDI1.0に従った信号を出していると思われる。私の所有するRolandのFP-7もMIDI1.0の信号を出力する。
MIDI1.0の規格書はMIDI企画委員会のウェブサイトからダウンロード可能だ。
(余談だが、今年2月にMIDI2.0が策定された。今後電子ピアノのMIDIはMIDI2.0に準拠してくのかもしれない。なお、MIDI2.0は後方互換性があるとのこと)

MIDI自体は幅広い使い方のできるプロトコルのため、全てを解説することはできないが、電子ピアノの演奏に限って言うと、信号自体は非常に単純である。

ピアノには通常白鍵・黒鍵合わせて88鍵ある。
MIDI1.0では、それぞれに鍵盤に対し21~108までのノート番号が振られている。また、弾いたときの強さとしてベロシティというパラメータがある。

f:id:kaname_m:20200711154534p:plain
ノート番号(MIDI1.0規格書より)

f:id:kaname_m:20200711154635p:plain
ベロシティ(音の強弱、MIDI規格書1.0より)

MIDI出力では、ピアノを弾くと弾いたタイミングで都度「どの鍵盤を弾いたか(ノート番号)」「どれくらいの強さで弾いたか(ベロシティ)」の信号が出力される。 しかも、その信号はUARTで読むことができるため、マイコンで簡単に入力・処理することが可能だ。

なお、演奏情報が「都度」出力されるため、MIDIでは厳密には同時に鍵盤が押されたことを表現できない。だが、人間は厳密に和音を同時に弾くことは難しいし、MIDI信号自体は人間の知覚に対して十分高速なので、和音のズレを意識することはまずない。

MIDIを読み取るハードウェア

MIDI信号は、基本的に31.25kbpsの非同期式シリアル通信だ。マイコンのUARTで簡単に読み取ることができる。
ただし、マイコン側とピアノ側は電気的な絶縁が必要なため、オプトアイソレータ(フォトカプラ)で絶縁する。
以下が、MIDI標準ハードウェア回路図だ。MIDIにはOUT, IN, THRUがあるが、今回のケースではピアノの演奏をマイコンに入力することになるため、MIDI INの部分を見れば良い。

f:id:kaname_m:20200502143703p:plain
MIDI標準ハードウェア回路図(MIDI1.0規格書より)

図の通り、フォトカプラで電気的に絶縁されていることがわかる。回路自体は非常に単純なので、このとおり組めばMIDI信号は読めるのだが、ひとつ気をつける点はフォトカプラの周波数特性だ。MIDI信号の31.25kbpsは一般的なフォトカプラでは応答が追いつかず、正しく信号が読み取れない場合がある。
そのため、高速フォトカプラを使う必要がある。ピアノ演奏可視化装置では、MIDI規格書中に記載のあったTLP513を使った。(規格書が古いため、記載されているフォトカプラはほとんど廃盤になっている。TLP513も在庫限りということだ)

www.sengoku.co.jp

これをESP32のUART2に接続する(RXD2はIO16)。

f:id:kaname_m:20200711150651p:plain
MIDI入力回路(ESP32)

ちなみに、ESP32につながず、直接Teraterm等で信号を読み取ると、例えば以下のようなデータが入力される。これは、ピアノのドミソを順番に押して、全部押したらぱっと離したときのデータだ。

[2020-02-01 12:09:01.899] F8
[2020-02-01 12:09:01.921] F8
[2020-02-01 12:09:01.944] F8
[2020-02-01 12:09:01.964] F8
[2020-02-01 12:09:01.992] F8
[2020-02-01 12:09:01.992] 90   // ノートオン、Ch1
[2020-02-01 12:09:01.992] 3C   // ド(0x3C)を押した
[2020-02-01 12:09:01.992] 32   // 強さ0x32
[2020-02-01 12:09:02.012] F8
[2020-02-01 12:09:02.037] F8
[2020-02-01 12:09:02.060] F8
[2020-02-01 12:09:02.085] F8
[2020-02-01 12:09:02.105] F8
[2020-02-01 12:09:02.129] F8
[2020-02-01 12:09:02.139] FE
[2020-02-01 12:09:02.151] F8
[2020-02-01 12:09:02.173] F8
[2020-02-01 12:09:02.196] F8
[2020-02-01 12:09:02.211] 90    // ノートオン、Ch1
[2020-02-01 12:09:02.211] 40    // ミを押した
[2020-02-01 12:09:02.211] 3B    // 強さ0x3B
[2020-02-01 12:09:02.219] F8
[2020-02-01 12:09:02.242] F8
[2020-02-01 12:09:02.265] F8
[2020-02-01 12:09:02.290] F8
[2020-02-01 12:09:02.314] F8
[2020-02-01 12:09:02.338] F8
[2020-02-01 12:09:02.361] F8
[2020-02-01 12:09:02.381] F8
[2020-02-01 12:09:02.387] FE
[2020-02-01 12:09:02.403] F8
[2020-02-01 12:09:02.426] F8
[2020-02-01 12:09:02.431] 90   // ノートオン、Ch1
[2020-02-01 12:09:02.431] 43   // ソを押した
[2020-02-01 12:09:02.431] 4B // 強さ0x4B
[2020-02-01 12:09:02.449] F8
[2020-02-01 12:09:02.473] F8
[2020-02-01 12:09:02.499] F8
[2020-02-01 12:09:02.526] F8
[2020-02-01 12:09:02.546] F8
[2020-02-01 12:09:02.569] F8
[2020-02-01 12:09:02.591] F8
[2020-02-01 12:09:02.615] F8
[2020-02-01 12:09:02.641] F8
[2020-02-01 12:09:02.641] FE
[2020-02-01 12:09:02.662] F8
[2020-02-01 12:09:02.684] F8
[2020-02-01 12:09:02.702] 80   // ノートオフ、Ch1
[2020-02-01 12:09:02.702] 43 // ソを離した
[2020-02-01 12:09:02.702] 7C   // 強さ(無効値) 
[2020-02-01 12:09:02.709] F8
[2020-02-01 12:09:02.716] 80   // ノートオフ、Ch1
[2020-02-01 12:09:02.716] 3C // ドを離した
[2020-02-01 12:09:02.716] 6D // 強さ(無効値)
[2020-02-01 12:09:02.721] 80   // ノートオフ、Ch1
[2020-02-01 12:09:02.721] 40 // ミを離した
[2020-02-01 12:09:02.721] 6B   // 強さ(無効値)
[2020-02-01 12:09:02.728] F8
[2020-02-01 12:09:02.751] F8
[2020-02-01 12:09:02.774] F8
[2020-02-01 12:09:02.801] F8

このように、演奏時にはノートオンイベント(押した)ノートオフイベント(離した)が発生する。
また、それらのイベントには2つのパラメータ(ノート番号、ベロシティ)が付随することがわかる。 なお、ノートオフ時のベロシティは無効値だ。ノートオフはベロシティ0のノートオンで出力される場合がある。
0xF8は同期用の信号なので、今回は無視する。4分音符あたり24の割当で出力される。
0xFEはハートビート的な役割。定期的に出力され、これが来ないと断線したなどと判断するのに使う。今回は無視。

MIDIを読み取るソフトウェア

上述の通り、MIDI信号は31.25kbpsのUARTとして読み取れる。
今回ESP32を用いているが、UART0は基本的にデバッグポートとして使っているので、MIDIにはUART2を使う。ArduinoのExampleに”MultiSerial”なるものがあるので、それを参考に使う。以下はMultiSerialの簡単な例。これは9600bpsだが、31250bpsに設定すればMIDI信号を入出力できる。

void setup() {
  // initialize both serial ports:
  Serial.begin(9600);
  Serial2.begin(9600);
}

void loop() {
  
  // read from port 0, send to port 0:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial.write(inByte);
  }
    
  // read from port 2, send to port 0:
  if (Serial2.available()) {
    int inByte = Serial2.read();
    Serial.write(inByte);
  }
}

UART2はESP32ではIO16(RXD)、IO17(TXD)を使う。MIDI OUTはしないので、RXD(IO16)のみ使う。

また、Arduino環境が使えるマイコンであれば、MIDI信号処理にはArduino MIDI Libraryが便利だ。

github.com

今見ると、結構頻繁にアップデートされているようである。私はv4.3.1を使った。インストールする際はzipでダウンロードし、Arduino IDEからライブラリをzip形式でインストールする。
Arduino MIDI Libraryの使い方については以下の記事が非常に詳しい。

qiita.com

ベーシックな使い方としては、MIDI.read()でイベントを検出、ノートオン・ノートオフに対応する処理を行う、といった使い方だ。以下の例ではマルチタスクを使ってMIDI処理タスクを生成している。

MIDIイベントを受信した場合は、MIDI.getData1()でノート番号、MIDI.getData2()でベロシティを取得できる。また、MIDI ChはMIDI.getChannel()だ。Roland FP-7の場合は自分で弾くとCh.1で、プリセット曲をMIDI OUTに出力するとCh.4に割り当てられていたりする。

ピアノ演奏可視化装置では、特にベロシティは使っておらず、MIDI.getData1()で得られるノート番号のみを可視化に用いている。

#include <MIDI.h>

#define TASKPRI_MIDI 0
#define TASKCORE_MIDI 0

MIDI_CREATE_INSTANCE(HardwareSerial, Serial2, MIDI);
TaskHandle_t h_MidiTask;

void prvMidiTask(void *pvParameters) {
    while (1) {
        if (MIDI.read()) {
            switch (MIDI.getType()) {
                case midi::NoteOn:    // 鍵盤を押した
                    disp.noteOnScore(MIDI.getData1(), MIDI.getData2(),
                                     MIDI.getChannel());     // 鍵盤を押した場合の処理
                    break;

                case midi::NoteOff:    // 鍵盤を離した
                    disp.noteOff(MIDI.getData1(), MIDI.getData2(),
                                 MIDI.getChannel());     // 鍵盤を離した場合の処理
                    break;

                case midi::ControlChange:  // ペダルを踏むとControlChangeイベントが発生するが、今回は使わない
                    break;

                default:
                    break;
            }
        } else {
            delay(1);
        }
    }
}

void setup() {
    Serial.begin(115200);
    MIDI.begin(MIDI_CHANNEL_OMNI);
    xTaskCreatePinnedToCore(prvMidiTask, "MidiTask", 4096, NULL, TASKPRI_MIDI,
                            &h_MidiTask, TASKCORE_MIDI);
}

void loop() {
    delay(1);
}

まとめ

マイコンMIDI信号を読み取る方法について述べた。
高速フォトカプラを入手することろだけがやや特殊だが、それ以外は通常のUART通信である。MIDIを読み取りさえしてしまえば、あとはソフトウェアでどうとでも料理できてしまう。

次はピアノ演奏可視化装置+NeoPixelあたりの話でも。