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プリンターで何が作れる?というのを考えてみてはいかがでしょう? 世界でもまだ誰も挑戦していないようなネタがあるかもしれません。

JLCPCBにEasyEDAからサクッと注文して苦労した話

以下の記事で紹介したJLCPCBですが、今回は王道、基板を発注してみることにします。

inajob.hatenablog.jp

※今回もJLCPCBの提供です。(EasyEDAとJLCPCB周りの不具合の話で、提供していただくのも恐縮だったのですが、問題を含めて記事にして良いということで、今回包み隠さず書いています!)

EasyEDAとは?

EasyEDAはブラウザ上で動作する基板CADです。 作成した基板を公開することなどもでき、まぁ雑に言うとKiCAD+GitHubみたいなWebサービスです。

まるでネイティブアプリのような操作性で動作する基板CADです

このEasyEDAですが、ちょっとUIを見ていると、編集中の基板をそのままJLCPCBに発注できるボタンがあることに気付きました。

今回は試していませんが、基板で使用する部品リストをLCSCに発注したり、PCBAを依頼するのも簡単にできるようでした。

今回やりたかったこと

EasyEDAでは様々な基板のデータが公開されています。

今回は基板を設計せずに、人の公開したデータをEasyEDAからJLCPCBにぽちっと発注するというのを試してみたかったのです。

これができると、基板づくりに詳しくない人も簡単にマージンを取られず原価で基板を作ることが出来ます。

まぁ、今回の結果は、「そんなに甘くないぞ」というものだったのですが・・・

EasyEDAでよさそうなデータを探す

EasyEDAには様々な基板のデータが公開されていますが、いざ自分で「作ってみよう」という観点で探すと意外と良いものが見つかりません

  • 家に、ある程度部品がそろっている
    • 表面実装部品の場合はサイズもある程度合っている必要がある
    • 部品リストから型番が明らかでない部品もある
    • 部品が細かすぎて家で実装するのが難しいものがある
  • 仕様がある程度公開されている必要がある
    • さすがに回路図だけではわからない
    • ファームウェアなども公開してあると良い

とか、色々考えて、みつけたのがこちら!! (注意!このデータで発注するといろいろ問題があります!!)

oshwlab.com

Gram Pianoについて

https://www.sparkfun.com/products/retired/11835 より

これはSparkFunでかつて販売されていたキットのデータをEasyEDAにインポートしたもののようです。

モノとしてはArduinoで作られた静電容量タッチで動作する電子ピアノのような基板です。

部品はスルーホール品ばかりで扱いやすそうで、配線も単純で何かあった際の修復も難しくなさそうです。 一方静電容量タッチの部分はPCB基板ならではのアートワークとなっており、ユニバーサル基板では実現の難しい「発注向け」の基板です。

販売されていたものですが、オープンソース(Creative Commons BY-SA)で基板データが公開されているため、EasyEDAなどで再配布することも問題ないようです。

元となる基板データやファームウェアはこちらにありました

github.com

EasyEDAからJLCPCBへの発注

これは非常に簡単でした。

EasyEDAはブラウザで動作する基板CADということで、普通のアプリケーションと同じような操作感です。 WebアプリではあるもののUIはパソコン用のアプリケーションと同じようなつくりになっています。

メニューにOne Click Order PCB/SMT という項目があり、ここをクリックするとちょっとした確認画面を挟んだのちにJLCPCBの注文画面に遷移します。

自分が試したときは、ここでPCBAのオプションが有効になってしまっており、金額が異常に高くなっていましたが、手動でOFFにしました。

内部的にはEasyEDAがガーバーファイルを書き出し、それをJLCPCBに送っているようです。

ここでガーバーファイルを手元にダウンロードして確認することもできます。 (ここで念入りに確認しておけば・・・後述・・)

今回はOCS Expressで送ってもらうことにしました。その他の送料は以下のスクリーンショットを参考にしてみてください。

