ESP32で64個のフルカラーLEDを制御する基板を作った

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています

これは何?

8×8=64個のフルカラーLEDを制御するための基板です。 コアとなるマイコンはESP32で、USB接続で簡単に開発できるというものです。

設計

以下のような要件で基板を設計しました。

  • USB Type-Cでパソコンと接続できる
  • USB シリアル変換IC CH340G
  • 自動リセット回路
  • 2mm角のシリアル制御できるフルカラーLED (8×8=64個)
  • ESP32の足をそのまま引き出した拡張ポート
  • フルカラーLEDの制御を3.3V、5Vのどちらか選択できるジャンパ

個々の要素はこれまで作ってきた基板で検証済みのものが多いので、比較的スムーズに設計できました。

例えば、USB Type-CコネクタについてはUARTで書き込みできるCH32V003開発ボードを作った - inajob's blogで検証しましたし、自動リセット回路についてはESPboyというオープンソースの携帯ゲーム機を日本用に再設計してみた - inajob's blogで学んだものです。

部品も上記の製作の時に買ったものがまだ残っていたので、新たに買い足す部品は少なくて済みました。

2mm角、シリアル制御フルカラーLED

今回使用したのはYF923-2020というフルカラーLEDです。

このサイズでメジャーなものとしてはWS2812B-2020やWS2812C-2020なのですが、仕様書を見るとこれらのLEDは3.7~5.3Vということで3.3Vで動かないようなのです(しかし実際のところはそれでも動く、という情報が多数見られますが・・)

今回はどうせ買うなら、ということでプロトコルはWS2812互換ですが、3.3Vでも動作可能とうたっているYF923-2020を選びました。

この情報は3.3V電源で動くNeoPixel LED YF923-2020 をXIAO RP2040に乗っけてPRK Firmware使ってLチカ - kuriharaのブログで学びました。有益な記事に感謝します。

まぁ、3.3Vで動くということですが、何かあったときのために5Vで動かすための仕組みも用意しておき、ジャンパで切り替えできるようにしておきました。(5V接続は結局試してないですが・・)

LEDを配置する面はこんな感じ。GNDを白抜き文字にしてみました。

ICを配置する面はこんな感じ。 ESP-WROOM-32のアンテナ部分は基板から飛び出すように配置しています。 また、各フルカラーLEDに対応したコンデンサも実装できるようにしましたが、これは実装しなくても問題なく動作しました。

発注

サイズは63mm角なので、$4 + 送料という安価で基板製造できました。

実装

さて、この基板、結構表面実装部品が多いので、実装は大変です。

まずは、USB Type-CポートとCH340G、レギュレータ周りの部品を実装して、USBシリアルデバイスとして認識できるかを確認しました。

はんだ付けにははんだペーストとホットエアーガンを使いました。さすがに何度も実装しているので、ここはすんなりと認識されました。

その後、ESP-WROOM-32の実装です。このモジュールは1.27mmピッチの端面スルーホールになっており表面実装部品として実装することにしたのですが、意外とはんだ付けにてこずりました。

この程度のピッチであればそんなに苦労したことはないのですが、特にGNDの端子について、熱が伝わりづらくうまくはんだが乗らないような感じがしました。

まぁ四苦八苦しながらESP-WROOM-32をはんだ付けしたところで、Arduinoとしての書き込みができない問題に気付きました。

色々調べてみると、IO0をHIGHにした状態でRSTをLOWにしてHIGHに戻すとシリアルコンソールに文字が出ていることに気づきました。これはうまくESP32は起動しており、シリアル接続もうまくできているが、自動リセット周りが何かおかしいぞ・・・ということであたりをつけて調べていると、自動リセット回路にプルアップが足りていないことを発見しました。

これは凡ミス・・(こういう回路のピンに求める条件みたいなのをテストするような仕組みはないのかな?、ソフトウェアの単体テストで書くアサーションのような・・)

ということで、とりあえず手元にあった10KΩの抵抗でプルアップを付け足したところ、無事、Arduinoとしての書き込みができました。

自動リセット回路だけでなく、IO0やRSTに対応するスイッチをつけておいてもよかったかなと感じました。

さて、最後は大量のフルカラーLEDです。

その前に、LED制御信号線に問題があることに気づきました。まず3.3Vレベルの信号線と5Vレベルの信号線につけているラベルが逆になっており、シルクの記載と実際に流れる信号レベルが異なっていました。

まぁこれはシルクの記載を無視してジャンパすれば問題なさそう。

そしてもう一つは、3.3Vレベルの信号線が実際のフルカラーLEDの制御ポートと接続されていない問題がありました。

これは大問題で、接続されていないので、当然信号をいくら出力してもフルカラーLEDには到達しません。

原因となっているのがこのラベルのようで、これDIN5とIO27というラベルがくっついており、横切っている配線と2つのラベルはくっついていない状態だったのです。

設計図がこうなっていると、DRCでも配線ミスとして検出されないため、結果として必要な結線を見落としてしまっていました・・

まぁここも必要な配線をジャンパすることで、問題を解決できました。

気を取り直してフルカラーLEDの実装です。

まず1つ実装してみて、ESP32から制御できるかを確かめました。

簡単にESP32から制御するために、ここからはMicroPythonを用いることにしました。

ThonnyというMicroPython用のIDEを使って、MicroPythonのファームウェアをまず焼きこんで、その後以下のようなプログラムを転送して動作を確認しました。 ESP32向けのMicroPythonにはNeoPixel互換のフルカラーLEDを制御するためのモジュールが標準搭載されているので本当に簡単に制御できました。

import neopixel
import machine
import time
np = neopixel.NeoPixel(machine.Pin(27), 64)

count = 0
while True:
    for i in range(64):
        np[i] = (0,((i + count)%8)*2,((int(i/8) + count)%8)*2)
    np.write()
    time.sleep(0.1)
    count = count + 1

Arduinoだと、(特にWindowsだと)コンパイルが非常に遅く、転送も含めると開発のイテレーションが非常に遅くなってしまい、イライラするのですが、MicroPythonだと、さっと書いたコードを実行できるのでストレスなく動作テストができました。

さて、ここからはフルカラーLEDをどんどん実装していって、キリの良いところで動作テストをすることを繰り返しました。

このフルカラーLEDはデイジーチェーンで数珠繋ぎに接続されているので、あるLEDのはんだ付けがうまくできてない場合は、そのLEDより先は全部制御できなくなるため、これを頼りにはんだ付けを進めました。

そしてついに64個すべてのLEDの実装が完了しました。(肩凝った・・)

まぁここまでできれば、あとは好きな模様を表示したり、WiFi経由で表示内容を制御するなど、応用先は様々ありそうです。

まぁ今回は基板の機能が一通り動くことを確認できたということで、ひとまず記事にしました。

まとめ

