"スマートな” TVリモコンを作りたい話 設計&基板製造@JLCPCB編—Raspberry Pi Picoでシンプルな学習リモコンを作りたい—

今回はこの記事の続きです👇

www.creativity-ape.com

ファームウェアをRUSTで書く

前回書いた通り、友人にハンズオンをやってもらいました。これ独学でやってる人すごいですね、僕は一人で手をつけてたら早々に心折れていたと思います。

例えるなら、PythonがAT車、RUSTはMT車だなという感想、乗りこなすまでは大変だけど、慣れたら手足のように使える自由度があるんだろうなって思いました。

そして、手取り足取りの指導を賜って出来たファームウェアがこちら。

github.com

見ていただくとわかる通り、いまのところまだ送信しかできていないので、リモコンの信号を読んでコマンドデータを準備する仕組みはこれから別途作る必要があります。

諸々完成した暁には、ぜんぶGitHubに上げようと思っていますが、絶賛作業途上です。

とりあえず動かすようには、IRremoreライブラリのRaw出力なんかが使えます。

github.com

電源管理どうする問題

リモコンを作る上で、いちばんの課題は電源管理でした。リモコンにRP2040を使うのは明らかにオーバースペックで、なにか工夫をしなければ消費電力も(リモコンを動かすにしては)大きいはずです。

マイコンを省電力運用したい時に、まず候補になる機能は、マイコンの機能を停止して消費電力を下げる「DeepSleep」です。

この記事によると、DeepSleep時の電流は0.8mA程度だそう。

picockpit.com

単4電池2本の容量がだいたい700mAhくらいだとのことなので、700mAh÷0.8mA÷24h=36.46日

うーん、月に1回電池交換が必要なテレビリモコンなんてスマートじゃないので、なにか別の方法を考えなくてはいけません。

操作ボタンで電源を兼用する

リモコンは基本的に受動動作なので、ボタンを押した時だけ電源が入るような作りになっていれば、待機電力は不要になります。

そこでこんな構造を考ました。 スイッチの信号をデジタル入力で受けつつ、ダイオードでOR回路を組んで電源としても利用するという作戦です。

この方法なら、プログラムもシンプルになって一石二鳥です。 起動→ピンを読み取り→対応するコマンドを送信

それに加えて、コマンドを送るのは一瞬だから、ボタンをポチッと押す時間くらいでじゅうぶんでは? という仮説も立てていたんですが、検証の結果、そんなことはない(一瞬のレイテンシがけっこう気になる)ことがわかったので、続いてこれも対策もすることにしました。

電源自己保持回路

プログラムのロード直後に、デジタル出力ピンから自分自身の電源ピンにHIGHを出力して、コマンドの送信が終わったらLOWにすることで、信号を送る間電源をキープします。

トランジスタを介して電源→VSYSをスイッチすることにしました。 (後から考えたら、これはトランジスタ入れなくても動くかも)

リモコン信号の送信方法

電源がハードウェア的なハードルとすると、こっちはややソフトウェア的なハードルです。

リモコン信号には38khzの変調が必要です。 リモコンの信号そのものは、比較的遅めの点滅なので苦労なく実装することができますが、38khzとなるとけっこう忙しくて、使う言語の処理速度も気にしたりする必要があります。

普通にいくと、ここでタイマー割り込みとか、RP2040を使うならPIOの話になるところですが、「PWMのキャリア周波数を38khzくらいにセットして、リモコン信号と一緒にAND回路に突っ込めば良いのでは?」というアイディアが降ってきたので、ここは思いつき駆動でいってみます。

ハードウェアの試作

手配線で試作したのがこちら。

修正が必要だったところ

LEDの波長を間違えた

電子部品屋さんで売っている赤外線LEDには、ピーク波長が850nmのものと940nmのものがあります。

リモコンに使われているのは940nmなので、850nmのLEDを使ってしまうととても感度が悪くなります。

940nmのものを買って付け替えました。

LEDの出力が弱い

横着してPi PicoのIOからダイレクトにLEDをドライブしたもんで、LEDの波長を変えてもまだ感度がいまひとつです。

そもそも、LEDの標準電流が50mAなのに対して、Pi Picoのドライブ能力が12mAなので、原因はたぶんそれです。

ドライブ能力が足りてないだけなら、トランジスタでAND回路を作って増幅すれば良いので、こんな感じです。

まだギリギリ隙間があったので、うまく収まりました。

プリント基板をつくる@JLCPCB

試作版がうまく動いたので、回路をKiCAD6で清書して、JLCPCBに基板製造をお願いしようと思います。

JLCPCBから、「ブログで紹介してくれたら基板製造のフリークーポンあげるよ」って素敵なオファーをいただいたので、基板製造の発注方法も簡単に紹介します。

jlcpcb.com

JLCPCBは基板製造サービスの中でも比較的ユーザーインターフェースが洗練されているので、使ったことがなければ一度使えばその簡単さに驚くとおもいます。(クーポン欲さの下心はありますが、オススメする気持ちは紛れもない本物です!)

基板設計にKiCAD6を使った場合の手順です。KiCADの使い方はわかりやすい解説が色々あるので端折りまして、ここではガーバーデータを書き出すところから紹介します。

PCBのデザインまでは出来ているものとして、「プロット」ボタンを押します。

出力ディレクトリは「gerber」とか名付けた空のフォルダを用意して指定しておきましょう。さもなくば、プロジェクトフォルダ直下に大量のファイルが生成されることになります。

特別な設定をするんでなければ、特に操作はいりません。プロットボタンを押せば指定したフォルダにガーバーデータ一式が書き出されます。

続いて、となりの「ドリルファイルを生成」ボタンからドリルファイルも書き出しておきましょう。同じフォルダに書き出されます。

ファイルの書き出しが終わったら、全部まとめてzip圧縮しましょう。

zipファイルの名前が日本語だとアップロード時にエラーが出るので、適当な英数字の名前をつけておきましょう。

ここまでできたら、あとはネットショッピングくらいの手軽さです。

Add gerber fileボタンからさっきのzipファイルをアップロードして

プレビューが表示されるので、ファイルが間違っていないか確認しつつ、用途やお財布と相談して仕様を選択していきます。

特にこだわりがなければ全部デフォルトのままでもOKです、最小限いじるとすれば、数量と基板の色あたりでしょうか。

配送方法によって大きく値段が変わります。 個人的には中途半端にお金をかけると1番後悔する気がするので、急ぎの案件なら1番高いやつ、そうでなければ1番安いやつという判定で発注しています。

支払い方法は3種類から選べますが、ぼくはいつもPayPalを使っています。

さいごにPayボタンを押せば注文は完了です。 製造のステータスは注文履歴から確認できます。結構こまかく更新されるので、安心感とワクワク感があります。

データに不備があると、データレビュー時にエンジニアから英文メールが来ます。deepl翻訳を片手に返信しましょう。

こちらの設計と英語がメタメタでも、彼らは非常にジェントルかつ素早く対応してくれます。(いつも不備のある基板出してごめんなさい🙇‍♂️)

あとは、選んだ配送方法なりのスピードで届きます。

品質バッチリでした👌

次回予告

長くなってきたので、続きはいったんここまで。 次回は、基板設計ミスの修正の話からの予定です!