なんだか唐突に、キーボードの自作をやってみたくなってしまったので、エイヤッと作ってみることにした。キットとかじゃなく、イチから自分の設計で…というか、知識ゼロから調べて作ることにしたのだ。なんたる無謀の極み。

 

いや、特に作りたいキーボードがあるわけでもないし、そもそも俺はトラックポイント信者なので、パソコンのキーボードを自作してもメインでは使わないと思う。作るとしても、いわゆる「左手キーボード」かな。でも、キーボード自作のスキルを身に付けておけば、他の工作に役立つだろうという目論見で、手を出そうと思ったのだ。

 

トラックポイント信者だけど、キーボードを自作したくなってしまった

 

 

まず情報収集

ともあれ、現状では知識がゼロなので、まずは情報収集から。「自作キーボード」というワードで検索して、色々なサイトを見て回ったら、あるねあるね、興味深いサイトが。

 

いちばん興味深かったのが、遊舎工房という自作キーボードショップのサイト。ここはキットやパーツとかを取り扱っているのかな。色々な自作写真が載っていて、まあアガること。どれもカッコイイんだよなあ。自作キーボードってカッコイイ。

 

遊舎工房 https://yushakobo.jp/

 

 

で、色んなサイトを見ていくと、芋づる式に「分からないこと」「知るべきかもしれないこと」が増えていく。うんうん、これが勉強の醍醐味だ。

 

とりあえず分かったのは、よく耳にする「茶軸・赤軸・青軸」という言葉が、Cherry MXというキースイッチのバリエーションを表しているということ。で、このCherry MXは超メジャーな部品なので、これの使い方さえ押さえておけば、あとはその派生みたいなものだということだ。

 

ダイヤテック https://www.diatec.co.jp/products/CHERRY/

 

さらに、Cherry MXは特許切れ(2013年)になってから互換スイッチが沢山発売され(それが自作キーボード流行の後押しをしたっぽい)、その互換スイッチメーカーの中でも、Kailhというところが出しているソケットを使えば、MXスイッチを挿し替えできるんだそうな。

 

KailhのMXソケット
ソケット部品

 

要するに、Kailhソケットを並べた基板を作って、MXスイッチを挿せばいいってことか。細部の理解は怪しいけど、まあ大筋は把握した。なんだ簡単じゃないか。早速やってみよう。

 

 

 

安く部品調達

メジャーな部品は、大体AliExで安く買えるし、なんならAmazonでもそう変わらない値段で入手できる。検索してみたら山のようにヒットしたので、適当に見繕って注文した。

 

 

ソケットはこれ:

 

 

 

キースイッチはこれ(打鍵感の違うものを2種類):

 

 

 

 

キーキャップはこれ:

 
 
キースイッチもキーキャップも、必要なら後で交換すればいいわけだから、とにかく値段とコスパを重視して、テキトーに選んだ。今回はフルキーボードを作るわけでもないし、位置づけとしては「試作の試作」レベルなので、本来なら少量だけ購入すればいいのだけれど、少量だと割高になってしまうので、発注数はまあそれなりに。全部合わせて4000円ぐらい。なんか駄菓子屋で蒲焼さん太郎を大人買いしてる感があるな。
 
会社員だった頃は、就業中の眠気覚ましに常用してた

 

というわけで、部品が全部到着。スイッチをソケットに挿したりキャップを付けたりして、仕組みを確認しておく。実際に手元に部品があると、設計イメージが湧いてくるな。

 

左から、キースイッチ赤/青、キーキャップ、ソケット
これが肝心のソケット
スイッチをソケットに挿して確認

 

じゃあ、お膳立ては揃った。設計に取り掛かろう。っていうか、どんなキーボードを作ろうか(今さら)。

 

ソケットを並べてイメージを膨らませる

 

 

試しに基板設計

例によってKiCad 7で作業開始。バージョン7もすっかり安定してるね。念のためバージョン6も残してあるけど、もう削除してもよさそうだ。

 

作業にあたって、まずはフットプリントを準備する。メジャーな部品なら大抵はメーカーなり部品販社なり有志なりが公開しているわけだけど、Cherry MXスイッチにKailhソケットといえば超メジャーなパーツなので、「Cherry MX Kailh KiCad footprint」で検索したら、複数のライブラリが苦もなく見つかった。GitHubに上がっているものもあれば、KiCadのプラグイン&コンテンツマネージャーからインストールできるものまで、よりどりみどりだ。

 

Keyswitch Kicad Library」はKiCadからもインストールできる

 

GitHubからダウンロードしてインストールするものは、こちら:

 

 

 

どのフットプリントも問題なく使えそうな気はするけれど、0.1mm単位で穴サイズに違いがあったりもするので、基板製造業者の精度や個別のスイッチの形状なんかと相性があるかもしれない。なので今回は、複数のフットプリントを混在させて試してみよう。

 

穴のサイズが0.1mm違ってた

 

 

まず回路図は、こんな感じ。まだ実験段階なんで、キーを12個並べて、それぞれからピンヘッダに線を引き出しただけの単純な構造だ。マトリクスとかダイオードとかは、この次の段階かな。

 

何も考えずにGNDとスイッチから信号を引き出しただけ

 

それを基板のパターン図に起こすと、こうなる。

 

スイッチの間隔とかもテキトー

 

パターン図に起こす前は、4個×3列の左手デバイスでも実験しようと思っていたのだけれど、並べている最中に用途を思いついたんでこの配列にした(用途については後述する)。端子は、ブレッドボードに挿す想定で、1列にしてある。

 

目視で配線に問題はなく、またDRC(デザインルールチェック)でも問題がなかったので、早速ガーバーデータに起こしてしまおう。KiCadのプラグイン「Fabrication Toolkit」を1クリックで、データ作成完了。何度もオススメしてるけど、このプラグインはマジで便利だわホント。データを作ってから発注するまでの手間がないのがいいんだよなあ。

 

PCBエディターで1クリックするだけ

 

さて、データもできたんで、発注するか。

 

 

サクッと基板発注&組立

発注先は、いつものJLCPCBだ。Fabricaation Toolkitで生成したZIPファイルを、サイトの「Add gerber file」という枠にドラッグ&ドロップ。読み込まれたらカートに入れて、配送手段を選んで支払いを済ませれば製造が開始される。発注までの流れが、本当にラクチンすぎる。

 

