目次


IoT 開発者のための 3D プリンティング

家庭用 3D プリンターの機能を探る

Comments

インターネットが出現して、ほぼ誰もが使えるデバイスから、ほぼどこからでもほぼすべての情報にアクセスできるようになりました。情報に対して起きたこの変化と同じことを、3D プリンティングは物理オブジェクトに対して実現すると期待されています。こうした期待の例に漏れず、3D プリンターは有用ではありますが、実際にはその誇大宣伝ほど優れたものではありません。そこで、この記事では比較的手ごろな価格の 3D プリンターで実際にできること、できないこと、そしてこの新しいテクノロジーを最大限に利用する方法を紹介します。

3D プリンターの用途

3D プリンターの一般的な用途は、静止したプラスチックの立体造形物をプリントすることです。それほど画期的なことには思えませんが、使用ケースはいろいろとあります。

  • IoT コンテナー。通常、モノのインターネット (IoT) デバイスは壊れやすい電子回路ですが、IoT デバイスが使用される環境は、こうした電子回路向けに意図されたものではありません (例えば、このリンク先のチュートリアルで説明している干し草の納屋など)。3D プリンターを使用すれば、IoT デバイス用のコンテナーをカスタマイズしてプリントできます。この納屋のチュートリアルでは、NodeMCU を DHT11 に接続して使用していますが、この NodeMCU を収容するのに、3D プリンターでプリントしたコンテナー筐体を利用できます。

  • 3D データを固形にして表示。例えば以下に示すオブジェクトを使用すれば、数学の教師は極大値、極小値、鞍点の違いを説明できます。

    3D データを固体の形にして表示`
  • 可動部。次の 2 つの方法で可動部を作成できます。

    • 複数のパーツをプリントして 1 つに組み立てます (例: IBM TJBot)。
    • 中が空洞の造形物をプリントし、その空洞から飛び出すには大きすぎる一方、空洞内で運動の自由があるサイズのオブジェクトをそこに入れます (例: 赤ちゃん用のおもちゃ)。

Thingiverse3DShare のサイト上で必要なものが見つからなければ、いつでも自分で独自にデザインできます。私のお気に入りのデザイン・プラットフォームは OpenJSCAD です。

OpenJSCAD を使用してプリント対象の造形物を独自にデザインする

世間に出回っている 3D デザイン・プログラムはいくつかありますが、これらのプログラムを使用してコンテナーを作成する場合、コンテナー内に形状を収容するための調整がかなり必要になります。私はプログラマーです。思い通りにしたければ、コードを作成します。私が最も使いやすいと思うシステムは OpenJSCAD です。OpenJSCAD では、Web ブラウザー上で JavaScript コードを作成した後、STL ファイルをダウンロードしてプリントできます。

基本的な形状

OpenJSCAD の基本エンティティーは形状です。最も単純なプログラムは、単一の 3D オブジェクト (例えば、底面が長方形の角柱)を作成して返します。

function main () {

cube 関数は、立方体または底面が長方形の角柱を作成します。size パラメーターには、単一の数値 (3 つの側面が等しい立方体の場合) または 3 つの数値からなる配列 (側面の長さが異なる長方形の角柱) のいずれかを指定できます。

    return cube({size: [10, 5, 1]});
}

形状を変換して組み合わせる

形状を変換するには、さまざまな方法があります。例えば、形状を変換 (移動)回転拡大/縮小することができます。複数の形状の結合体を作成して、形状の交点 (共通する点) を計算したり、ある形状と別の形状との差異 (最初の形状にしか含まれない点) を見つけたりすることもできます。これらの方法を組み合わせることで、さらに複雑な形状を作成できます。

例えば、このリンク先のページに記載されているプログラムを使用すると、NodeMCU 開発ボード用のボックスを作成できます。

このプログラムに必要な構成パラメーターは 3 つあります。具体的には、デバイスのサイズ (このリンク先のページを参照)、NodeMCU デバイスを無理なくボックスに収容するための空間の余白、ボックスの壁の幅です。

const devSize = [49, 24.5, 13];
const margin = 3;
const wallWidth = 10;

function main () {

デバイスを収容する空洞の各次元のサイズは、物理デバイスのサイズに余白の 2 倍を足したサイズになります。

const holeSize = devSize.map(l => l+2*margin);

一方、ボックス全体のサイズは次元の間で違いがあります。x 軸と y 軸の次元には、2 つの壁があります (デバイスの側面ごとに 1 つ)。z 軸の次元には 1 つの壁、つまり床面しかありません。デバイスを入れるための開口部が必要だからです。

const boxSize = [
  holeSize[0]+2*wallWidth,
  holeSize[1]+2*wallWidth,
  holeSize[2]+wallWidth,
];

cube 関数を使用するときは、角の位置を (0,0,0) に設定して長方形の角柱を作成します。ボックス全体を作成する場合は、これで問題ありません。角はどの位置にでも設定できます。けれども、内部の空洞の角については、各次元のゼロ位置から 1 つの wallWidth 分だけ離れた位置に設定する必要があります。こうすると、空洞が中央に位置することになり、すべての壁が同じ幅になります。

const box = cube({size: boxSize});
const hole = cube({size:holeSize}).
  translate([wallWidth, wallWidth, wallWidth]);

完成版のボックスは、ボックス全体から、デバイスを入れるための開口部を取り除いた形になります。

const completeBox = difference(box, hole);

OpenJSCAD は、いくつかの特化されたライブラリーを揃えた JavaScript です。OpenJSCAD は main 関数を実行し、この関数から作成された形状が返されることを期待します。

    return completeBox;
}

より有用な例

上述のプログラムで作成したボックスは、それほど有用なものではありません。このボックスには、NodeMCU の電源として必要な microUSB コネクターを通す穴がありません。

microUSB コネクターを通す穴が必要です`
microUSB コネクターを通す穴が必要です`

Wikipedia によると、この microUSB コネクターのサイズは 6.8 x 1.8 mm となっています。けれども、この数値をそのまま使用するには問題があります。

  • 安価な 3D プリンターは 100 パーセント正確とは言えないからです。コネクターを通せるだけの穴にするためには、少々大きめに穴をデザインする必要があります。
  • microUSB コネクターには一般にプラスチック製のハンドルが付いているため、ハンドルを含めるとコネクターのサイズは実寸よりも大きくなります。ハンドルもボックス内に収めなければなりません。

穴の直径を 15mm にするほうが理にかなっていますが、ただ大きくするだけでは別の問題が生じます。それは、NodeMCU をボックス内に収容した後、microUSB コネクターを接続するのが難しくなることです (正しい接続箇所に届きにくくなるため)。ケーブルを穴から通して NodeMCU に接続し、その状態の NodeMCU を所定の位置に配置するとしても、また別の問題が生じます。なぜなら、その状態ではボックス内に収まらないからです。

幅 15mm の穴から通した microUSB`
幅 15mm の穴から通した microUSB`

環境内にどれだけの埃があるかによっては、ボックスの上端にかけて microUSB コネクター用のスロットを設けることで、この問題を解決できます (このリンク先のページに記載されているプログラムを参照)。また、ほとんどの NodeMCU IoT デバイスは NodeMCU ピンにアクセスする必要があります。このニーズを満たすのに最も簡単な方法は、ピンが上向きになるように NodeMCU デバイスを逆さにすることです。

ピンを上向きにします`
ピンを上向きにします`

形状に関する制約事項

3D プリンティングでは、層を 1 つずつ積み重ねていくことによってオブジェクトを作成します。この積層方式のプロセスは時間がかかるだけでなく、プリントできる形状も制約を受けます。プリント・ジョブが完了すれば、オブジェクト全体ですべての層を支えられるとしても、支えがない時点で層をプリントすることはできません。したがって、次のような形状はプリント不可能です (現在の向きではプリントできませんが、回転させればプリント可能になります)。

プリントできない形状`

