RakuChord v1.4の開発の記録

RakuChordの開発スタイル

本編のまえに、RakuChordの計画について少し紹介します。

RakuChordは僕が、「楽に演奏できる楽器」というコンセプトで10年ほど作り続けている電子楽器です。

販売は 2018年 にMakerFaireTokyo、通販は2019年に2回、そして今回です。

f:id:inajob:20201115101426p:plain

意外と長いRakuChord開発の歴史

RakuChordはすでに十分に"演奏できる楽器"にはなっているものの、細かい改良点がまだたくさんある状態です。

基板の発注は最低単位があり、1つだけ、というわけにもいかないため、せっかく作った基板だし、ということでキットとして販売をしているというのが実情です。

RakuChordを買っていただくことで、僕が次のさらに進化したRakuChordや、ほかの何かを作り始めることが出来ます。

またRakuChordを他の人に見せびらかしていただくことで、さらに多くの方が、RakuChordに興味を持ってもらうことができ、このサイクルを回しやすくなります。

 

作りかけを売るってこと? と思われるかもしれませんが、RakuChordの開発はライフワークなので、あきらめない限り無限に改良できます。その時その時でベストを尽くしていますので、手を抜いているわけではないことをご承知おきください。

「同人ハードウェア方式」

RakuChordのような開発スタイルを勝手に「同人ハードウェア方式」と名付けてみました。

自分のような、趣味でものづくりを行っている人にとって、ある程度大規模に製品を作る手段として有名なものとして、クラウドファンディングがあります。

よくRakuChordもクラウドファンディングしないのか?と聞かれることがあるのですが、「その必要がない」と返答しています。

 

クラウドファンディングが必要な状況とは何でしょう?

  • なるべく多くの人に製品を使ってもらいたい
  • 目的とする品質を実現するためには量産が不可避
  • 量産のための頭金が必要

といった状況ではクラウドファンディングが有効なのではと考えます。

 

しかしRakuChordについて考えると、、

  • 興味のある人に製品を使ってもらいたい
  • 現状3Dプリンタ、レーザーカッター、中国の基板業者を使うことで、1イテレーション10個単位で生産可能
  • 量産ではないので頭金は不要

という感じで、あえてクラウドファンディングを行う必要性が無いのです。

 

しかし、10個単位で生産ができるとしても、イテレーションを回すにはそこそこのお金がかかります。まぁ趣味の開発なのでそこは自分のお小遣いで・・ということもで切るのですが、作るたびに赤字を垂れ流すというのもテンションが下がります。

 

MakerFaireTokyoなどでRakuChordを展示していると「自分も欲しい!」という奇特な方が存在することもわかりました。

 

そこでRakuChordは「同人ハードウェア方式」を採用して、持続可能な開発を進めることにしました。

 

この方式は、下図の企画、検証以降の「試作」フェーズで採用することが出来ます。

要は、実際に動作するプロトタイプを有料で販売し、それを基に試作フェーズを持続的に回す、という方式です。

f:id:inajob:20201115085544p:plain

今後のRakuChordが、どうなるかは、まだ僕もわかりません。

試作フェーズを数回回して、ある程度満足するものが出来たら、量産に挑戦するかもしれませんし、そのためにもう少しバッチサイズを大きくして試作フェーズを回す、ということもあるかもしれません。

 

まぁ、ともかく現在のRakuChordの開発は、試作段階のプロタイプを買っていただける奇特な方の存在により実現できているという状態なのです。

 

ここまでの販売で、RakuChordを購入いただいた方、宣伝いただいた方には、大変感謝しています。

 

まぁ、そういった方式で進めていることもあり、今回のRakuChord v1.4では、どのような改良をしたのか?ということを、公開することはとても重要なことなのです。

応援いただいている皆様に、RakuChordがどのように進化しているか、僕がどのように試行錯誤しているか?を紹介することで、このサイクルに皆さんを巻き込んでいきたいと考えているからです。

 

過去のRakuChordの記事紹介

この記事ではRakuChord v1.4 の開発の記録について紹介します。

それ以前のRakuChordの開発記録については、下記リンクを参照してください。

inajob.hatenablog.jp

inajob.hatenablog.jp

inajob.hatenablog.jp

inajob.hatenablog.jp

基板設計見直し

RakuChord v1.4では、基板の設計を見直しています。

変更点はイヤホン端子の出力を、アンプの後段にしたことです。

今までイヤホン端子からの出力は、マイコンからの信号をCRフィルタしたものがそのまま出力されていました。そのため、イヤホンで聞くなどは問題が無かったのですが、外部のスピーカなどにつないだ際には、ほかの機器に比べてオーディオのレベルが低くなってしまっていました。

 

そこで、今回はイヤホン端子の出力もアンプの後段に持ってくることで、この問題を解消しました。

f:id:inajob:20201115101803p:plain

イヤホン端子をアンプの後段にした

しかし、この変更をすると、イヤホン使用時に音量が大きすぎるという問題が発生しました、そこで、音量調節用のボリュームも実装することにしました。

このボリュームはスピーカー出力の際も有効なので、静かな部屋で演奏するときにはボリュームを下げるといった操作ができるようになりました。

f:id:inajob:20201115105828p:plain

新設したボリュームです!

 

もう一つの変更点は「拡張端子」です。RakuChordは、Arduinoベースの楽器試作環境としても、利用することを想定しているので、拡張端子は必須です。

v1.3 までは、Arduino Nanoのピンをそのまま内側に伸ばして拡張端子、としていましたが、この端子が、使いにくい、、、ということで設計しなおすことにしました。

f:id:inajob:20201115102052p:plain

新しい拡張端子

拡張端子は、RakuChordで使用していないArduinoGPIOと、電源、シリアル、I2C、そしてアンプの入力、アンプの出力、を引き出しました。

 

これにより、例えば下記のような拡張ボードが作れます。

  • シリアル、またはI2Cで接続できる外部音源
  • 内蔵スピーカ以外のスピーカの搭載
  • 内蔵アンプ以外のアンプの搭載
  • I2Cやアナログ入力による入力インターフェース追加
  • フルカラーLEDなど演奏に応じて光るような飾りの追加
  • 外部機器とのテンポ同期信号のやり取り

まぁ、想定しているだけで、どれもまだ存在していませんが・・

筐体設計見直し

筐体設計も大きく見直しました。というかモデリングツールをOpenSCADからFreeCADに移行しました。

ツールを変更したのは「フィレットがやりにくい」という理由からです。

OpenSCADはプログラミングで3D図形を設計するという一風変わった3DCADです。Gitで差分管理をしてもわかりやすいということで、ここまで使用してきたのですが、仕上げの部分で、使いづらさが出てきました。

 

1.3までのRakuChordの筐体の底面の角は「角ばって」いました。これはOpenSCADでそのまま底面を引き延ばして、3D図形を作っていたためです。

f:id:inajob:20201115102809p:plain

底面の角がすごく角ばっている

この底面の角を丸くする、いわゆる「フィレット」を付けたいな、と思ったのですが、OpenSCADにはそれを実現する直感的な方法がありませんでした。

もちろん工夫してモデリングすれば期待する立体を得る方法はあるのですが、そのためにいろいろとパズル的に設計するのは、どうも遠回りな気がしてきました。

 

ということでFreeCADです。FreeCADはGUIの3DCADで、辺を選択しフィレットを付けることが出来ます。

 

ちょっと癖のあるソフトなので、使いこなすのに苦労しましたが、なんとか、今までのRakuChordの筐体と同程度の物にフィレットを付けたものを作ることが出来ました。

f:id:inajob:20201115102408p:plain

FreeCADでフィレットが簡単につけられました

製造・発注

設計が終わったら次は製造です。

基板はいつも通りFusion PCBに発注しました。筐体本体は引き続き我が家の3Dプリンタで作成しました。

www.fusionpcb.jp

筐体のフロントパネル・スペーサーについては、今までは、フロントパネルは最寄りの工作室でレーザーカット、スペーサーは我が家の3Dプリンタで作成していたのですが、今回はelecrowにレーザーカットを発注してみました。

www.elecrow.com

我が家の3Dプリンタで作っても良かったのですが、なるべく外注で作れるようにしていこうと考え、レーザーカットの発注にしました。

f:id:inajob:20201115110740p:plain

良い感じに加工してくれました!

バグとその対策

さて、実装が完了し、手元にはRakuChord v1.4 のキットの材料がそろいました。