サイトのトップページで…
ここにドラッグ&ドロップ
基板データが読み込まれる

 

なお、いつもは基板の厚みを1.2mmにするんだけど、今回は下の画像を参考にして、ソケットの一部が僅かに顔を出すように、0.8mm厚で発注してみた(0.6mm~1.6mmは価格が変わらない)。ちょっと薄い感じはするけど、まあ実験だから問題なし。何かあったら、その次に作る時に反映させればいいのだ。

 

ソケットの頭が0.3~0.4mmほど顔を出している

 

配送にはDHLを選んで1週間ほどで到着。DHLは10ドル以上お高いのだけど、今までに全部の配送会社を試してみた結果、所要日数や受け取りの融通なんかを考慮して、ここがベストだというのが俺の評価。配送情報に携帯番号を登録しておけば、SMSにお知らせが来て、そこから受け取り日時を変更できるんだよね。俺はもっぱら宅配ロッカーを指定してる。クロネコヤマト並みに便利。

 

1週間で到着
5枚で8ドル
表裏はこんな感じ

 

んで検品。今回の基板は、回路としては間違えようがないぐらい単純なものだけど、穴のサイズや位置がソケットに合っているかどうかが肝だ。まずはソケットとキースイッチを仮にはめてみる。

 

仮組み

 

フットプリントはどちらも緩めに作ってあるのか、若干のガタつきがある。まあ公差の範囲内なので問題ではないのだけれど、キーのガタつきについては後々問題になってきそうな気もするな。

 

Cherry MXの寸法図

 

使用感は後で判断するとして、ソケットを半田付けしてしまおう。端子の部分は割と大きめなので、半田付けの難易度はかなり低めだ。

 

ソケット1つあたり端子は2か所
金具の部分に半田を流す

 

やりながら気づいたのだけれど、ソケットを基板にしっかり密着させて固定するためには、まずざっと仮止めした後に、ソケットを押さえつけながら半田を溶かすと、いい感じに密着してくれる。

 

ソケットを押さえながら半田を再度溶かして、基板に密着させるのがコツ

 

ソケット12個と、ブレッドボードに挿すためのピンヘッダも半田付けして、あっという間に完成。

 

超カンタン
キースイッチも挿してみた

 

よし、じゃあ早速動作させてみよう。

 

 

動作確認と、今後に向けて

まずは、電源とLED(+抵抗)だけ繋いで、基板周りが正常に動いているかの確認から。

 

LED+抵抗を繋いでの点灯試験

 

うん、LED点灯、首尾よく動いてる。ならば本番、マイコンにも繋いでみよう。

 

2枚作って繋いでみた

 

ここまで書いていなかったけど、実は今回の基板は、キーボードはキーボードでも、楽器の鍵盤として使えるようにレイアウトしたのであった。1枚で1オクターブ分。上の画像だと2オクターブの鍵盤ってわけだ。

 

そして繋いだマイコンは「Teensy LC」。これで鍵盤の出力をUSB-MIDIの信号に変換してPCの音楽ソフトへ送るようにしたのだ。以前、ビンテージ鍵盤ハーモニカのMIDI化(プロジェクト MeloMIDIca)をやったときに Teensy 4.1を使ったんだけど、Teensyのシリーズは、キーボードやMIDIを扱うのがめちゃめちゃ簡単なんだよね。実際、今回のMIDI信号に変換するプログラムも、1時間かからずにできてしまったよ。うーんお手軽。

 

 

この鍵盤で曲を弾いた動画もYouTubeに上げておいた。この記事の動画バージョンで、曲は4分40秒から。

 

 

曲を弾いてみて分かったけど、基板がたわんでキーが押しづらく、めっちゃ弾きにくい。0.8mm厚という基板の薄さもあるんだろうけど、1.6mm厚にしても、やっぱりたわむことはたわむだろう。

 

めっちゃたわむ

 

以前のMeloMIDIcaでは、3Dプリントでフレームを作り、基板と密着ネジ止めして、剛性を出すとともにスイッチをがっちり固定した。今回も同じことをやらないと、快適に弾けるな鍵盤にはならないだろうな。

 

MeloMIDIcaでは、基板と同サイズの樹脂フレームで剛性を出した

 

というわけで、ひと通りの実験は終了。部品も基板の設計も、そして今後実際に「使えるもの」を作るときにやらなきゃならないことも、大体分かったように思う。

 

実は今回の鍵盤の実験をしながら、別に実験を進めているセンサーと組み合わせて使うアイデアが湧いてきたので、次はそのあたりを試していこうと思う。キースイッチのノウハウも手に入ったし、やっぱり手を動かして実験するのは楽しいねえ。

 

(この項、了)

ESP32-S3」というマイコンを今後メインで活用していくためにDIP化基板(ピッチ変換基板)を自作した。今回はそのあたりについてダラダラと書いていくよ。


なお、使った基板制作ソフトはフリーのKiCad 7.0で、発注先はJLCPCB。無料ソフト&格安基板製造業者とか、ホントにいい時代になったよなあ…。

 

※ガーバーデータや部品購入のリンクは、ページ最後に記載。

 

 

素人にこそ高速大容量マイコンを

ここ数年で色々なマイコンを触ってみたけど、最近ではESP32シリーズほど趣味の電子工作に向いたマイコンはないと個人的に思っている。

 

ESP32-WROOM-32Eの開発モジュール(Devkit-C)

 

ホビーマイコンで、素人が実用的なことをやろうとするんなら、ライブラリが豊富なのは最低条件。それ以外にも、動作クロックが速くメモリも沢山載ってないと、結局は変なところでつまづいて挫折することになりがちだ。逆にマイコンが高速大容量なら、俺みたいな素人が書いたムダだらけのプログラムであっても、それなりに実用的に動いてくれる。つまり素人にこそ高速大容量なマイコンが必要ってことだ。これは素人歴40年超の俺が云うんだから間違いないと思ってもらっていい。

 

その点、ESP32シリーズは、メジャーな「ESP32-WROOM-32」という製品だと、クロックも160~240MHzとそこそこ速く、メモリも(型番にもよるけれど)大量に載ってる。それで機能が低いかというとそんなことはなく、デュアルコアでWi-FiもBluetoothも付いてる。I/Oピンも多い。

 

