PHPプログラムで制御する3Dプリンタ入門

第1回PHPで簡単!3Dプリンタ出力ファイルの作り方

はじめに

さっそくですが、写真1をご覧ください。これは筆者が試作中の片手入力キーボードです。このキーはジョイスティック構造になっていて、4方向に倒して入力できるほか、押し込むこともできます。カーソルで項目を選び、押し込んで決定、という使い方をするスイッチです。このスイッチをキーボードに使うことで、キーの数を1/5に減らしてみようという目論みです。

写真1 試作品の片手入力キーボード
写真1 試作品の片手入力キーボード

しかし、これには問題がありました。基板までは作ったのですが、このスイッチに合うキートップが市販されていないのです。軸径が合わないだけでなく、高速入力を考えると指が触れる面の形状もいろいろ試す必要が出てきます。展示会などで業者さんに聞いてみたことはありますが、20個ほど作るのに何十万もかかるということで、どうやって実現するか悩んでいました。

東京 渋谷に、FabCafeというお店があります。レーザー加工機をホビー用途の人が利用できるので、ご存じの方もいらっしゃるかも知れません。このFabCafeに3Dプリンタが入ったというニュースを、知人から教えてもらいました。このお店にデータを持ちこめば、立体を出力してくれるわけです。

でも、データをどうやって作ればいいでしょうか。ネットカフェでフリーのデザインツールを片っぱしから試してみましたが、どれを使ってもこのキートップを作ることができませんでした。特に重要なのは中心の穴です。3Dプリンタは、樹脂の広がりによって多少の誤差が出ます。軸径は仕様では3.2mmとなっていますが、0.1mm単位で変えたものをいくつか作る必要があります。

そこでPHPの出番です。3Dプリンタで使われるSTLというデータ形式は、テキストファイルで構造も簡単です。これをPHP(などのプログラミング言語)で出力してあげれば、FabCafeなどで出力できることになります。寸法を0.1mmずつ変えたバージョンをいくつも作るなどの作業は、プログラムを使えば朝飯前です。こうしてプログラムを作り、FabCafeで出力してもらったのが冒頭の写真というわけです。

前置きが長くなりましたが、この連載では3DデータをPHPで出力する方法を取り上げていきます。よろしくお付き合いください。

まず最初に、今回のPHPプログラムと、出力結果となるSTLファイルを以下からダウンロードしてください。解凍した中で「casepanel.php」がこれから説明するプログラム、⁠casepanel.stl」がPHPによって生成されるSTLファイル、⁠keytop.php」が後半説明するキートップ作成プログラム、⁠keytop.stl」が生成されたキートップのSTLファイルになります。

基本的な使い方

ではさっそく簡単な形状を例にして、PHPライブラリの使い方を説明しましょう。リスト1が上記の「casepanel.php」で最後にライブラリを呼び出している部分です。順に説明します。

リスト1 基本的な立体を作るプログラム(一部)
$s0 =& new stl_solid();
print $s0->output(1);

$a =& $s0->addpoint(0, 0, 0);
$b =& $s0->addpoint(51, 0, 0);
$c =& $s0->addpoint(51, 23, 0);
$d =& $s0->addpoint(0, 23, 0);

$a->moveadd(0, 0, 1.2);
$b->moveadd(0, 0, 1.2);
$c->moveadd(0, 0, 1.2);
$d->moveadd(0, 0, 1.2);

$a->moveadd(2, 1.5, 0);
$b->moveadd(-2, 1.5, 0);
$c->moveadd(-2, -1.5, 0);
$d->moveadd(2, -1.5, 0);

$a->moveadd(0, 0, 1.2);
$b->moveadd(0, 0, 1.2);
$c->moveadd(0, 0, 1.2);
$d->moveadd(0, 0, 1.2);

print $s0->output();
print $s0->output(2);

まず$s0->output(1)は、ファイルのヘッダ部を出力します。同様に$s0->output(2)はファイルのフッタ部を出力します。

実際のデータは、最初に底面の定義から始まります。$s0->addpoint()を繰り返し呼んで、底面の多角形を定義します。今回は長方形ですので、4つの点を登録します図1⁠。addpoint()を呼ぶと、あとでこの点を動かして立体にするのに必要なオブジェクトが返りますので、変数に入れておきます。