1台を組み立てつつ、マニュアルを作成します。

 

大体ここで、バグを発見するのですが・・今回もいくつか致命的なバグをやらかしました。

 

ボリュームとイヤホン端子の干渉

まず、組み立てていて気付いたのは、ボリュームとイヤホン端子が干渉してしまい、組付けられない!という致命的なミスです。

ボリュームは新しくつけたものなので、この周りでミスが起きるのはある程度想定していましたが、、これは・・何とも恥ずかしいミスです。

f:id:inajob:20201129131743p:plain

ここであきらめて、基板を捨てても良かったのですが、リカバリ方法を考えてみました。

 

まさかのボリュームの逆挿しです。配線が対称なボリュームであればこの技が使えます。(この時は対称だと思っていた・・・次項へ続く・・)

f:id:inajob:20201115103155p:plain

必殺!裏面挿し!

ボリュームを逆刺ししたことで、今度はスピーカーとボリュームが干渉するようになりましたが、筐体の隙間を少し開けることでこちらは比較的簡単に対応することが出来ました。

 

フットプリントに対して、逆向きにボリュームを実装するというワークアラウンドでこの問題は無事回避(したかのように見えました、、)。

ボリュームのフットプリントのミス

いきなりの伏線回収。このボリューム、5つの足があり、2連のボリュームを1つだけ使うような設計にしていたのですが、その5つの足の役割を間違えていました・・

おかげで、完璧とも思えた前述の「ボリュームの逆刺し」案も配線が意図しないものとなり、実現が難しいこととなりました・・

 

しかし!!まだあきらめません。このボリューム、2連のうち1連しか使用していないので、使っていないボリュームの足と配線をショートさせても特に問題はありません。

 

ということで、間違った配線のボリュームのピンを隣の正しい配線のピンとはんだボールを使いショートさせることで、意図した配線を実現しました。

f:id:inajob:20201115103411p:plain

必殺!はんだボール!

これでボリューム周りのミスは無事回避出来ました!

(結果組み立て手順が難しくなっていきました・・)

電解コンデンサの配線間違い

これは、完全に配線の設計ミスです。イヤホン端子付近にあった電解コンデンサを、そのままにしていたのですが、イヤホン端子がアンプの後段に移動したおかげで、その電解コンデンサが、回路上意図しない位置に実装されてしまっていました。

 

これはもう、どうしようもない・・ と思いましたが、、

f:id:inajob:20201115103634p:plain

必殺!リワーク!

必殺リワーク!を使い、 基板上の配線をアクリルカッターで1本カットし、組み立て時に余った配線で、電解コンデンサの足を正しい端子につなげる、という手順とすることで、回避しました。

(結果、また組み立て手順が難しくなってしまいました・・)

マニュアルの写真ミス

これは、販売当時は気づいていなかったのですが、組み立てマニュアルの写真に2か所も間違いがありました。

これは、実際の組み立て時、上記のミスを修正したり、試行錯誤している中で撮った写真と取り違えてしまっていたのが原因の1つでした。

OLEDの裏面にゴムを貼る

これは、ミスではなく、未然にミスを防ぐ仕組みです。

OLEDを実装するとき、その裏面には配線が存在しており、OLEDを斜めに実装した場合、OLED裏面の金属部分と、裏面の配線が接触することにより、意図せず回路がショートすることが予想されました。

これを防ぐために、v1.3のころからOLEDの裏側に薄いゴム板を貼り付けることにしました。

これにより、組み立て時に発生しそうなミスを1つ減らすことが出来たと考えています。

f:id:inajob:20201115103759p:plain

キット販売では細かい配慮が重要

まとめ

以上のような改良と、それによって発生した様々なバグを乗り越えて、RakuChord v1.4は完成しました。

次回 v1.5 を作る際は、少なくともこれらのバグを修正したものとなりそうです。

 

重ねてのお礼となりますが、ここまでの販売で、RakuChordを購入いただいた方、宣伝いただいた方には、大変感謝しています。皆さんのおかげで、RakuChordの機能が洗練され、さらに多くの方の手にRakuChordを届けることが出来ています。

 

引き続きどうぞよろしくお願いします。

 

宣伝

RakuChord v1.4 まだもうちょっと在庫が残っています。この記事を読んでみて、「面白い試みだな」「遊んでみたいな」と思った方!ぜひ購入してみてください!

 

inajob.booth.pm

WioTerminalが来た!(商品提供によるレビュー記事です)

はじめに

この記事はSeeedからレビュー用の製品をいただき、書いたものです。

 

f:id:inajob:20201110130852p:plain

Seeedは、中国の企業でいわゆるメイカー向けの製品の開発・販売や、製造を行っている会社です。自分はSeeed Fusionという、プリント基板の製造や、部品の実装を行ってくれるサービスをよく利用しています。

inajob.hatenablog.jp

 

思えばこのブログも結構長く書いてきましたが、ついに自分にも「製品レビューの依頼」が来ました!!!

ちょっと感動しつつ、ありがたくレビューさせていただくことにしました。

 

ということで、以下 いわゆる PR記事 になるんですかね、Wio Terminalについてレビューしていきたいと思います。

Wio Terminal 公式での買い方

こちらから買うことが出来ます。

jp.seeedstudio.com

f:id:inajob:20201110130039p:plain

Japan Direct Lineで発送してもらうと、DHLやFedExよりも安い値段で、そこそこ早く届けてくれました。(5-7営業日)

製品外観

良い感じの箱に入ってきます

f:id:inajob:20201110103613p:plain

技適もばっちり

f:id:inajob:20201110103654p:plain

右下の丸いのが方向キー

f:id:inajob:20201110103727p:plain

筐体にも技適マーク付き。スケルトンがカッコいい!のは光センサーがここに入っているから。

f:id:inajob:20201110103823p:plain

説明書にも日本語ページがありました!

f:id:inajob:20201110104205p:plain



新製品!ワクワクしますね!

仕様を見てみる

なんとなく存在は知っていたWio Terminalですが、改めてそのスペックを見てみることにします。

 

まず外見ですが、最近広く見かけるようになった「M5Stack」とよく似ていることに気付きます。M5Stackとの比較記事としては下記が非常に参考になります。

note.com

この記事にも書かれていますが、自分が気になった点は

  • 画面解像度は同じ(サイズはWio Terminalのほうが大きい)
  • 技適付きなのも同じ
  • CPUはARMベースの samd51なのでARMの勉強によさそう(M5Stackは ESP32)
  • 十字キーが搭載されていてうれしい
  • 加速度センサー・マイク・光センサー・IR送信機 など 周辺機器がてんこ盛りなのがうれしい
  • USBホスト・クライアント機能がうれしい
  • バッテリーが非搭載なのは残念(別途バッテリーが販売されているようです)
  • SRAMが少ないのは残念

といったところです。いい所・悪い所 それぞれある感じですね。

Arduinoとして利用してみる

早速ArduinoとしてPCにつないでみます。

f:id:inajob:20201110104011p:plain

緑と青のLEDがかっこいい!

私が普段使用しているのはWindows10搭載のPCです。おそらくこういうデバイスを使う上ではMacよりもWindowsのほうがすんなりいくことが経験上多いです。

 

USBケーブルでPCとWio Terminalをつなげると、期待通り ドライバのインストールが自動的に始まり、インストールされると Wio TerminalのシリアルポートがPCから見えるようになりました。

 

WioTerminalの情報は、公式ページが結構充実しており、これに従っていけば基本的に困ることはなさそうです。

wiki.seeedstudio.com

しかも、日本語版も用意されています。これは初学者にも優しくて良いですね。

(ただし日本語版よりも英語版のほうが内容が充実しているようです。英語に抵抗がない方は英語版を見ながら進めるのがよさそうです。)

 

さて、シリアルポートが見えるようになったので、Arduino IDEから書き込みを試してみます。

M5Stackなどほかのボードの追加と同様に、ボード定義を含むjsonファイルの設定を追加してから、ボードマネージャから「Seeed SAMD Boards」を追加すれば、ボード一覧にWio Terminalが現れます。

f:id:inajob:20201110082819p:plain

まぁ上記ページの通りにやればArduinoとして使い始めることが出来るというわけです。

WioTerminalの2つの書き換え方法

WioTerminalのコアであるSAMD51を書き換える方法はいくつかあるようです。

まず1つはArduino系のファームウェアが書き込まれている状態であれば、前述のようなUSBシリアル経由での書き込みができるようです。