ESP32をコアとした8×8=64個のフルカラーLEDを制御する開発ボードを作りました。 表面実装部品が結構ありましたが、実装面で苦労することはあまりなく、はんだ付けが少しは上達したかなと感じました。

ESP32の開発はコンパイルが遅いという印象でしたが、MicroPythonを使うことで迅速に開発サイクルを回すことができました。

回路のミスもいくつかありましたが、切り分けがうまくでき、そこまで悩まずに対処できたのもよかったです。

今までESP-WROOM-32を使うときには開発ボードを使っていましたが、今回初めて自作の基板に直接実装することを試すことができました。今後は自作のガジェットにも積極的にESP32を採用できそうです。

エンジニアパパと4歳の娘で2024年に作ったもの

娘も4歳となり、何かを親が作る、というより「親と一緒に作る」ことが増えてきました。 今年も細かいモノづくりをたくさんおこなったので。年末ということで一気にまとめて紹介してみようと思います。

この記事は子育てエンジニア Advent Calendar 2024の12/07の記事です。 昨日は今年も3人育児しながらエンジニアやってる - ビットの海でした。(3人の子育て大変そうです・・) 我が家は妻と私、4歳の娘の3人家族です。

サランラップの箱と輪ゴムで弦楽器

輪ゴムを使うとなんでも楽器にできます。 一応コマの部分を左右にスライドさせることで音階を演奏できるようにしてみました。

ペットボトルと輪ゴムで楽器

ほら、なんでも楽器になりますね。ペットボトルは切り口が鋭利になるので、養生テープでガードしました

魔法のスティックの補修

ショッピングモールの携帯ショップのアンケートとひきかえにもらった光る魔法のスティックですが、早々に先っぽが折れてしまいました。ということで先っぽだけ3Dプリンタで作ることにしました。

折角なので様々な形にして光と影で遊べるようにしてみました。

3歳の娘と作るスイッチ付きの電子工作

まぁ自分が電子工作好きなので、なんとか娘と一緒にできないかと考えた末のアイデアです。 はんだづけなどは危なくてできないし、実際の回路の組み立てなどは親がやることになるので、じゃあどこを娘にやってもらうか、などを考えながら取り組みました。

www.youtube.com

牛乳パック工作

自分が幼い頃に牛乳パックで色々作ったな・・と思いながら娘と遊べるおもちゃを作りました。 娘には色塗りをお願いしました

セルフ方式バレンタイン

妻提案で、チョコフォンデュのようなバレンタインデザートを実施しました。 チョコレートを湯煎で溶かすところから娘と一緒に作業するスタイルです。 娘も楽しんでおり、しばらくは「またチョコフォンデュしようよ!」と言ってきました(特別な日のイベント、ということでそんな頻繁にはしませんが・・)

雪だるま

珍しく雪が積もったので、公園で雪だるまを作りました。

コアラのマーチの箱でぼんぼり

3月ごろにコアラのマーチの空き箱ができたのでなんとかぼんぼりみたいにできないかなと試行錯誤しました。

貝殻をおもちゃにする

夕食のハマグリの殻で遊んだのがきっかけで集め始めました。 ハマグリ、アサリ、シジミ、ホタテ、アワビが集まりました(後半は集めたくて夕食を決めたりもしました)

並べてみたり、擦ってみたり、ぶつけてみたりと、「おはじき」的に楽しみました。 鋭利な部分がある貝もあるので注意です。

謎のくじ引きの工作

ティッシュ箱の中に、さまざまな文字や絵の描いた紙を入れてつくった「くじ引き」です。 引き当てた紙をグルーピングしてポーカーのようにして「役」を作る、みたいな遊びをしました。(役は自由に想像して作って良い)

新聞紙で儀式めいた家

図書館から借りてきた新聞紙の工作の本を参考に作りました。 もっとたくさん新聞紙があればもっと大きな家が作れそうだったのですが、枚数が足りず・・あいにくここまででした。

お化けの形のクッキー型

以前作った3Dプリンタ製のクッキー型にまた挑戦しました。今回はお化けの形をしたものです。 パソコンでデザインする様子を娘に見せつつ3Dプリントするところまでやってみせました。娘はデザインレビュー役です。

万華鏡づくり

レストランのおもちゃで万華鏡があったのですが、他にも欲しいものがありもらいそびれてしまったので、自分で作ることにしました。 たまたま家に転がっていたアクリル板を切ってサランラップの芯の中に入れました。

おもちゃ箱からビーズなどを取り出してきて、万華鏡のマテリアルを色々交換して遊びました。

録音再生モジュール

私が趣味で使おうと思っていた、無骨な録音再生モジュールに、雑に3Dプリンタで枠をつけたものをおもちゃとして与えてみました。 少し説明すると仕組みを理解して色々遊んでいました。(流石に無骨すぎて危なさもあるので、後で回収しました)

Viscuit, ScratchJr

STEM教育入門ということで、iPadで少し遊ばせてみました。 Viscuitは少し高度なデジタルお絵描きツールとして、ScratchJrもシールを貼る感じであまりロジックの使い方は理解していないようですが遊んでくれました。

たまに遊びたいと言われることがあります。

ATOM Printerで遊ぶ

以前買っていたATOM Printerを使ってポケモンなどのキャラクターを印刷して、「塗り絵」として渡してみました。 まぁレシート用紙は小さいし、色も塗りづらいので塗り絵としては微妙ですが、しばらく「ピカチュウを印刷して〜」みたいなやりとりがありました。

リビング夏モード

リビングの壁に幼稚園の壁のように季節に合わせた装飾を施す活動を初めてみました。 第一弾としては打ち上げ花火。雑に丸く画用紙を切ったものを並べるだけなので、娘にハサミで画用紙を切ってもらったりして一緒に作ることができました。

リビング七夕モード

リビングの壁飾りのネクストバージョン。娘が率先して色紙をテープで貼り付けた飾りを作ったので、親も折り紙を使った切り紙を披露したりして一緒に作りました。

リビング海モード

七夕も終わったので海の生き物を作って貼ってみました。

3Dプリンタでお絵描き定規を作る

3Dプリンタでお絵描き定規を作りました。単純な図形から、写真から生成した娘の顔まで、様々な定規を作ってみました。

こどもちゃれんじのお絵描き定規

上と同じ要領でこどもちゃれんじのダイレクトメールで紹介されていた定規とそっくりなおもちゃも作ってみました。

ポッドキャスト風音声を録音する遊び

公開はしていませんが、娘とインタビュー形式のポッドキャスト風の音声を録音する遊びをしました。 非常にかわいかったので(親バカ)、祖父母にも送って喜ばれました。

DFPlayer Miniで子供用おもちゃ再び

以前に作ったおもちゃですが、音楽を差し替えてたまに遊んでいます。もう少しボタンを増やしたいな。 inajob.hatenablog.jp

リエーターパソコン