しかも安価。

 

最高かよ。

 

ESP32-WROOM-32E、単体だと500円ぐらい

 

ということで、これからは主力として使うマイコンをESP32に移行しようと考えているわけだが、少し前までは「ESP32-WROOM-32」という製品がメジャーだったけど、最近は「ESP32-S3-WROOM-1」という、より新しい製品シリーズがメジャーになりそうだという。なるほど、じゃあESP32-S3へ移行することにしようかね。

 

 

どのESP32-S3基板モジュールを使おうか

ESP32-S3を使おうと決めはしたものの、ESP32-S3を搭載したモジュールは山のように発売されている(ここでいうモジュールってのは、USB端子や3端子レギュレーターを付けて使いやすくした基板のことね)。モジュールごとにスペックも様々だ。そこで、どのモジュールを使うかを検討すべく、いくつか購入していじってみた。

 

左から、ESP32-S3-DevKitC-1LILYGO T-Display-S3M5Stamp S3

 

どれも心臓部はほぼ同じなので、性能もプログラムの作りやすさも変わらない。だから、端子の数やサイズ・価格で選べばいい…んだけど、正直どれも俺の用途にはしっくりこない。例えば直近の計画だと、MIDI鍵盤ハーモニカをワイヤレスにしようと思っているんで、I/Oピンはできるだけ多く欲しい。けれどモジュール自体は小さくないと筐体に入らない(なので、IOエクスパンダとかの他ICも使いたくない)。そういう観点からみると、今回買っていないものも含めて、どれも一長一短なのだ。

 

その中で、M5Stamp S3(上記画像の右端)は、サイズがかなり小さい割にI/Oピンが23個あってイイ線いってるんだけど、I/Oピンをフルに使おうとするとピン間隔が1.27mmになる。つまりブレッドボードに挿せないのだ。惜しい。

 

とはいえM5Stamp S3のパッケージは小さくてカッコいい

 

1.27mmピッチをブレッドボードに挿すんなら、DIP化基板(ピッチ変換基板)を間にかませばいいんだけど(実際にStampS3用の変換基板は売っていいる)、そこでフと思った…どうせ変換基板が必要なら、ESP32-S3そのものをピッチ変換した方が話が早いんじゃね? その方が圧倒的に安いし

 

ESP32-S3の端子ピッチも1.27mm

 

というわけで方針変更。市販のモジュールではなく、ESP32-S3単体+DIP化基板で進めることした。

 

 

市販のDIP化基板は発見できず…

先行製品のESP32-WROOM-32は、1.27mmピッチを2.54mmピッチ(ブレッドボードに挿さる)に変換する基板は数多く市販されている。秋月からも出てるし、アマゾンでもロング版ショート版が入手できる…っていうか全部持ってるw これ便利なんだよね。特に秋月の変換基板(下画像の真ん中)は、端子部の幅が細いんで、ブレッドボードで使いやすいんだわ。

 

左から、ESP32-WROOM-32、秋月の変換基板ロング版ショート版

 

で、ESP32-S3にも似たような基板がないかと思って探したんだけど、秋月/Amazon/AliExpressでは残念ながら見つからず。

1件だけ、マイクロファンというショップで近いものは見つかったんだけど、これはDIP化基板というよりは「ブレッドボードで使いやすい開発モジュール」と呼ぶべきものかな。俺が求めるのは、最低限の機能だけ載せた、もっとシンプルな変換基板なのだ。

 

 