f:id:inajob:20201110083208p:plain

そしてもう一つ「ブートローダーモード」というのがあります。電源ボタンをONの方向からさらに先に押し込むという「リセット」操作を素早く2回行うことによりこの「ブートローダーモード」に入ることが出来ます。

f:id:inajob:20201110083222p:plain

この時PCにはマスストレージデバイスとして認識され、USBメモリのようなドライブが出現します。このドライブにuf2形式のファイルを配置することで、ファームウェアを書き込みするのが後者の方法です。(mbedなどでおなじみの方法ですね)

 

この仕組み故か、ArduinoIDEから書き換えを行うタイミングで、USBのドライブが接続されて、すぐに外されるような挙動をするようです。(ちょっとびっくりしました)

 

Arduinoから最新の方法でWiFiを使う準備

Wio TerminalはWiFiBluetoothの機能も提供していますが、これはメインCPUであるSAMD51とは別に搭載されているRTL8720というCPUにより実現されています。

M5StackはメインCPUであるESP32の内部にWiFiBluetoothの機能が内蔵されているのとは対照的ですね。

 

で、どうもWio Terminalの古い仕組みだとRTL8720とSAMD51の間はATコマンドでやり取りをしたようなのですが、今では新しくeRPCというプロトコルに刷新されているようです。

f:id:inajob:20201110083635p:plain

f:id:inajob:20201110083650p:plain

ということで、RTL8720のファームウェアを書き換えて、上記の新しいやり方であるeRPCを使えるようにバージョンアップするのがよさそうです。

ここで紹介する内容は公式Wikiの下記ページを基にしています。(英語版しかないようです)

wiki.seeedstudio.com

RTL8720はUSBと直接つながっているわけではないので、ちょっと工夫が必要です。

まずSAMD51に「PCから送られてくる情報を基に、RTL8720のファームウェアを書き換えるソフトウェア」を書きこみ、それからUSBシリアル経由でRTL8720用のファームウェアを書き込みます。

バケツリレーのようですね。

f:id:inajob:20201110084231p:plain

公式ページで紹介されているのはブートローダーモードによる書き換え方法なので、それに従います。

提供されているuf2形式のファイル(rtl8720_update_v2.uf2)を、マスストレージデバイスとして認識されたWio TerminalにCopy&Pasteします。

このuf2形式のファイルの実体は、下記のArduinoのスケッチをコンパイルしたもののようです。

github.com

シリアルポートから来たコマンドをRTL8720にそのまま渡すようなプログラムのようです。

ここまで来たらPCからRTL8720の新しいファームウェアを書き込みます。

日本版はファームウェアが別のようなので注意が必要です。

f:id:inajob:20201113071125p:plain

 

GitHub - LynnL4/ambd_flash_tool: Firmware download script for rtl872x のリポジトリを git cloneして書き込みツールを取得する手順が紹介されているのでそれに従います。

 

書き込みツールの実体はPythonで動作するスクリプトのようですが、Windows向けにはexe形式も用意されているので、Pythonの導入は不要でした。

公式ページの指示に従い RTL8720のFlashの消去と、新しいファームウェアへの更新を行います。

$ ./ambd_flash_tool.exe erase
Erasing...
All images are sent successfully!
Image tool closed!

Success!

$ ./ambd_flash_tool.exe flash -d 20201106-seeed-ambd-firmware-rpc-v2.0.1/
copy img to workspace...
Flashing...
All images are sent successfully!
Image tool closed!

Success!

これでハードウェア的には準備が整いました。

 

次はArduinoからこの 新しいファームウェアを利用する準備を行います。

必要なライブラリは公式から提供されているようなので、単にそれらをArduino IDEに取り込むだけです。

ライブラリはArduino公式のライブラリとしては登録されていないので、GitHubからZIP形式でダウンロードし、Arduino IDEに取り込みます。

GitHub - Seeed-Studio/Seeed_Arduino_rpcWiFi: A library of maximum ESP32 WiFi-compatible software.

これはRTL8720のWiFi機能を ESP32の WiFi機能とよく似たインターフェースで利用するためのライブラリです。

GitHub - Seeed-Studio/Seeed_Arduino_rpcUnified: RTL8720DN wireless abstraction layer using the eRPC protocol.

これはeRPCを扱うためのライブラリです。

GitHub - Seeed-Studio/Seeed_Arduino_FreeRTOS: This library gives an example of how to get FreeRTOS running on a SAMD processor. The project can be used as a template to build your projects off of as well.

これはFreeRTOSの実装のようです。 READMEにはSAMD21用と書かれているので、WioTerminalに必要なものかよくわかっていませんが、公式の手順で紹介されているので、一応入れておきます。

 

これらのライブラリはかなり新しいもののようでこれからどんどん改良されていくことが予想されます。rpcWiFiなどはまだバージョンに対応するタグが1つもないなど、開発途上である様子が伺えます。

 

とにかくここまで導入すれば、最新のドキュメントに従ってArduinoからWiFiを利用することができます。

 

公式ドキュメントにあるWiFiのアクセスポイントを列挙するサンプルが動くことを確認しました。

Wi-Fi - Seeed Wiki

使い方はM5StackのWiFiライブラリと同じなので、学ぶことが少なて良いですね。

Platformio(CLI)から書き込んでみる

私はArduinoを扱う時は Platformioを使うことが多いです。

調べるとPlatformioはWio Terminalにも対応しているようなので、試してみました。

Seeeduino Wio Terminal — PlatformIO 5.0.3a2 documentation

[env:seeed_wio_terminal]
platform = atmelsam
framework = arduino
board = seeed_wio_terminal
board_build.mcu = samd51p19a
board_build.f_cpu = 120000000L

こんな感じのplatformio.iniを用意すれば、PlatformioからもArduinoとして書き込むことが出来ました。

これでCLIを使った開発がはかどりそうです。

 

画面に文字を出すだけの簡単な例を作ってみました。Platformioを使った開発の参考にしてみてください。

github.com

f:id:inajob:20201110104131p:plain

感想

ざっとWio Terminalを使って開発を行う手前のところまでの手順を紹介しました。

周辺機器が充実しており、電子工作をしない人でもソフトウェアの書き換えだけでしばらく遊べそうです。

 

ここまで触ってきて、Wio Terminalを買うと幸せになる人の像がぼんやりと見えてきました。

  • SAMD51を使ったオリジナルの「同人ハードウェア」のプロトタイピングを行いたい方
  • M5Stackは気になるけどESP32のアーキテクチャがちょっと・・という方
  • Wio Terminalを製品の一部に組み込むことで、難しい部分の設計を省きたいという方
  • Wio Terminal自体をゲーム機と考え、そこで動くゲーム開発を行いたい方

この記事を読んでいるあなた! これらの項目に当てはまるぞ!という場合はぜひ Wio Terminal を買ってみてください。

 

 この記事では Wio Terminalの本当に導入部分までしか紹介できませんでした。

無線機能の活用やUSBホスト・クライアント、各種センサーの活用、ほかの電子部品との合わせ技、などWio Terminalで試してみたいことはまだまだたくさんあります。

 

またいろいろ遊んでみてから、記事を書いていこうと思います。 

Go To Eat が使えるお店を 地図で見るためのサービス「Go To Eat 埼玉 マップ! 」を作った

これは何?

今話題のGo To Eatですが、その利用可能店舗を知るためには、利用可能店舗一覧ページを見るしかなく、それぞれに住所は書いてあるものの、地図上で確認することが出来ませんでした。

 

そこで、上記の情報を基に埼玉県のGo To Eat対象店舗を地図上で見ることが出来るWebサービス 「Go To Eat 埼玉マップ!」を作りました。

 

※ここで扱うのは埼玉県のGo To Eatの食事券が使える店舗です。これ以外に予約サイトのポイントがたまるというのもGo To Eatの施策がありますが、そちらに対応している店舗はもっとあるはずです。

f:id:inajob:20201109134633p:plain

 

 

類似サービス

同じような課題を感じている方は他にもいて、下記のような類似サービスが開発されているようです。

正直なところ、私が作ったものより、これらのサービスのほうが使い勝手が良いと感じます。また埼玉県以外もサポートしているようです。

まぁすでに自分も作ってしまったし、同じようなサービスが切磋琢磨したほうが良いものができると思うので、皆さんそれぞれのサイトを使ってみてください。

 

go-to-eat-map.com

gotoeatmap.net

自由な地図API