合わせて、今回利用することになる2MΩの抵抗をAliExpressに注文しました。 それ以外の部品は家の部品箱にありました。

届いた・・が・・

注文してから、10日くらいで基板が届きました。 (DHLを使うともう少し早い気がしますが、今回はAliExpressで注文した部品より早く届いても意味がないのでOCSで十分でした)

さて、基板が届きました。が・・・

よくよく基板を見てみると、どうも妙なところがあります・・

一部の部品のフットプリントが元データから消えているようなのです・・

改めてEasyEDAの画面と比べてみると、基板の上の方に位置する部品のいくつかが消えていることが確認できました。

これはJLCPCBが悪いのか・・? と思いこの段になってEasyEDAの生成するガーバーファイルを見てみると・・

なんと! EasyEDAの生成するガーバーファイルにもこの部品は存在しないことが判明しました。

手元で入稿したガーバーデータを見た

つまり、この問題はEasyEDAに何か問題があって起きており、JLCPCBは、正しく納品したデータで基板を製造していることがわかりました。

この Gram_PianoのデータはもともとEagleというソフトの形式で作られていたようでこれをEasyEDAにインポートする際に何か不具合が起きたのではないかと予想しています。

タチが悪いことに、EasyEDAの画面上はすべての部品が正常に見えており、ガーバーを出力すると特定の部品が出力できないという問題のようで、ワンクリックの簡単さゆえにわからず発注してしまいました。

次回からは、ワンクリックで注文せずにガーバーファイルを一度ダウンロードして目で確認するのが良いと感じました。

ファームウェアの用意

とりあえず間違った基板は何とか直すとして、マイコンファームウェアを焼きこみ用意する必要があります。

コアとなるマイコンDIPパッケージのATmega328Pです。 この基板には水晶発振子がないため、fuseを設定し内部発振8MHzにします。

fuseAVR® Fuse Calculator – The Engbedded Blogで計算しました。 内部発振8MHz、2.7VでBODで、ほかはデフォルト値としました。 (lfuse 0xe2, hfuse 0xd8, efuse 0xfd)

fuseの書き込みには手元にあったft232のbitbangモードを利用しました。

自分は昔から外付けAVRライタ無しでBootloaderを書き込むを参考にしていましたが、かなり情報が古いので、最新のやり方を使うのが良いと思います。

上のページではft232のbitbangモードをサポートした独自ビルドのavrdudeを利用していますが、現在配布されているavrdudeの公式(v7.0)ではこれがサポートされているので、公式のavrdudeを使うことが出来ます。

また上記ページでは独自のGUIツールを使って書き込みしていますが、avrdudeをコマンドラインから使うのであれば、このGUIツールは不要です。

ということで、参考になるのはft232とATmega328Pの接続の配線くらいです。

fuseArduinoを書き込む方法としては、ほかにもArduinoを書き込み機にする方法や、純正のAVRライターを使う方法などもあります。 (手軽なのはArduinoを書き込み機にする方法だと思います)

一応メモ的にコマンドラインを書いておくと・・(これを間違えるとATmega328Pが普通に動かなくなり、元に戻せなくなることもあるので注意してください)

# COMポート番号などは必要に応じて書き換えてください

# fuseの読み出し(はじめは低速じゃないと読めないかも・・)
> avrdude -PCOM8  -c diecimila -p m328p -b19200 -U lfuse:r:con:h -U hfuse:r:con:h -U efuse:r:con:h

# fuseの書き込み
> avrdude -PCOM8  -c diecimila -p m328p -b19200 -U lfuse:w:0xE2:m -U hfuse:w:0xD8:m  -U efuse:w:0xFD:m

ArduinoファームウェアArduinoCore-avr/ATmegaBOOT_168_atmega328_pro_8MHz.hex at master · arduino/ArduinoCore-avr · GitHubを利用しました。

これはArduino Pro Mini 328 3.3V 8MHz用のものです。

hexファイルの書き込み方はこんな感じ