積層方式に関連する問題としては、ほぼ水平の角度も挙げられます。こうした角度をプリントしようとすると、プロセスのある時点で非常に薄い層で比較的重い材質を支えることになります。次の図に示す形状のように、垂直に対する角度が 45 度を超えると、通常はプリントできません。

垂直に対する角度が 45 度を超えるとプリントできません`

この通則には 1 つの例外があります。それは、橋、つまり 2 つの縦方向の要素を短い横方向の要素でつなげた形状です。プリント中、横方向の要素は両側から支えられるため、長すぎない橋であればプリントできます。

長すぎない橋はプリントできます`

大抵の 3D プリント・プログラムには、プリントできないような形状でもプリントできるよう、オブジェクトに支えを追加する機能が備わっています (FlashForge の FlashPrint による例を参照)。ただし、このような支えを使用する場合は、後から手作業で支えを取り除かなければならないことになります。それよりも、最初から支えが必要にならない形状をデザインできるようになるほうが遥かに賢明です。

支えを追加してオブジェクトをプリント可能にします`

蓋付きの NodeMCU ボックスを 3D でプリントする

どのような形状に対応できるのかがわかっていれば、さらに有用な、蓋付きの NodeMCU ボックスをデザインできます。このリンク先のプログラムを使用してください。

蓋は別個の要素としてプリントします。それには、次の 2 つの理由があります。

  • NodeMCU を入れるために蓋を開けられるようでなければなりません。
  • 蓋の幅は少なくとも NodeMCU の幅と同じ 24.5 mm (ほぼ 1 インチ) にする必要がありますが、両端にかけるには、これでは長すぎます。
蓋は別個の要素としてプリントする必要があります`
蓋は別個の要素としてプリントする必要があります`

蓋には、NodeMCU に接続するケーブル用の 2 つのスロットがあります。これらのケーブルには NodeMCU ピンに接続するメス端子とブレッドボードに接続するオス端子が付いています。

蓋には NodeMCU に接続するケーブル用に 2 つのスロットがあります`
蓋には NodeMCU に接続するケーブル用に 2 つのスロットがあります`
ケーブルには NodeMCU ピンに接続するメス端子とブレッドボードに接続するオス端子が付いています`
ケーブルには NodeMCU ピンに接続するメス端子とブレッドボードに接続するオス端子が付いています`

別の特徴として、蓋には、ボックス本体の側壁の突起部にはめ込むためのくぼみがあります。これらのくぼみによって、蓋をボックスの上部に直接取り付けられるようにする一方で、蓋が大幅にずれないようにします。くぼみの断面は三角形になっています。これは、一般消費者向け 3D プリンターのプリント精度はそれほど優れていないためです。くぼみの断面を矩形にして、それが側壁の突起部と完全に一致しなければ、蓋がずれるだけの余裕ができてしまうか、まったく蓋がはまらないかのいずれかになります。断面が三角形のくぼみであれば、正確に一致しなくても、少々力を入れれば蓋をはめ込むことができます。

蓋のくぼみには矩形の切り欠き部分があります。矩形であることから、蓋を押し込んだり外したりするには多少の力が必要です。けれどもほんの小さいものなので、それほど力を入れる必要はありません。それでも、蓋を所定の場所に維持するのに役立ちます。

蓋のくぼみの矩形の切り欠き部分`