地図系のサービスを作るということであれば Google MapsYahoo! 地図が真っ先に思い浮かぶのですが、Google Mapsは有料化され、Yahoo! 地図のAPIは廃止されています。

map.yahoo.co.jp

 

(後で良く良く調べると、Google Mapsは条件によっては無料で使えるらしく、今回の用途であればマイマップを使うのが良かったかもしれません。類似サービスの中には枚マップを使ったものもありました。)

qiita.com

まぁ、ともあれ、地図系のWebサービスを作るときに他社のご機嫌をうかがいながら開発するのも気持ちの良いものではありません。

 

ということで、今回はLeafletと国土地理院の地図を使ってみることにしました。

 

leafletjs.com

Leafletというのは ブラウザ上で地図を表示するためのオープンソースJavaScriptライブラリです。OpenStreetMapのタイルサーバを参照することで、世界中の地図を表示することが出来ます。

また地図のドラッグアンドドロップや、地図上にマーカーを描画するなど、いわゆるYahoo! 地図やGoogle Mapsのような使い勝手を、非常に少ないコーディングで実現することが出来ます。

 

Leafletについては下記サイトが非常に参考になりました。

ops.jig-saw.com

 

日本の政府機関である国土地理院は、OpenStreetMap互換のタイルサーバを提供しています。

maps.gsi.go.jp

利用のガイドラインも非常に緩く、今回の用途でも問題なく利用できそうでした。

地理院タイルをウェブサイトやソフトウェア、アプリケーション上でリアルタイムに読み込んで利用する場合、地理院タイルは出典の明示のみで申請不要でご利用いただけます。

本当はOpenStreetMapの本家のタイルサーバを利用したかったのですが、これは不特定多数が利用するWebサービスから参照することは、規約上NGのようだったので、使用を見送りました。

wiki.openstreetmap.org

住所文字列から緯度経度への変換

Go To Eatの対象店舗情報は、各自治体ごとに公表されています。

埼玉県の場合は下記サイトにHTMLで一覧が記載されています。

saitama-goto-eat.com

ここには店の名前、電話番号、住所などが記載されていますが、地図上に表示する際に必要な「緯度・経度」が記載されていません。

 

ということで「住所文字列から緯度・経度を求める」必要があります。

 

幸いなことにYahoo! JAPANが提供しているAPIに良いものがありました。

developer.yahoo.co.jp

ということで材料はそろいました。

埼玉県のGo To Eat対象店舗一覧のHTMLをスクレイピングして、店舗の情報を取得し、YOLPのジオコーダAPIをつかい、それらの緯度・経度を求めます。

 

最後にこれらの情報をLeafletを使って国土地理院のタイルの上に描画すれば完成です。

 

マーカーが多すぎる問題の回避

Leafletを使って、マーカーを大量に配置すると、ブラウザが固まってしまうほど動作が遅くなってしまいました。

これはLeafletあるある、な問題のようで、今回はMarkerではなくCircleMarkerという別の仕組みを使って地点を描画することで、この問題を回避しました。

f:id:inajob:20201109142415p:plain

MakerはDOMを生成するため大量に登録するとブラウザが重くなるようです、しかしCircleMarkerの場合はCanvasに図形を描画するため、ブラウザはそこまで重くならないようです。

 

下記のStackoverflowが参考になりました。

stackoverflow.com

埼玉県への要望

できれば、Go To Eat対象店舗の情報をCSVのようなコンピュータで扱いやすい形式で公開してほしいです。

ちょうど埼玉県のオープンデータのポータルがあるようなので、ここで公開するのが良いのでは?と考えています。

https://opendata.pref.saitama.lg.jp/

(すでに上記サイトから要望は送ってみました)

最後に

まぁこんな感じで無事「Go To Eat 埼玉マップ!」が完成しました。

MITライセンスでソースコードもオープンにしているので、似たようなものを作りたい人は参考にしてみてください。

また、修正点・改善点のPullRequestもお待ちしています。

 

github.com

 

エンジニアパパ 6か月の娘との初めての外泊 東京ディズニーランドホテル

はじめに

娘が生まれてはや6か月。ずっと育休を取得し、妻と一緒に子育てを続けています。

しかし、やはりずっと家にいて子守しているというのはマンネリ化してくるものです。

そんな中 Go To Travelを活用して外泊をしてみないか?という話が持ち上がりました。

 

f:id:inajob:20201107220311p:plain

候補探し

今回の大きな目的は「6か月の娘と初めて外泊する」「親も気分転換をする」です。

これをもう少し具体的に考え・・

  • 赤ちゃんの受け入れに慣れている
  • 普段行かないようなゴージャスさ

あたりをキーワードに近場の宿の候補を探しました。

 

このページが非常に参考になりました。

travel.biglobe.ne.jp

さて、上記のページを見ていると、ディズニーリゾートの周辺のホテルが多いことに気付きました。

6か月の娘と一緒の旅ということで、さすがにまだディズニーは早すぎるだろうということで、深く考えてなかったのですが、「ディズニーランド周辺のホテル」というのは、実は今回の要件をよく満たしているのではないかと思い直し、ディズニーランド周辺のホテルを深堀調査しました。

f:id:inajob:20201107221526p:plain

ディズニーランド周辺のホテルは、赤ちゃん連れに非常に適しており、ベビーベッドの貸し出し哺乳瓶の洗浄キットの用意、赤ちゃん連れの客が多く多少騒がしくしても目立たない従業員が赤ちゃんに慣れている、など設備・サービスの面でも今回の要件と一致していました。

 

加えてディズニーランドの最寄り駅である舞浜駅」は様々な方法でアクセスできるのも選んだ理由の一つです。自分は認識していなかったのですが武蔵野線を使うと埼玉のほうからも意外と電車1・2本でいけるというのには驚きました。

f:id:inajob:20201107163158p:plain

https://beta-map.yahoo.co.jp/route/train?from=%E6%9D%B1%E5%B7%9D%E5%8F%A3&to=%E8%88%9E%E6%B5%9C&t=1&y=202011&d=07&h=16&m=31&sort=1&lat=35.798034581996575&lon=139.69056968504947&zoom=10&maptype=basic&no=1

 

ディズニーランド周辺のホテルには「ディズニーホテル」「オフィシャルホテル」「パートナーホテル」など、様々種類があり、値段やグレードもまちまちでした。

 

今回の旅の目的から考えると ゴージャスなホテル、という話なので、そこそこいい感じのホテルを選びたいところです。

妻とホテル一覧を眺めていると「ディズニーホテル」というのは、いわゆる一般的な高級ホテルというのとは少し毛色が違っていることに気付きました。

 

外装・内装がディズニーの世界観に合わせてあり、建物のあちこちにディズニーキャラクターをあしらったオブジェなどが設置されているのです。

 

他のホテルに関しても、子供向けのポップな色合いなどの内装ではあるものの、ディズニーキャラクターなどは使えないようで、ディズニーホテルほどの「思い切ったキラキラ感」は無いようでした。

 

折角行くなら、この楽しげな「ディズニーホテル」が良いだろう。ということで、今回は数あるディズニーホテルの中でも、その佇まいが最もゴージャスそうな「ディズニーランドホテル」への宿泊に挑戦することにしました。

f:id:inajob:20201107220955p:plain

Go To Travelとディズニーランドホテル

ディズニーランドホテルの宿泊予約は公式ホームページからできるようでしたが、この申し込み方法だと、Go To Travelは適用されません。

しかし、ここであきらめずに調べていると、、例えば一休(ホテル予約・旅館予約[一休.com])のような、宿泊予約サービスを経由して予約することで Go To Travelの恩恵を受けることが出来ることに気付きました。

 

ちなみに今、ディズニーランドホテルは「外壁工事」を行っており、客室の一部は窓が開けられない状態になっているようで、少し安いプランになっているのですが、あまり人気がないようで、比較的予約が空いていました。

f:id:inajob:20201107220711p:plain

まぁ、今回の主役である6か月の娘は終始眠っているし、あまり外の景色にはこだわらないで良いだろうという選択と集中」作戦により、少し安めの「外壁工事部屋」を予約しました。

(この辺、謎にケチるのが自分らしいな、と思ったりします・・)

 

ともかく宿は予約できました。

ホテルのサービスとしてベビーベッドがあるというのは把握していたので備考欄でベビーベッドを用意してほしいと伝えました。

旅行の予定を立てる(スケジュール)

なんといっても生後6か月の娘を連れての初めての外泊です。ちゃんと計画を立てないと大変なことになりそうです・・

