ESP32の静電容量タッチでフリック入力を実現してみた

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

JLCPCBとは

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

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

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

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

この記事の作例もJLCPCBに基板を発注して実現しました。

ESP32の静電容量タッチ機能とフリック入力への応用

ESP32には静電容量タッチ機能が搭載されており、ESP-WROOM-32には10個のピンを静電容量タッチセンサーとして利用できます。

よくある作例としては、10個のパッドを搭載し、静電容量タッチでテンキーなどを作っているものがあります。

ピンが10個しかないので、10個のパッドしか用意できない、というのは、ある意味その通りなのですが、もっとたくさんの入力を得るための工夫の余地はいろいろあります。

今回はこれらの静電容量タッチセンサーの2つのピンの組み合わせを1つのスイッチのように扱うことで5×5=25個のスイッチとして扱うような基板をデザインしてみました。

静電容量タッチ周りの設計

静電容量タッチの基板を作る際は、通常の回路の設計よりも気にすべきことが多いです。 ぱっとわかりやすいところとしては、タッチ検知に関する配線を変に迂回させたり、高周波の信号線と平行に並べない、などという制限があったりします。

github.com

まぁ、すべてのルールを守って設計するのは、なかなか大変なので、今回はそこまで厳密にルールに従わず、静電容量タッチまわりの配線をなるべく迂回させずに配置する、程度にしています。

基板全体の設計

静電容量タッチ以外の部分については、なるべくシンプルになるように余計な機能をつけず、既存のモジュールを並べるだけの構成にしました。

  • ESP32-DevKitC用ピンヘッダ
    • 定番の開発ボード
  • 128x64のI2C接続のOLEDモジュール用ピンヘッダ
  • 128x128のSPI接続のTFT液晶モジュール用ピンヘッダ
    • 上記のOLEDとどちらかを利用できる
  • SDカードモジュール用ピンヘッダ
  • スピーカー接続用ピンヘッダ
  • 外部静電容量タッチセンサー用ピンヘッダ

Amazonのリンクだと以下のような部品を想定しています。

静電容量タッチのフットプリントのデザイン

静電容量タッチのフットプリントのデザインは、以前の300円テトリスのスイッチ部分と同じような方式で用意しました。

KiCADの自動生成ツールの「Mutualcap Touch Button」というツールを使います。 このツールで作成するフットプリントはソルダーレジストがついた状態のものですが、今回はタッチ部分はソルダーレジストなしに編集しました。

静電容量タッチのほかのボードを見るとソルダーレジストありの物を多く見かけるので、それでもおそらく動作すると思うのですが、電極が露出していた方が、より感度が高くなるのでは?という雑な考えの元このように変更してみました。 (結局比べていないので、どちらが良かったのかはまだ不明です。)

基板の発注

今回もJLCPCBに発注しました。基板サイズが10cm×10cm以内だったので、非常に安くで作ることが出来ました。 5枚発注だと送料を抜くと$2でした。送料も$1程度なので、ワンコイン以内ですね。

組み立て

今回は、モジュールを組み合わせるだけなので、組み立ては簡単です。 念のためソケットを介して各モジュールを実装しました。

動作確認とファームウェア開発

まずはI2C OLEDの動作確認をします。といってもこれは素直にESP32のI2Cのポートに取り付けただけなのでu8g2ライブラリを使えば、かんたん・・

と思っていたのですが、手元のOLEDが不良品だったようで妙に動作確認に手間取りました、まぁこれは本質と関係ないので割愛します。

u8g2ライブラリは日本語フォントにも対応しており、今回の用途にはぴったりでした。

github.com

次に静電容量タッチの動作確認をしたところ、どうもT1のポートが反応していないことに気が付きました。 詳しく確認してみると、このT1はGPIO0に使われているピンで、BOOTという起動時の動作を設定するためのピンでもあることがわかりました。 そのためESP32 DevkitCのモジュールでは自動リセットの回路の一部としてこのピンが利用されていました。

おそらくこの影響でT1が意図しない状況になっており、うまくタッチセンサーとして機能しない状況になっているようでした。

T1についてはあきらめてしまおうかと思っていたのですが、色々試行錯誤していると、どうもパソコンとのシリアル接続がつながっている状態だと、問題なく静電容量タッチが動作することに気付きました。

これは自動リセットにかかわるDTR、RTSの信号が、うまい具合にシリアル通信の際に設定されることで、T1のポートが静電容量タッチセンサーとしてうまく機能する状態になるようでした。

(おそらくシリアル通信中はRTSが大半の期間LOWとなるため、IO0がハイインピーダンスになるのではないかと思います。)

https://dl.espressif.com/dl/schematics/esp32_devkitc_v4-sch.pdf

上記PDFより

まぁ、こんな具合でこの基板は何とか動作しましたが、シリアル通信をしていないときはT1ポートが使えないのは、かなり問題なので、ESP32DevKitCなど、自動リセット回路を搭載している回路構成ではT1ポートを静電容量タッチセンサーとして使うのはお勧めしません。

タッチセンサーの入力はアナログ値として取り出せます。この値は絶対値ではなく、パッドの位置や環境によって毎回異なるもののようなので、起動時の初期値を覚えておいて、その値からの変化を見ることで、タッチを検出するのが定番のようです。

ここまでで、25個のキーのどこに触れたかを検出できるようになり、その結果をOLEDに表示できるようになりました。

25キーのキーパッドが作りたいだけなら、ここで完成です。

フリック入力のロジックの実装

25個のキーパッドの入力が検出できるようになったので、次は本命のフリック入力のロジックを実装します。

様々な実現方法がありますが、今回は比較的単純な実装とします。 それでも、ちょっと複雑なので、まずはフリック入力の状態遷移について考えました。

まずは、スワイプではなくタップについて考えます。これは、あるキーの入力が検知され、その後一定期間経過後にどのキーの入力も検出されなくなる、と定義できそうです。

一定期間待つのは、タップ開始中や、タップしている最中に静電容量センサーの状態が不規則にON/OFFされる、いわゆるチャタリング的な現象が発生するからです。

次にスワイプについてです。これはタップのような現象が短い間隔で2度連続して発生することと定義できそうです。厳密には2つの入力の間にどのパッドにも指が触れない瞬間があるか、続けて2つのキーが検出されるかは場合によるので、初回タップのリリースが検出されない場合もありそうです。

などと考えると、結構ややこしいです。

状態遷移図はこのような問題を考えるときに良い道具となります。

まだまだ改善点はありますが、現時点でのソースコードを公開しておきます。

github.com

フリック入力のデモ

そんなこんなで、一応フリック入力のプログラムが完成しました。 スマートフォンのようにスムーズに、というわけにはいかないですが、一応フリック入力でひらがなを入力できました。

現時点では実用は難しそうですが、ソフトウェア的に改良できる点は多いので、ESP32で少ない部品点数で日本語を入力する手法として可能性があると感じました。

さらなる改良案

今回は、キーの検出を静電容量タッチセンサーの値を2値化して、処理しましたが、アナログ値のままで、最も大きな値のものを選択するなどの実装にすると、スワイプの途中に少し隣のキーをかすってしまうような場合もうまく処理ができるようになるのではと考えています。

また、今回は5x5のキーパッドの形状に配線しましたが、X軸,Y軸に5本の細長いパッドを配置し、各パッドの検出値の重みを考慮して、タッチされたX,Y座標を計算するような方式の方が、より応用例の多いタッチセンサーになるかなと感じました。この方式であれば、ノートパソコンに搭載されているトラックパッドのような操作にも対応できそうです。(というかトラックパッド自体がそのような仕組みなのだと思いますが・・)