ひらがなを勉強するにあたり、「あいうえお表」があると良いということで、壁に貼るものを使っていたのですが、もっと携帯性に優れたもの、ということでラップトップ型のあいうえお表を作ってみました。

看護休暇を取るからには全力

カスピ海ヨーグルトのパッケージを活用してペンギン?を作ってみました

空き箱工作

お菓子の空き箱を使って、ちょっとしたジオラマのようなものを作ってみました。娘はこれでごっこ遊びなどをして楽しんでくれました。

TERADAMOKEI感がありますね

4歳の娘とパソコンの絵

想像通り、私は結構リビングでパソコンを触っていることが多いのですが、娘にもそれはバレており、そのような絵をよく描いてくれます。

ワープロソフトで簡易ひらがなクイズ

作った、というと大げさですが、画面に適当な文字入力ができるソフトを表示して、そこにひらがなを入力するだけで、ひらがなクイズが完成です。

リビング雪モード

娘が率先して、リビングの壁を雪モードにしてくれました。親から始めたリビングの壁の装飾ですが、早くも娘がクリエイティビティを発揮してくれてうれしいです。

段ボールでバス

わんぱくだんの絵本で出てきたということで、自分も作りたい、と娘が言い出したので一緒に作りました。 この段ボールは2年前にクリスマスツリーとして使ったものですが、その後、窓をつけて「家」となりそしてバスとなりました。

パターン切り紙

折り紙を折り曲げてテキトーに切ることで、きれいなパターンの切り紙が作れるので、一緒に作りました。 自分が小さい頃、これ好きだったんだよなー

プチッとビーズジョイント

ダイソーのプチっとビーズを分岐、合流させるためのアタッチメントを3Dプリンタで作りました。

3Dプリンタでビー玉迷路

よく見かけるおもちゃを作ってみました。が、まだ娘には早かったようで迷路をクリアできずに(文字通り)投げ出してしまいました・・残念。 データはこちらのものを使わせてもらいました: https://www.printables.com/model/272870-05-marble-maze

ビー玉でコリントゲーム的なおもちゃの試作

同じくこちらもまだ難しかったみたいです。木の板も釘も鋭利で危ないので早々に片付けました。

3歳の娘と小麦粘土

粘土遊びは、娘が集中しているので、親も負けじと隣で作品を作って張り合っています。

クリスマスリース

近所で材料を集めて、クリスマスリースを作りました。去年はツルと松ぼっくりが見つからなかったのですが、今年こそはと調べていたので材料をそろえることができました。

まとめと宣伝

もともとものづくりをするのが趣味なのですが、子育てを始めるにあたり、そういう活動は出来なくなるな・・・と思っていました。

しかし、娘の成長に合わせて一緒にものづくりするのは、このくらいの年齢になれば全然できることがわかり、今年はその範囲で様々なモノづくりができました。 おもちゃ作りはまさに「顧客がそこにる」ということで、一人での自己満足的なものづくりとはまた違う楽しさや挑戦があります。 また、おもちゃを一緒に作ること自体が一種の「遊び」となり、娘との楽しい時間を過ごすことができており、このような体験が何か娘の成長の足しになったら良いなと思っています。

このあたりのアウトプットは育児Scrapboxなどにも書き溜めてありますので、ぜひ参加してください! (そして、あなたの育児Tipsも書き込んで下さい!)

scrapbox.io

また、私のポッドキャストでもこういった、「ものづくり子育て」について紹介しています。この記事を見て興味を持った方はぜひ聞いてみてください。

open.spotify.com

自分で設計するRP2040基板

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています

これは何?

RP2040は、Raspberry Pi PicoのメインのICです。 Raspberry Pi Picoは安価で入手性も良い開発ボードですが、形状が固定されており、製品に組み込むことを考えると柔軟性に欠けます。

ということで、自分で基板を設計して、自由な形状のRaspberry Pi Pico的なものを作ってしまおうというのが今回の作例です。

もう一つの目的として、Raspberry Pi Picoへの理解を深めるというのもあります。

資料

RP2040は公式のリファレンスがとても親切で、なんと日本語のハードウェア設計のための資料が存在します。

https://datasheets.raspberrypi.com/rp2040/hardware-design-with-rp2040-JP.pdf

この資料の中でも「最小設計例」として、Raspberry Pi Picoとは違う独自の開発ボードを設計する例が紹介されています。

以前の挑戦

実は、これ以前にもRP2040を使った基板を作る前準備として、以下のボードを使ったことがありました。

github.com

これは https://x.com/nonnoise さんが設計された、RP2040搭載の開発ボードです。

RP2040を搭載した開発ボードを作るにあたり、心配だったのはRP2040をどうやってはんだ付けするかということです。 パッケージははQFN56ということで、小さなパッケージでかつ、ICの足が出ていないので、手ではんだ付けする難易度は高そうでした。

幸い我が家にはホットエアーガンがあるので、QFN56の足を1本ずつ手ではんだ付けするのではなく、はんだペーストを端子に塗布して、ホットエアーガンで基板とICを熱することで実装できるだろうという目論見はあったのですが、こういうのはやってみないと安心できません。

ということで、自分で基板を設計する前に、このボードで実装の難易度を確認しました。 必要な部品はAliExpessで購入したRaspberry Pi Pico風のボードから剥がすことで入手しました。(不要な基板から必要な部品を取り出して流用することを、界隈では【羅生門】などと言うみたいです)

結果としては、何とか実装できる!という感じでした。

設計

前述の2つの資料を参考にしつつ回路図を作成します。

この基板独自の特徴としては・・

  • I2C接続のOLED取付用の端子
  • USB Type-C
  • AMS1117による3.3V供給
  • Flash ICはW25Q16JVSSIQ
  • コンデンサ・抵抗のサイズは0603

設計と並行して、必要な部品を調達します。

家に無い部品に関しては https://www.lcsc.com/ で購入しました

Type-C端子のフットプリントに関しては UARTで書き込みできるCH32V003開発ボードを作った - inajob's blog で実験したものを活用しました。

RP2040のGND端子はICの真ん中にパッドがあるので、そこを裏からはんだ付けするためのスルーホール穴の開いたフットプリントを利用しました。(GitHub - 74th/rp2040-dev-boardを利用しました)

今回からKiCAD8を使うようにしたので白抜き文字のシルクや、日本語のシルクなども試しに入れてみました。

実装

今回はホットエアーガンを使った実装をしましたが、はんだペーストの塗布はメタルマスクを使用せずにシリンジ型のはんだペーストを手で乗せていきました。

まぁ、実装が難しいのはUSB Type-Cの端子と、QFN56のRP2040だけなので、まずはチャチャっとほかの部品を実装してしまいます。

全部実装して、少しテスターで確認したのちに、USBケーブルでパソコンにつなぐと・・・

パソコンにRP2040のストレージが現れました。成功か?!

と思って、適当なuf2ファイルを転送して書き込んでみたが・・ なぜかここからうまく動かず・・、リセットするとまたストレージが見えるのですが、uf2ファイルを書き込むと無反応に・・の繰り返しです。