ということでまずはタイムスケジュールを検討しました。

現在の娘は朝寝、昼寝、(昼寝が不十分な時は)夕寝、が必要で、離乳食は2回食、完ミ(母乳ではなくミルクのみを飲む)という状態です。

 

離乳食は慣れさせるために与えているので旅行の間くらいは食べなくても大丈夫そうです。睡眠は、その時間になったら眠るので、親の食事や移動時間とうまく合わせられるとよさそう、、といった感じでタイムスケジュールを考えました。

 

1泊2日の予定を考えているとまぁ、とてもディズニーランド内に入っている余裕はなさそうだったので、大まかな予定としては

 

移動 → 宿泊 → ちょっとウロウロする → 家に帰る

 

という感じに決まりました。

ディズニーランドホテルに泊まりつつ、ディズニーランドに入らないなんて、なんと不思議な旅なんだ!と思っていましたが、実際にホテルの方に聞いてみると、そういうお客さんも結構いるらしいです。

旅行の予定を立てる(持ち物)

次に気になるのが持ち物です。

おむつ、哺乳瓶、保湿用のミルクローション、、哺乳瓶洗浄用のブラシは必要?、服は何枚必要?

と、戸惑いながらも書きだしたうえで整理して、必要なものを用意しました。

結構量が多いので、今回はホテルに荷物を送りつける作戦を採用しました。

 

事前にホテルに送る荷物

  • おむつ x20
  • ミルク缶(ビニール袋に入れる)
  • 保湿用ミルクローション
  • おしりふき

手荷物で持っていくもの

  • 短肌着 x4
  • 普通長袖 x2
  • 厚手長袖 x3
  • 靴下x2
  • レッグウォーマーx1
  • 防寒用ポンチョ
  • タオル x3
  • ガーゼ x6
  • 哺乳瓶 x4
  • ブランケット
  • おくるみ x1
  • 抱っこ紐
  • 皮膚の炎症を抑える軟膏
  • ベビーソープ(風呂用)
  • BOS袋(おむつがにおわない袋)
  • ビニール袋
  • お気に入りのおもちゃ
  • おむつ替えセット(数回分)(おむつ、おしりふき)
  • ミルクセット(2回ほどミルクが作れるように)(粉ミルク、お湯、湯冷まし)

全部を大き目の肩掛けバッグにいれて、準備しました。

ベビーカーも今回大活躍したアイテムです。

 

ホテルに事前に確認すると下記はホテルで貸してくれるということで荷物が少し減りました。

  • 哺乳瓶電子レンジ除菌箱
  • 哺乳瓶用スポンジ
  • 哺乳瓶用洗剤

実際のスケジュール

今回の旅行の実際のスケジュールをまとめてみました。

f:id:inajob:20201107204743p:plain

細かいところはスケジュール表を見てください。

ミルク、睡眠と いつもの娘のスケジュールをこなしつつディズニー周辺を満喫してきました。

 

今回良かったのは、移動中やいつもと違う部屋にもかかわらず娘がちゃんと寝て、ちゃんと飲んでくれたことです。おかげでかなりスムーズに旅をすることが出来ました。

 

恒例の食事難民とGo To Travel 地域共通クーポンの罠

今回ハラハラしたのは食事です。娘がどこでどういうぐずり方をするかわからなかったので、「最悪コンビニ飯で・・」というつもりで何の予約もせずに出発したものですから、案の定 食事の調達に苦労しました。

 

加えて今回はGo To Travelキャンペーンで、地域共通クーポンというものが発行されており、これも使い切ってしまいたいという気持ちがありました。このあたりもう少し事前に調べておけばよかったです。

 

Go To Travelの地域共通クーポンが使えるお店は

map.goto.jata-net.or.jp

を見ると、地図上で確認することが出来ました(が、スマートフォンで見ると異常に動作が重たいのがつらかった・・)

 

夕食をどうしようかとこの地図を見てみると、地域共通クーポンが使えるお店は大手コンビニ以外では、ホテルのレストランがほとんどで、当然それらは予約で埋まっていました。また、この地域共通クーポンは「電子クーポン」と「紙クーポン」の2種類があり、店舗によっては「紙クーポン」しか扱っていないところもありました。

 

「最悪お土産を地域共通クーポンで買えるかな?」と思っていたのですが、ディズニーのお土産が買えるお店で利用できるのはすべて「紙クーポン」だけでした。

 

電子クーポン・・ダメじゃん・・

 

しかし我々はあきらめません・・

夜ごはんは唯一電子クーポンが使えて、予約などが不要そうな「ベッカーズ」にて調達することに成功しました!

f:id:inajob:20201107205635p:plain

ベッカーズは初めて利用したのですが、まぁいわゆるちょっと良いハンバーガーチェーンという感じで、ややジャンキーな感じはありましたが、夕食を堪能しました。

また、ベッカーズの買い物の道中にちょうどディズニーランドの花火が上がっているのを見ることができ、ちょっとラッキーな気持ちになりました。

 

ただ、娘が就寝していたため、ホテルの部屋の隅で薄暗い中食べるという、ちょっと不思議な夕食となりました。

f:id:inajob:20201107221222p:plain

 翌朝の朝ご飯は、まぁ普段もそんなにしっかり食べないということもあったので、コンビニでテキトーなものを買って済ませました。一応朝ごはんのビュッフェも予約が空いていないかを夜に確認したのですが、まぁいっぱいでした。そうですよね、、事前に予約が基本なんですよね・・

 

そして最後のチェックアウト後の昼ごはん、、ダメもとでお昼のタイミングでビュッフェの状況を聞いてみたところ「すぐに入れますよ」とのこと・・・!!!

最後の最後でホテルの素敵なビュッフェにありつけたのです!!

 

f:id:inajob:20201107221315p:plain

f:id:inajob:20201107221343p:plain

後で冷静になって考えると、ホテルの性質上、宿泊者の多くはディズニーランド内で昼ごはんを食べるため、ホテルのレストランは比較的空いているということのようでした。

 

ということでGo To Travelの地域共通クーポンも使い切ることが出来ました

今回は食事周りがハラハラしましたが、結果オーライでした!

 

ディズニーランドに入らないディズニー観光

まぁ正直なところ、入らないと特にできることは何もありません。そんな中見て回ったのはホテルの庭「アリスガーデン」「シャーウッドガーデン」、ホテルの玄関「ファンタジアコート」です。ベビーカーを押しながらウロウロするにはちょうど良い広さで、ディズニーの雰囲気を感じつつ、まったりと散歩しました。

f:id:inajob:20201108075852p:plain

 

ディズニーランドからは1駅離れた葛西臨海公園にも遊びに行きました。ここはディズニーランドとは打って変わって、広々としていて自然が美しい公園でした。

娘に初めて海を見せることが出来て、親としては満足しました(娘はすこし寒かったのか不機嫌でしたが・・)

f:id:inajob:20201107222028p:plain

あれが夢の国か・・from 葛西臨海公園

ちょっとスケジュール的にきつくて葛西臨海公園は急いで歩き回る羽目になりましたが、水族館や観覧車などもあり、ここだけでも楽しく観光できそうな公園でした。

 

最後にディズニーをぐるっと一周しているモノレールである「ディズニーリゾートライン」に乗り、ディズニーランド・ディズニーシーを一周見渡してから、家に向かいました。

 

f:id:inajob:20201107221440p:plain

まぁちょっと物足りないですが、ディズニーランドに入るのは、娘がもう少し大きくなってから挑戦しようと思います。

 

まとめ

娘を連れて初めての外泊、ということでGo To Travelを使って東京ディズニーランドホテルに行ってきました。

今までの夫婦二人の旅行は まったり、くつろぎに行く、という感じでしたが、子連れの旅行というのは、ハラハラドキドキ、でも充実感がある、スポーツのような感じがしました。

これはこれで気分転換としては面白く、これから始まるエキサイティングな育児の片鱗を味わったような、そんな旅行でした。

 

ここまでの記事で書いたように、私は結構長めの育児休業を取得しており、そのおかげでこのような充実した時間を家族と過ごすことが出来ています。

育児休業いいですよ!!とアピールしてこの記事を締めます。

 

f:id:inajob:20201108080634p:plain

 

エンジニアパパの初めての娘の風邪

初めての風邪

うちの娘も生後5か月。そろそろ離乳食も始めています。

そんなある日・・ 初めて娘が風邪をひきました・・・