図1 底面の登録
図1 底面の登録

これだけでは平面にしかなりません。そこで「厚み」を持たせます。具体的には、先ほど登録した4つの点を、上に1.2mm動かします図2⁠。絶対座標を指定する場合はmoveto()を、相対座標で指定する場合はmoveadd()を使用します。なお、今回のライブラリでは、必ず底面から見てz座標が増える向きに進める必要がありますので、ご注意ください。

図2 厚みを作る
図2 厚みを作る

単に垂直に動かすだけでなく、水平に動かすこともできます。次回で解説しますが、今回のような3Dプリンタでは、上を大きくするのは制限があります。そこで、4点とも内側に寄せてみましょう図3⁠。

図3 内側に寄せる
図3 内側に寄せる

最後に、もう一度上に1.2mm動かして完成です図4⁠。これを$s0->output()で出力します。こうすることで、寸法の決まった立体をプログラムで作ることができます。

図4 もう一度厚みを作る
図4 もう一度厚みを作る

ちなみにこの立体は、電子工作で使うプラスチックケースのパネルです写真2⁠。もちろん、穴の開いていないパネルを買ってきてドリルや糸鋸で穴を開けてもいいわけですが、切屑が飛び散るのが好ましくない場合もあるでしょう。今回のプログラムをベースに、穴を入力してあげれば、はじめから穴の開いたパネルができるというわけです。

写真2 ケースとパネル
写真2 ケースとパネル

このプログラムを使うときは、コマンドラインから

php casepanel.php > casepanel.stl

のように入力して、ファイルにリダイレクトしてください。この例では、casepanel.stlにSTLファイルが出力されます。

では、続いて穴の作り方を見ていきましょう。

穴のある立体

穴を開けるには、図5のようにします。つまり、凹の形にして座標をぴったり合わせ、閉じてしまうわけです。

図5 穴を開ける方法
図5 穴を開ける方法

