Pc-Trace

<< 2024年4月 >>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30






Pc-Trace
PC-Trace

2016年11月の記事
11/30(水)
画像ファイルはありません 添付ファイルはありません
11/13(日)
画像ファイルがあります 添付ファイルがあります
11/03(木)
画像ファイルがあります 添付ファイルがあります
11/01(火)
画像ファイルがあります 添付ファイルはありません
11/01(火)
画像ファイルがあります 添付ファイルはありません
>>2016年11月の記事一覧

「Unity」復習中

暫く経つと全てが水の泡に。
いえ、私個人の記憶の話。

「Unity」・・復習しなければ。


無駄を嫌って2号機誕生。

組み立て途中の失敗を予見して、数多くプリントした予備のパーツ。
無駄にする事を嫌うと結果こうなる。

2号機を作る事にメリットがあるとすれば、1号機の欠点を改善して製作できる事。



どれほど細かい描写が出来るか気になるところなので、同じボールペンを使って紙にイラストしたものと比較してみた。

皮肉にも、何より目立ってしまったのがキーボードの汚れと、タマゴに描いたキャラクター。
個人の好みでは無く、ぬりえを希望した人からのリクエスト。(誤解なきよう。)


じっくり見なければ分からないほど、細かい描写も出来ている。


「EggBot」 SketchUp図面(本体のみ)

今回製作した「Eggbot」の本体フレーム
(Servoや、ネジ類、基板などを除く)
ソースを変更する事によって「Servo」を左右どちらにも取り付けられるように変更。
「Servo」を取り付けない片側には、そのネジ穴に「ペンアーム」と綴る、弱い「引っ張りバネ」を取り付ける。
(薄い殻のタマゴに0.1ミリなどの細いペンで描画した際、ペン先が殻に接触した瞬間、殻に穴を開けてしまう事があった。
現在はバネの代わりに、弱い力で、伸びの良い輪ゴムを利用している。)


製作する際は、3Dプリンターで印刷できるように各パーツを「stl」形式でエクスポートする必要がある。
フレーム本体を合板で作る場合、取り付け位置の芯を正確に合わす必要があるが、それほど難しい加工部分は無い。



今回は、ペンアームの昇降に既定のバネ(フィラメントをS字形にプリントしたもの)を利用せず、「Servo」に負担がかからないよう、持ち上げるだけの構造に変更してあり、そのためServoの取り付けが上下逆になる。

製作したハードの環境に合わせて、「Inkscape」の「context.py」を以下のように書き換えて利用したが、あくまで個人の環境に合わせて変更したものなので、規定のソースをそのまま利用する事が望ましい。
(※ペン交換時にアームが動かないよう、常に制動の効いた状態で停止する。)

添付したソースのルート(XPの場合)
C:\Program Files\Inkscape\share\extensions\unicorn

忘れがちなのが、ソース書き換え後に、前にコンパイルされていた同名の「pyc」ファイルを削除して「Inkscape」を再起動しなければ更新したソースの内容が反映されない事。
書き換えたソース(py)のコンパイル・ファイル(pyc)は、起動時に存在しなければ自動で生成される。

「context.py」
----------------------------------------------------------------from math import *
import sys

class GCodeContext:
def __init__(self, xy_feedrate, z_feedrate, start_delay, stop_delay, pen_up_angle, pen_down_angle, z_height, finished_height, x_home, y_home, register_pen, num_pages, continuous, file):
self.xy_feedrate = xy_feedrate
self.z_feedrate = z_feedrate
self.start_delay = start_delay
self.stop_delay = stop_delay
self.pen_up_angle = pen_up_angle
self.pen_down_angle = pen_down_angle
self.z_height = z_height
self.finished_height = finished_height
self.x_home = x_home
self.y_home = y_home
self.register_pen = register_pen
self.num_pages = num_pages
self.continuous = continuous
self.file = file

self.drawing = False
self.last = None

self.preamble = [
"(Scribbled version of %s @ %.2f)" % (self.file, self.xy_feedrate),
"( %s )" % " ".join(sys.argv),
"G21 (metric ftw)",
"G90 (absolute mode)",
"G92 X%.2f Y%.2f Z%.2f (you are here)" % (self.x_home, self.y_home, self.z_height),
""
]

self.postscript = [
"",
"(end of print job)",
"M300 S%0.2F (pen up)" % self.pen_up_angle,
"G4 P%d (wait %dms)" % (self.stop_delay, self.stop_delay),
"M300 S255 (turn off servo)",
"G1 X0 Y0 F%0.2F" % self.xy_feedrate,
"G1 Z%0.2F F%0.2F (go up to finished level)" % (self.finished_height, self.z_feedrate),
"G1 X%0.2F Y%0.2F F%0.2F (go home)" % (self.x_home, self.y_home, self.xy_feedrate),
"M300 S%0.2F (pen up)" % self.pen_up_angle,
"G4 P%d (wait %dms)" % (self.stop_delay, self.stop_delay),
" (M18 drives off)",
]