兆候

くしゃみが多いな・・という日があり、それがひき始めだったのかな?と思います。そのうちせき込むようになり、鼻詰まりが気になるようになってきました。

発熱は無し、だけどミルクを飲むときにせき込んだり、睡眠中にもせき込んで目が覚めるなど、辛そうでした。

小児科を受診

検診や予防接種で小児科には何度も行っているので、まぁいつもの感じで小児科に行きました。聴診器をあてられ、のどをちょっと見てもらい、気管支を広げる薬と、咳をおさえる薬を処方してもらいました。

親も風邪をひく

そうこうしているうちに、親も風邪の症状が出始めました。熱は出ないものの鼻水と咳が・・・

家族3人、全員ダウンです。これはつらい・・

一応、娘に風邪っぽい症状が出始めたころから、娘のおもちゃや、プレイマット、家じゅうの取っ手などはアルコール消毒していたのですが、時すでに遅しというやつだったんでしょうね・・

鼻水を吸い取る

赤ちゃんは鼻水を「チーン」できないので、親が吸い取る必要があるそうです。

ということで、スポイト式「鼻水吸い取り器」を使って鼻水を吸い取ろうと頑張りました・・が、大して吸い取れない割に娘は大泣き・・ これは心が折れる

鼻水もだばぁと出ているわけではなく、鼻の奥にたまっているような状態なので、スポイト式で吸い取るには難易度が高い状態のようでした。

 

他には、親が口で吸い取るという下記のような商品もあるのですが、これは話を聞く限り「子供の風邪が親にうつる」らしいので、却下。

 

 

そこで、少し高いですが「電動鼻水吸い取り器」を購入しました。子育て仲間の友人のアドバイスをもらいつつ、機種を選定し下記を購入しました。

相変わらず娘は大泣きしますが、確実に素早く鼻水を吸い取ることができ、大活躍しました。

 

f:id:inajob:20201015152748p:plain


 

最大-75kPaと結構な吸引力で、鼻の奥にたまってしまった鼻水もずぞぞっと吸い取れます。分解して洗浄するのがちょっと面倒ですが、逆に考えると、細かい部品単位でばらばらにでき、細部まで洗浄することが出来るということです。

 

他にも似たような価格帯では以下のような鼻水吸い取り器があるようです。

自分が買ったやつが一番「メカメカしい」ですね。レビューなどを見る限り、吸い取る力はそこまで変わらず、メンテナンス性にちょっと違いがあるのかなといった所でした。

ピジョン 電動鼻吸い器

ピジョン 電動鼻吸い器

  • 発売日: 2018/08/24
  • メディア: Baby Product
 

参考にしたサイト: とある医師の買ったものを記すブログ - スマイルキュートとメルシーポットどっちを買うべき?比較論に答える https://www.a-certain-doctor.com/2019/03/mercipot-and-smilecute.html

 

粉薬どうやって飲むの?

小児科で処方していただいた薬は「粉薬」。これをどうやって飲ますのか・・

薬局で薬をもらう際に聞いたところ、「少しの水で練って頬っぺたの裏にくっつける」または「水で溶いてスポイトで飲ませる」のどちらかが良いとのことでした。

 

始めは「少しの水で練って頬っぺたの裏にくっつける」を実践しようとしたのですが、水が少しでも多いと、サラサラになってしまい、うまくできず、うまく団子状にできても、味が濃すぎて、口に入れた時に娘が非常に嫌がってしまいました。

 

ということでスポイトを購入して飲ませる作戦に切り替えました。この方法だと、口に入れた直後は嫌がるものの、初めの方法ほどは嫌がらずに飲み込んでくれました。

 

一安心。

 

もう少し月齢が進めば下のような、ゼリー状のオブラートが使えそうなので、次回があれば挑戦してみたいところです。

龍角散 おくすり飲めたね ぶどう 200g×5個

龍角散 おくすり飲めたね ぶどう 200g×5個

  • メディア: ヘルスケア&ケア用品
 

 

徐々に回復

幸いにして親は3日ほどで風邪の症状は回復しました。娘は結局2週間くらいかけて回復し、今では鼻水もまったく出なくなり元気になりました。

結局最後まで発熱することもなく、ひどくなることもなかったのでほっと胸をなでおろしました。

 

まとめ

初めてのことばかりで、ちょっと風邪を引くだけで、びくびくしているエンジニアパパですが、娘とともに親も一歩ずつ成長できています。

とはいえ、病気はなるべくしないでいて欲しいな、と思った一件でした。

CNCルーターの活用:基板の切削 「親バカ サンプラー」の作成

CNCルーターについて

さて、先日購入し、アクリルカットもできるようになったCNCルーターですが、今回は「回路」の掘削に挑戦してみました。

inajob.hatenablog.jp

inajob.hatenablog.jp

イデアから論理回路の作成

回路の作成は、プリント基板を作るときと同様です。

まずはアイデアを出し、ブレッドボードなどでプロトタイピングをしたのちに、回路図を書き起こすのが失敗を少なくするコツです。

今回作成するのは 「静電容量によるタッチセンサーを使ったmp3再生装置」です。

いわゆるサンプラーというDTM機器に近いものです。主な部品はATmega328とMP3再生モジュールであるDFPlayer Miniです。

まぁ、今回は掘削の話がメインなので、この辺は割愛して、、、 出来上がった論理回路図がこちらです。

f:id:inajob:20200922134413p:plain

左上がレギュレータ。右上にスピーカ端子。その下がDFPlayer Mini(フットプリントを新規に作るのが面倒だったので、ピンヘッダのフットプリントで代用)です。

 

左下に大きくあるのがArduinoのコアと同じATmega328、右下にあるのがタッチセンサーです。

配線図の作成

さて、これを基に配線図を作成します。回路規模も小さいのでテキトーに手で配線します。

プリント基板の場合は両面基板を良く作るのですが、今回は簡単に掘削できるように片面基板で作る事にします。

立体交差ができないため、配線図を作る際には工夫が必要です。

f:id:inajob:20200922134809p:plain

またデザインルールにも注意が必要です。CNCルータの性能により、このパラメータは様々ですが、今回は配線幅1mm クリアランス0.41mmにしました。

(後から考えるとクリアランスはもう少しあったほうが良かったです。)

 

静電容量タッチ用のPadは図形ポリゴンツールで描きました。

また、TO-92のようなパッケージはフットプリントのPadが近すぎて上記のデザインルールを見たさにため使うことができません。

f:id:inajob:20200922135229p:plain

https://akizukidenshi.com/catalog/g/gI-08973/

例えば上記のレギュレータのフットプリントは下記ですが、パッドが近すぎてうまく掘削できません。

f:id:inajob:20200922135415p:plain

今回はたまたま、パッドの間隔が広い部品しか使う必要がなかったので、特に工夫は不要でした。

掘削用データの作成

FlatCAMというソフトを使ってガーバーファイルを掘削用データであるgcodeに変換します。

細かい手順は下記サイトを参考にしました。

denshikousakusenka.jimdofree.com

注意する点としては左右反転が必要だということです。

f:id:inajob:20200922135726p:plain

また、Tool diaの設定より細い隙間掘削することはできないので、上記の図で水色の領域が正しく配線の間を分割しているかどうかを確認します。(クリアランスをTool diaより大きくしておけば基本的には問題ないはずです)

 

Tool diaの単位はインチで、掘削に利用するドリルの直径に設定しておきます。

またCut Zで基板表面からどれだけ深く基板を掘削するかを設定します。今回はTool diaは0.016、Cut Zは-0.002を設定しました。

 

ここまで出来たら、後は掘削するだけです。

AutoLevelの実行

と、アクリルのカットの場合はここから掘削するだけだったのですが、基板掘削の場合は、Z方向にかなりの精度が要求されます。今回の場合だと掘削時のZ方向の掘削幅は-0.002inchでおよそ-0.5mmです。

XY平面が平らでない場合は、基板の一部で回路を深く掘りすぎてパターンが途切れたり、浅く掘ってしまったがためにほかの配線とショートしてしまうなどの問題が起きていまします。

 

そこで、実際の基板が水平からどれだけずれているかを測定し、掘削時にその誤差分を補正することで、仮に基板がZ方向に斜めになっていても、うまく掘削できるようにする機能であるAutoLevelを利用します。

 

AutoLevelでの測定は、ドリルと基板にそれぞれ電極を取り付け、ゆっくりとドリルをZ方向に下げていき、ドリルと基板が接触したところをゼロ点として記録することを、格子の交点ごとに行い、対象物の形状を測定します。