果たして基板が悪いのか、周辺部品が悪いのか、RP2040が壊れたのか・・こうなると暗中模索です。

RP2040の不良を疑い(この疑いは間違いでした、後述)、手元にあった、動作しているRaspberry Pi Pico互換ボードから、RP2040を取り外しこのボードに取り付けてみたところ・・

動きました!!

RP2040不良だったのか・・と思いつつ、その怪しいRP2040を今度は逆にRaspberry Pi Pico互換ボードに実装してみたところ、こちらも問題なく動きました・・・

ということで、RP2040には問題がなく、再度はんだ付けしたら動いたということで、おそらくはんだ付け不良による動作不良だったようです。

ということで、基板、周辺部品、RP2040のすべてが問題ないことがわかりました。

動作確認

ここまでくればあとはRaspberry Pi Picoと同じように利用できます。 適当にCircuitPythonのuf2をダウンロードして、パソコンからRP2040のストレージに転送します。

その後Thonnyを使ってプログラミングを行いました。

I2C接続のOLEDを接続して動作確認してみます。

LibrariesからOLED制御用のライブラリをダウンロードします。 CircuitPythonのバージョンによってライブラリのバイナリが異なるので注意が必要です。

ダウンロードしたzipファイルのlibの中の以下のファイルをCircuitPythonのドライブのlib以下にコピーします。

  • dafruit_framebuf.mpy
  • adafruit_ssd1306.mpy

さらに、examples/framebuf/font5x8.bin をCircuitPythonのドライブのルートにコピーします。

そして、以下のプログラムをCircuitPythonのドライブのルートのcode.pyに書き込みます。

import board
import busio

import adafruit_ssd1306

i2c = busio.I2C(board.GP17, board.GP16)
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

print("start")
display.fill(0)
display.text('hello world', 0, 0, 1)
display.show()

普通に動きました。

(関係ないけど、MicroPythonやCircuitPythonでさっと画面に日本語を表示するデファクトスタンダードな方法が欲しいなと思いました)

まとめ

RP2040を使った基板を設計して、実装し、動作確認ができました。

この経験を活用することで、自分のオリジナルのガジェットにRaspberry Pi Picoの形状や仕様にとらわれない、オリジナルのRP2040制御回路を構成できるようになりました。

最近使っているマイコンは、ATMega328, CH32V003, ESP32, ESP8266, RP2040ということで、ずいぶんと多くのマイコンを扱えるようになりました。まぁどれもちょっと触った程度なので、いろいろと活用していく中で理解を深めていきたいと思います。

ThinkPad L15 Gen2を購入した

前回ノートパソコンを新しくしたのが2019年 inajob.hatenablog.jp

この記事以降にストレージを1TBのSSDに換装し、バッテリーも交換しました。

それから5年使いましたが、特に性能上の課題はなかったのですが、この時新調したLatitude 5580はTPMが搭載されておらず、Windows11にアップグレードできなという問題がありました。

ということで、来年10月のWindows10のEOLが来るまでに新しいマシンに新調しようと考えました。

今回の要件

性能上の課題はなかったので、同じような性能でWindows11がインストールできれば良いなということで以下の要件で探しました

  • ラップトップ
  • 15inch FHD(1920×1080)
  • メモリ16GB ~ 32GB(旧マシンのメモリを移植する予定)
  • ストレージ 1TB(旧マシンのストレージを移植する予定)
  • 以前のIntel第6世代i5と同等からそれより良い性能

ThinkPad L15 Gen2に決めた

以上の要件から、ThinkPad L15 Gen2にしました。

CPUはIntel第11世代のi5(Core i5 1135G7(2.4GHz) )、ストレージは500GBのHDDですが、これは換装するつもりなので性能が低いほうが安くで買えてお得です。

まぁ大体、中古で安いものを探すと、メーカーを気にしない場合前回のようにDELLとか、今回のようにThinkpadになりがちと感じています。

Latitude 5580からのストレージ移植

今回の作業の目玉である、ストレージの移植です。

まず、旧マシンのSSDの中身をクリアする前に、必要なデータのバックアップを取ります。 我が家のNASのコールドバックアップ用の4TBのHDDを使い、旧マシンの1TBのSSDの中から必要なデータをバックアップします。

まるっとすべてバックアップしてもよかったのですが、今回は自分が作成したデータのみをバックアップすることにしました。 もともとこういうこともあるだろうと思い、ディレクトリを分けて管理していたのが良かったです。

その後、旧マシンから、SSDを取り出して、新マシンに差し込む、、のですが、新マシンはSATAのHHDがマウントされており、旧マシンのSSDはM.2で、そのままでは利用できない問題が発生しました。

この問題を解決するためにSATAをM.2に変換するコンバータを購入しました。1000円しないようなものをテキトーに選びましたが、特に問題なく動いています。

その後Windowsの標準機能である「回復ドライブ」を使って、ストレージを入れ方の後にクリーンインストールします。

これが結構時間がかかる作業で非常にドキドキしました。 回復ドライブを作るのに数時間(メモし忘れた)、回復ドライブからのクリーンインストールに4時間ほどかかりました。

インストール作業中にTPMの削除をして良いかの確認がこんな画面で出てきて恐る恐る削除しました

古いマシンも一応動くようにしておく

古いマシンは利用していたSSDを抜いてしまうので、起動できなくなってしまいますが・・、家に以前このマシンで利用していた250GBのSSDが、データもそのままで残っていたので、これを差し込んで起動したところ・・、普通に起動し、ライセンスも問題なく認識されました。

メモリの移植

旧マシンはDDR4-2400の16GBのメモリを2枚差して 合計32GB搭載していました。 新マシンにこのメモリを移植しようと思ったのですが、新マシンに購入時に刺さっている8GBのメモリはDDR4-3200で、これは古いマシンに差しても認識しないようでした(これは勘違いかも・・)

ということで、とりあえず16GBのDDR4-2400のメモリ1枚を新しいマシンに差して、旧マシンは16GB、新マシンは8GB+16GB=24GBという構成にしました。

旧マシンの際もメモリ使用量を見ていると大体16GB程度に収まっていたので、24GBあれば実際の使用においてメモリ不足で悩むことはほとんど起きていません。

ソフトウェアのセットアップ

ここまでで、新しマシンが期待したスペックになりました。

あとは使っていくだけです。

今まで使っていたソフトウェアを、欲しくなったタイミングで入れていきます。 ついでに、同じことを実現できるもっと良いソフトウェアがないか、などを探したりしました。

ソフトウェアのインストールには、対応している限りWinGetを使用し、簡単にインストールしたソフトウェアを管理できるようにしています。

新しいノートパソコンを使い始めて2か月ほど経った今現在でインストールしているソフトは以下です。