self.registration = [
"M300 S%d (pen down)" % (self.pen_down_angle),
"G4 P%d (wait %dms)" % (self.start_delay, self.start_delay),
"M300 S%d (pen up)" % (self.pen_up_angle),
"G4 P%d (wait %dms)" % (self.stop_delay, self.stop_delay),
"M18 (disengage drives)",
"M01 (Was registration test successful?)",
"M17 (engage drives if YES, and continue)",
""
]

self.sheet_header = [
"(start of sheet header)",
"G92 X%.2f Y%.2f Z%.2f (you are here)" % (self.x_home, self.y_home, self.z_height),
]
if self.register_pen == 'true':
self.sheet_header.extend(self.registration)
self.sheet_header.append("(end of sheet header)")

self.sheet_footer = [
"(Start of sheet footer.)",
"M300 S%d (pen up)" % (self.pen_up_angle),
"G4 P%d (wait %dms)" % (self.stop_delay, self.stop_delay),
"G91 (relative mode)",
"G0 Z15 F%0.2f" % (self.z_feedrate),
"G90 (absolute mode)",
"G0 X%0.2f Y%0.2f F%0.2f" % (self.x_home, self.y_home, self.xy_feedrate),
"M01 (Have you retrieved the print?)",
"(machine halts until 'okay')",
"G4 P%d (wait %dms)" % (self.start_delay, self.start_delay),
"G91 (relative mode)",
"G0 Z-15 F%0.2f (return to start position of current sheet)" % (self.z_feedrate),
"G0 Z-0.01 F%0.2f (move down one sheet)" % (self.z_feedrate),
"G90 (absolute mode)",
"M18 (disengage drives)",
"(End of sheet footer)",
]

self.loop_forever = [ "M30 (Plot again?)" ]

self.codes = []

def generate(self):
if self.continuous == 'true':
self.num_pages = 1

codesets = [self.preamble]
if (self.continuous == 'true' or self.num_pages > 1):
codesets.append(self.sheet_header)
elif self.register_pen == 'true':
codesets.append(self.registration)
codesets.append(self.codes)
if (self.continuous == 'true' or self.num_pages > 1):
codesets.append(self.sheet_footer)

if self.continuous == 'true':
codesets.append(self.loop_forever)
for codeset in codesets:
for line in codeset:
print line
else:
for p in range(0,self.num_pages):
for codeset in codesets:
for line in codeset:
print line
for line in self.postscript:
print line

def start(self):
self.codes.append("M300 S%0.2F (pen down)" % self.pen_down_angle)
self.codes.append("G4 P%d (wait %dms)" % (self.start_delay, self.start_delay))
self.drawing = True

def stop(self):
self.codes.append("M300 S%0.2F (pen up)" % self.pen_up_angle)
self.codes.append("G4 P%d (wait %dms)" % (self.stop_delay, self.stop_delay))
self.drawing = False

def go_to_point(self, x, y, stop=False):
if self.last == (x,y):
return
if stop:
return
else:
if self.drawing:
self.codes.append("M300 S%0.2F (pen up)" % self.pen_up_angle)
self.codes.append("G4 P%d (wait %dms)" % (self.stop_delay, self.stop_delay))
self.drawing = False
self.codes.append("G1 X%.2f Y%.2f F%.2f" % (x,y, self.xy_feedrate))
self.last = (x,y)

def draw_to_point(self, x, y, stop=False):
if self.last == (x,y):
return
if stop:
return
else:
if self.drawing == False:
self.codes.append("M300 S%0.2F (pen down)" % self.pen_up_angle)
self.codes.append("G4 P%d (wait %dms)" % (self.start_delay, self.start_delay))
self.drawing = True
self.codes.append("G1 X%0.2f Y%0.2f F%0.2f" % (x,y, self.xy_feedrate))
self.last = (x,y)
添付ファイル 添付ファイル


「EggBot」 備忘録2

連日、タマゴのお絵かきで何も書くことが無くなってしまった。
同じ絵を書いても、ペンの色を変えるだけで異なる雰囲気を出せるため、なかなか新しい図柄に取り組もうとしない、怠け癖も出てしまう。

【マットの上にテーブルを置いて撮影。タマゴの殻は吹けば飛ぶほど軽い】


【お絵かきのため、昨日と今日で消費したタマゴ。
そろそろ同じ図柄の出力にも飽きてきた。】


「Inkscape」で図柄を処理した後、「Spherebot_UI」か、「SphereBotSender」を使って出力する事の方が多くなると思うが、それぞれに特徴が出る。(OSを変えてテストしていないのでXP限定のレポートが、以下。)