www.dush.co.jp

上記サイトより

まとめ

以下のことがわかりました

  • ESP32を使うと10個の静電容量タッチが利用できる
    • うちT1については自動書き込み回路の影響で、利用は推奨できない
    • タッチセンサーは部品なしにスイッチを作ることが出来るため、コスト削減にもつながる
  • 10個の静電容量タッチは、組み合わせることで、より多くのタッチ入力センサーとして利用できる
  • 5x5のタッチパッドの構成において、フリック入力が実装可能であること
    • ただし、ソフトウェアをもう少し工夫しないと実用的とはいいがたい
  • 静電容量タッチのアナログ値を利用することで、より精度の高いタッチセンサーの製作が可能であること

簡単な基板でしたが、多くのことを学ぶことが出来ました。 静電容量タッチの仕組みがなんとなく理解できたので、今後のガジェット作成で活用していきたいです。

最後に、この基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板はこちらにまとめています。)

HandiPiの手のひらサイズのキーボードを作ってみた

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

JLCPCBとは

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

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

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

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

この記事の作例もJLCPCBに基板を発注して実現しました。

HandiPiとは?

今回作るのは手のひらサイズのキーボードです。

自分で設計してもよいのですが、今回はHandiPiという手のひらサイズのRaspberry Piコンソールのプロジェクトのキーボード部分のデータがオープンソースになっていたのでそれを使うことにしました。 (というかこのHandiPiのキーボードに一目ぼれして、作ってみよう、と思い立ったというのが正確なところです)

https://github.com/brickbots/HandiPi より

このキーボードは、大半がスルーホール部品で構成されており、基板と少しの追加部品を購入すれば我が家の部品箱にある部品で作れそうでした。

Miryokuとは

このキーボードはMiryokuというキーボード配列を採用しています。

github.com

これは36キーのキーボード配列で、様々なキーボードファームウェアでこの配列を利用できます。 今回はQMK版のmiryoku_qmk/users/manna-harbour_miryoku at miryoku · manna-harbour/miryoku_qmk · GitHubを使用します。

横10列のキーと、下の6つのキーが存在し、下の6つのキーでレイヤーを切り替えながら、横10列のキーを打鍵するというスタイルです。

https://github.com/manna-harbour/miryoku/tree/master/docs/reference より

下の6つのキーのどれか一つを親指で押さえながらほかのキーを打鍵することで、数字や記号を入力することが出来ます。 この配列の賢い点は、抑える親指と反対の手のキーのみに配列が割り当てられていことです。

具体的には、右下真ん中を押下したNumというレイヤーの配列の場合、数字キーは左手側にテンキーの配列で割り当てられています。

https://github.com/manna-harbour/miryoku/tree/master/docs/reference より

一方、左真ん中を押下したNavというレイヤーの場合は、カーソル移動のキーは右手側に割り当てられています。

https://github.com/manna-harbour/miryoku/tree/master/docs/reference より

細かいカスタマイズの設定も用意されています。

上のキーの割り当て表を見て謎のキー配列だと思う方もいるかもしれませんが、これはColemak Mod-DHという配列のようです。HandiPiではこの配列ではなくなじみのあるQWERTY配列のオプションを選択しています。また、それに合わせてカーソルキーをVIライクなH,J,K,Lに変更するオプションも有効にしています。

発注までの流れ

下記のプロジェクトのリポジトリに、KiCADの設計ファイルやガーバーデータが置いてあります。

github.com

KiCADの設計ファイルを使うと、オリジナルを少し改変したものを作ることもできますが、今回はそのままガーバーデータを使い、全く同じものを発注することにしました。

トッププレートと、ボトムプレートの2種類の基板が必要となります。

それぞれを5枚発注して$7×2 + 送料となりました。 (ほかの基板と一緒に発注したので$7になりましたが、JLCPCBでは1枚目の基板が安くなるはずです)

トッププレートは1mm厚、 本体基板は通常通りの1.6mm厚で注文しました。

必要な部品の購入

このキーボードをつくるにあたって必要な部品はそれほど多くありません。

メインマイコンのATMega328PはArduino UNOのメインマイコンとして有名なもので、我が家にも在庫がいくつかありました。 またその周辺部品として必要な16MHzの水晶発振子、や22pFのコンデンサ、バイパスコンデンサである0.1uFのコンデンサなども家にありました。

キーボードのスイッチとなるのも、一般的な6mm角のスイッチで、これは秋月電子で売っているものがありました。これは比較的軽い押し心地で、コスパもよいのでお勧めです。

ファントムキー防止のためのダイオードは表面実装のものが必要です。これもちょうど家にあったので、買う必要はありませんでした。

このキーボードはATMega328Pにソフトウェア的にUSB HIDを実装するV-USBというライブラリを使用します。そのため、USB周りのちょっと普段は使わない部品が必要です。

具体的には 75Ωの抵抗と、3.6Vのツェナーダイオードです。これは家になかったのでAliExpressで注文しました。 また、4方向スイッチもそれっぽいものをAliExpressで注文しました。(が、このスイッチは現状のファームウェアではうまく動きませんでした)

ATMega328Pへのファームウェアの書き込み

さて、基板と部品がそろったら、いよいよ組み立てたいところなのですが、、まずはメインマイコンであるATMega328Pにファームウェアを書き込む必要があります。

しかし、リポジトリを眺めても、どうもファームウェアの作り方についての詳細が記載されておらず、Issueで聞いてみることにしました。

github.com

この件は私のほかにも気になっていた方がいたようでした。 親切にも作者の方がビルドに必要なリポジトリの場所と、コマンドラインを教えてくれました。

私はDocker環境でこれを実行し、必要なhexファイルを作りました

# リポジトリをcloneする
$ git clone https://github.com/brickbots/qmk_firmware
$ cd qmk_firmware
$ git checkout handipi

# submoduleをpullする
$ git submodule init
$ git submodule update


# docker上のQMK環境に入る
$ docker run -it -v //`pwd`:/qmk_firmware -w //qmk_firmware qmkfm/qmk_cli

# 教えてもらったコマンドラインでビルドする
$ make clean handipi:manna-harbour_miryoku:flash MIRYOKU_ALPHAS=QWERTY MIRYOKU_NAV=VI

ここまでを実行すると handipi_manna-harbour_miryoku.hex が生成されます

qmkをDockerではなく直接マシンにインストールしていればこの流れで書き込みができるようなのですが、自分は手元の環境にいろいろ入れたくなかったのでDockerを使ったため、マイコンへの書き込みは別途avrdudeコマンドを使うことで行いました

$ avrdude -c diecimila -p m328p -b19200  -U flash:w:handipi_manna-harbour_miryoku.hex -v

さて、順番が前後しますが、ATMega328Pにファームウェアは焼いたものの、fuse bitの設定が出来ていません。 デフォルトのfuseの設定ではうまく動作しないので、こちらも設定します(qmkで焼くときはfuseの設定もうまくされるのだろうか?)

miryoku_qmk/docs/fuse.txt at miryoku · manna-harbour/miryoku_qmk · GitHub ここを見るとATMega168でのfuseの設定例が載っているので、これと同じような設定をATMega328Pでも設定すれば良さそうです。

大事そうな設定は、外部水晶発振を使用することと、クロックを1/8しない(CKDIV8 = 1)くらいだと思います。