Audacity 3.6.3
Windows ドライバ パッケージ - Silicon Labora…
Docker Desktop
FFmpeg 5.0.0 for Audacity - x86_64
Git
Krita (x64) 5.2.3 (git 68d178c)
Microsoft 365 - ja-jp
OpenSCAD (remove only)
Arduino IDE
Inkscape
freerouting
Go Programming Language amd64 go1.22.5
LibreOffice 24.2.5.2
Adobe Acrobat (64-bit)
Microsoft Update Health Tools
Node.js
Google Chrome
GnuWin32: Make-3.81
Microsoft Edge
Microsoft Edge Update
Microsoft Edge WebView2 Runtime
Lenovo Vantage Service
Python Launcher
Microsoft Visual C++ 2015-2022 Redistributab…
FreeCAD 0.21.2 (現ユーザー用に導入を行う)
KiCad 8.0 (current user)
kubectl
LINE
Microsoft OneDrive
Microsoft Visual Studio Code (User)
Python 3.13.0a5 (64-bit)
HYPER SBI 2
インテル® グラフィックス・コマンド・センター
ThunderboltTM コントロール・センター
Microsoft Clipchamp
テレキングリモート
テレキングプレイ
Dolby Audio Premium
Lenovo Commercial Vantage
Cortana
Microsoft Defender
AV1 Video Extension
ニュース
MSN 天気
Copilot
アプリ インストーラー
Xbox
問い合わせ
Microsoft ヒント
HEIF Image Extensions
デバイス製造元からの HEVC ビデオ拡張機能
日本語 ローカル エクスペリエンス パック
MPEG-2 ビデオ拡張機能
Microsoft Edge
Microsoft 365 (Office)
Solitaire & Casual Games
Microsoft 付箋
Mixed Reality ポータル
Microsoft .Net Native Framework Package 1.3
Microsoft .Net Native Framework Package 1.3
Microsoft .Net Native Framework Package 2.1
Microsoft .Net Native Framework Package 2.1
Microsoft .Net Native Framework Package 2.2
Microsoft .Net Native Framework Package 2.2
Microsoft .Net Native Runtime Package 1.4
Microsoft .Net Native Runtime Package 1.4
Microsoft .Net Native Runtime Package 2.1
Microsoft .Net Native Runtime Package 2.1
Microsoft .Net Native Runtime Package 2.2
Microsoft .Net Native Runtime Package 2.2
OneDrive
Outlook for Windows
ペイント
Microsoft People
Power Automate
Raw Image Extension
Snipping Tool
Windows セキュリティ
Microsoft Engagement Framework
Microsoft Engagement Framework
Skype
Microsoft Store エクスペリエンス ホスト
Microsoft To Do
Microsoft.UI.Xaml.2.7
Microsoft.UI.Xaml.2.7
Microsoft.UI.Xaml.2.8
Microsoft.UI.Xaml.2.8
Microsoft Visual C++ Runtime Package
Microsoft Visual C++ Runtime Package
Microsoft Visual C++ 2015 UWP Desktop Runtim…
Microsoft Visual C++ 2015 UWP Desktop Runtim…
Microsoft Visual C++ 2015 UWP Runtime Package
Microsoft Visual C++ 2015 UWP Runtime Package
VP9 Video Extensions
Web メディア拡張機能
Webp Image Extensions
Widgets Platform Runtime
Dev Home
Microsoft フォト
Windows クロック
WindowsAppRuntime.1.3
WindowsAppRuntime.1.3
WindowsAppRuntime.1.4
WindowsAppRuntime.1.4
WindowsAppRuntime.1.5
WindowsAppRuntime.1.5
WindowsAppRuntime.1.5
Windows 電卓
Windows カメラ
フィードバック Hub
Windows マップ
Windows メモ帳
Windows サウンド レコーダー
Microsoft Store
Windows ターミナル
Windows Package Manager Source (winget) V2
Xbox TCUI
Xbox Game Bar Plugin
Game Bar
Xbox Identity Provider
Xbox Game Speech Window
スマートフォン連携
Windows メディア プレーヤー
映画 & テレビ
クイック アシスト
Linux 用 Windows サブシステム
Windows Web Experience Pack
クロス デバイス エクスペリエンス ホスト
Realtek Audio Control
Synaptics Trackpoint Control Panel
Synaptics TouchPad Control Panel
PrebootManager
メール/カレンダー

移植作業で気づいたミス

設定ファイルのバックアップが一部とれておらず、設定しなおしとなっていました。 バックアップを取る際には、ソフトウェアごとの設定ファイルがどこに配置されているか、確認が必要です。

Windowsの場合はレジストリに設定を持つようなソフトウェアもあるので、さらに注意が必要です。

またSSH秘密鍵のバックアップも忘れており、旧マシンの鍵はクリーンインストールでなくなってしまい、かつ新マシンからVPSへのログインができなくなり、ヒヤッとしました。 今回はたまたま家のRaspberry Piの鍵ペアもサーバに登録してあったので、事なきを得ました。

OneDriveに保存していたデータは気にせず勝手に移行されており、意外と便利!という気持ちになりました(課金していないので、すべてのユーザーデータを保存するほどの容量はないですが・・)

ThinkPad L15 Gen2を使っていて気づいたこと(Latitude 5580との比較)

  • USB Type-Cが搭載されており、ケーブル一本で電源と外部ディスプレイ接続ができて便利
  • CPUは第6世代i5 → 第11世代のi5 だが、ほとんど性能向上を感じない、結構CPUの違いで値段が違ったのだが、この程度の違いならもっと古くて安いCPUでもよかったかも・・
  • キーボードはたまにAとLのキーが押せてないことがあるのが気になる、慣れれば何とかなるかな?(押し込めていない?)
  • 分解しづらくなった。Latitude5580はねじを外したらスッと裏ブタが取れたが、ThinkPad L15 Gen2はツメがしっかり引っかかっている
  • 指紋認証でログインできる
  • 日本語入力中にChromeVS Codeが落ちることがあったが、この問題が解消している(Windows11で良くなった?)
  • Windows Tarminalを使い始めたら便利だった(これは単に移行のタイミングで乗り換えただけ)

お値段

本体が45000円程度、SATA→M.2変換アダプタが1000円程度で、 合計46,000円ほどかかりました。

メインストレージや、メモリは旧マシンのものを移植することで、コストを抑えることができました。

まとめ

Windows11が動かないということで、マシンを新しくしました。 期待通りではあるものの、期待を超える何かを感じないまぁ普通の買い物となりました。

CPU性能の向上はもう少し体感できるかな、と思ったのですが、少し残念です。

まぁこれでWindows10がEOLになっても何とかなりそうです。 次こういう機会があれば、もうLinuxにしようかな、、なんて考えています。

おまけ

この話は私のポッドキャストでも話したものです。音声で聞きたい方、書きおこしを見たい方はこちらをどうぞ

listen.style

Spotifyはこちら open.spotify.com

