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です。

https://www.holtek.com/productdetail/-/vg/ht1626

正直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に発注し、手元で組み立て、動作させることが出来ました。

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

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

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

ESPboyというオープンソースの携帯ゲーム機を日本用に再設計してみた

ESPboyとは

ESPboy

ESPboyはESP8266をコアとする携帯ゲーム機です。

オープンソースハードウェアとして開発が進められており、回路図を参照することで誰でも同じ仕様のESPboyを作ることが出来ます。

また完成済みの製品も販売されています。 (後述しますが、これらの製品は日本で利用するには問題があります

こちらは初代バージョンで$75です。 www.tindie.com

こちらは改良版で$95です。筐体が違うだけで中の回路は論理的に等価です。 www.tindie.com

ESPboyで遊べるゲームは、いくつかに分類することが出来ます

まずはインディーズ携帯ゲーム機であるArduboyPokittoGamebuino METAなどのゲームです。 あまり耳なじみがないかもしれませんが、これらは最近この界隈では有名な(?)携帯ゲーム機です。

これらのゲームはバイナリ互換というわけではなく、ESPboy用に移植された各ゲーム機のSDKがあるので、それを使って再コンパイルしたものが遊べます。ゲームによってはハードウェア固有の機能を活用しているものもあり、そういったゲームはそのまま移植することが出来ない点に注意が必要です。

もう一つは、レトロゲーム機、パソコン用のゲームです

ZX spectrum 48k, GameBoy, Chip8/Schipのエミュレータが動作し、それらのプラットフォームで動くゲームを遊ぶことが出来ます。

最後が、ESPboy専用に作られたゲームです。

まだ数は少ないですがESPboyの性能をフルに活用したゲームを遊ぶことが出来ます。 もちろんゲーム開発用のSDKオープンソースなので、ゲームを自作することもできます。

後述するWeb App Storeの画面からもいくつかのゲームのスクリーンショットを見ることが出来ます。

なぜ自作したのか?

まぁ、そこに回路図があったからだ!というのも大きいのですが、一番の理由は「販売されているESPboyを日本で使うことが出来ない」からです。

どういうことかというと、販売されているESPboyに搭載されているESP8266のモジュールに技適がついていないのです。

もちろん特例申請を使ったりすることで、一時的に日本で使うことはできそうですが、そういったものを人に勧めることも難しく、いまいち購入する気にはなりませんでした。

しかしESP8266を使ったモジュールの中には技適のついた、日本でも利用できる「ESP-WROOM-02」というモジュールが存在します。ESP8266というコアのICは同じなので、うまく設計すれば、技適ありのESPboyが作れるのでは? と思いついたのが自作を始めたきっかけです。

回路図を作る

まぁこういう時はブレッドボードから、作るのが鉄則なのですが、最近は基板づくりも安くできるようになっているので、いきなり基板を発注してみることにしました。

まずは論理回路図を設計します。

と言ってもESPboyはオープンソースハードウェアなので、本家の設計を参考にすることが出来ます。

大まかな構成図は公式ページの下の方に掲載されています。

espboy.comから転載

さらに詳しい回路図はこちらのページにあります。

ESPboy_v4.3 - EasyEDA open source hardware lab

この回路図にはLOLIN-ESP8266というモジュールが存在しており、今回はこのモジュールが使えないのでこの中身も知りたいところです。

その回路図はここで見つけました。 LOLIN D1 mini — WEMOS documentation

このモジュールはESP8266を搭載し、USB端子からシリアル接続でArduinoとして書き込みができるというものです。

LOLIN-ESP8266と同等の機能を持ったESP-WROOM-02を搭載したモジュールとしては ESPr® Developer(ESP-WROOM-02開発ボード) - スイッチサイエンス がよさそうですが、今回は回路図もあるので、このモジュールの部分も自作基板に含めることにしました。

こうして出来上がったのがこの回路図です。

(元のESPboyのライセンスに従って CERN Open Hardware License とします) (このライセンスは本当は、さらに細かい区分があるようなので、ESPboyではどれに該当するのか聞いています・・)

USBシリアル変換はCH340G、自動リセット回路などに2回路入りトランジスタUMH3Nを利用しています。

LiPoバッテリーの充電に関しては、自分で実装せずに出来合いのモジュールを使うことにします。

部品の購入

大半の部品は秋月電子で購入しました。コアのモジュールであるESP8266、DACであるMCP4725や、I/OエキスパンダのMCP23017/SP、フルカラーLEDのWS2812Bなども秋月電子で扱っていました。

USB Micro端子、AP1117-3.3、UMH3N、TFT液晶、ボリューム、タクトスイッチ、スピーカー、LiPoバッテリー充電モジュールなどは、日本でも購入できるかもしれませんが、AliExpressで購入しました。

液晶モジュールはESPboyと同じものを利用しないと、初期化コードなどが異なりバイナリ互換がなくなってしまうので注意が必要です。

配線図の作成

ちょちょいのちょいで・・・とはいかず、色々と試行錯誤しました。 ESP-WROOM-02のアンテナ部分には配線を通していけないようなので、Keep Outゾーンとしました。

基板の発注

今回の基板はALLPCBに発注しました。というか発注したのは去年の12月ごろです。 そしてあれから半年程度、この基板は積まれていたのです・・・ いや、子育てとかいろいろ忙しくてですね・・(言い訳)

送料込みでこんなお値段。

部品の実装

この基板は表面実装部品ばかりで構成したので、実装も少し苦労しました。

ピッチの狭いICであるUMH3NやMCP3725も6ピンのパッケージで真ん中、左右の順に足を固定すれば手はんだでも実装できました。

一番気を遣ったのはMicro USB端子です、これはホットエアーガンを使って実装しました。(まぁHACHIBARで何度も実装したのでコツはなんとなくつかんでいました)

書き込みテスト

ESPboyはソフトウェアのデプロイ周りも充実しています。

まずはWebブラウザから書き込みできる Web App Storeというものがあります。ブラウザからゲームを選んで、書き込みボタンを押すだけでESPboyにゲームをインストールできます。

もう一つはWiFi経由でアプリをダウンロードできるApp Storeです。これはゲーム機同時にBボタンを押しっぱなしにすることで起動します。初期設定はWiFiSSIDやパスワードの入力が必要ですが、一度設定すると記憶されます。 一度設定するとインターネット上のAppStoreサーバからゲームの一覧を取得でき、そこからゲームをインストールすることが出来ます。まるでiPhoneAndroidのようです!(大げさ)

ケースの作成

ここまでで、一応動くゲーム機にはなりましたが、基板がむき出しで遊びづらいです。

ということで3Dプリンタでケースを作ります。

今回はFreeCADで設計しました。

(ディスプレイ固定具用のデータがあったのですが、保存せずに終了して失われてしまいました・・無念)

我が家には3Dプリンタがあるので、精度はともかく、ササっとプロトタイピングが出来て良いです。

ということでひとまず、そこそこ遊べるESPboy端末が出来ました。

まとめ

ということで、日本でも利用できるESPboyを作ることが出来ました。

基板製造、3Dプリント、AliExpressでの部品発注、ESP8266でのプログラミングなど、ここまでで得た知識を組み合わせることで、一つの製品を設計、開発できました。

オープンソースハードウェアを参考に、少し自分用に手を加えて自分のオリジナルのガジェットを作るというのは、非常に面白いので、腕の覚えのある方はぜひ挑戦してみてください。

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

かんたんUSBホストを試してみた

かんたんUSBホストとは

文字通り簡単にUSBホスト機能を実現するためのモジュールです。

かんたんUSBホスト、サポートページから抜粋

ArduinoなどのマイコンボードでUSBホスト(USB機器に対する「親」)を実現するためには、ちょっと工夫が必要です。

よく目にするのはUSB Host Shieldを使う作例です。

USB Host Shieldは汎用的なUSBホストを実現するためのモジュールで、様々な用途で利用できる反面、使い方が簡単とは言えません。

一方で今回紹介する「かんたんUSBホスト」はUSB接続のキーボードの制御に特化することで非常に簡単に利用できるのが特徴です。

(かんたんUSBホストの作者さんとは、知り合いで、実は以前に「かんたんUSBホスト」を頂いたのです。と言っても1年以上前のことで、折角頂いたのに「積み基板」となってしまっておりました・・、積んではいかんですね、ほかにも結構積んでいるので順番に試食していこうと思います。)

使い方

かんたんUSBホストは様々なオプションがあり、細かく制御することもできますが、まずはじめとしては、一番簡単な方法を見てみましょう。

GNDとVCCとVBUS、TX→RXの4つの配線をするだけです。

かんたんUSBホスト説明書より抜粋

これでArduinoのシリアル入力として簡単USBホストを利用することができます。

Arduinoは書き込みにシリアル入力を利用するので、Arduinoを書き込む際はTX→RXの配線を一時的に抜く必要があることに注意してください。 (SoftwareSerialなどでArduinoのハードウェアシリアルとは違うピンを利用してかんたんUSBホストと接続することで、この問題は解消できます。)

あとは簡単USBホストにキーボードを接続し9600bpsでシリアルポートを読み取れば、押したキーのキーコードが取得できます。

簡易ワープロを作ってみる

さて、実際の動作を試しがてら、ちょっとした作品を作ってみましょう。

作ったのはキーボードから入力した文字をディスプレイに表示する、というまぁ、これだけなんですが、いうなれば「簡易ワープロ」です。

ディスプレイとして利用するのは、たまたま家にあった、ちょっと大きめのOLEDです。

大きさの割には解像度は128x64とかわいらしく、ノスタルジックな見た目となっています。

このOLEDの制御は定番のu8g2ライブラリを利用します。

ソースコードはこんな感じです。

ほとんどがOLEDの制御コードで、かんたんUSBホストの制御は初期化と、キーの読み取りの部分だけです。

「簡易」という事で本当に最低限の動きしかしませんが、それでもここまで簡単にワープロもどきが作れるのは楽しいです。

かんたん 以外に出来る事

ここまで紹介してきたように、かんたんUSBホストは、かんたんにUSB接続のキーボード入力を得ることができますが、ほかにも様々な機能があります。

説明書から少しかいつまんで紹介すると・・

  • キー配列をJIS、USで切り替える
  • CapsLockなどを設定する
  • キーリピートの間隔を調節する
  • 特定キーの組み合わせに反応する
  • シリアル接続のボーレートの変更

他にも、制御とは関係ないところで以下のような機能も搭載しています

  • USB Hub経由でのキーボードの接続
  • 動作中のキーボードの抜き差しへの対応
  • キーリピート

USB Host Shieldとの違い

USB Host Shieldはキーボードに特化していないため、キーボード固有の処理はArduino側で実装する必要があります。CapsLockやNumLock, キーコードとASCIIコードとの変換、キーリピートの処理、などなど、実装コストも大きくなるし、Arduinoの限られたメモリを消費します。

また巷に出回っているMini USB Host Shieldはちょっと癖のある基板で、5VのArdunoで利用するためには謎の改造をする必要があったりと、使い勝手も悪いです。

そもそもUSB Host ShieldのコアとなっているMAX3421Eは、かんたんUSBホストのコアとなっているCH559と比べ高額なので、自然とそれを採用したボードの価格も高くなってしまいます。

などなど、これらの理由により、USB接続のキーボードをArduinoから利用する場合はかんたんUSBホストに軍配が上がりそうです。

一方でゲームコントローラや、Bluetoothドングル、USB-MIDIなど、キーボード以外のUSB機器を利用する場面ではUSB Host Shieldが適していることもあると思います。(CH559でもこれらに対応したファームウェアを作れば安価に対応できそうですが、作例もなく、いばらの道のように思います)

中身について

このかんたんUSBホストですが、コアとなるマイコンがCH559という、中国製のICです。

USB Host、Deviceの機能を持つ汎用マイコンにもかかわらず、比較的安価ですが、昨今の半導体不足の影響をあまり受けず、現在も簡単に入手できます。

最近半導体部不足が深刻になっており、様々な汎用ICの在庫がなくなる中、でこれらの中国製のICはアマチュア電子工作愛好家の間で、にわかに脚光を浴びています。

そんなトレンドに興味のあるMakerにとってもこのモジュールは魅力的だと思います。

かんたんUSBホストの作者の方が、CH559に関する開発周りの知見を惜しげもなく公開されており、こちらの資料も必見です。

q61.org

まとめ

かんたんUSBホストは、Arduinoでキーボード入力をサポートしたいときには非常に有用なモジュールです。

USB、キーボード周りの面倒な処理のほとんどをこのモジュールが処理してくれるため、Arduino側に余計な実装をする必要がなく、省メモリ、省実装コストを実現できます。

気になった方はスイッチサイエンス、BOOTHなどで購入できます。(同人ハードウェアの為、在庫はそんなにないかもしれません、気になったときが買い時ですよ!)

www.switch-science.com q61.booth.pm

JLCPCBに3Dプリントを発注してみた

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

JLCPCBとは

jlcpcb.com

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

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

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

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

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

ということで、今回はこの3Dプリントサービスがどんなものなのかを、実際の私の発注を例に紹介しようと思います。

今回発注するデータ

私は家に3Dプリンタを持っているので、これまでに多くの3Dプリンタ用のデータを作成してきました。

今回も、JLCPCBに3Dプリントを発注するにあたり、今まで作ってきた実績のある以下の2種類のデータを使うことにしました。

3Dプリンタの難しいところの一つに3Dプリントに適した設計というのがありますが、今回で言うと、この難しいところは過去の自分が頑張ってくれていたので、スキップすることが出来ました。

一度データを作ってしまうと、こうやって何度も作成できるのが、手作業による加工と違い、3Dプリントなど機械加工の便利なところです。

発注について

早速発注方法です。JLCPCBのユーザ登録は済ませているものとして、Web上での中も方法を少し紹介します。

と言っても、本当にデータをアップロードするだけで、特に難しいところは無いのですが・・

Webサービスの文字も中国の会社ですが英語で記載されており特に戸惑うところはありません。

注文データの登録

まず初めに、3DプリントではおなじみのSTLファイルを、注文ページからアップロードすると次のような画面が現れます。

ここで素材と、個数と説明を書くだけです。

素材は様々な樹脂や金属から選ぶことができますが、今回は安価なSLA(Resin)を選択しました。

さらにその中にも3種類の素材がありますが、これらの違いは微妙そうなので、大きな水切り棚については、一番安い9000R Resinを選択しました。

金額はほぼ体積で決まるようで、この水切り棚は$16.49でした。(体積は送料にも響いてくるので、注意が必要です)

Product Descというところにはそれが何かを説明する箇所です。今回は「Kitchen tool」としておきました。

次にRakuChordのパーツです。水切り棚に比べて体積の小さなパーツのみなので、非常に安価です。 最も小さなネジのパーツはたったの$1.0でした。

試しに同じSLA(Resin)の中の違う素材を選択してみました。

送料について

そして、次に送料の確認です。

非常に時間がかかるが安いもの、早いが高いもの、などいろいろありますが、今回は早くて若干高いDHLを選択しました。

というのも、普段AliExpressなどで安い運送業者を使うと、本当に雑に梱包されて届いたり、届くのに1か月かかったり、破損していたりと、様々なトラブルを経験したことがあるからです。

今回の送料はDHLだと $27.63でした。 (最安だとEconomical Global Direct Lineの $9.77というのがありました)

つくるモノが大きいと送料もそれだけ大きくなるので、いくら製造コストが安くても送料で損をしてしまうケースもあるだろうなと感じました。

レビューについて

3Dプリントをやったことがある人なら、形状によっては3Dプリントが難しいことを知っているかと思います。

という事でJLCPCBでは人手による(?)レビュープロセスが存在します。登録した注文データをOrderすると、支払い前にレビュープロセスで少し待たされます。

自分の場合は翌日にはレビューが完了していました。

一部の部品に非常に薄い箇所があり、この箇所は正しく出ないかもしれない、という警告が出ましたが、今回はそのまま進めてくれ(下の図で言うYES)を選択しました。

待つ

発注してから待つこと、、6日、DHLで我が家に造形物が届きました。

自分で設計したオリジナルの造形物が6日で届くというのは、個人的には「早いな」という感覚でした。

出来栄えについて(水切り棚)

今まで家庭用(?)の積層式の3Dプリンタしか扱ってこなかった自分にとって、光造形式の出力は非常に印象的でした。

積層痕もほとんど目立たず、中身もずっしりと樹脂が詰まっており、「これ、製品では?」と思うような質感でした。

レジンは白色の物しか選べないのですが、この無骨な白色が水切り棚という台所用品ともマッチしていて、無印あたりで売っていそうな雰囲気を感じさせます。

水切り棚については、単純な形状で、とても3Dプリンタにやさしい設計となっているため、造形の不具合なども全く見つかりませんでした。

また寸法もすでに家にある3Dプリンターで作ったもので合わせてあるため、即台所で使い始めることが出来ました。

比較相手としては全く適切ではないかもしれませんが、我が家の3Dプリンター(積層式)で作ったものとの比較です。

出来栄えについて(RakuChord)

こちらも家にある積層式の3Dプリンタで出力したことのあるデータだったのですが、水切り棚と比べると複雑な形状で、薄い部分も多く、3Dプリンタ的には難易度の高い造形でした。

案の定、薄く角がとがっている部分は少し反って出力されており、やっぱりプロがやってもこういうことがあるんだな、と感じました。

まぁ私の用途では許容範囲の反りですが、やはりデータ通りに作るというのは、難しいところがあるようです。

オーバーハングの個所が一部ありましたが、家の3Dプリンタでも出力できる程度の小さなものだったこともあり、特に問題なく出力されていました。

RakuChordは3Dプリンタ製のネジで電池ボックスを固定するのですが、このネジについても、特に問題なく噛み合い、固定することが出来ました。

出来栄えについて(まとめ)

もともと3Dプリンタで出力するように考慮して設計し、実際にも出力したことがあるデータだったため、大きなトラブルなく完成しましたが、手元に3Dプリンタがない状態で設計していきなり発注するのはちょっと難しいかも、と感じました。

水切り棚のような単純な造形物であれば、それも可能ですが、RakuChordのような複雑な形状の場合は、手元で実際に何度も作りながら造形をブラッシュアップしていく必要があるため、手元の3Dプリンタが必要だと感じました。

また、RakuChordの部品の各所で反りが発生しているのを確認しました。これは3Dプリンタあるあるなので、やはりか・・という感じですが、底面で鋭角の出っ張りを作るのを極力避けるか、側面が多少反っても問題ない設計にするなど、割り切りが必要だと感じました。

細かい部分では、発注した3Dデータそのまま、というわけにはいきませんでしたが、家にある積層式3Dプリンタで出力するよりは明らかにそれっぽい造形なので、ここぞ!という時に発注するのが良いかなと感じています。

安価な素材であるSLA(Resin)は乳白色しかないので、この色が許容できない人は、利用が厳しいかもしれないと感じました。

試していないですが、これに塗装するなど、ひと手間かければこの問題は解決できそうです。

3Dプリント以外のケース外注の選択肢

平面的な造形であれば、3Dプリントではなく、PCBを基板をケースとして設計する方法もあり、こちらの方が安価です。 (いわゆる基板サンドイッチ方式、パリピデストロイヤーなどがこの方式です)

またレーザーカットなども外注できるサービスがあるので、透明なアクリル板やある程度厚みのある板をカットする場合にはこれらも選択肢に入れると、安くで作ることができるかもしれません。

実際RakuChordの部品の一部はレーザーカットを外注しており、これは3Dプリントで同じものを外注するより安いうえに、精度が良いです。

一方RakuChordの筐体や、水切り棚のように3次元的な造形や、非常に分厚い造形については3Dプリンタや自由度の高いCNCでないと作ることができません。

まぁ、何が優れている、と言うよりは、適材適所の加工方法があるという事です。

まとめ

初めての3Dプリントの発注でしたが、思っていたより安く、品質も値段の割には良かったと感じています。

Webでの発注も非常に簡単で、気軽に利用できると感じました。

ただ、やはり家に3Dプリンタがあり、手元で一度試作をしたデータを発注するのが、時間面、金銭面においては賢い選択かなと思いました。

とにかく小さな造形物であれば数千円あれば発注できるので、興味のある人は、手元のデータを発注してみて、実物を見てみると良いと思います。

ホワイトボードの買い物リストを外から見えるようにする

ホワイトボードの買い物リスト?

我が家では台所にホワイトボードを設置しており、そこに「買い物リスト」を書いています。

(以前はLINEのチャットボットを使い、スマートフォンで買い物リストを管理していたのですが、在宅勤務中心となったためホワイトボードに移行しました。)

買い物に行くときは、スマートフォンでパシャッと、このホワイトボードのリストを撮影します。

しかし、何かのついでにふらっとスーパーに寄ったときなど、家の買い物リストに何が書かれていたかを知ることができず、必要な買い物ができない場合があります。

また、出かけるたびにホワイトボードをスマートフォンで撮影するのも面倒です。

ということで、「出先からホワイトボードを確認するための仕組み」を作ることにしました。

外から安全にホワイトボードを見たい

安直に考えれば、ホワイトボードが映るようにカメラを設置し、Webサーバか何かを外部に公開して、家の外から見えるようにするのが簡単です。

しかし、家にWebサーバを立てて外からアクセスできるようにするのは、我が家のセキュリティを強固に保つために、できればやりたくありません。

ということで、家にWebサーバを立てる案は却下です。

材料

さて、ここからはこの手法を実現するための材料を紹介します。

Google Drive

家にWebサーバを立てないということで、今回利用したのはGoogle Driveです。

ホワイトボードを撮影するカメラが撮影した画像を定期的にGoogle Driveにアップロードします。

これにより我が家のセキュリティを強固に保ったままホワイトボードの写真を外から見ることができるようになります。

TTGO T-Camera

写真の撮影はTTGO T-Cameraを利用します。

これはESP32-WROVER-Bとカメラモジュールの付いた、WiFiカメラを作るためのモジュールです。

似たようなボードは各種ありますが、今回利用するのは技適を取得しているESP32-WROVER-Bが搭載されたボードです。

(多分これかな? 自分はAliExpressで買いました)

Raspberry Pi 3

TTGO T-Cameraで撮影した映像をRaspberry Piから取得し、Google Driveにアップロードします。

もしかしたらTTGO T-CameraだけでもGoogle Driveにアップロードできるかもしれませんが、今回は簡単のためにRaspberry Piを利用しました。

丁度、我が家には「おうちサイネージ」として動かしているRaspberry Piがあるのでこれを利用することにしました。

inajob.hatenablog.jp

調理

さて、これらの材料を組み合わせてシステムを完成させていきます。

概要

これから構築するシステムの概要です。

TTGO T-Cameraで撮影した映像をRaspberry Piで定期的に取得し、Google Driveにアップロードします。

TTGO T-Cameraのファームウェアを我が家用に変更

TTGO T-CameraをWebカメラとして動作させるためには以下のソースコードを利用しました。 (というか購入時はこのファームウェアが入っていたようです)

github.com

WiFiのAPの設定を修正し家のWiFiに接続できるように再コンパイルして書き込みます。

起動すると画面にIPアドレスが表示されるので、そこにアクセスするとカメラの映像を確認できます。

我が家のルーターと相性が悪いのか、長く起動しているとWiFiの接続が切れてしまう問題が発生しました。

以下の記事を参考にし、WiFi接続が切れた時は自動的に再接続するようにしました。

randomnerdtutorials.com

TTGO T-Cameraを固定するための台

台所の壁に設置したホワイトボードを撮影するためには、TTGO T-Cameraを良い角度で固定する必要があります。

このためのカメラの脚を3Dプリンタで自作しました。

FreeCADを使ってこのような立体を作りました。

このパーツは2つくっつけるとこのようにL字型の蝶番のようになります。

TTGO T-Cameraのケース(写真に写る紫のケース)は 以下のモデルを使いました。

www.thingiverse.com

Raspberry Piにアップロード用スクリプトを仕込む

定期的にTTGO T-Cameraから画像を取得しGoogle Driveにアップロードするスクリプトを用意します。

Google Driveへのアップロードにはrcloneを利用します。

rcloneの初期設定はCLIのウィザードで実施することができます。CLIENT_ID, CLIENT_SECRETを設定するのがちょっと面倒だったのですが、設定しなくても一応動かすことはできます。(ただし共用のIDを使うことになりすぐに制限に引っかかってしまうので、常用するのには向きません)

スクリプトは以下のような感じです。

(convertコマンドにより画像を反転したり、日付を入れたり、過去にアップロードした画像を削除したりもしています。)

#/bin/bash

cd `dirname $0`

curl http://<TTGO T-CameraのIPアドレス>/capture -o todo.jpg
convert todo.jpg -rotate 180 -fill white -pointsize 25 -font Helvetica -draw "text 20,20 '`date`'" -background white todo.jpg

for f in $(rclone lsf "google drive:/ouchi-raspberry-pi/"); do
  echo "delete $f"
  rclone delete "google drive:/ouchi-raspberry-pi/$f"
done;

rclone copyto todo.jpg "google drive:/ouchi-raspberry-pi/todo-$(date "+%Y%m%d-%H%M").jpg"

同じ名前のファイルをどんどん上書きしても良いのですが、iPhoneGoogle Driveのアプリのキャッシュの処理などにより、画像が更新されないという問題が起きたので、日時に合わせて画像ファイル名を変更するようにしました。

Google Driveの共有設定

このようにしてアップロードした写真は、Google Driveの共有機能を利用すると他人と共有することもできます。

我が家でも妻と写真を共有し、夫婦どちらでも家の買い物リストを出先から見られるようにしました。

まとめ

TTGO T-Camera, Rasperry Pi, 3DプリンターなどIoT的な装置をフルに使ってホワイトボードの画像を外から見るためのソリューションを作ることが出来ました。

これでまた生活が便利になりました! 自分の知識を使って、生活を便利にするのは楽しいので、この記事をご覧の方もぜひ挑戦してみてください!