プログラムでどのように蓋のくぼみを作成するか説明しましょう。

蓋のくぼみの矩形の切り欠き部分`

最初のステップとして、長方形の角柱を作成し、それを X 軸を中心に 45 度回転させます。Y 軸と Z 軸の次元は slotSize/Math.sqrt(2) であるため、対角線そのものが slotSize となります。

const slotPrecursor = cube({size: [boxSize[0],
  slotSize/Math.sqrt(2), slotSize/Math.sqrt(2)]}).
rotateX(45).
回転後の長方形の角柱`

OpenJSCAD が形状を拡大/縮小するときは、[0,0,0] 座標を中心に拡大/縮小します。ここで必要となるのは高さを増やすことです。それには最も簡単な方法として、X 軸が中心になるように角柱を移動します。

translate([0,slotSize/2,-slotSize/2]).
回転後の長方形の角柱`

くぼみの上端の角度を 90 度未満にするために、Z 軸上でくぼみに相当する部分を拡大/縮小します。

scale([1, 1, slotHeightFactor]);

くぼみの断面を矩形ではなく三角形にするには、立方体を作成し、Z 軸と交差させて Z=0 平面の上部だけを残します。これによって、三角形の下半分が取り除かれます。

const zAbove0 = cube({size: [200, 200, 200]}).
translate([-100,-100,0]);
回転後の長方形の角柱`

