Eggbotは簡易CNCの一種で、PCでペンを制御して卵に絵を描く装置である。卵だけでなく、ゴルフボール等の球体に絵を描く事が出来る。
ソフトや作成用データは多数インターネットに転がっているが、幾つかポイントがあるのでメモしておく。
装置は3Dプリンターやレーザーカッターなどでパーツを作って綺麗に作成する事も出来るが、出来るだけ簡単・短時間に家にある材料だけで作成してみた。
必要なのは以下の通り。卵をモーターで回転させ、ペンの位置をモーターとサーボで動かす事が装置のポイント。理屈は簡単である。
- ステッピングモーター2つ
- サーボモーター1つ
- サインペン(油性マッキーが良さそう)
- ステッピングモーターを固定するフレーム
- ペン固定とサーボモーターで上下させる仕組み
- 卵を固定する仕組み
- Arduino本体
- CNCシールド(A4988をバラで組んでもOK)
大体の部分はざっくりで良いが、卵を回転させる所だけある程度精度を出しておく必要がある。卵が綺麗に回転しないと、途中で卵がズレたりして綺麗に絵が描けない。ペンはサーボで持ち上げるだけで、描くときは自重で下げている。
フレームはバルサ板で作成。適当に切ってサーボモーター取り付け位置に穴を空けて木工用ボンドで付けて釘で補強。
ペンホルダーも板と丁番、百円ショップの木製洗濯バサミで作成。丁番はぐらつきがあるとペンで描く際にペン先がブレるので、ぐらつきが少ないものを使う。丁番もサーボも強力両面テープで固定。洗濯バサミは片側だけ木工用ボンドで固定。
制御はArduino UNOの互換品と、CNCシールドとA4988モータードライバーを使用。
シールドはAmazonで2個セット850円(モータードライバーは付属しない)。
HiLetgo 2個セット V3 彫刻 シールド 3D プリンタ CNC 拡張ボード A4988 ドライバーボード Arduinoと互換
ステッピングモーターは12vで動作するので12vを給電する必要があるが、ネジターミナルに電源線を固定するのは面倒なので12vのACアダプターをArduino本体側に挿して動かせる様、シールド上のVINピンからネジターミナルの+に繋いだ。
ステッピングモーターはX軸とY軸を使用。サーボモーターは5V/GNDと、X+のエンドスイッチ用ピンに接続する。配線はこれだけである。
卵を抑える部分だけは正確に作成しておく必要がある。卵が落ちない様に、綺麗に回転する必要がある。この部分だけ3Dプリンターで作成した。
反対側の卵抑えはアルミ棒とベアリング、ワッシャー、バネを使用。バネはホームセンターで売っている。
組み上げて最初にハニカム図形を描いてみた所、見事に失敗した。
卵やペンがしっかり固定されていないと、回転中卵やペン先がブレたりズレたりして上記の様にダメダメな出力になってしまう。
モーターの反対側の抑えの軸を板の両側にベアリングで固定し、しっかりモーター側の軸と合わせ、卵もズレない様に少しクッション性のある両面テープを手でベタベタ触って粘着性を落として(粘着性が高いと卵を外す際カラが壊れる)付けた。
全部組み上げるとこんな感じになった。
精度はいまいちで端の方の線がゆがんだりかぶったりしてしまっているが、おもちゃとしてはとりあえず満足だ。
動いている様子を動画にまとめてみた。
さて、ソフト側の説明。
Arduinoで組む場合色々なスケッチが出てくるが、今回下記スケッチをベースにした。
https://github.com/cocktailyogi/EggDuino
まず、このままだとビルドエラーが発生するのですべての「void inline」を「inline void」に置換する。そして、ピン定義をCNCシールドのピンに変更する。
//Rotational Stepper:
#define step1 2
#define dir1 5
#define enableRotMotor 8
#define rotMicrostep 16 //MicrostepMode, only 1,2,4,8,16 allowed, because of Integer-Math in this Sketch
//Pen Stepper:
#define step2 3
#define dir2 6
#define enablePenMotor 8
#define penMicrostep 16 //MicrostepMode, only 1,2,4,8,16 allowed, because of Integer-Math in this Sketch
#define servoPin 9
ArduinoのスケッチはこれでOK。
印刷データの生成と出力はPCから行う。inkscapeと言うフリーのドローソフトにエクステンション(拡張プラグイン)をインストールする。Windowsの場合、inkscape 0.92.4をインストール後下記ページからダウンロードできる「EggBot_281_r1.exe」を実行するだけ。
https://wiki.evilmadscientist.com/Installing_software
このままではエクステンションが上手く動かないので、エクステンションのスクリプトを少し修正する。
エクステンションのファイルは下記フォルダーに入っている。
C:\Program Files\Inkscape\share\extensions
修正するのは ebb_serial.py のファイル。シリアルポートの認識の処理を少し修正する。ポート認識の名称の EiBotBoard を Arduino に、USBのIDを 04D8:FD92 から 2341:0043 に修正する。また、testPortのタイムアウトを1秒から4秒程度に増やしておく。
def findPort():
# Find first available Arduino by searching USB ports.
# Return serial port object.
try:
from serial.tools.list_ports import comports
except ImportError:
return None
if comports:
com_ports_list = list(comports())
ebb_port = None
for port in com_ports_list:
#inkex.errormsg(gettext.gettext(port[1]))
if port[1].startswith("Arduino"):
ebb_port = port[0] # Success; EBB found by name match.
break # stop searching-- we are done.
if ebb_port is None:
for port in com_ports_list:
#inkex.errormsg(gettext.gettext(port[2]))
if port[2].startswith("USB VID:PID=2341:0043"):
ebb_port = port[0] # Success; EBB found by VID/PID match.
break # stop searching-- we are done.
return ebb_port
def listEBBports():
# Find and return a list of all Arduino units
# connected via USB port.
try:
from serial.tools.list_ports import comports
except ImportError:
return None
if comports:
com_ports_list = list(comports())
ebb_ports_list = []
for port in com_ports_list:
port_has_ebb = False
if port[1].startswith("Arduino"):
port_has_ebb = True
elif port[2].startswith("USB VID:PID=2341:0043"):
port_has_ebb = True
if port_has_ebb:
ebb_ports_list.append(port)
if ebb_ports_list:
return ebb_ports_list
def list_named_ebbs():
# Return discriptive list of all Arduino units
ebb_ports_list = listEBBports()
if not ebb_ports_list:
return
ebb_names_list = []
for port in ebb_ports_list:
name_found = False
p0 = port[0]
p1 = port[1]
p2 = port[2]
if p1.startswith("Arduino"):
def testPort(port_name):
"""
Open a given serial port, verify that it is an Arduino,
and return a SerialPort object that we can reference later.
This routine only opens the port;
it will need to be closed as well, for example with closePort( port_name ).
You, who open the port, are responsible for closing it as well.
"""
if port_name is not None:
try:
serial_port = serial.Serial(port_name, timeout=4.0) # 1 second timeout!
印刷するデータはinkscapeで作成し、出力する。サンプルデータは下記サイトのサンプルフォルダーに入っている。
https://github.com/evil-mad/EggBot
自分で文字を打つ場合、文字を入力後オブジェクトをパスに変換する。
エクステンションからeggbotを開く。
ペンを上げた時と下げた時の角度を設定し、テストしておく。ペンが左右の位置だと中央より卵の殻の位置が上がるので、上げた時の角度は余裕を持って設定しておく。
サーボモーターをオフにした状態で卵を設置、回転がスムーズになるか確認。ペンを中央位置にしてモーターをオンにする。モーターのオンオフ制御はManualタブで出来る。選択後適用でコマンドが実行される。
データを印刷する場合、プロッター出力のタブに切り替え適用ボタンを押す。これで描画が始まる。