「Spherebot_UI」で複雑な図柄をプロットすると、徐々にスピードが落ちて行き、やがて停止したかと錯覚するほど低速になってしまう。
そのため簡単な図柄は「Spherebot_UI」、複雑な図柄を「SphereBotSender」で書き出す事にしている。
「SphereBotSender」は1万行を超えるデータを出力しても一定の速度をキープしてプロット出来る。

ただ、「SphereBotSender」の場合、ファイルを開く動作でフリーズする事が多く、開いた途端に命令無しでプロットを開始する事もあり、操作に注意が必要。(あくまで個人のパソコン上での話。)
※ SphereBotSenderの添付ファイルは、Linux、Mac、Windowsの3種類を含む。

いずれのファイルもスタンドアローンで実行できる。



「SphereBotSender」を起動した直後の画面。
これ以上ないほどシンプル。

左側から順にボタンを押して操作していく。
(1)「PORT COM」で「Eggbot」を接続したCOMポートを指定。
(2)「SEND」ボタンを押してプロットするファイルを選択。
(3)「AGEIN」ボタンを押してプロットを実行。
(4)「ABORT」ボタンを押して作業を終了する。




「COM」ポートに接続されると、緑に変わる




「Spherebot_UI」を起動した直後の画面。
操作するためのスライドバーが表示され、Servoやステッピングモーターのテスト用としても使える。
(3Dプリンターを動かす場合、リミッターを接続しない状態では衝突に注意する必要がある。)


添付ファイル 添付ファイル


エッグスタンドと、タマゴの中身の押し出し

「Eggbot」でペイントした後に、上下に開けたpinの穴からタマゴの中身を抜く問題を身近なもので解決できた。

ペットボトルのキャップを利用し、任意のサイズ(今回は5ミリ)で穴を開け、水道用パッキン(Oリング)をカーペット用の両面テープで貼り付けるだけという、簡単なもの。

口を当てて吹き出すのと違い、楽に清潔に、早く中身を取り出す事が出来る。
タマゴの中身を取り出した後はボトルに水を入れ、殻内部の洗浄に使える。
取り出したタマゴの中身はそのまま料理にも使えるので、無駄にならない。

【すでに描画済みのエッグアート。美観上、上の穴だけ塞いである。】


【今後のエッグ・アート用に3Dプリントした「エッグ・スタンド」】

すぐに無くなりそうだが・・。



●タマゴの中身を押し出す、キャップの加工

【今回、ペットボトルのキャップに使用した水道用のパッキン】


【ペットボトルのキャップに穴を開け、「カーペットテープ」で貼り付けるだけ】


【飲み終わった後のペットボトルを洗浄し、製作したキャップを取り付けたら、穴を開けたタマゴに押し当て、圧力で押し出す】


【タマゴの中身を抜いて洗浄した後、上の穴をこれで塞ぐ。】

※ タマゴの殻内部を洗浄した後は下の穴だけ残し、残りの水分を時間をかけて抜く必要がある。(水分が完全に切れるまで2日くらいかかるが、ドライヤーを使うのも効果的)



【すでに数台のエッグボットが組み立て待機中】



「Inkscape」による、「Eggbot」用、カラー・データの分割出力

【サンプル・データ 伝統模様の出力】
ペンをセットするアーム テンション用のゴムの張り方が弱かったため、ペンの重さでモーターの振動と共振し、描画開始までバウンドを繰り返す。
描画に支障は無いのでそのまま実行!


これまで「Illustrator」を専用のDTPとして利用してきたが、「Eggbot」での描画は「Gcode」で生成して出力する必要があり、本腰を入れて「Inkscape」に着手。
(「Inkscape」の基本機能に「Eggbot」専用のテンプレートや「Gcode」生成に関する設定ダイアログは含まれていないため、別途インストール必要があるが、必要ファイルは前の記事にすべて添付した通り。)

馴染みが浅いため、「Illustrator」からの移行に少し手間取っているが、メニュー項目に大きな違いは無く、操作にそれほど違和感は無い。

「Eggbot」出力のための詳細が把握出来たところで、ペン交換によるカラーデータの出力を試してみた。
色ごとに分割したデータの書き出しは人手によりペンを交換して行うため、交換時に好きな色をセットできる。
※最後に出力する色データ以外、「Gcode」の最終行の"M18"コマンドを削除し、ステッピングモータに制動の効いた状態で次のデータを読み込むとペン交換時のズレが発生し難い

既にプロットしたタマゴが30個を越え、料理で使った後の殻に、一つ残らず文字や模様が入っていると言う異常事態。


【多少凸凹したタマゴの表面でも「エンドレス」な連鎖模様もスタートとエンドがピタリと一致するよう、個人の所有するハードウェア環境に合わせてソースの微調整が必要。】

個人的な感想として、「タマゴ」には幾何学模様が一番あっているような気がする。