f:id:inajob:20200922195021p:plain

基板データは今回のものとは違うけど、こんな感じに測定できます。

bCNCでは、このAutoLevelを実行することで、掘削用のgcodeをうまい具合に補正してくれます。

 

AutoLevelを利用するためには、まずドリルと基板に取り付ける電極が必要です。家にあるものでチャチャッと作り、CNCのメイン基板のA5端子とGND端子に取り付けます(写真の右下のProble(Probeの間違い?)という端子)。

f:id:inajob:20200922180208p:plain

f:id:inajob:20200922142605p:plain

https://www.aliexpress.com/item/4000264419927.html

実際のAutoLevelの使い方は下記2つのサイトを参考にしました。

Auto Level - 電子工作専科

martyworkshopdiary.blogspot.com

トラブル!!!

このAutolevel、素晴らしい仕組みなのですが、手順を間違えるとすぐにドリルを破損してしまいます。

いくつかのトラブル例を紹介します。

Probeつけ忘れ

Probe端子はワニ口クリップとなっており、ドリルと基板に取り付けますが、AutoLevel実行時、この端子が外れてしまっていると、AutoLevel機能はドリルと基板の接触を検知できません。

そのため、ドリルが基板に接触しているにもかかわらず、さらにドリルを下げ続けて、基板がゆがみ、ドリルは折れてしまいます。ステッピングモーターにも無理がかかってしまいます。

基板範囲の逸脱(バイスへの衝突)

AutoLevelはメッシュの交点を測定していくのですが、そのメッシュが測定対象の基板より大きい場合、様々な問題が発生します。

その1つがバイスへの衝突です。基板をステージに固定するために、バイス(万力)を使っているのですが、設定が間違っているとAutoLevelの測定中にドリルがこのバイスにぶつかってしまいます。

このトラブルでは、ドリルが折れ、破片が飛散するので危険です。また、モーターにも無理がかかってしまいます。

基板範囲の逸脱(捨て板へのめりこみ)

基板範囲の逸脱で起きるもう一つの問題が捨て板へのめり込みです。これはProbeつけ忘れと同様に、ドリルが捨て板にめり込んでしまい、折れてしまう事象です。

AutoLevel時、基板表面にドリルが接触すれば検知されるのですが、検査範囲が測定対象よりも広い場合は、基板表面に触れることなく捨て板にドリルがめり込みます。

 

AutoLevelの設定で最大下降幅を指定できるので、この値をうまく設定することで、このトラブルを防ぐことができます。

基板掘削・穴あけ

AutoLevelがうまく実行出来たらいよいよ基板の掘削です。

ここまでうまくできていれば、待つだけで基板は完成します。今回の基板の作成はおおよそ30分程度で完了しました。

 

f:id:inajob:20200922180318p:plain

基板掘削用ドリル

パターンの掘削が終わったら、最後にドリルでの穴あけを行います。これも15分程度で終わりました。

f:id:inajob:20200922180250p:plain

0.8mm穴開け用ドリル

回路パターン掘削用のドリルビットと、穴開け用のドリルが別の場合は、基板を固定したままで、ドリルを交換して、続きの作業を行います。

 

手元には0.8mmの穴開け用のドリルがあったのでこれを使いましたが、一般的なピンヘッダの直径は0.8mmちょうどで、ぴったり過ぎて、うまく挿入できませんでした、0.9mmか1mm程度の穴をあけるのがよさそうに思います。

 

今回は外形のカットは行わないので、ここまでで基板は完成です。

f:id:inajob:20200922180428p:plain

部品実装

f:id:inajob:20200922194132p:plainf:id:inajob:20200922194205p:plain

基板ができたので、部品を実装します。まぁプリント基板に部品を実装するのと同じですが、いくつか注意点があります。

  • 穴部分はスルーホール加工できていないので、ちょっとはんだ付けがやりづらい
  • ピンヘッダにQIコネクタなどを差し込む場合、銅箔と積層板の接着力でピンを保持することになり、簡単に基板からピンが外れてしまう(下の写真を参照)。
  • プリント基板と違いソルダーマスクが塗られていないので、意図しない配線にはんだが乗ってしまうことがある

まぁ、こんなところです。

f:id:inajob:20200922194357p:plain

この辺は掘削基板だけでなく、エッチングを使って作成した基板などでも同じ問題が起きると思います。

完成・プログラミング

部品が実装できれば基板は完成です。

次はプログラムを作成します。

 

静電容量タッチの検出にはADCTouchというライブラリを使っています。

github.com

下記はほとんどDFRobotDFPlayerMiniライブラリのサンプルそのままです。

6つのパッドをloopでスキャンすると、loopの実行間隔が長くなってしまい、サンプラーの醍醐味である「音源の先頭部分を繰り返し再生する」遊びができなくなってしまいます。また、タッチの反応速度も悪くなってしまいます。

この対策として、ADCTouch.readの第2引数をデフォルトの100から10に変更していることと、メインループのdelayを削除しているのが大きな変更点です。

 

(6つある変数を配列にすべきですね・・ とりあえず動いているのでこのままで・・)

 

#include <ADCTouch.h>
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;


int ref0, ref1, ref2, ref3, ref4, ref5;     //reference values to remove offset

void setup() 
{
    // No pins to setup, pins can still be used regularly, although it will affect readings

    Serial.begin(9600);

    ref0 = ADCTouch.read(A0, 500);    //create reference values to 
    ref1 = ADCTouch.read(A1, 500);    //account for the capacitance of the pad
    ref2 = ADCTouch.read(A2, 500);
    ref3 = ADCTouch.read(A3, 500);
    ref4 = ADCTouch.read(A4, 500);
    ref5 = ADCTouch.read(A5, 500);
    
    mySoftwareSerial.begin(9600);

    if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
      Serial.println(F("Unable to begin:"));
      Serial.println(F("1.Please recheck the connection!"));
      Serial.println(F("2.Please insert the SD card!"));
      while(true){
        delay(0); // Code to compatible with ESP8266 watch dog.
      }
    }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(15);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
} 

int trigger0 = 0;
int trigger1 = 0;
int trigger2 = 0;
int trigger3 = 0;
int trigger4 = 0;
int trigger5 = 0;

void loop() 
{
    int value0 = ADCTouch.read(A0,10);   //no second parameter
    int value1 = ADCTouch.read(A1,10);   //   --> 100 samples
    int value2 = ADCTouch.read(A2,10);
    int value3 = ADCTouch.read(A3,10);
    int value4 = ADCTouch.read(A4,10);
    int value5 = ADCTouch.read(A5,10);


    value0 -= ref0;       //remove offset
    value1 -= ref1;
    value2 -= ref2;
    value3 -= ref3;
    value4 -= ref4;
    value5 -= ref5;
    
    //Serial.print(value0 > 40);    //send (boolean) pressed or not pressed
    //Serial.print("\t");           //use if(value > threshold) to get the state of a button
    if(value0 > 40){
      if(trigger0 == 0){
        myDFPlayer.play(1);
      }
      trigger0 ++;
    }else{
      trigger0 = 0;
    }

    //Serial.print(value1 > 40);
    //Serial.print("\t\t");
    if(value1 > 40){
      if(trigger1 == 0){
        myDFPlayer.play(2);
      }
      trigger1 ++;
    }else{
      trigger1 = 0;
    }

    if(value2 > 40){
      if(trigger2 == 0){
        myDFPlayer.play(3);
      }
      trigger2 ++;
    }else{
      trigger2 = 0;
    }

    if(value3 > 40){
      if(trigger3 == 0){
        myDFPlayer.play(4);
      }
      trigger3 ++;
    }else{
      trigger3 = 0;
    }

    if(value4 > 40){
      if(trigger4 == 0){
        myDFPlayer.play(5);
      }
      trigger4 ++;
    }else{
      trigger4 = 0;
    }

    if(value5 > 40){
      if(trigger5 == 0){
        myDFPlayer.play(6);
      }
      trigger5 ++;
    }else{
      trigger5 = 0;
    }
    //Serial.print(value0);             //send actual reading
    //Serial.print("\t");
	
    //Serial.println(value1);
    //delay(100);
}

 

「親バカサンプラー」化

「静電容量によるタッチセンサーを使ったmp3再生装置」は、完成しました、後はDFPlayer Miniに挿入するSDカードに6つのmp3音源を入れるだけです。

 