AVR® Fuse Calculator – The Engbedded Blogを使って、fuseを計算すると、lfuse 0xEF, hfuse 0xD9, efuse 0xFEとなりました。

ということでこのfuseを書き込みます

$ avrdude -c diecimila -p m328p -b19200  -U lfuse:w:0xef:m -U hfuse:w:0xd9:m -U efuse:w:0xfe:m

組み立て

ひとまずキーボードとダイオード以外の部品をはんだ付けします。

22pFのコンデンサは表面実装のものしかなかったので、スルーホールのフットプリントの上に無理やり乗せました 1.5kΩの抵抗も手元になかったので1kΩの表面実装抵抗3つをうまく使って1.5kΩの抵抗を作りました。

USB部分はコネクタではなく、4本の配線が出ているだけだったので、動作テストのためには古くなったマウスのUSBケーブルを切り取ったものをつなげてPCに接続してみました。

うまくいくとPCでUSB機器として認識されます。

この状態でキー1つと対応するダイオードを取り付けると、キーボードとしての動作も確認できます。

ここまでくれば後はすべてのキーとダイオードを実装します。

ダイオードは表面実装で、数も多いので実装が大変ですが、黙々とはんだ付けします。

動作確認

キーを順番に押して行って、すべてのキーが想定通りに動作するか確認します。

自分の場合ははんだ付けがうまくいってなかったり、製作の過程で基板に傷をつけて、断線してしまっている箇所があり、ここで少し苦労しました。

Miryokuの組み合わせキーも試してみると、マウスの操作もこのキーボードでできることが確認できました。

まとめ

HandiPiプロジェクトのキーボード部分のデータを利用して、自分でも手のひらサイズのキーボードを自作できました。 HandiPiのようにRaspberryPiと組み合わせて手のひら端末を作るのも良し、ほかのマイコンボードと組み合わせるにも良しの、便利なモジュールだと感じました。

組み立ての過程でATMega328PをUSB HIDとして利用するためのV-USBや、QMKを使ったキーボードファームウェアのビルド、Miryokuという面白いキー配列の知識も学ぶことが出来ました。

自分で基板を設計するのも勉強になりますが、こういうほかの人の作例を真似して作ることでも、多くの学びを得ることが出来ることも実感しました。

最後に、この基板が数枚余っていますので、もしほしい人がいたら連絡ください。 (可能なら、ボツ基板交換的なノリで、何か自作の面白い基板と交換してもらえると嬉しいです。 私が提供できるボツ基板はこちらにまとめています。)

表面実装部品版RakuChordをつくってみた

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

JLCPCBとは

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

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

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

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

この記事の作例もJLCPCBに基板を発注して実現しました。

表面実装版RakuChordとは?

RakuChordというのはinajobが開発している電子楽器です。

inajob.github.io

ワンタッチで和音を演奏できるボタンがあり、だれでも比較的簡単に演奏ができるという電子楽器で、少しずつバージョンアップをさせながら、電子工作キットとしての販売をしています。

今まではキットという性質上、リード部品のみを使った構成だったのですが、今回は実験も兼ねて表面実装部品を利用するものを作ってみることにしました。

表面実装版RakuChordの仕様と設計

せっかく作るので、少しは新しい機能を搭載することにします。

  • 単4電池ホルダx2を基板に搭載
    • これによりケースに電池ホルダをマウントする必要がなくなり、小型化がやりやすくなります
  • 5V昇圧機能
    • 上記の電池ホルダは3Vしか作れないので、5V昇圧機能を搭載します
  • 8個のフルカラーLED搭載
    • 何かと便利そうなフルカラーLEDを搭載してみます

もともとのRakuChordはArduino Nanoをそのまま貼り付けていたのですが、今回はそれに近い構成をRakuChordのメイン基板に実装する必要があるので以下の機能も自分で設計する必要があります。

  • USB-Serial
  • ICSP書き込み端子
  • 何かあった時用のシリアル書き込み端子(Arduino Mini互換)

ということで回路図を・・・描きました。

PCBの設計

一部の家にリード部品がたくさん余っている部品はリード部品とし、大半の部品を表面実装部品で設計しました。 基板サイズも今までのRakuChordより一回り小さくなるようにしました。

今回は実装する部品が多いので、機能ごとに枠線を書くという工夫もしてみました。

いつものように定数を基板上に表示しておくのも実施しています。

JLCPCBに発注

そして、今回もJLCPCBに発注です。サイズは100mmx100mm以下なのでとてもお安く作ることが出来ます。

今回はなんとなく白色の基板にしてみました。

これに送料がかかりますが、$2って!安い!(元々$4なのですが、今は割引中のようです)

実装

1~2週間で基板が届いたので、実装します。

(写真は従来のRakuChordの基板との比較です)

一気に全部実装すると設計ミスがあった時にデバッグがしづらくなるので順番に実装します。

まずはメインプロセッサ周り。実装後ICSP端子からArduinoブートローダーを書き込みます。

ここで、気づいたのですが、ICSP端子にはいつもピンの役割を明記するようにしていたのですが、これを忘れていることに気付きました。 これはうっかり。まぁ見た目だけの問題なので、特に困ることはありませんでした。

右は300円テトリス基板のICSP端子

USB-Serial周り

MicroUSB端子のはんだ付けが難しい

その後USB-Serial周りを実装しますが、どうもここがうまく動かない。原因はいくつかあるのですが、まずMicroUSB端子のはんだ付けが難しく、雑につけるとコネクタを差し込んだ時にすぐ外れてしまうという問題がありました。 これはホットエアーガンではんだを多めに流すことで解消しました。

回路の間違い

USB-Serial周りの実装をしようと、改めて回路図を見ていて、間違いに気づきました。 なんとUSB信号線のD+と、USB-Serial変換ICの3V端子が意図せず接続してしまっています。

これはKiCADで操作するときに、配線がICの端子の上を横切ってしまい、意図せず接続してしまったことによるものです。 このままではうまくUSBの信号をICに届けることが出来ないので、対策が必要です。

恐る恐る配線図を見てみたところ、きれいにD+と3Vの配線だけが通っている箇所があったので、ここをアクリルカッターで「エイヤ」とパターンカットすることで、この間違いを修正することが出来ました。

このまま部品を実装すると、謎の挙動をして、頭を悩ませるところでした。

Arudinoの書き込みができない1

USB-Serial周りの部品を実装したのですが、どうもArduinoとしての書き込みが出来ません。

切り分けをするためにArduino Mini互換の書き込み端子に外からUSB-Serialモジュールをつなげて、書き込みをテスト・・しようとして、問題に気付きました。 この端子のTX,RXが逆になっています! UART接続のTX, RXはマイコン側と書き込み側でクロスに接続する必要があるのですが、これを間違えていました。 とりあえず、ブレッドボードを介してTX, RXピンを入れ替えて接続することで、書き込みできることを確認しました。

Arudinoの書き込みができない2

書き込みはできるということで、ブートローダーは正常であることが確認でき、問題は基板上のUSB-Serial変換ICのようでした。

今回利用したCH330N(同じピン配置のCH340Nも)というUSB-Serial変換ICは、外部に水晶発振子が不要で部品点数が少なくなって便利かなと思い採用したのですが、どうもArduinoが利用する57600baudの通信がうまくできません。