【「Spherebot_UI」によるGcode出力の際、SVG形式での出力を併せて行う事により、「ビューウィンドウ」に画像が反映されるようである。】



「EggBot」 備忘録

「EggBot」の製作に当り、参考にしたサイト

「EggBot] Wiki
Evil Mad Scientist
http://wiki.evilmadscientist.com/The_Original_Egg-Bot_Kit

「EggBot」フレーム本体データ
http://www.thingiverse.com/thing:263668

The Original EggBot
http://egg-bot.com/

Arduino Software
https://www.arduino.cc/en/Main/Software

Arduino・ファームウェア(GitHub)
https://github.com/search?utf8=%E2%9C%93&q=eggbot+arduino

Inkscape Plugin
https://mijnpws.wordpress.com/arduino-simuleert-eibotboard-inkscape-plugin/

「Arduino UNO」用のファームウェアを「Aruduino mega2560」に書き換える際に参考にしたボードのpin画像





実体配線図を掲載したサイト
http://www.arduinopolska.cba.pl/projects/eggbot/eggbot.html



「Arduino UNO」を入手するまでの暫定的な措置として「3Dプリンター」用のボードを取り外し、ファームウェアを書き換えて利用。
因みに「Arduino」のWikiによると「EEPROM」の書き換えは10万回で寿命に達するらしい。

既に注文済みなので、入手後はギットハブで公開されているUNO用のファームウェアに戻す予定。
コストとスペースを最小限に抑える事が出来る。

再配布が可能なので、書き換え前の「Arduino」用オリジナルソースと、「Inkscape」のプラグインを添付。
添付ファイル 添付ファイル


「EggBot」 テスト・プリント

何とか手探りで完成できたものの、あまりに慌ただしい3日だったため、辿った履歴が何も記憶にございません!(^^;)

・・と、勝手な言い訳は置いといて、
60年以上も人生経験しておきながら、"3日で完成する" などと軽々しい発言はするものでは無い事を反省。

このままでは備忘録にならないので、後々整理して再掲載する予定。
【Inkscape】



【Inkscape】を通して出来たg-code



プロットの様子動画。位置は正確に再現されたようだ。
極細ペン先以上の解像度があるため、細かい部分は塗りつぶされてしまう。




【幾何学模様】


少し睡眠が必要・・・。


本体完成!

Servoを取り付けて、ピンポン玉まで対応出来るようにシャフトを長くして本体の完成!

タマゴのキャッチ部分は、一般水道用の13ミリOリングを貼り付けて使用。
シャフトを支えるベアリング部分は少しでも安定できるよう、ベアリング間にスペーサーを作って挟んだ。

上から


後ろから(ベアリング間が短いので、安定化を図るためスペーサーを挿入)


3Dプリンターの制御ボートを外して接続。(Arduino UNOを購入するまで一時的に利用)
使うのはX軸と、Y軸、Servo用の4番(mega2560+Ramps1.4の場合)端子


「Arduino UNO」のFirmwareは見つけたが、mega2560+ramps1.4でのFirmwareをいくら探しても見つける事が出来なかったため、UNOのソースを書き換えて使う事に。
一刻も早く動かしたいので、次はソースの作成!



「EggBot」 仮組み

色が色なだけに、前の写真には掲載しなかったテスト・プリント用のピンクのパーツで仮組みしてみた。(Servoはあと回し。)

ピンポン玉まで対応させるには8mmのボルトをもう少し長くしなければならない。

全体的にこんな感じ。
まだ随分と改善の余地がある。






「EggBot」のパーツは揃った!

初めて3Dプリンターを製作をした当時、幾度の設計変更で余っていたパーツ。

Servoだけ「Amazon」で追加購入してすべてが揃った。
もう、出来たも同然か?(また!・・逸る気持ちは抑えなければ失敗の原因に。)

固定する「ナット」は20個近く必要だが、撮影用に3個だけ。


定尺ボルトの中に一本だけ1mものの余りが混ざっているため長さが違う。
いずれにしても切り揃えるので問題は無い。

長いので写真の中に入れて無いが、べリングに通す「8mm」のボルトが必要。


一日目、Panel プリント完了

SketchUpでパーツの不安要素をすべて修正し、プリントが完了。



3Dプリンターを製作する過程で余っ材料のみで完成出来そうな予感がしてきた。

最終的に、ボードは 1000円程度で購入できる格安の 「Arduino UNO」 にする予定だが、せっかくなので購入前に現在利用中の3Dプリンターのものを一時的に付け替えてテストする予定。

この調子だと3日程度で完成する?・・かも。(楽観的)



パーツ・プリント中の画像。
絵かきマシンのテストプリントは、この3Dプリンターのボード(基板)をそのまま取り外して使う予定。

手持ちのベアリングのサイズに変更してプリント。