静電容量タッチと基板を裏から光らせる手法の実験

この記事ははJLCPCBの提供でお送りします。

JLCPCBとは

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。

これは何?

静電容量タッチを使った実験として、以前ESP32の静電容量タッチでフリック入力を実現してみた - inajob's blogを作りました。

今回は、さらに実験を行おうと、新しい基板を作成しました。

仕様

  • 8×8 のパッド (静電容量タッチセンサーが16個必要)
  • それぞれのパッドに対応した8×8のLED
  • マイコンは実装せず、手元の適当なマイコンをつなげて制御する

設計

8×8のパッドはそれぞれのパッドを2つの静電容量タッチの端子を組み合わせることで16個のタッチセンサーで8×8=64個のキー入力を認識できるようにします。

(後で気づきましたが、この方式は複数キー同時押しに対応できません)

単にスイッチとLEDがあるだけの単純な回路図となりました

LEDは基板の裏面に実装し、その光を表面に透過させる方式としました。 基板の裏面にLEDのパッドを配置し、その部分の両面のソルダマスクをなしに指定することで、光を透過しやすくします。

裏面が発行するチップLED部品もあるようですが、我が家の部品庫には一般的なチップLEDしかないので、これを表裏逆向きにはんだ付けする作戦で行きます。

前回の実験では静電容量タッチ部分はソルダマスクを除外しましたが、今回はソルダマスク付きで設計しました。結果的にはこれでも問題なく静電容量タッチが検出できました。

JLCPCBに発注

今回も発注はJLCPCBです。今回の基板は紫色にしてみました。

名刺基板のサイズは10cm×10cm以内なので、非常に安く作ることが出来ます(5枚で$2 + 送料)

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

実装

TTP229モジュールで制御してみる

手元にTTP229という16ポートの静電容量タッチを扱うICを使ったモジュールがあったので、これを流用できないか試してみました。

このモジュールは16個の静電容量タッチパッドがついていますが、すべての端子が引き出されているので、今回製作した基板とも接続することが出来ました。

しかし、Arduino UNOと接続してTTP229モジュールと通信することで、タッチ状態を認識できるかと試行錯誤してみましたが、どうもキャリブレーションが柔軟に行えないようで、うまく今回の基板のタッチを認識できないようでした。

モジュールにもともとついている16個のパッドの認識はうまくできているので、TTP229自体には問題はなく、今回のように利用することが想定外なのか、何か細かいキャリブレーションを行う手法があるのかわからないですが、とにかく今回のケースではうまく動かなかったです。

ここはもしかしたら深堀したら良いやり方が見つかるかもしれませんが、一旦別の方法を試すことにしました。

ESP32の静電容量タッチを利用する

以前の以前ESP32の静電容量タッチでフリック入力を実現してみた - inajob's blogと同じ方法で、ESP32の静電容量タッチの機能を使うことを試してみることにしました。

ただしESP32-WROOMには静電容量タッチで利用できるピンが9個(本当は10個なのですが、開発ボードでは1つ利用できないため)しかないので、8×8のパッドのうちの4×5の領域で動作を確認することにしました。

LEDも上記の4×5の領域にのみ実装し、9個のGPIOで制御することにしました。

TTP229モジュールではうまく認識できませんでしたが、ESP32ではすんなりとタッチを認識できました。

LEDで裏面から照らす部分の実装

通常表面に光る側を向けて実装しますが、今回は表裏をひっくり返して実装します。

うまく実装できるか心配でしたが、ちょっとはんだを多めに盛ることで実装できました。

ここで1つトラブルがありました。

LEDの光が基板を透過するようにソルダマスクに穴をあけたのですが、一部の配線がソルダマスクの穴の部分に存在しており、はんだ付けの際に気を付けないと、意図しない配線がショートしてしまうという実装しづらいものとなっていました。

ソフトウェア実装

さて、静電容量タッチ、LED部分ができれば、後はソフトウェアです。

とりあえず、パッドをタッチしたら、そのパッドに対応するLEDが消えるという簡単な動作確認プログラムを作成してみました。

静電容量タッチセンサーの読み取りを10回行い、タッチが検出し続けることができればタッチとして認識するというようなロジックを組むことで、それっぽく動くものが出来ました。

雑なコードですが、一応掲載しておきます。

ESP32の静電容量タッチの認識と、マトリクス方式でLEDを駆動しているだけです。

gist.github.com

動作の様子

パッドを触るとその部分のLEDが消える様子がわかるかと思います

まとめ

マトリクス方式で静電容量タッチを試すための基板を作成し、TTP229とESP32で制御できるか試してみました。

TTP229ではうまくタッチを認識できずESP32を使うこととなりました。このため8×8すべてのパッドを認識できず一部4×5の領域で動作確認することとなりました。

静電容量タッチをマトリクス方式で利用するこの手法は、キーの数を増やすことはできますが、複数同時押しが認識できないので、注意が必要です。

基板裏面からLEDを照らす方式は、通常のチップLEDを逆向きに実装するという荒業で、期待通り動作することがわかりました。 ソルダマスクの指定をうまくやらないと、配線が露出して、はんだ付けしづらくなるというトラブルについても学ぶことが出来ました。

ポッドキャスト「#inajob の試しに録音してみた」の作り方

これは?

私は毎週1回更新のポッドキャストである「#inajob の試しに録音してみた」をかれこれ、2023年5月から始めて1年以上続けています。

ポッドキャスト、というと面倒くさそうというイメージがあるかもしれませんが、個人的にはブログ記事を書くよりも簡単・気楽に自分の言葉を紡ぎだし、公開する手段だと考えています。

この記事では、このポッドキャストの技術的な側面について紹介します。

まずは宣伝

この記事では、「#inajob の試しに録音してみた」をどうやって作っているかという技術面での紹介にフォーカスして紹介しましたが一応「#inajob の試しに録音してみた」の紹介もさせてください。

「#inajob の試しに録音してみた」は、30台後半、ものづくりが好きで、4歳の娘を子育て中のinajobが、なんでもない日々の雑談を毎週30分程度録音しているポッドキャストです。

「30代後半」、「ものづくり」、「子育て」あたりのキーワードにピピっと来た人はぜひ試しに聞いてみてください!

Spotifyで聞きたい方はこちら open.spotify.com

LISTENで文字起こしを見たい、文字起こしを見ながら聞きたい方はこちら listen.style

機材

機材と言っても、パソコンとマイクだけです。 パソコンは一般的なものなので、マイクについて紹介します。

以前も紹介しましたが、マイクはWeb会議用のインカム型のマイクを利用しています。

ポッドキャストを録音する人は、かなり良いマイクを買っているようですが、自分はまだ踏み出せていません。でもどうでしょう、自分のポッドキャスト、そこまで音声がひどいってことはないように聞こえませんか? (良いマイクはこんなところがいいよ!というプレゼンをしてほしいと思い、あえてこういう書き方をしてみる)