あまり詳しく詰めていませんが、9600baudなら通信できたので、Arduinoブートローダーをビルドしなおして、通信速度を変更したものを用意して、書き込むことで一応解決しました。 Arduino書き込みの速度を変更したので、Arduino IDEから書き込むためにも少し工夫が必要となってしまいました。 次回設計するときは素直に王道のCH340Gと水晶発振子を使うのが良いかなと思っています。

(CH330N/CH340N で似たような現象をご存じの方いたら教えてください・・)

5V昇圧部分・オーディオアンプ部分・スイッチ

その後は5V昇圧部分を実装します。ここは全く問題なし、乾電池2本=3Vから5Vが出力できました。 さらにオーディオアンプ部分、電解コンデンサのはんだ付けが甘く、一度音が出ないトラブルがありましたが、すぐに修正しました。

そしてたくさんのスイッチとダイオードをどを並べて・・RakuChordの完成です。

ピン配置は今までのRakuChordと同じにしたので、ファームウェアはそのままで動作しました。

OLED

フットプリントを間違えて、意図した場所とは違う位置に逆向きに実装する必要がある作りになってしまっています。 まぁほかの部品と干渉しない位置ですし、画面表示の反転はプログラムの修正で治すことが出来るので致命傷ではないですが・・

フルカラーLED

おまけでフルカラーLEDを並べて動作確認します。まずは1つ配置、ライブラリはAdafruitのものを利用しました。 説明通りに実装すれば問題なく制御できましたが、ここでデータシートをよく見ると、!!!。どうもこのフルカラーLEDは1つずつにバイパスコンデンサを1つ配置する必要があったようで、この基板は仕様に沿っていないことがわかりました・・

まぁ、一旦仕様のことは無視して、8個のLEDを実装してみたところ、一応動作するものの、稀に点灯しなかったり、意図しない色に光ったりすることがわかりました。これがパスコンの有無による問題なのかはまだ分かっていないですが、次回設計するときは、1つずつにバイパスコンデンサを実装してみます。

演奏テスト

スピーカーは既製品を使って、演奏テストをしてみました。

使っているスピーカーはこちら

まとめ

ということで、色々なトラブルはあったものの表面実装部品版のRakuChordが一応動作するところまで組み立てられました。

RakuChordとしては何度も設計している構成なのですが、新しく設計を変更した部分はどうしても、このように問題があり、一発ではうまくいかないものですね。

次はこれにケースをつけたりして、演奏しやすくできればと考えています。 今後の展開をお楽しみに!