こうすると、穴の部分に渡るための「橋」ができます。このライブラリでは、同じ線を往復した場合、相殺されて残らないようになっています(実際にはもう少し複雑です⁠⁠。また、このような点を合わせたまま移動する機能もあります。

たとえば図6の場合、まず$a~$dは前回と同じですが、そのあと$aの座標に戻るので、$a->addchild()を呼びます。これで$dの次の点として$aと同じ座標の点が作られます。しかも$aを動かすと、この点も自動的に同じ座標に移動します。

図6 外枠の登録
図6 外枠の登録

そのあとは$e~$hを入力します。$a~$dは左まわりだったのに対して、$e~$hは右まわりになっていることに注意してください。これは、線を交差させないためです。最後に$e->addchild()を呼んで、底面は完了です図7⁠。

図7 ⁠穴」の登録
図7 「穴」の登録

続いて、中心部の穴を3mm持ち上げますが、今回使用するタイプの3Dプリンタでは、底面が広がりやすいという性質があります。これは、テーブルとノズルの間隔に誤差が出やすく、ノズルから出たプラスチックがテーブルに押しつけられて広がってしまうことがあるためです。

また、出力を開始するときに固まったプラスチックがくっついたりすることもあります。そこで、底面の段階で穴を0.5mm広げておき、これを1mmかけて本来の寸法に戻すようにしましょう図8⁠。

図8 窄める
図8 窄める

そして、あと2mm垂直に持ち上げて、合計3mmとなります図9⁠。

図9 持ち上げる
図9 持ち上げる

これ以上軸が入らないよう、さらに0.5mmすぼめて完了です図10⁠。

図10 もう一度窄める
図10 もう一度窄める

最後に、外枠を持ち上げます図11⁠。内側は合計で4mm持ち上げたので、外枠は5mm持ち上げることにします。

図11 外枠を持ち上げる
図11 外枠を持ち上げる

こうすると、底面は水平でしたが上面はくぼんだ形となり、ちょうどキートップ状になります図12⁠。なお、底面や上面が平らでない場合、ライブラリが適当に平面に分割することになります。

図12 完成品の外観
図12 完成品の外観

さて、このまま出力すると、1つ問題があります。冒頭に書いたように、このタイプの3Dプリンタには誤差があります。今回は軸の太さが3.2mmですが、入らない場合は太さを変えて試さなくてはなりません。もちろん、プログラムを修正して太さを変えてもいいのですが、せっかくですから太さの異なるものを一列に並べ、まとめて出力することにしましょう。

1つのファイルに、複数の(つながっていない)立体を出力するには、先ほどの処理を繰り返せばOKです。具体的には最初にヘッダを出力し、新しいオブジェクトを作って何度も出力して、最後にフッタを出力します。ヘッダとフッタは固定文字列ですので、どのオブジェクトを使って出力しても構いません。

こうしてできたのがリスト2です。$xと$yを使って位置を変えながら出力しています。

リスト2
$s0 =& new stl_solid();
print $s0->output(1);

for ($i=0; $i<5; $i++) {
        $s0 =& new stl_solid();
        
        $x = $i * 12;
        $y = 0;
        $w = (3.2 + $i * 0.1) / 2 + 0.5;
        
        $a =& $s0->addpoint($x - 5, $y - 5, 0);
        $b =& $s0->addpoint($x + 5, $y - 5, 0);
        $c =& $s0->addpoint($x + 5, $y + 5, 0);
        $d =& $s0->addpoint($x - 5, $y + 5, 0);
        $a->addchild();
        $e =& $s0->addpoint($x - $w, $y - $w, 0);
        $f =& $s0->addpoint($x - $w, $y + $w, 0);
        $g =& $s0->addpoint($x + $w, $y + $w, 0);
        $h =& $s0->addpoint($x + $w, $y - $w, 0);
        $e->addchild();
        
        $e->moveadd(0.5, 0.5, 1);
        $f->moveadd(0.5, -0.5, 1);
        $g->moveadd(-0.5, -0.5, 1);
        $h->moveadd(-0.5, 0.5, 1);
        
        $e->moveadd(0, 0, 2);
        $f->moveadd(0, 0, 2);
        $g->moveadd(0, 0, 2);
        $h->moveadd(0, 0, 2);
        
        $e->moveadd(0.5, 0.5, 1);
        $f->moveadd(0.5, -0.5, 1);
        $g->moveadd(-0.5, -0.5, 1);
        $h->moveadd(-0.5, 0.5, 1);
        
        $a->moveadd(0, 0, 5);
        $b->moveadd(0, 0, 5);
        $c->moveadd(0, 0, 5);
        $d->moveadd(0, 0, 5);
        
        print $s0->output();
}
print $s0->output(2);

出力すると写真3のようになります。

写真3 完成した片手キーボード キートップ部分
写真3 完成した片手キーボード キートップ部分

FabCafeの紹介

さて、ここまで読んでこられた読者の方の中には、3Dプリンタに興味はあっても、期待したような出力が得られるのか心配、という方もいらっしゃるのではないかと思います。実は筆者も、このキートップを作るときに、強度がどれくらいあるのか心配でした。そこで、このお店を紹介しようと思います。

FabCafeは、東京の渋谷にあるお店で、レーザーカッターや3Dプリンタを有料で使うことができます。曜日によってシステムが違うのですが、基本的には時間いくらの料金体系になっています。来店しないといけないので、関東に住んでいる人に限られてしまいますが、どんな出力が得られるのかや、どれくらい時間がかかるのかを実際に見てみたいという方にはおすすめです。

今回出力したSTLファイルは、上記のホームページに書いてある方法で変換できますし、有料の変換サービスを申し込んでお店で変換してもらうことも可能です。

ちなみに筆者は、先のキートップを出力したあと、3Dプリンタをたくさん使いそうだったので、自分で3Dプリンタ(のキット)を購入しました。使い方がまずくで故障してしまったのですが、このときも修理用の部品を出力するのにFabCafeを利用しました写真4⁠。

写真4 FabCafeで出力した3Dプリンタの代替部品
写真4 FabCafeで出力した3Dプリンタの代替部品

次回は、3Dプリンタでできることとできないこと、そしてその実例などをご紹介しようと思います。よろしくお願いします。

おすすめ記事

記事・ニュース一覧