ちなみに個人で作っている人も見かけたんだけど、説明文で「基板」のことを「基盤」と書いていたんで、その時点で読むのを止めた。プリント基板は「基盤」ではないんだぜ?(俺は #基板警察 なのだ)

 

まあ、なんだかんだ探して、自分の用途に合ったしっくりいくものは見つからなかった。なので、「それなら自分で作っちゃえ」と、結局はDIP化基板をオリジナルで作ることにしたのであった。たぶんそんなに手間じゃないしね。

 

 

KiCadでの設計準備

さて、いつもの基板作成フリーソフトKiCadで基板を設計するわけだが、実際にパターンを引く前に、資料集めから。

 

KiCadはバージョン7.0に移行済

 

まず何はなくともデータシート。ハードウェアのデザインガイドなんてのもあったけど、とりあえずはこれを眺めときゃ間違いない。

 

日本語版データシートはなかったけど、英語版でもまあよし

 

そしてKiCad設計用のシンボルフットプリントGitHubからダウンロードして手作業でもインストールできるのだけれど、GitHub上の説明によれば、KiCad 6.0以降なら「プラグイン&コンテンツ マネージャー」から直でインストールできるらしい。マジかよ。

 

ライブラリで「Espressif」を検索してインストール
回路図シンボルを発見
基板のフットプリントもちゃんとある

 

マジだった。何、この簡単さ。

 

 

初「4層基板」チャレンジ

そしてKiCadでの実作業。今回はちょっと新しいやり方にチャレンジしてみた。「4層基板」で作ったのだ。

 

今まで作ってきた基板では、配線パターンは表裏の2層だけだが、多層基板では、サンドイッチのように基板内部にもパターンレイヤーが挟み込まれている。当然、配線の自由度は上がる。

 

Wikipedia「プリント基板」より

 

なぜ4層基板にチャレンジしたかというと、ひとつには「一度やってみたかったから」。今回の基板は構造が単純で難易度も低く、初めて試すにはピッタリだ。上手くいこうがいくまいが、ノウハウが貯まることになる。

 

そしてもうひとつは「安いから」。いつもお世話になってるJLCPCBだと、50×50mmまでなら8層基板でも2ドル。2層基板と同んなじ価格だ。これは試す価値ありでしょ。

 

50x50mmまでなら、8層でも2ドル

 

4層にするにあたってのKiCadの設定は、「ファイル > 基板の設定…」のダイアログから、「基板スタックアップ > 物理的スタックアップ」を選び、導体レイヤーの数をメニューから選ぶだけ。あとの設定は全部、いつも使っているデザインルールまんまだ(デザインルールは、このあたりを参考にして、いちばん最初にテンプレ的に設定してある)。

 

追加設定したのは、ここだけ
基板編集レイヤーも念のため確認したけど、デフォルトのままで問題なさそう

 

調べたところ、貫通しないビア(buried via)を設定する場合にはそれなりにケアが必要だったり、アナログ回路や高周波回路では1レイヤーを丸々電源ラインにすべきだとか、インピーダンスがどうとかの話はあるようだけど、俺の趣味工作では不要なものだと判断。結果的には上手くいったのだから、まあ間違ってはいなかったってことかな。

なあんだ、4層基板、思ったより簡単じゃん。

 

 

回路図作成

回路図は、基本的にはデータシートに記載されている「参考回路図」をベースにして、不要な部分を削除していく。

 

これがデータシートの元回路図

 

  • チップ内蔵のUSB機能は、作るデバイスに合わせて個別に後付けする。

  • リセット(EN)スイッチは必要に応じて後付けする。

  • リアルタイムクロック用クリスタル(RTC)、デバッグ機能(JTAG)は基本的に不要。

 
不要な部分を削除した回路図

 

USBについて補足しておくと、従来のESP32ではUSBシリアルを通じてUARTからプログラムの書き込みを行っていたわけだけれど、ESP32-S3ではチップ自体がUSB機能を持っているので、それを使って書き込むこともできる。ただ俺としては、チップのUSB機能は主にアプリケーションに使いたいので、今回の回路ではフリーにしてある。プログラムの書き込みには、M5Stamp Picoと一緒に買った「ESP32 ダウンローダ」というUSBシリアル変換器を使う想定だ。

 

ESP32 ダウンローダ

 

ということを踏まえて、完成した回路図がこちら。

 

ESP32-S3 DIP化基板の回路図

 

結局、元回路図から残ったのは、電源を安定させるパスコン2つと、電源投入時のリセット信号を安定化させるRC回路だけなのであった。後は全部コネクタ or ピンヘッダにつないで並べただけ。ま、そんなもんでしょ。

 

 

配線パターン作成

あまりに簡単な回路なんで、作業工程は省略。んで、完成した4層基板のパターン図がこちら。

 

DIP化基板完成パターン図
DIP部分は、ピン番号順に並べた
プログラムを書き込む信号は、ESP32 ダウンローダに合わせてコネクタに

 

各レイヤーごとの配線パターンはこんな感じだ:

 

表レイヤー(F.Cu)
内1レイヤー(In1.Cu)
内2レイヤー(In2.Cu)。ここは電源&GNDのみ
裏レイヤー(B.Cu)

 

ものの本によれば、多層基板では「電源だけのレイヤー」とか「GNDだけのレイヤー」を、内側に置くのがセオリーなのだそうな。今回の回路では、内2レイヤー(In2.Cu)を電源だけにしてみた。なお、上記画像には表示していないけど、配線箇所以外はベタGNDになっている。

 

正直、今まで作ってた2層基板よりも、4層の方が配線自体はラクだった気がする。ESP32-S3はI/O端子が番号順に並んでいないので、それを昇順に並べるのが少し面倒だったけど、でも4層もあれば配線自体は極めて簡単だ。これ、2層だったらこうはできなかっただろうなあ。今後は、積極的に多層で作っちゃおうかねえ。

 

 

ガーバーデータ作成&発注

例によって、プラグインの「Fabrication Toolkit」を使い、1クリックでガーバーデータを生成。本当に便利すぎる。

 

PCBエディター上で、Fabrication Toolkitのボタンを1クリック
全製造用データが自動生成されるけれど、今回必要なのは「gerber.zip」だけ
「gerber.zip」の中身

 

うん、4層基板でも、全レイヤー分のデータがしっかり生成されているな。以前は、ガーバー ビューアーで全データ・全配線を目視チェックしていたけれど、今まで一度も問題のあるデータだったことはないので、今はざっと眺めるだけに留めている。

データもできたんで、発注。

 

「gerber.zip」をドラッグ&ドロップ

 

gerber.zip」を、JLCPCBのサイトで「Add gerber file」と書かれた枠内にを放り込めば…

 

見積もり画面

 

サイズが50×50ミリだったら5枚で2ドルだったんだけど、今回はハミ出しちゃっているんで、7ドル。まあ、機能としてこのサイズが必要なんだからしょうがない。

 

さて、発注も済んだから、あとは到着を待つだけだ。

 

 

到着・組み立て・動作確認

さて到着!

 

いつもの青箱がまた増えた

 

今回は中国の大型連休(国慶節)を挟んだんで、到着までいつもより1~2日ほど時間がかかったのであった(9/27発注~10/6到着)。それとも、4層基板だから時間がかかったってことなのかな?

 

完成した基板

 

うん、いい感じ。4層基板だからか、そこはかとなくズッシリ感がある(気のせいかも)。

 

ブレッドボードに乗せるとこんな感じ

 

ブレッドボードで使いやすいように設計した甲斐あって、サイズ感も形状もピッタリだ。

 

なお、初めての4層基板チャレンジなので、念のため端子間の導通をテスターで確認したけれど、問題はまったくなかった。あとは半田付けをミスらなければいいんだけど…。ESP32-S3の端子ピッチは1.27mmと狭いんで、これが今回の作業の山場になりそう。

 

使う道具は、ツールクリップ、半田(0.3mm)、フラックス
こて先の形状は、細かい作業に向いている「BC型」
ある意味、最も大切なツール

 

失敗歴40年超の俺に云わせれば、ちゃんとした道具を正しく使うことこそが成功の秘訣だ。先の細い半田ごてと、極細の半田(0.3mm)、フラックスツールクリップ、そして老眼鏡(最重要!)を揃えて、万全の体制で半田付け作業に取り組む。

 

まず正しい位置に仮止めするのがコツ
1辺が完成

 

フラックスをしっかり塗り、正しいパッド位置に端子を接触させて、適量の半田を流し込む。正しい手順でやれば、全然難しくない作業であったよ、うむ。

 

全パーツ半田付け完了

 

コネクタ、抵抗、コンデンサ、ピンヘッダも半田付けして、完成

 

ちなみに、ブレッドボードとの接続には、両端の長いピンヘッダを使った。上から計測器用に信号を取り出すためだ。

 

両端の長いピンヘッダ
上の足にテストフックを引っ掛けられる

 

プログラムの書き込みは、先述の通り ESP32 ダウンローダを使う。

 

コネクタのピン配置も、ESP32 ダウンローダに合わせた

 

で、簡単なプログラムを転送して動作確認。

 

一定時間ごとに「test」と表示させている

 

うん、プログラムも動いている。無事完成だ!

 

 

ESP32-S3をどう使っていこう…

というわけでESP32-S3を使う準備は整った。将来的にはこれでBLE-MIDIとか、USBデバイスあたりを作っていきたいんで、まずは適当なサンプルプログラムを動作させるところから始めていこうかね。

 

あと、今回の記事はダラダラと長くなっちゃったけど、コンパクトな動画にもまとめているんで、もしよかったらご覧くださいな。

 

 

 

リンク・ガーバーデータ・その他まとめ

■発注業者: JLCPCB(新規ユーザーの人は$54クーポンが貰えるよ。いますぐリンクに飛んで取得しよう! → https://jlcpcb.com/JPV
いつもお世話になってる中国の業者さん。4層基板も、いつもの2層基板と同じ感覚で、簡単に安く発注できたよ。

 

■発注データ(ガーバー=基板データ) とりあえずGoogleドライブで公開。これをZIPのまま、基板業者のサイトにアップロードすれば発注できるのであった。

https://drive.google.com/drive/folders/1pzxXdhZ3101XYrnw04_8EZOnre8BX4pc?usp=sharing
※品質その他の保証はできません。不具合があった場合も責任は持てませんので、悪しからず。

 

■ESP32-S3-WROOM-1の入手先
自分が買ったのはAliExpress。メモリ容量が色々と選べる。アンテナ無しの「-1U」も選べるけど、技適周りが不明だったので、ちょっとやめておいた。
https://ja.aliexpress.com/item/1005004815894336.html
 

皆んな大好き秋月電子だとこちら。SPIflashが16MB, PSRAMが8MB。

https://akizukidenshi.com/catalog/g/gM-17256/

 

ちなみにESP32-S3のデータシートはこちら。本家Espressifのサイト。

https://www.espressif.com/sites/default/files/documentation/esp32-s3-wroom-1_wroom-1u_datasheet_en.pdf

 

■USBダウンローダー(USB-シリアル変換) M5Stack社の製品「ESP32 ダウンローダーキット」。秋月やスイッチサイエンスで入手可能。
秋月: https://akizukidenshi.com/catalog/g/gM-17240/
スイッチサイエンス: https://www.switch-science.com/products/7471

AliExpressで同じピン配置の別製品が安く手に入るけど、まあ1個あれば十分なものなので、国内通販の方がラクかな。

 

(この項、了)

ユニバーサル基板が、憎い。

 

ブレッドボードは実験するのには超便利なんだけど、いったん実験にカタがついた後は、取り扱いに困ってしまう。

 

SN76489の実験

 

そのまま保存しておいても、ジャンパーワイヤーが抜けてオシャカになってしまうのが関の山だし、写真に撮って記録してからバラすんでも、また必要になった際に繋げ直すのが面倒だ。特に、飽きっぽい性格の俺は、3つ4つの実験を並行して走らせているのが常なので、たまにフと「あの実験と、こっちの実験を組み合わせたら面白いんじゃないか?」と思いついても、ブレッドボードに組み直すことを思うとウンザリしてしまう。まずやる気を出すまでがひと苦労なのだ。

 

それに、成功した実験の通りに接続しても、すぐ動くとは限らない
上手くいった実験というのは、ただ接続が上手くいったというだけではなく、不良部品をはじく「検証工程」であったり個体差の選別であったり、部品の加工であったりと、見えない工程が積み重なった上での「成功」なのだ。部品箱をもう1回あさるのとか、面倒すぎるだろ。

 

スキルのある人間なら、こういう時は、上手くいった実験をそのままユニバーサル基板に移植するんだろうけど…

 

 

…あいにく俺は、子供の頃からユニバーサル基板という奴が苦手で…というか嫌いで…むしろ憎んですらいるのだった。

 

“universal”って「万能」とか「万人向け」って意味じゃないの?
なんであんなに難しいんだよ!
俺向けじゃねえぞ!

 

なんかもう、汚くしか作れない。憎い。

 

どうあがいても上手く作れないし、ちゃんと作ったはずなのに動かない。あるいは動いても、数日後に引っ張り出すと動かなくなってる。

 

だいたい、ランドにいったん半田付けした後、なんで、もう1回配線を半田付けさせるんだよ!?

 

配線の半田付けを拒絶するかのような構造。憎い。

 

二度付けは禁止だろ!

 

関西人はユニバーサル基板を告発すべきだ。

 

ユニバーサル基板が、憎い!

 

――そんなある晩、解決策を突然思いついたのだ。

 

 

ブレッドボード式ユニバーサル基板

 

要は、ユニバーサル基板の「配線」が難しいのだから、あらかじめ基板上に配線があればいいのだ。
なら、「ブレッドボード」のような仕組みを持ったユニバーサル基板があればいい。というか、ブレッドボードの仕組みをそのままパクっちゃえ それなら、実験した結果をそのまま移植できるぜ!

 

そう思いついた俺は、矢も盾もたまらず、KiCadを立ち上げて基板の設計を始めたのであった。

 

とりあえず、2.54mmピッチでランドを並べて開始。

 

大きな設計方針としては「ブレッドボードをパクって作る」ということなんだけど、その他にもユニバーサル基板には不満が多い。例えば、片面だけにランドがあるユニバーサル基板とか、何度も熱を加えているとランドが剥がれることがよくある(それも憎みポイントのひとつだ)。両面ランドのスルーホールにしておけば、配線難易度もさらに低減できるだろう。

 

そうそう、これだよこれ…

 

色々な部分を、ブレッドボードと少し変えてある。

 

これこそ真の「万人向け(ユニバーサル)」基板だろ!

 

データが出来たんで、即行で発注。発注先は、いつもお世話になってるJLCPCBだ。先日知ったKiCadのプラグイン「Fabrication Toolkit」を使えば、ワンクリックでガーバーデータが生成できてしまうのであった。KiCadのプラグイン検索で出てくるので、インストールもラクチンだ(調べてはないけど、JLCPCB以外の業者でも、発注データを作れるプラグインはあると思う。さすがオープンソースのKiCadはスゲエ)。

 

ワンクリックでデータができるの、本当に便利。

 

プラグインでは、ガーバーデータが圧縮されたZIPファイルが作られるんで、発注業者(今回はJLCPCB)のサイトで、それをドラッグ&ドロップするだけだ。

 

基板製造業者のサイトって、大抵はこの形。

 

というわけで、着想してから発注するまで、実に「2時間」しかかからなかった。まあ、構造が単純だったり、ブレッドボードというお手本もあったり、自動化プラグインもあったりと、環境が揃っていたということもあったけれど、何より、「ユニバーサル基板が憎い! 奴と永遠にオサラバしたい!」という想いが強いモティベーションとなって、俺をここまで駆り立てたのであった。ふう、やったぜ、俺!

 

 

――発注したあと、何気なくアマゾンで「ブレッドボード ユニバーサル基板」と検索したら、同じような基板が山ほどあったけどさwww

 

そりゃ、誰でも考えつくよなあ。

 

作る必要なかったのか? 否! 自分で作れば10枚で5ドル!(送料別)
しかも自分の使いやすいように設計できる! これが自作の醍醐味だぜ!

 

 

到着

 

発注から7日間で到着。
実は、SとLの2サイズを発注していたのであった。それぞれ10枚ずつで、合計10ドル。うん、アマゾンで同じような商品を買うよりも、ギリ安いw(まあアマゾンなら2日後には届くけど…)

 

下側の2枚が、今回の基板。

 

ブレッドボードよりも穴の数は多めにして、ESP32 DevKitC(幅が広くて、普通のブレッドボードだと配線する隙間がない)でも配線できるようにした。こういうことができるのが、自作の良さだよね。

 

ESP32 DevKitCでも両脇に配線の余裕がある。

 

あと、細かいところも自分が使いやすいようにしてたりする。たとえば内部配線は1.5Aぐらい流せるような太さにしてある(ブレッドボードは0.5Aぐらい)。また、四隅にはマウンティングホールも作ったので、できた後はスペーサーを差したり、ケースに固定したりしやすい。

 

うんうん、これよこれ。

 

スペーサーで二枚重ねするのも夢があるね。

 

というわけで、ブレッドボード上に組んだ実験回路を見ながら、そのまま配線していく。マジ簡単。

 

想像以上に簡単。

 

そうそう、マッキーなんかで書き込みできるように、基板の色は「白」を選んだんだけど…。

 

書き込みできるのは便利なんだけど…。

 

半田付けのとき、反射してめっちゃ見づらい!
これは、黒い基板に白マッキーで書き込むとかの方がいいかも。今後、改善の余地ありかな(まあ、白じゃないとブレッドボードっぽくはないけどね)。

 

白い基板は、どこに半田付けしたかが分かりづらい。

 

なお、配線用のワイヤーは、俺は秋月で買ってあったものがあったんで使ったけど、単芯の「ブレッドボードに使えます」と謳った製品だったら大丈夫だと思う。

 

KYOWA「耐熱通信機用ビニル電線 H-PVC 0.65mm」。

 

ってわけで、ブレッドボードからの移植も完成。
例の「2度付け」配線が必要ないだけで、「こんなにも簡単なのか!?」と驚くほどだったよ。

 

これぞ真のユニバーサル基板だ!

 

あと、ブレッドボード式ユニバーサル基板だと、ここからさらに実験を発展させやすいという利点もあるな。なにせ、最初から配線されたランドがいくつも余ってるわけだし。

 

うん、大満足!

 

ユニバーサル基板よ、永遠にさようなら!

 

 

データはこれだよ

今回発注したデータは、Googleドライブで公開してある。このまま注文できるんで、もしよければどうぞ。

新規ユーザーは https://jlcpcb.com/RGE/kicadjp のリンクから入れば$54ドルのクーポンを貰えるそうなんで、ほとんど通関手数料(1~2ドル)だけで何十枚も作れると思う。

(※とは云え、品質その他の保証はできません。不具合があった場合も責任は持てませんので、悪しからず)

 

 

 

 

動画もあるよ

今回の内容は、六百デザイン工作部のチャンネルにも上げてある。よければそちらもどうぞ。

 

 

 

(この項、了)

 

 

 

 

 

 

 

 

 

「六百デザイン工作部チャンネル」を作った

しばらくブログに記事を投稿しなかった間、俺が何をやっていたかというと、YouTubeで「六百デザイン工作部」というチャンネルを立ち上げていたのであった。

 

 

 

 

製作した物の「動作」は動画で伝えた方が早いんで、前から工作系動画もどんどん作っていきたかったんだけど、なにしろ自分のメインチャンネルは、ウチのバンドのライブやらウクレレ弾き語りやらの映像ばかり。そこに工作系の動画を混在させると「視聴者が減るよ」と誰かにアドバイスされたんだったかな。なので、サブチャンネルに分けたというわけだ。

 

ただ、「動画を作ってると、工作する時間が無くなるよ」とも云われた。それじゃ本末転倒だw そこで、まずは短めの動画を2~3本ほど作って、動画制作スキルを徐々に上げていくことを目指した。あまりにも時間を取られるようであれば、動画作りはスパッとやめる心積もりでね。

 

そして最近、やっと動画制作の手順もこなれてきたんで、あらためてブログも再開させたという次第。動画もブログも並行して進めていくつもりだ。相乗効果で、視聴者・読者が増えてくれると励みになるんだけどね。

 

ちなみに動画は「ゆっくり解説」スタイルで、古の日本ソフトバンク出版部・Beep誌に登場させていた氷水芋吉山村モヘップ(12)に喋らせることにした。まあ、声はゆっくり魔理沙&ゆっくり霊夢なんだけどね。ごめん、買うから許して。

 

このために、Beepを参考にイラストを起こしたよ

 

 

LEDゴーグル「新・3号機」

というわけで本題。このブログでずっと進めてきた、LEDゴーグルの新型・3号機を設計・製作したのであった。
とは云ってもコンセプトを新しくしたわけじゃなく、初号機・2号機で得たノウハウで決定版を作った、という感じかな。

 

初号機はこちら:

 

2号機はこちら:

 

初号機は直径47mmのスチームパンク風ゴーグルに52個のLEDを並べ、2号機は51mmの溶接用ゴーグルに112個のLEDを並べた。そして3号機では、47mmに112個を並べようという目論見だ。

 

2号機の数のLEDを、初号機のサイズに入れる

 

設計は、最近バージョンが7.0に上がったKiCadで。

 

Kicad 7.0では6.0のファイルも読み込みはできるのだけれど、後方互換性がないから、7.0で保存してしまうと旧バージョンでは読めなくなってしまう。7.0に不具合があったらもうアウトだ。なのでバックアップを取りながら、おっかなびっくり7.0に移行中という感じ。使用感はあまり変わらない。

 

LED間の距離は3.5mm

 

使用するフルカラーLED・WS2812B-2020は、その名が示すように2mm角のサイズ。それを3.5mm間隔で並べていく。基本パターンを作って、それをコピペで「田植え」していくわけだ。

 

直径47mmに112個のLEDが並ぶ

 

そうそう、以前はコントローラーとの配線は基板に直付けしていたけれど、今回からはコネクタを使うことにした。JST(日本圧着端子製造)の「XH」というコネクタが、趣味の電子工作ではかなり使いやすいので、今後の設計では、これを俺の制式部品とすることに決めたのだ。

 

そのあたりは六百デザイン工作部の動画で説明しておいた。よければご覧になってほしい。マジで便利。

 

 

 

 

基板を「面付け」して発注…1クリックで

基板を発注するにあたって、新しく「面付け(Panelization)」という技法を試してみた。これは、複数の基板を一度に製造してもらうやり方で、小さな基板を作る時などはコストを圧縮することができる。

 

同じ基板を並べて1枚として製造できる

 

今回は円形基板なので、コスト圧縮の効果は微々たるものなのだけれど、両眼が1枚の基板に並んでた方がカッコいいからそうしてみたw

 

円形基板の4箇所にミシン目を入れている
ミシン目は規定通りに

 

あと今回、発注にあたってナイスなやり方を見つけてしまった。KiCadのプラグインで「Fabrication Toolkit」というものがあり、それをインストールしておけば、1クリックで発注データを生成してくれるのだ。ガーバーデータもZIP化してくれるし、部品表(BoM)もポジションファイルも一括生成だ。こんなに便利でいいのか!?

 

KiCadのプラグインセクションから「Fabrication Toolkit」で検索


というわけで、今回も基板作成&部品実装をJLCPCBに発注した。いつもお世話になってます。

なお、 https://jlcpcb.com/RGE/kicadjp のリンクから入れば、新規ユーザーは $54ドルのクーポンを貰える模様。

 

1クリックで生成されたZIPを、ドラッグ&ドロップ
部品表もポジションファイルも、生成されたものを送信
製造データとして認識された!

 

 

到着! そして組み立て・動作確認

4月21日に発注して、4月29日に到着。さてさて、仕上がりはどうかな…?

 

両目を1枚の基板に収めて大正解!
うん、かっこいい!(自画自賛)
2mm角のLEDを100個並べるとか、自分じゃ絶対ムリ!

 

基板からミシン目に沿って切り取り、自分ではんだ付けする唯一の部品・コネクタを取り付ければ、それで完成。簡単。

 

表面実装部品が多いから、切り取りはリューターでやった
うん、サイズ感もバッチリ

基本的な回路は2号機と変わらないから、2号機用のコントローラーにつなげば、ソク光る。

光った!

 

うん、今回も大成功だ。
あと、コントローラーも新型を発注済みなので、こちらも到着するのが楽しみだ!

 

 

動画もあるよ

今回の内容は、六百デザイン工作部のチャンネルにも上げてある。よければそちらもどうぞ。

 

 

 

(この回、了)

 

 

スチームパンク風ゴーグルにLEDマトリクスを仕込んで、ライブの小道具として使おうという計画。ハードウェアは完成して、残すはプログラムだけなのに、そこで問題が発生してしまい、11月のライブには間に合わなかったのであった。
ちなみに次のライブは1月22日。さてそちらには間に合うのだろうか?

 

トラブルの原因はたぶん、俺が書いたタイマー割り込みの表示制御プログラムと、LEDを制御するライブラリ(こちらも割り込みを使ってる)がバッティングしてしまい、正常に動作していないこと。

 

一口にArduino IDE互換マイコンといっても仕様は様々で、特にタイマー割り込みについては、心臓部のマイコンによって方言があるらしい。今回使ってるM5Stamp Pico(ESP32マイコン)は、一般的なArduino(AVRマイコン)とは違うんで、その辺りを考慮しなきゃならなかったんだと思う。
もちろん、そんな方言を覚えることに時間を費やす気はサラサラないので、これ以上の追求は行わず逃げ道を探すことにするわけだが。

 

 

割り込みを使わないで一定時間ごとに処理

そもそもタイマー割り込みを使おうとしていたのは、LEDの表示やアニメーションという一定時間ごとに必要な処理をバックグラウンドで行って、WiFiリモコン周りを並行して処理したいという理由からだ。割り込みを使わないんだったら、タイマーを監視して、一定時間の経過を判定して処理するしか方法はない(と思う)。

 

幸い、Arduinoの標準ライブラリには「Millis()」という、常に動いているカウンタータイマーが存在するので、それを使って監視すればいい…のだけれど、もっと使いやすそうな「elapsedMillis」というライブラリを見つけたので、そちらを使うことにする。Millis()をベースに、個別のタイマーを定義できるライブラリだ。これを使って、一定時間ごとにフラグを立てる関数を作ってみた。

// elapsedMillisを使い、一定時間ごとにフラグを立てるタイマー
// 引数が0ならリセット
// 引数が0以上なら、リセット後にその時間[ms]だけ経過しているかを判定
// 経過していたらtrueを返してタイマーをリセット
elapsedMillis time_elapsed;

boolean elapsed_timer(unsigned long count) {
	if(count == 0) {
		time_elapsed = 0;
		return(true);
	} else {
		if (time_elapsed > count) {
			time_elapsed = 0;
			return(true);
		} else {
			return(false);
		}
	}
}

loop()の中に、WiFi入力処理と、この関数でフラグが立ったら呼ぶ処理(表示周り)とを並べて入れておけば、どちらも並行して処理できるって寸法だ。

 

というわけで、まずはWiFiではなく、ボタン入力で切り替えるバージョンを作ってみた。表示をアニメーションさせながらボタン入力も受け付けている。

 

 

うん、首尾よく動いてるわ。あとはボタン入力部分を、WiFiコントロールに差し替えればオールオッケーだ。

 

 

M5Stamp PicoをWiFiアクセスポイントに

M5Stamp Picoは「WiFiアクセスポイント」として動作させることができる。つまり、スマフォを直接接続して通信することができるわけだ。そのためのサンプルプログラムが「スケッチ例」にあるので、とりあえず動かしてみる。

 

スケッチ例の名前は、そのまんま「WiFiAccessPoint」

 

そうそう、書き忘れていたけれど、M5Stamp Picoを使うにあたってボードは「M5Stack-ATOM」として動かしている。STAMP-PICOを選んでいると、たまにコンパイルの途中で戻ってこなくなるのだ。ネットで調べた限りでは、ATOMはPICOとほぼ同じ構成なので、これで問題はないらしい。

 

というわけで「M5Stack-ATOM用のスケッチ例」から「WiFiAccessPoint」を動かしてみた。

 

「yourAP」というのが今回のアクセスポイント名

 

うん、アクセスポイント、ちゃんと立ってるわ。バリ3だ。

 

もちろん、実際に何かをする場合は、アクセスポイントだけじゃダメで、サーバーも立てる必要がある。そのあたりも当然スケッチ例に含まれているので、いちいち動かして確認しながら、自分のやりたいことに合わせて改造していくわけだ。

// M5Stamp PicoをWiFiアクセスポイントにする
// スケッチ例「WiFiAccessPoint」をベースに作成
// 接続した後、ブラウザで192.168.4.1(ポート80)に接続すると、リモコンページが表示される

// WiFiAccessPoint用
#include <WiFi.h>

// アクセスポイントのSSIDとパスワードは別ファイル
#include "MyAccess.h"
const char *ssid = PICOSSID;
const char *password = PICOPASS;

// サーバー作成
// PORTNUMは別ファイルに記載
WiFiServer server(PORTNUM);

void setup() {
	// いつもの
	Serial.begin(115200);

// WiFiアクセスポイント・サーバーの初期化
  Serial.println("Configuring access point...");

  WiFi.softAP(ssid, password);
  IPAddress Ip(192, 168, 4, 1);       // Server IP を固定
  IPAddress NMask(255, 255, 255, 0);  // Server サブネットマスクを固定
  WiFi.softAPConfig(Ip, Ip, NMask);   // Ip, Gateway, SubNetMask
  IPAddress myIP = WiFi.softAPIP();
  
  Serial.print("Access Point IP address: ");
  Serial.println(myIP);
  
  server.begin();
  Serial.println("Server started");
// WiFi初期化はここまで

}


// クライアントに操作ボタンを表示するページのHTML
const char html_buttons[] =
"<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>\
<style>.btn{font-size: 900%;</style>\
<title>LED Goggles</title></head>\
<body><center><form method='get'>\
<input type='submit' name='vi' value='V' class='btn' />\
<input type='submit' name='la' value='笑' class='btn' />\
<input type='submit' name='an' value='怒' class='btn' />\
<input type='submit' name='cr' value='泣' class='btn' /><br>\
<input type='submit' name='ra' value='虹' class='btn' /><br>\
</form></center></body></html>";


void loop() {

	// クライアントからの接続処理
	// ほぼスケッチ例「WiFiAccessPoint」のまま
	WiFiClient client = server.available();   // クライアント接続を監視

	if (client) {															// クライアント接続があったら
		Serial.println("New Client.");
		String currentLine = "";								// クライアントからのメッセージ

		while (client.connected()) {						// 接続中
			if (client.available()) {							// クライアントからの受信があれば
				char c = client.read();							// 1バイト受信
//				Serial.write(c);
				if (c == '\n') {                    // '\n'に到達
					if (currentLine.length() == 0) {	// 受信終了なら、クライアントに送信
						client.println("HTTP/1.1 200 OK");
						client.println("Content-type:text/html");
						client.println();
						client.print(html_buttons);
						client.println();
						break;
					} else {
						currentLine = "";
					}
				} else if (c != '\r') {							// 引き続き受信
					currentLine += c;
				}

				// クライアントからsubmitされたボタンを判定
				if (currentLine.endsWith("GET /?la")) {
					Serial.println("笑");
				}
				if (currentLine.endsWith("GET /?an")) {
					Serial.println("怒");
				}
				if (currentLine.endsWith("GET /?cr")) {
					Serial.println("泣");
				}
				if (currentLine.endsWith("GET /?vi")) {
					Serial.println("V");
				}
				if (currentLine.endsWith("GET /?ra")) {
					Serial.println("虹");
				}
			}
		}
		client.stop();													// 接続終了
		Serial.println("Client Disconnected.");
		Serial.println("");
	}
}

できたできた。
スマフォでM5Stamp Picoのアクセスポイントに接続してブラウザを開けば、操作ページのHTML(ソース内に記述)が表示される。ボタンを押せばPicoの方で検知できるという流れだ。

 

設定したIPアドレスにアクセスすると表示される操作ページ
ボタン押下によってシリアルモニタに文字を表示

 

うんうん、動作も想定通り。ちなみに、スケッチ例では「WiFiClient.h」と「WiFiAP.h」をインクルードしていたけど、使っていないようだったので削除しておいた。
あとはこれを、先に作った「ボタン入力バージョン」のボタン入力部分と入れ替えるだけだ。

 

ついに完成! だが。

さて、プログラムを合体させてみたが、動作はどんなもんだろう?

 

 

 

ちゃんと動いてるじゃん!

 

FastLEDライブラリとWiFiライブラリがバッティングしていないかだけが心配だったけれど、どうやらうまく共存できているっぽい。スマフォ側からボタンを押せば、ゴーグルの表情はしっかり変わる。完成だ! ライブに間に合ったぜ!

 

 

 

 

――ところが。

 

1月22日に予定していたライブ…メンバーが2人もコロナに罹ってしまい、急遽キャンセルになってしまったのでした。

 

 

せっかく完成はしたけれど、残念ながらお披露目は延期。

 

でもまあ仕方がない。次のライブ、早く決めるとしよう。それまでに、表情の数を増やしたりと、さらにグレードアップさせとこうかな!

 

(たぶん、終わり)