このヘッドセット、普通に在宅勤務時にも便利に使っています。

選ぶポイントとしては、安いこと、USB接続ではなく3.5mmオーディオジャックであること(一般的にはUSB接続の方が音質が良いなどと言われている気がしますが、接続の相性などが無い3.5mmオーディオジャックの方がつぶしがききそうだなと思って、こちらを選択しました)くらいを考慮しました。

台本

台本と言っても、何を話すかのトピックを列挙しただけのテキストです。

私は、普段自作のWikiで日記をつけているので、そのWikiの中に台本を作っています。

自分のポッドキャストでは、主にその週に起きたことをトピックとして取り上げることが多いため、台本作りというか、「先週の振り返り」をやっていると自然と台本が出来ているというような感じです。

録音ソフト

Windows標準の「ボイスレコーダー」、Macの場合は「ボイスメモ」を使っています。

私のポッドキャストは1人で録音しているものなので、録音周りで凝った機能は不要です。

しかし、この後の編集作業で、話題の切り替わりポイントに効果音を入れる処理があるので、話題の切れ目で音声ファイルを分けたいという要件があります。

OS標準のこれらのソフトは、録音ボタンで録音ができて、1つの音声を録音したのちに、さらに録音ボタンから録音すると別の音声ファイルとして録音を開始してくれます。

まぁ当たり前と言えば当たり前なのですが、この機能がトピックごとに音声ファイルを分けて録音するうえでとても便利です。

音声編集ソフト

Audacityを利用しています。 Audacityは無料で利用できる音声編集ソフトです。

また、後述するようにプログラミングで動作を定義することができるので、定型的な編集作業を自動化できます。

今回はこのプログラミングでの音声編集についてもう少し詳しく説明します。

プログラミングでの音声編集

Audacityはプログラミングで動作を定義できるということで、ポッドキャストをある程度編集していく中で、お決まりの編集作業をスクリプトとして定義しました。

後から音声の一部を切り取りたい、と言った作業をする必要が無い場合は、プログラムを実行し、少し手で作業するだけで、トピックごとのぶつ切り音声にBGMやサウンドを合成して、ポッドキャストっぽい音声を半自動的に作成できるようになっています。

ということで、この仕組みを使うと、ポッドキャスト収録にかかる時間は録音している時間と、少しスクリプトを実行する時間のみ、ということで、かなり手軽にポッドキャスト的な音声を作ることができます。

ぶつ切り音声をポッドキャスト化する手順

  • 録音した音声をすべて読み込む
  • (ここは手動)ノイズ低減
    • Audacityのノイズ低減エフェクトは、音声データの無音部分を指定することで、バックグラウンドノイズを認識して、ノイズを低減する機能です
    • 無音部分の指定がプログラムから実行できないので、この処理の手前でスクリプトが一時停止するように作っています
  • 無音の切りつめ
    • 録音データで沈黙部分が長い場合に切り詰めます
  • ラウドネスノーマライズ
    • -14LUFSに音声レベルを合わせます
  • 録音した音声を並べる
    • 最初と最後の音声は、BGMのイントロ部分と被らないように少しずらして配置します
  • 音声の切り替わり部分に効果音を入れる
  • 最初と最後の音声部分にBGMを入れる
    • BGMは最初数秒再生したのちにフェードアウトするようにエンベロープを設定します
  • 最後の音声の終了に合わせてBGMを切り詰める
  • (ここは手動) 名前を付けてプロジェクトを保存
  • (ここは手動) mp3形式でオーディオをエクスポート

自動化スクリプト

上に書いた処理を実行するスクリプトを公開しています。 もし似たようなポッドキャストを作ってみたい方は、どうぞご自由に使ってください。

github.com

配信

Spotify for Podcastersを使って配信しています。無料です。 さらに、Spotify for Podcastersの機能で、YouTubeApple Podcasts、Amazon Music、などさまざまなポッドキャストプラットフォームに配信しています。

podcasters.spotify.com

文字起こし

LISTENを使って文字起こしを作成しています。無料です。

listen.style

無料ユーザーの場合、サマリーとチャプターのの生成は10日間に1エピソードのみなので、毎週配信のポッドキャストだとたまにサマリーとチャプターが生成されない回があります。

もう一つ文字起こしサービスとしては Podexも利用しています。こちらも無料です。

podex.in

さらに最近、Podwiseというサービスでも文字起こしが作成できます。こちらは有料のサービスですが、だれか1人の課金ユーザが文字起こしを依頼すると、他の人は無料で見られるよいというような仕組みで、最近どなたかが、文字起こしを依頼してくれているようで、私は無料で(月4エピソードまでですが)文字起こしなどを見ることができています。(誰か知らないけど感謝です!)

podwise.ai

BGM

何かそれっぽい音楽が鳴ればいいや、と思いインターネットからPublic DomainのBGMを探してきて、エピソード毎にコロコロ変えています。

最近は以下のゲーム用の素材サイトからBGMでかつ、ライセンスの緩いものを検索して、良さそうなものを選んでいます。

opengameart.org

フィードバック・コミュニティ

フィードバック募集ツールとして、Google Formsを使っています。無料です。(あまり使われませんが・・)

またCosenseプロジェクト「井戸端」で、エピソードに対応したページを作り、好きに雑談できるようにしています。無料です。

ポッドキャストを始めるにあたり、何らかのコミュニティを活用することで、初期に聞いてくれる人を少しでも確保するのが、継続の秘訣かなと思いました。自分の場合は前述の「井戸端」や、Xのフォロワーさんが初期リスナーとなってくださいました。

scrapbox.io

さらに今年から、Dicordサーバ「inajob川」を作り、ポッドキャストにかかわらず私を中心としたコミュニティづくりも始めてみました。無料です。

discord.gg

まとめ

さて、ここまで紹介してきましたが、私がポッドキャストを始めるために払ったお金は、、マイク代の2000円弱だけです。

ポッドキャストって案外お金をかけずに継続できるんですね。

もちろん、マイクや編集は「沼」で、凝り始めるとかなり時間もお金もかかるとは思いますが、最小構成としてはこのくらいで始められるということがわかりました。

個人的に、在宅勤務や育児ということで、同僚や友人と顔を合わせて雑談する機会がかなり少なくなり、雑談に飢えていた中でたどり着いたのがポッドキャストです。

しばらく聞いていたのですが、そのうち自分でもやってみたくなり始めてみたところ、なんだかんだで1年以上続けることができています。

ポッドキャストを始めたことで、ほかのポッドキャストを配信する方との交流が増え、新たな刺激にもなっています。

この記事をお読みの皆さんも、私のポッドキャストに限らず、まずは聞くところから始めて、もし興味があればポッドキャスト配信を始めてみるのはいかがですか?

音の鳴る名刺基板

この記事ははJLCPCBの提供でお送りします。

またJLCPCBのブログとほぼ同じ内容です。