> avrdude -PCOM8  -c diecimila -p m328p -b19200 -U flash:w:ATmegaBOOT_168_atmega328_pro_8MHz.hex:i

ここまで書き込みをすると、Arduinoとしてシリアル書き込みができるようになるので、ATmega328PのTX, RX, RESETを USBシリアル変換モジュールとつなげて、Arduino用のスケッチを書き込めるようになります。

ファームウェアソースコードはGram_PianoのGitHubリポジトリにinoファイルがあるので、これをそのまま利用します。 Arduino IDEからコンパイル+書き込みを実行します。

ライブラリとしてCapacitiveSensorをインストールする必要がありました。Arduino IDEのライブラリマネージャから最新の0.5.1をインストールすれば、コンパイルできました。

内部発振の場合シリアル通信が不安定で、書き込みがうまくいかないことがありますが、まぁそういうものなので、何度か挑戦しました。(運が悪いと100%失敗する個体もあると思います)

このあたりの話は、以下の記事に詳しく書きました。意外とこの作業は過去の知識の集大成という感じがあります。

inajob.hatenablog.jp

部費の実装と基板の修復

論理回路図や正しい回路図があるので、それを正として基板を修復します。

Gram_Pianoは部品数も少なく、ほとんどがATmega328PのICの足と部品がつながっているだけなので、フットプリントが消えてしまった部品は、ICの足と直接はんだ付けすることにしました。

頑張って配線しました

初めは基板に追加でドリルで穴をあけて、とりあえず部品を固定していたのですが、スルーホール穴ではないのではんだ付けすることが出来ず、あまり意味がないと感じたので途中でやめました。

ドリルで穴をあけ、基板をやすりがけして、はんだ付けしたが、これは大変です・・

Gram Pianoの肝である回路として構成されているタッチセンサー部分は消失していなったのが幸いし、比較的簡単に基板を修復できました。

電池の固定用の部品は手元にあったのですが、部品消失の影響で利用できないため、外付けの電池ボックスを使うことにしました。もともと単三電池2本の3V駆動だったのですが、部品を見る限り電池4本の6Vでも動作しそうだったので、手元にちょうどあった単4電池4本用の電池ボックスを使うことにしました。

スピーカーはフットプリントが消失していることに加えて、同じ部品が手元になかったので、適当なスピーカーをICに直接繋げました。

試運転

部品を一通り実装して、電源を入れたら・・・ 何度か試行錯誤があったものの・・(静電容量センサーの1つだけが部品消失の影響を受けており、微妙な調整が必要でした・・)

期待通り動きました!

これはArduinoから電源をもらって動作させている

基板のタッチで操作できるというのは不思議な感覚です。

ケースの作成

ここまで来たら後は好きな改造をしていきます。

電池ボックスやスピーカーを外付けのパーツにしたこと、フットプリントが消失した部品を無理やり実装しているため、部品が外れやすくなっていることから、ケースが欲しくなりました。

ということで、OpenSCADでササっとケースを作ることにしました。

こういう単純な形はOpenSCADで作るのが楽です

我が家には3Dプリンタがあるので、ちょちょいの・・・ちょい!

配線は雑な感じですが、、

出来ました。

演奏動画

まとめ

ということで、思ったよりもてこずりましたが、オープンソースハードウェアのGram PianoをJLCPCBに発注し、手元で組み立て、動作させることが出来ました。

まぁ、こういうトラブルもあるので、最悪の場合、自分でも作れそうな基板に挑戦するのが無難だと感じました。

仕様がオープンでも、電子パーツの互換性に関する知識や、ファームウェアの書き込みの知識、トラブルシューティングの知識などがないと、基板だけあってもモノを作ることが出来ないと、身をもって体感しました。

逆に考えると、人の作った基板を組み立てることで、強制的に知らなかった知識をインプットする必要性が出てくるので、ちょっと背伸びして勉強したい人などにお勧めです。