(例によってこの基板、3枚ほど余っています、腕に覚えのある方でほしい方は http://twitter.com/ina_ani まで連絡ください。ボツ基板交換のお相手も募集しています。)

2022まとめ

今年もいろいろなことがありました。

毎年恒例ですがまとめていきます。

ピックアップニュース

Scrapboxによる共同編集プロジェクトの運営

育児+コロナ禍で、人と会うことが減り、かつ自由にできる時間が減ったため、オンラインでの懇親会などにも参加が難しくなっていたのですが、今年はScrapboxを活用することで、この問題を少し解決することが出来ました。

具体的には以下の2つのプロジェクトを作り、ここでいろいろな方と非同期にコミュニケーションしています。

 

まずは育児Scrapboxです。こちらは育児のTipsをまとめるというプロジェクトです。

scrapbox.io

もう一つはfab-wikiというデジタルファブリケーションのTipsをまとめるプロジェクトです。

今年の5月ごろからfabnewsという毎週気になったモノづくり系ニュースを紹介する取り組みも始めています。

scrapbox.io

また、こちらは私が始めたものではないのですが、井戸端というScrapboxで雑談を行うプロジェクトにも参加させてもらい、すっかり馴染んでいます。

これらの活動により、育児、コロナ禍にもかかわらず、十分にコミュニケーションを行うことが出来た1年でした。

育児+チームリーダー

仕事の面では年明けからチームのリーダーの役割を拝命しました。

育児をしながらということで、不安もあったのですが、うまく自分なりの進め方を見つけることが出来たと感じています。

このあたりの話は会社のアドベントカレンダーとして紹介しましたので、興味があればご覧ください。

qiita.com

水耕栽培

なぜか急に始めたレタスの水耕栽培。5月ごろから始めて、9月に収穫しました。

すごくうまくいったわけではないですが、全滅することなく収穫できたので、まぁよしとしましょう。

収穫量はちょっとでしたが、新しい体験で、面白かったです。

300円テトリス

10月、12月に記事にしたものですが、実はこの計画、今年の2月からコツコツと進めていたものなのです。

ダイソーで手に入る300円テトリスゲーム、前から改造してみたかったのですが、その夢がやっと叶いました。

おかげさまでたくさんのブックマークもいただくことが出来ました。

LCDを搭載したゲーム機を乗っ取る方法が大体わかったので、面白い液晶のガジェットがあったらまた挑戦してみたいです。

inajob.hatenablog.jp

inajob.hatenablog.jp

ステータス

  • 今の家に引っ越してから6年目
  • 会社に入ってから13年目
  • 結婚して6年ちょっと
  • 娘が生まれて2年目

今年学んだスキル

電子工作系が多いですが、React.jsとか流行りのオープンソースプロダクトを試したりと、時間が少ない中でもいろいろ挑戦出来たのが良かったです。

  • 子供のおもちゃの修理
  • 3Dプリンタによるクッキー型作成
  • Kritaによる画像編集
  • DLNAでTVチューナーに喝を入れる手法
  • ESP32で定点カメラ作成
  • 3Dプリンタによるキーキャップ、フレーム作成
  • BuildrootによるRaspberry Pi用イメージの作成
  • VOICEVOXで遊ぶ
  • 金属3Dプリント
  • OpenSCADのライブラリBOSL2
  • React.jsを少し学びなおす
  • ホットサンドメーカーによる調理
  • オープンソースハードウェアの回路図からオリジナルの基板生成(ESPBoy)
  • 風力発電とスーパーキャパシタの実験
  • Raspberry Piで動く写真ギャラリーソフト試食
  • Brainuxを試す
  • 3Dプリントの発注
  • Raspberry Pi Picoで和音楽器を作る
  • TWELITEの実験
  • CH552試食(Lチカ程度)
  • Raspberry PiでスキャナとOCRによる文書管理
  • AR眼鏡の原理自作

今年買ったもの

  • 電子レンジ
    • 壊れたので買い換えました
  • 調味料ボトル
    • ワンプッシュで大さじ1杯でるので、楽です
  • ホットサンドメーカー
    • 最近の朝ご飯はこれで作ってます
    • なんでも挟んで焼けばおいしくなる(暴論?)ので夕食づくりでもたまに使います

感想

育休をあけて2年目、リーダーを任されるところからのスタートでしたが、これは1年目で十分に役割を果たせた、無事会社に復帰できた証明ともいえるかなと思っています。

娘も2歳になり、昨年ほど手がかかることがなくなり、育児、仕事、趣味ともに力を注げた1年でした。

しかし娘が風邪をひいたり、濃厚接触者となり登園できなかったり、家族全員が風邪をひいたりと、予想外のイベントは相変わらず盛りだくさんで、計画的に物事を進めるのは難しいと感じています。

育児、コロナ禍での課題だったコミュニケーションの問題についてはScrapboxの活用という、育休以前よりも良いやり方を見つけることが出来たのが良かったです。

このブログにもスポンサーがついたりと、趣味の方面でも新しい動きがでてきており、育児をしながらでも、できることが結構あるなと感じています。

inajobがいろいろ紹介するサイトです – inajobのいろいろレビューも、引き続きほぼ平日毎日更新できています。

来年は娘の昼寝がなくなってきそうなので、もしかしたら今年よりもできることが少なくなるかも・・なんてびくびくしつつ、その分娘と遊ぶためのおもちゃ作りなどに力を入れようかな?なんて思ったりしています。

引き続き、環境の変化に柔軟に対応しつつ楽しく生きていきたいと思います!

月別生データ

1月

  • 帰省疲れ
  • 娘のおもちゃ修理
  • チームリーダを拝命
  • 水切り棚の治具の検討
  • 電子レンジ故障
  • いろいろレビューで日本の事例も扱い始める
  • 井戸端に参加

inajob.hatenablog.jp

inajob.github.io

2月

inajob.github.io

inajob.github.io

inajob.hatenablog.jp

3月

  • カニカルキーボード購入
  • 3Dプリンタによるキーキャップ・フレームの自作
  • 我が家の換気口が開いていないことに気付く
  • 自主隔離
  • 洗面所のドアストッパー自作
  • ESP32で日本語入力のプロジェクトを少し進める

 

inajob.github.io

inajob.hatenablog.jp

inajob.hatenablog.jp

inajob.hatenablog.jp

4月

 

qiita.com

inajob.hatenablog.jp

inajob.github.io

inajob.hatenablog.jp

qiita.com

5月

  • fab-wikiにてモノづくり系気になったニュースを毎週まとめるfabnewsという取り組みを始める
  • 水耕栽培開始
  • ホットサンドメーカーを買った
  • 調味料入れを買った
  • Lexicalを試した
  • いちご狩りに行った

inajob.hatenablog.jp

6月

 

inajob.hatenablog.jp

qiita.com

qiita.com

qiita.com

qiita.com

7月

 

inajob.hatenablog.jp

inajob.hatenablog.jp

8月

 

inajob.hatenablog.jp

inajob.hatenablog.jp

9月

  • 自宅待機
  • マンションの騒音苦情でハラハラする
  • 下痢
  • 上野動物園
  • CH552試作

qiita.com

qiita.com

10月

  • 芋ほり
  • Raspberry Pi Picoで和音
  • 電子の森ラジオに出演
  • スキャナで文書管理システム
  • ハロウィン用アニメーションランタン実験
  • AR眼鏡の原理実験

anchor.fm

inajob.hatenablog.jp

inajob.hatenablog.jp

inajob.github.io

11月

12月

  • 引き続きやや体調不良
  • お手製の段ボールクリスマスツリー

inajob.hatenablog.jp

qiita.com

qiita.com

参考

改造した300円テトリスの実験とゲーム開発

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

JLCPCBとは

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

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

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

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

この記事の作例もJLCPCBに基板を発注して実現しました。

ここまでの流れ

前回の記事で、ダイソーの300円テトリスの中身を乗っ取り、画面に好きな画像を出すことが出来ました。

inajob.hatenablog.jp

しかし、基板の設計に失敗し、肝心のマイコンを基板に搭載することが出来ず、代わりにArduino UNOを外付けして制御することになってしまっていました。

今回はこの話の続きです。

失敗基板が活用できたわけは?

前回の失敗基板ですが、「こんなこともあろうかと」という精神で用意した仕掛けが、うまく利用できたために、完全なボツ基板とはならず、液晶制御の実験を行うことが出来ました。

この仕掛けというのは、なるべくICのピンを引き出しておくことです。

今回はHT1626というLCD制御用の100ピンのICを使いましたが、この基板では、このICのピンをすべて引き出しています。 利用しないCOM、SEGの制御用のピンは表面実装用のパッドに、利用しているCOM、SEGや、制御用のピンはスルーホールのパッドに引き出しています。

ここで、制御用のピンを引き出していたおかげで、外付けのArduino UNOから簡単に液晶を制御できたという言うわけです。

そのほかにもATMega328Pの未使用ピンや、ICSP端子、Arduino Mini互換の書き込みポートなども引き出しています。

修正版の基板発注

失敗基板の原因はメインマイコンであるATMega328Pの型番間違え、だったので、単純に正しい型番を指定し、再度配線を引き直すだけで再発注できました。

今回もJLCPCBに基板の製作を依頼しました。

なんとなく今回は紫色です。

色を変えることで基板の取り違えを防ぐという目的もあります。

緑と値段は変わりませんが、製作にかかる時間が少し長くなるようです。

修正版基板の実装

配線以外は全く同じなので、実装は前と同じことをやるだけ、なのですが、HT1626は100個もピンがあるICなので、それなりに大変です。 出来た!と思ってもいくつかのピンがうまくはんだ付けできていないなど、苦労がありました。

書き込み用ポートの増設

基板が実装出来たら、いよいよ組み込みです。 今回はメインマイコンも基板上に実装できたので、300円テトリスのケースの中にすべて収めることが出来、一見元の300円テトリスのようだが、中身はArduino互換マイコン、というのが実現しました。

しかし、このままではArduinoとして書き込みするためには、ケースを開いて中の書き込みポートとパソコンをつなげる必要があります。

ということで、ケースを開かずに簡単にArduinoとして書き込みができるように、ケースに少し穴をあけて、書き込み用のピンを引き出すことにしました。

あまり深く考えていなかったのですが、Arduino Mini互換の書き込みポートがちょうどよい位置にあったので、ピンソケットを90度曲げたものを取り付けて、ケースを少し削ることで、ほとんど見た目に影響なく、書き込み口を取り付けることが出来ました。

この書き込み口にUSB-シリアル変換モジュールを差し込むことで、Arduino UNOのように簡単に書き込みできます。

日本語表示の実験

ここまで来たら、後はソフトウェアの世界です。

300円テトリス液晶の解像度は10×20で、小さいながら日本語のフォントも表示できそうです。

ということで、この界隈では有名な「美咲フォント」を使うことにします。

Arduinoで簡単に美咲フォントを扱うためのライブラリがあるので、これを使わせてもらうと・・・

ほら出来た。 縦書きで2文字とちょっと1画面に表示できるので、これをスクロールして表示しています。

スクロールさせて気づきましたが、この液晶は残像が結構長く残ります。そのためちょっと早めに画面を切り替えると、うまく文字が読めないという現象が起きました。

ということで、スピード感のあるゲームなどをこれで実行するのは厳しそうです。

ボタンとスピーカーの実験

配線の確認もかねて、ボタンを押すとスピーカーから音階が流れるようなプログラムを作ってみました。 9個ボタンがあるので、1オクターブ以上ならせます。慣れればこれで1曲演奏できそうです。

十字キーの部分はマトリクス配線になっていたので、キースキャンのロジックを実装する必要がありました。

回転ボタンは一見4つキーがあるように見えますが、全部1つのキーとして扱われます。

簡易ライブラリの実装

前回の記事で、テトリスのブロック表示部分のロジックはできていたのですが、右側のスコア表示の部分はまだ処理が作れていませんでした。

メモリマップのメモを頼りにこの部分を実装し、setScore(100)みたいな関数で簡単に設定できるようにします。

ちなみに、この液晶のスコア表示、右側の00の部分はこれで1つのセグメントとなっており、どうやっても末尾は00としか表示できません。 また、テトリス坊やの体と、SPEED、LEVELの表示も1つのセグメントとなっており、これらはまとめてON/OFFしかできません。

セグメントを節約しつつ表示要素を増やすという涙ぐましい努力なんですかね?

さらに、前の実験で作ったキースキャンのロジックなどもライブラリとして提供するようにしました。

ここまでできると、300円テトリスを使ったゲーム作りが簡単にできるようになります。

Flappy Bird風ゲームの実装

ということで、かねてからの目的であった、300円テトリスで、自作のゲームを動かす挑戦です。

といっても、画面解像度が10×20しかないので、この画面で遊べるゲーム、となるとかなり絞られます。

今回はよくあるFlappy Bird風のゲームを作ってみました。

ボタンを押している間だけ上昇し、離すと重力の影響で下に落ちてしまう磁気を操作し、迫りくる障害物をよけるゲームです。

加速度のある動きは、300円テトリスの既存のゲームには存在しないので、ちょっと面白いかな?と思いこれを選びました。

まぁ、普通に遊べますね。

ドット絵エディタ実装とハーフトーンの実験

ゲーム以外も何か作れないか?と考えて作ってみたのが、ドット絵エディタです。

カーソルキーでポインタを動かして、ドットを打ち込むことが出来ます。 さらに、ONとOFFの中間のハーフトーンの表現もできるようにしてみました。

ハーフトーンなんて言ってますが、単に高速にON/OFFしているだけです。 一応ハーフトーンの表示はできますが、あまり視認性は良くありませんでした。

かんたん作曲ツールの実装

もう一つ、ゲーム以外の作例として、かんたん作曲ツールも作ってみました。

ドット絵エディタと仕組みはほとんど同じなのですが、並べたドットに対応して音が鳴るというものです。 和音にはまだ対応しておらず、1音のみを8個並べることが出来るだけですが、プログラムを改良すれば、ちょっとした曲作りに使うものは作れそうです。

DeepSleepの実験

この300円テトリスの筐体には電源の線をON/OFFするスイッチがなく、ON/OFFはモーメンタリなボタン(要は押している間だけ導通するスイッチ)で実現されています。

これを再現するには、ATMega328のDeepSleep機能を使うのがよさそうだったので、これを試してみました。

スリープへの移行とボタン押下による復帰 の記事などを参考にしながら、Deep Sleepモードをに移行させてみました。もちろんHT1626の機能もOFFにします。このための命令がHT1626には用意されていたので、ATMega328がスリープする直前に、HT1626も機能をOFFにする命令を発行しています。

DeepSleepは電源断とは違い、メモリの内容が保持されるので、上の動画のように編集中のドット絵はそのまま保持されています。

雑に電力を測定すると、通常起動時は6mA程度、DeepSleep時は0.03mA程度の電流が流れていました。

ソフトウェアを作ってみて

メインマイコンのATMega328はFlash32K、RAMが2Kと、結構非力なマイコンですが、ゲーム開発において、メモリ消費の大半を占めるのがグラフィックスであることを考えると、このゲーム機は画面が10*20しかないので、結構余裕があるように感じます。

上記のソフトを作る時もメモリのことはほとんど気にせず、プログラミングして、特に問題は起きていません。

ただ、当然その反動として、表現力が非常に低いのは課題です。

英字すら2,3文字しか表示できないので、画面に文字で説明を入れることが出来ませんし、この解像度だと、キャラクタも1ドットくらいの表示となるため、ゲームキャラクタの個性なども出すことが出来ません。

逆に考えると、この環境で面白いゲームが作れれば、かなり根源的に面白いといえるのでは?という気もします。

言うまでもなくテトリスはそういったゲームの1つですが、さて、自分はそういうゲームを考え付くことが出来るだろうか?なんて思いながら開発をしていました。

まとめ

1度は基板の設計ミスで思うように動きませんでしたが、2度目の挑戦で、当初予定していたものが完成し、いくつかのソフトウェアを実装して、遊ぶことが出来ました。

300円テトリスの改造を通して、多くの知識を得ることができ、また自分の新たなおもちゃが増えました。

この知見を活かすと、任意の液晶付きのガジェットを、自分の好きな仕様で動かすことが出来ます。また一つ100円均一ショップに行くのが楽しみになってしまいました。

この300円テトリスの改造、どの程度読者の方が興味を持っているかわからないのですが、キットとして頒布する、と言ったら欲しい人いますか? この記事のコメントや、Twitter( http://twitter.com/ina_ani )などでフィードバックをいただけると、今後の展開を考えるうえでの参考になりますので、よろしくお願いします。

300円テトリスに好きな画像を出すまでの道のり

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

JLCPCBとは

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

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

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

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

この記事の作例もJLCPCBに基板を発注して実現しました。

300円テトリス

最近は100円均一ショップで電子ゲームが手に入るようになっているようです。

まぁさすがに100円とはいかず、300円のようですが・・

さて、この300円テトリスですが、好きなゲームをプログラミングして動かせるようにできないものでしょうか?

そんな素朴な思いからこのプロジェクトは始まりました。

分解してみる

何はともあれ分解してみます。

ねじを数本外すだけで簡単に分解できます。

メインとなる基板はこれで、液晶の後ろに固定されています。

メインの処理はこの黒い樹脂(いわゆるCOB)の中のようです。

ここがプログラム可能なマイコンなどであれば、HACKのしようもあったのかもしれませんが、COBでは手出しができません。

液晶と基板の接続は縦方向にのみ信号を通す導電ゴムで、ゼブラコネクタと呼ばれたりするものです。

基板の設計を始める

いつもだいたいこの辺であきらめるのですが、今回はスポンサーもついているので、ちょっと基板を設計してこの300円テトリスを乗っ取るという挑戦をすることにしました。

やりたいのは、メイン基板と互換性のあるプログラム可能な基板を作り、ごっそりそれを入れ替えることです。

さて、この基板を作るにあたっての作業は意外とたくさんあります。順番に説明していきます。

液晶の仕様のリバースエンジニアリング

液晶はゼブラコネクタで基板と接続されていますが、どのような信号がやり取りされているか不明です。

制御を乗っ取るにあたり、この液晶の仕様を知る必要があります。

この液晶はいわゆる「LCD」と呼ばれるもので、この知識があると解析はそこまで難しいものではありません。

LCDというのは2極間の電位差が生じていると光を通さなくなるいわゆる「液晶」を使った表示機です。

この液晶をセグメントに区切って、数字や、テトリスのブロックを表現しているのです。

素直にすべてのセグメントに直接配線すると配線数が膨大になってしまうので、マトリクス状に配線されることが多いです。

これらの配線はCommonとSegmentと呼ばれたりします。

ここまで聞くと、いわゆるドットマトリクスLEDと同じかな、と思うのですが、液晶は電位差を与えれば光を通さなくなるのですが、長く電位が偏った状態が続くと急速に劣化してしまいます。そのためパルスを使って制御する必要があります。

このLCDを制御するパルスの生成はマイコンにその機能があるものや、専用ICを使う方法、汎用マイコンのGPIOを使い制御する方法などがあります。

制御の手法はともかく、ここまでの知識でこの300円テトリス液晶の仕様を解析することにします。

ちょうど家に簡易オシロスコープがあるので、液晶とゼブラコネクタで接続しているピンに来ている信号を見てみることにします。

接続しているパッドは18個のものが2列、計36個です。

おそらくこの36個のパッドがそれぞれ、CommonだったりSegmentだったりするのだと思います。

ということで信号を見てみると・・・ピンによって信号は様々なのですが、明らかに傾向が違う2種類のピンがあることがわかりました。

10個並んだピンは4段階の電圧を行ったり来たりするようなパルスを出力していました、残りの26ピンは3段階の電圧を行ったり来たりするようなパルスか、もしくは全くパルスが出ていないものでした。

Commonと思われる信号

Segumentと思われる信号

LCDの制御の方式はいくつかあるようでデューティーやバイアスといったパラメータで表現されるようですが・・・

ここではそんな知識はなくとも2種類の信号が出るピンがあったということがわかればまぁOKです。

一般的にCommonのピンの方が数が少ないので、おそらくCommonが10ピンと、残りの26ピンがセグメントだと見当がつきました。

10*26=260でセグメントの総数としてもおおむね、この300円テトリスの画面のセグメント数と一致しそうな雰囲気です。

ちなみにこのテトリスの液晶、非常に多くの安価なテトリスゲームで使用されており、右下にかわいい「坊や」がいるので、「テトリス坊やの液晶」なんて呼ばれていたりも・・(どこかで聞いた気がするのですが、ソースが見当たらず・・)

(https://s.click.aliexpress.com/e/_DmWdhkR から転載)

制御方式の決定

さて、解析の結果この液晶はCommonが10本、Segmentが26本あることがわかりました。

これを制御する仕組みを考えます。マイコンで制御するとなると36個信号線が必要で、例えばArduino UNOなどでは足りません。 また仮に信号線が足りたとしても、液晶制御用のパルスを生成するロジックを自前で実装する必要があり、面倒そうです。

ということで、今回は専用ICを探すことにします。

しかし普通のLCD制御用のICはCommonが4本や8本のものがほとんどで、それ以上のものがなかなか見つかりませんでした。 あきらめず探していると1つだけありました。それが、Commonが16本利用できるHT1626というICです。

Holtek

正直16本も不要なのですが、これよりCommonが少ないもの、となると8本のものしかないので仕方がありません。

そしてこのIC、足が100本もあります・・ はんだ付けが大変そうです・・

まぁともあれこれで制御方式の目途が立ちました。

液晶制御とは関係ない部分

このボードは液晶制御ICのほかにメインのCPUも搭載しています。

今回利用するのはArduinoでおなじみのATmega328です。DIPの部品だと300円テトリスの筐体に入らなそうなので、TQFPパッケージのものを利用します。

300円液晶の液晶下にある4つのボタンの入力もこの基板でセンシングします。

といっても、ボタンの裏に導電ゴム付きのラバードームがついているので、これが接触したら導通するようにくし形のパターンを基板上に露出させればOKです。

ここまでの部品は最低2.8Vで動くので、今回はレギュレータを使わず300円テトリス筐体の電池ボックスに入る乾電池2本の3Vを直接繋げて制御することにしました。部品点数も少なくなるので作るのが簡単になります。

シンボル・フットプリントの作成

液晶はゼブラコネクタを介して基板と接続されています。

作成する基板にもこのゼブラコネクタに信号を伝えるためのパッドを用意する必要があります。

KiCADのフットプリントウィザード(今回初めて存在を知りました)の、FPCコネクタを使って、パッドの数やサイズを合わせて、不要な要素を削除しました。

で、できたものが↓です。

明るい紫の矩形はソルダーマスク除外の指定です。これをしておかないとソルダーマスクされてしまい、ゼブラコネクタと導通させることが出来ません。

液晶制御用のHT1626もKiCADのライブラリに存在していないため、モジュールとフットプリントを作る必要があります。

手はんだしやすいようにパッドは長めにしました。

液晶下のボタンについても、適切な大きさのくし形のフットプリントの作成が必要です。

こちらもフットプリントウィザードの、静電容量タッチセンサーのパターンを少し改造して作りました。

こちらもソルダーマスク除外の指定を忘れないようにします。

論理回路図の作成

ここまでのところで、利用する部品が決まりました。

これらの論理的は配線をKiCADでデザインします。

LCD制御のためのHT1626は配線は多いですが、ほとんどが液晶のゼブラコネクタに直結なので回路は単純です。

基板に間違いがあったときにも、少しでも検証ができるように、液晶のゼブラコネクタ経由での信号線や、HT1626のすべてのピンを拡張端子として引き出しました。 これにより最悪の場合ブレイクアウトボードとして利用できます。

サイズ調整と実体配線図の作成

この乗っ取り基板は、サイズがとても重要です。

ゼブラコネクタ、固定穴、基板サイズが適切でないと、300円テトリスの筐体に収めることが出来ません。

ということで、本体基板のサイズをあれこれ測って、それをLibreCADにメモしました。

このメモしたデータをKiCADにインポートし、これをもとに部品の位置合わせや基板外形をデザインしました。

部品の配置が終わったら、配線を行いますが、この部分はFreerouterで自動配線しました。

最終サイズ確認

設計が終わった後、基板データをPDFで出力し、コンビニで印刷したものを、はさみで切り取り、実際の300円テトリスの筐体にはめてみて、大きさに問題がないかを念入りに確認しました。

盛大に穴の位置がずれていることに気付きました。危ない危ない・・

部品購入

マイコンなどは家にすでにあったのですが、今回初めて利用するLCD制御用のICであるHT1626については、家になかったので、基板発注の前にAliExpressで購入しました。

届いてみてびっくり!パッケージが期待したものとは違います。

用意していたフットプリントは25×25の100ピンのICだったのですが、実際に届いたものは 30×20ピンのICでした。

調べてみるとHT1626は同じ型番で2種類のデータシートが存在しており、それぞれピンの配置が異なっていることがわかりました。

事情は分かりませんが、これは罠でした・・

まぁ買ってしまったので今回は30×20ピンを使うこととして、フットプリントを作り直しました。

そしてこれ、フットプリントウィザードだとこのような比率が1:1でないパッケージは作れないようで、泣く泣く手で配置しました。 (プログラムでやったほうが良かったなぁ・・)

基板発注

基板もJLCPCBに発注しました。

サイズが10cm角以内だったので非常に安く済みました。

5枚で送料も入れて・・$3!! 安いですねー

動作確認

基板が届いたら早速動作確認です。まずはマイコンをはんだ付けして、ICSP端子からファームウェアを書き込む・・・・

全く動きません

途方に暮れて、配線を確認すると・・・

やっちまいました・・・

論理回路図ではDIP部品用のシンボルを使っていたにもかかわらず、フットプリントをTQFPにしてしまっていたのです・・・

大半の部品がそうであるようにATmega328もDIP部品とTQFP部品はピンの番号に対応する役割が違います(そもそもピン数が違います)

ということで、この基板にATmega328を搭載して動かすことは難しいことがわかりました・・・

悲しいですが気を取り直して、次はHT1626の動作確認です。

基板上のマイコンは前述のように利用できないので、基板の外のArduino UNOから外出ししておいたHT1626の制御用のピンを使って制御してみます。

まずは液晶を取り付けずに、メモリに値を書き込み、それが読み取れるかを確認します。

(はんだ付け不良があり、何度か失敗したものの・・・)確認できました。

その後300円テトリスの液晶を基板に押し付けて確認すると、メモリに対応するセグメントが黒く表示されることが確認でき、この基板がある程度は使い物になることが確認できました。よかった。

メモリマップの作成

HT1626は内部にメモリを持っており、そのメモリに読み書きすると、メモリ番地に対応したセグメントが黒くなる、という動作をします。

今回雑にCommonとSegmentの種別のみを頼りにテキトーに配線したため、300円テトリスの画面とメモリの番地が結構おかしなことになっています。

ということで、電子ノートを取り出して、メモリ番地と液晶のセグメントの対応をひたすら確認します。

順にメモリの中身に1を書き込んでいき、メモリ番地をシリアルコンソールに出すプログラムを用意し、液晶を見つつ、セグメントが黒くなった番地をメモすることで、メモリマップを完成させました。

デモプログラムの作成

メモリマップが出来ればあとは、プログラムするだけです。

無事、配列に格納したビットマップを300円テトリスの液晶に表示することが出来ました。

次にやること

取り敢えずこの基板はマイコン部分に問題があり、今回は外部のArduino UNOから制御したので、これを修正したいです。 そうなると、基板単体で動作するようになり、300円テトリスの筐体内にも収まります。

ボタンのセンシングなども行うようにして、オリジナルのゲームを動くようにしてみたいです。

ここまでのところで難所は乗り切ったので、おそらくそこまで難しくないはずです。(フラグ?)

まとめ

さいころ、親に買ってもらってうれしかった手のひらサイズのテトリスゲームですが、まさかこんな形で再会するとは思っていませんでした。

あの頃はゲーム機に内蔵されていたテトリスゲームで遊んでいただけだったのに、今やその中身をまるっと入れ替える基板を設計し、独自のプログラムを実行すべく改造していると考えると、結構自分も成長したなぁと感じます。

LCDの制御に用いたICはピンの間隔が0.65mmと結構細かい上に、100ピンもあったのですが、特に苦労することなくはんだ付けすることが出来たので、今後は臆せずこのサイズのICを使っていく自信がつきました。

このプロジェクトはまだ途中なので、また進捗があったら記事を書きます。

参考記事

無数にWebの記事を参考にしましたが、特に印象に残っている記事をリンクしておきます。

hackaday.com

チープカシオの液晶を、今回やったのと同じように基板を総とっかえして乗っ取る話。 Youtube動画の中で、CommonとSegmentの見分け方なども詳しく解説されています(英語)

awawa.hariko.com

今回はやりませんでしたが、汎用CPUでLCDを駆動する方法。 最悪これでできそう、という目途が立ったため、実験に踏み切ることが出来ました。

github.com

HT1621という、今回使ったICのモデル違い(COMが少ない版)のArduino用制御コードです。 制御コードを0から作るのは大変だったので、これを参考にしました。

基本的なプロトコルはこれとよく似ていますが、アドレス長や、dutyの設定が無かったりと細かい違いがありました。

金属3Dプリントサービスで「焼き印」を作ってみた

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

JLCPCBとは

jlcpcb.com

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

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

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

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

そんなJLCPCBですが、最近「3Dプリントサービス」を始めたようです。

以前このサービスを使って光造形式の3Dプリントを依頼したことがあります(下の記事です)

inajob.hatenablog.jp

今回は、このサービスの「金属3Dプリント」に挑戦してみました。

金属3Dプリンターを活用したい

家ではなかなかできない金属3Dプリンターですが、こういうサービスがあるなら使ってみたくなるのがMakerというものです。

ということで何かを金属3Dプリントしたいのですが、、いざ考えてみると意外と良いネタが思いつきません。

メカを作っている人は剛性が必要な部品などを作るのが普通の使い方でしょうが、私は電子工作のエンクロージャに使うことがほとんどで、体積が大きくなりがちで、ちょっとお値段が高くなってしまいますし、また金属を使う必要性もあまり感じられません。

ということで、普段作っているものからは離れて、「なるべく小さめの金属を使った何か」を考えた結果思いついたのが・・・

「焼き印」です!!

焼き印とは?

自分もあまり詳しくないのですが、蒸しパンとか、パンケーキなどの表面にロゴマークやキャラクターを焼き付けるために使う金属片です。

金属片に模様が彫り込まれており、加熱した焼き印を対象物に押し付けることで焦げ目をつけるという単純な仕組みです。

おそらくこれは、金属を切削して作るものだと思うのですが、金属3Dプリントでも同じものが作れるのでは?と思いました。

しかも、当然好きな模様の焼き印を作ることが出来、3Dプリントサービスを使う意義もあります。

デザイン

今回もOpenSCADを使って設計しました。

筒状の金属片の両端に模様を彫り込み、2種類の模様を使い分けることのできるよう設計しました。

模様は何にしようか迷ったのですが、いつもの「うんこ」マークにすることにしました。 反対側は保険として、「星」マークも用意しました。

この金属片にどうにかして柄をつける必要があるので、固定用の穴を側面に開けました。 (この時はまだどうやって固定するか深く考えていませんでした、まぁ穴開けておけば何とかなるだろうと・・)

大まかなサイズ感は直径3cm、高さ2.4cmの円柱です。

ちなみに、この時に使った「うんこ」は以下のクッキー型を作る時に作ったものです。デジタルファブリケーションはこういうところで素材の流用ができて便利ですね。

inajob.hatenablog.jp

発注

発注は以前の光造形の3Dプリントと同じ要領だったので簡単です。

ただ、お値段は桁が違います。

この造形だと$45.06でした、側面の穴を大きくすると値段が安くなったので、この金額は重量というか、金属の体積によるもののようです。

Shipping MethodはOCS Expressを選択すると、$6.82で、総額$51.88で発注できました。

ちょっとお値段がはりましたが、焼き印のサイズを小さくしたり、円柱を低くすることで、おそらく半額以下にできそうな気がします。

今回は小さすぎて模様がつぶれてしまうことや、金属片が小さすぎて柄をつけることが難しくならないように、十分に大きく設計したのでこのサイズになりました。

まぁでもオリジナルの焼き印を作る値段としてはそこまで高くないのではないでしょうか?

届いた!

待つこと1週間程度、届きました!

ずっしりと重たい、うんこ柄の金属片です。 穴も両面の刻印も特に問題なく造形できています。

柄をつける

取り敢えず練習で焼きを入れるだけなので、雑に手元にあった木片に針金で固定しました。

何度も利用する場合にはしっかり固定しないと危ないとは思うのですが、今回は万全の注意を払いつつ利用するということで、仮にこのような形にしました。

焼き付けてみる

焼き印に食用油を塗り、ガスコンロの火で焼き印を加熱し、適当なタイミングでパンに押し付けてみました。

何度か試してみたところ・・、全然焼き色がつかない・・ と嘆いていたのですが、どうも焼き付ける時間が短すぎたことが原因だったようです。

焼き印を押しつけて、1分ほど放置すると・・ いい感じにできました! (普通の焼き印を調べるともっと短い時間でよさそうなことが書いてありますが、私の場合は加熱が足りなかったのかもしれません・・)

調子に乗って盛り付けも頑張って、カフェのメニュー風にしてみました。いいですね!

※食品に利用していますが、安全性についてはよくわかっていませんので真似する際は自己責任でお願いします。

まとめ

金属3Dプリントサービスを使って「焼き印」を作ってみました。 直径3cmのようなものを大きめに作りましたが$50程度で作ることが出来ました。

もう少しうまくやれば半額くらいで作れそうです。

柄の取り付けにはさらなる研究が必要そうですが、木材と針金でも何とかなりました。

金属3Dプリントサービスは、業務用としては結構使われ始めていますが、自分のような個人が気軽に使えるようになったのはごく最近のことです。

皆さんもぜひ金属3Dプリンターで何が作れる?というのを考えてみてはいかがでしょう? 世界でもまだ誰も挑戦していないようなネタがあるかもしれません。