JLCPCBとは

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

JLCPCBとは、プリント基板製造などで有名な香港の企業です。

日本からでもWebページでポチポチするだけでKiCADなどで作成した基板データの製造を依頼できます。

値段もかなりお手頃で、ホビー電子工作ユーザーの間では広く利用されています。

これは何?

基板を使った名刺を作るという活動があり、そういった基板を「名刺基板」と呼んだりします。

ということで、今回はinajobも名刺基板を作ってみようということで、挑戦してみたという話です。

要件定義としては、折角なので何か機能を持たせたいなと言うことで、ピアノのようなスイッチとボリューム・スピーカーなどを搭載し、「音が鳴る名刺基板」ということにしようと決めました。

設計

テーマは決まりましたが、細かいパーツに何を採用するかを決めていく必要があります。

色々考えて以下の構成に決定しました

  • メインICはCH32V003
    • 安いので、名刺基板に向いている?
  • 書き込み用USB端子(Type-C) + CH340G
  • 電源は単4電池2本
    • 外部電源なしで動くようにしたい
    • CH32V003は2.7V-5.5Vで動くので乾電池2本でそのまま動きます
  • オーディオアンプNS8002+ オーディオジャック + 表面実装スピーカー + ボリューム
  • 部品は片面にのみ配置
    • PCBAを見越して安く済むように
  • 12個の演奏用スイッチ
  • 12個のLED
  • 初回書き込み用のソケット

色々考えているとどんどん要件が膨らんで大変でしたが、ぎっしり部品が並んだ、見た目にも「それっぽい」基板になりそうです。

CH32V003のUSB経由での書き込みの仕組みやオーディオ周りは、ここ最近の製作で得た知識を応用することで、設計を流用しています。こういうことの積み重ねでできることがどんどん増えていくのは面白いですね。

スイッチののスキャンとLEDの点灯

12個のスイッチのスキャンと、12個のLED表示の制御を7個のGPIOで行おうと以下のような回路を設計しました(これは、あまり良い方法でないことがわかりました)

基板設計

片面に部品を寄せたので、表面はかなりごちゃごちゃした見た目になっていますが、個人的には名刺基板として「それっぽく」なっているので、良いなと思っています。

一応、表面に「Hello! inajob」と名前の紹介っぽいものが入っているのと、裏面にXのURLが記載してあるところが「名刺」的要素です。

JLCPCBに発注

今回も発注はJLCPCBです。今回の基板は青色にしてみました。

名刺基板のサイズは10cm×10cm以内なので、非常に安く作ることが出来ます(5枚で$2 + 送料)

jlcpcb.jp (↑こちらは日本語版のログインページで、お得なクーポンも配布されています。)

実装

さて、今回も・・・トラブルがありました!!!(毎回これですね・・)

基板設計で必要な配線が出来ていない

さて、以下の画像をみれば、何が起きたか、わかる人にはわかるのですが・・

論理回路図で接続している配線が、基板上で配線できていません(白い斜めの線がそれを示しています)

今回の配線はFreeroutingというソフトを使い、自動配線したので通常このようなことは起こらないのですが、おそらく発注に向けて作業しているどこかで、操作ミスをして自動配線で作成された回路の一部を削除してしまったのでは、と考えています。

この手のミスは、以下のように見た目でもわかりますし、発注前にKiCADの「デザインルールチェッカー」を実行すればすぐに気付くことが出来るので、気づけなかったことが悔しいです。

この問題については、必要な配線を導線でジャンパすることで対応しました。(格好悪い・・)

スイッチスキャンとダイオード点灯回路に課題あり

上で紹介したこの回路。まぁ見る人が見ればすぐ気づく問題があります。

それは「スイッチを押しているときに対応するLEDが消灯してしまう」という問題です。

スイッチを押していないときは、ダイナミック点灯ですべてのLEDを個別に制御できますし、押されたスイッチもそれぞれ個別に認識できますが。

スイッチが押されているときに、そのスイッチと同じピンに接続されているLEDを点灯することが出来ません。

まぁ、LEDで何を表示したいかによりますが、スイッチから手を離せば意図した表示になるので、今回は一旦「こういう仕様」ということでこの問題は無視することにしました。

PD1のピンがそのままGPIOとして利用できない

上のスイッチとLEDの回路図でDIOとラベルの付いた配線がありますが、これはPD1と名の付いたGPIOです。

CH32V003は、初期設定ではこのピンをGPIOとして利用することが出来ません。

一応設定をすることでGPIOとして利用できるようにはなるようなのですが、そうすると書き込み機で書き込めなくなってしまうようで、ちょっと不便です。

また、今回利用したライブラリであるch32v003funで、このピンの役割を変更する方法がぱっとわからなかったということもあり、この問題のために基板の回路に修正が必要でした。

CH32V003J4M6 PD1 SWIO ピン共用問題 シリアル出力の実装とFlash eraseでの解決方法 - 宅配おもちゃ病院 %

今回はPD4が何も使わずに空いていたので、配線をカットしてPD1を使うのをやめてPD4を使うように変更することでこの問題を回避しました。

そのほか細かい気づき

  • 基板厚をもう少し薄くすればよかった
    • 基板厚はいつもと同じ1.6mmにしましたが、「名刺基板」というからにはもう少し薄くしても良かったかなと思いました
  • ICの利用していないピンを引き出しておけばよかった
    • 上で記載したPD4を含めいくつかのピンが未使用なのですが、このピンを引き出しておくと、この名刺基板を開発ボードとして活用することもできると感じました
  • スルーホールUSB-C端子は基板厚が1.6mmでもはんだ付けできる
    • 以前 UARTで書き込みできるCH32V003開発ボードを作った - inajob's blog で1mm厚ではんだ付けできることを確認しましたが、1.6mmでも問題なくはんだ付けできました。足が裏面に飛び出さないので、ちゃんと導通するか不安でしたが、表面張力ではんだがスルーホール穴に吸い込まれるため、問題なく導通しました。

ソフトウェア開発

おなじみの GitHub - cnlohr/ch32v003fun: Open source minimal stack for the ch32 line of WCH processors, including the ch32v003, a 10¢ 48 MHz RISC-V Microcontroller - as well as many other chips within the ch32v/x line. を使って開発しました。

以前以下の2つの記事で使ったプログラムを組み合わせることで、一応鍵盤を押すと音が鳴るという動作を実現できました。

inajob.hatenablog.jp

inajob.hatenablog.jp

動作デモ

ソフトウェアを作りこめば和音も鳴らせるはずですが、今のところ単音のみ実験しています。

まとめ

とりあえず当初の目的であった「名刺基板」を設計し、それっぽい動作が出来るところまでこぎつけることが出来ました。

CH32V003を使った基板も何枚か作って、知見がたまってきてスムーズに設計ができるようになってきていると感じました。

不具合もたくさんあったので、もう一度似たようなものを作ってみたいです。