一般的なサンプラーの場合は、ドラムセットのサンプリング音源を入れたりするのですが、今回は、かわいい我が娘(生後5か月)の声のmp3データを入れることにしました。

 

これにて「親バカサンプラーの完成です。

 

基板上の四角いパッドを連打すると、いい感じに我が娘の声が再生されます。

 

まとめ

ということで、CNCルーターで基板を作成し、実用的な(?)ガジェットを作る事ができました。

これでもうもじゃもじゃした配線と格闘することなくプロトタイピングを楽しむことができます。

 

ここでもう一度CNCルーターを使った基板作成の制限について列挙しておきます。

  • 基本的に片面基板しか作れない(両面基板も作れなくはないですが、位置合わせが大変そうです。スルーホールでもないし、viaも自分で打つ必要があります。)
  • デザインルールが厳しい。配線幅、クリアランスなど。
  • この程度の基板なら1時間以内で作れるが、大量に作るのは大変。

このように、CNCルーターを使った基板作成には、多くの制約が課されますが、それでも短時間でそこそこ複雑な回路を作る事ができるので、家でのプロトタイピングがはかどると感じました。

 

前回の記事ではアクリル板の切削、今回は基板の切削に挑戦しました。これにてCNCルーターを購入時に考えていた項目をすべて実現することができました。

どちらも期待通りの成果で、CNCルーターの購入により我が家でのプロトタイピングがさらにやりやすくなりました。

 

前回の記事でも書きましたが、良い買い物をしました!

この記事を読んでいる皆さんも、CNCルーター買いませんか?!

CNCルーターの活用:アクリル板の切削 CNCはレーザーカッターの代わりになるか?

CNCルータについて

さて、7月末に手に入れたこの「CNCルーターですが、コツコツと使い方をマスターしてきています。

今回紹介するのはアクリル板の切削です。

inajob.hatenablog.jp

モデルの作成

今回は私が作っているRakuChordのフロントパネルを作成します。

これは厚さ1mmの透明なアクリル板を材料としており、今まではレーザーカッターで作っていたものです。

f:id:inajob:20200921081400p:plain

このデータはOpenSCADで作成し、そこからSVGに変換してレーザーカットに使っていました。

今回はOpenSCADからDXFに変換します。

inajob.hatenablog.jp

DXFをCNCの加工のためのデータ形式であるgcodeに変換する必要がありますが・・ここではbCNCというソフトを使います。

github.com

DXFはカットしたい形状の輪郭線を表していますが、CNCで削るためにはドリルの径を考慮する必要があります。

 

DXFを読み込むとこのような感じです。

f:id:inajob:20200920214043p:plain

Profileツールを使ってドリルの径を考慮したエッジを生成します。

外形線は外側に少し大きめに、内側のくりぬく部分は内側に少し小さめにエッジを生成しています。(Dirctionの inside/outside を設定して上のProfileをクリックしていきます。)

他にもStockやMaterial、EndMillなども適切に指定する必要がありますが、ここでは割愛します。

詳しいところは下記を参考にして設定しました。

htlab.net

f:id:inajob:20200920214437p:plain

鋭角になっているくりぬきの部分は下図のように角っこでちょっと飛び出すような、面白い軌跡になります。

f:id:inajob:20200920214637p:plain

この軌跡を1回のパスでカットする場合はこれで良いのですが、少しずつ掘り下げながら数回パスでくりぬくためには「Cut」ツールを使います。(詳しくは上記記事を参照してください)

 

また加工の順序を編集し、外形線の掘削が一番最後になるように順序を変更しておきます。(外形線を先に掘削すると固定していたアクリル板が浮いてしまい内側を削るときに盛大にずれてしまうため)

 

さて、ここまで来たら実際の加工です。

アクリル板をステージに固定する

アクリル板をステージの上に置くのですが、ドリルがアクリル板を少し突き抜けて加工することになるので、加工したいアクリル板の下にいわゆる「捨て板」を配置する必要があります。

今回はスタイロフォームを捨て板に使いました。が、バイスでアクリル板を固定するときに圧力に負けてスタイロフォームが少し沈んでしまい、アクリル板が浮いてしまったので、もう少し固いものを捨て板にするのが良かったと思います。

(のちに木材を捨て板にするようにしました。)

f:id:inajob:20200921072157p:plain

(写真は加工した後のものです・・)

f:id:inajob:20200921081931p:plain

アクリル板が捨て板から浮いてしまうのを防ぐために、両面テープと養生テープで捨て板に固定しました。

アクリル板には保護シートが貼ってあったので、両面テープの「ねばねば」はアクリル板そのものには影響しません。

アクリル板を加工する

X,Y,Zの原点を適切な位置に調整して加工スタートです。後は待っているだけでアクリル板が指定した形状にくりぬかれます。

モーターの回転数や、ドリルの種類、ドリルの移動スピードなど、様々なパラメータにより加工精度は大きく変化します。今回も何度かパラメータを変更して挑戦してみましたが、まだまだ追い詰められていない感じです。

 

パラメータがまずいと、アクリル板が熱で溶けて切断面がガタガタになったり、アクリルを切断しきれていないのにドリルを移動してしまい、ドリルが折れてしまったりと、様々なトラブルが起きます。

 

Twitterでいろいろなアドバイスをいただいたので少し貼り付けておきます。もし同じようなことに挑戦しようとしている方の助けになれば幸いです。

 

ひとまず掘削完了・レーザーカットとの比較

まぁそんなこんなでアクリル板の掘削ができました。

エッジの部分がささくれているのがわかると思います。もう少しパラメータを攻めればさらにいい感じになると思います。

f:id:inajob:20200920221809p:plain

RakuChordに取り付けるとこんな感じ。いいね!

f:id:inajob:20200920221910p:plain

レーザーカッターで作ったものに比べると下記の点が気になりました

  • 加工したエッジ部分が鋭利なので、指でこすったりするとケガをしそう。(レーザーの場合は熱で溶けてちょうどいい感じに滑らかになります。
  • ドリルの歯が丸いのでとがった角のくりぬき加工ができない(今回は3mmのドリルを使ったので、くりぬき時は半径3㎜の丸い角となりました。)
  • 元データからドリル分のオフセットを指定する必要があり、やや面倒(レーザーはほとんど幅を持たないのであまり気にしたことがない)

まぁそのまま比べられるものではありませんが、これらの点に注意して加工すれば、CNCルーターでもレーザーカッターで行うようなアクリル板のくりぬき加工ができることが実証できました。

 

10枚20枚と大量に同じ形でくりぬく場合はレーザーカッターのほうが有利ですが、レーザーカッターは簡単にご家庭に導入できるものではありません。(最近いいくらいのサイズのレーザーカッターも出てきているようですが・・)

その点CNCルーターはレーザーカッターに比べると安価で、場所もそれほど取らないため、家で簡単にアクリル板の加工ができます

最終製品はレーザーで加工することを念頭に起きつつ、家でのプロトタイピングではCNCルーターで加工するというのが良い使い分けのように感じました。

 

特に昨今、コロナの影響で外に出ることがはばかられており、今ままで気軽に立ち寄っていた工作スペースへもちょっと行きづらい雰囲気です。そんな時におうちにCNCがあれば、サクッとプロトタイピングができて大変良いです。

いやぁ良い買い物をしたなと思っています。

 

最後に注意点

CNCルーターは結構大きな音がします、またドリルで削っているため、細かい粉塵のゴミが発生します。さらに折れたドリルや、素材の削りカスが結構な勢いで飛んできたりして危険なことがあります。これらの処理はご家庭にCNCルータを導入する際には大きな課題になると感じました。

我が家では下の写真のような「囲い」を作って、粉塵の飛散と危険な破片が飛び散るのを防いでいます。また動作時には「ゴーグル」を付けて目に危険な破片が飛んでくることを防止しています。

音については未対策で、動作中は部屋の扉を閉める、くらいしかやっていないので、ちょっとうるさいです。

本当は防音箱を作ってその中で動作させるのが良いと思います。

f:id:inajob:20200921092522p:plain

 もしこの記事を読んで、CNCルーターを買おうと考えている方は、これらの点に十分気を付けてください。

 

次回は・・?

さて、ここまででCNCを購入してやりたかった2つのことのうちの1つである「アクリル板のカット」をクリアしました。

もう一つの目的である「基板の掘削」についても書きました!こちらの記事もぜひ読んでみてください。

inajob.hatenablog.jp