両側面のくぼみに適切なサイズと向きのスロットは、次のとおりです。

const slot = intersection(slotPrecursor,
  zAbove0).translate([0, (wallWidth-slotSize)/2 ,0]);

後方のくぼみは Z 軸を中心に 90 度回転させて、ボックスのサイズに合わせて (X 軸ではなく) Y 軸上で拡大/縮小する必要があります。

const backSlot = slot.rotateZ(90).
  translate([boxSize[0],0,0]).
  scale([1,boxSize[1]/boxSize[0],1]);

前方のくぼみも後方のものと同様ですが、USB コネクター用の部分を取り除く必要があります。

const frontSlot = difference(
 backSlot.translate([-boxSize[0]+wallWidth,0,0]),
 usbHole.translate([0,0,-20]));
USB コネクター用に一部取り除かれます`
USB コネクター用に一部取り除かれます`

すべてのくぼみ部分が利用できるようになると、プログラムは union 関数を使用して、これらの部分を 1 つに組み立てます。

const slots = union(slot,
  slot.translate([0, boxSize[1]-wallWidth, 0]),
  backSlot,
  frontSlot);
union 関数ですべてのくぼみ部分を 1 つに組み立てます`

くぼみが完成したら、ボックスに追加して完成版のボックスを仕上げます。

const completeBox = union(noSlotBox,
  slots.translate([0,0,boxSize[2]]));
完成版のボックス`

さらに、蓋からくぼみ部分 (およびケーブル用のスロット) を取り除いて蓋を仕上げます。

    const top = cube({size: [boxSize[0], boxSize[1],
    wallWidth]});

    const wireHole = cube({size: wireHoleSize}).
        translate([(boxSize[0]-wireHoleSize[0])/2,0,0]);

    const wireHoles = union(wireHole.translate([0,wallWidth,0]),
wireHole.translate([0,boxSize[1]-wallWidth-wireHoleSize[1],0]));

    const completeTop = difference(top,
        slots.rotateY(180).translate([boxSize[0],0,wallWidth]),
        wireHoles);

プリント・サイズと接着剤

3D プリントの材料 (大抵は PLA) は、プリントヘッドから押し出される液体で、温度が低くなると粘着性が出てきます。沈着すると、その下の層または (最下位層の場合は) プリントベッドにくっつきます。ただし、これはプリントヘッドにもくっつきます。プリントしているアイテムのサイズが小さいと、最下位層とプリントヘッドとの接着力がプリントベッドとの接着力よりも強くなって、最下位層が所定の位置からずれてしまう可能性があります。この問題を回避するには、プリント・ジョブを開始する前にプリントベッドに弱接着剤を塗布するという方法があります。弱接着剤であれば、プリントが完了した後にバター・ナイフを使ってプリント済みのオブジェクトから剥がずことができます。

まとめ

3D プリンターのスキルは、読んで学ぶよりも、実際に自分でオブジェクトを作成するほうが簡単に習得できます。そうとは言え、この記事が手頃な価格の 3D プリンターに投資するだけの好奇心を刺激し、3D プリンティングを開始する際に必要となる情報を十分に提供できたことを願います。


ダウンロード可能なリソース


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Internet of Things, Cloud computing
ArticleID=1066247
ArticleTitle=IoT 開発者のための 3D プリンティング
publish-date=07122019