CNCペンプロッターの作成 その1
当ブログを見ていただき、ありがとうございます。
私は現在、理系大学に通っているのですが、思っていた以上に課題が多くて毎日辛いです...(切実)
中でも特に大変なのが、、、そう。手書きレポートなんです。
多くの理系大学には「(化学・物理)実験」という授業が存在しており、実験が終わった一週間後までにその実験についてのレポートを書く必要があるのです。
このレポートの大変さは実験によって様々なのですが、大変なものになると1週間でレポート30枚を書かなくてはならない場合もあります。
そしてなんと、、、大学や所属学科によってはこの膨大な量のレポートを「全て手書き」で書かなければいけないという指定があったりします!(涙)
Twitterで「手書きレポート」で検索すると、この手書きレポートへの不満が山のように出てきます。
手書きレポートは頭悪すぎる、今すぐ廃止するべき
— 理科大の河城にとり (@Engineetori) August 16, 2019
どうして今の時代に手書きレポートなんてさせるんだ文明に頼ってよ教授......
— 洋 (@olt_Lindel) August 15, 2019
うんうん。みなさん、手書きレポートに苦しまれていますね。
そもそも、この「実験」という授業は、研究室に入って学会に論文を提出するための練習でもあるはずなんですが、一体誰がこの時代に論文を手書きで出すんでしょうか。Texとかの使い方の講義をした方がよっぽど有意義であると思いますね...。
そこで、、、
「手書きレポートなんて機械にやらせればいいんだ!!」
...という発想に至りまして、実際に作ってみることにしました。
1. 準備
さて、まずは材料の準備です。幸い、CNCフライスを自作する記事は以前に読んだことがあったので、それを参考に、秋月とAmazonとAliexpressで材料を調達しました。
材料
- Arduino Uno R3
- CNCシールド V3.0
- A4988(ステッピングモータードライバ)with ヒートシンク それぞれ2つ
- NEMA17 (ステッピングモーター)2つ (X軸・Y軸用)
SG92RSG90(サーボモーター)(ペンを上下に動かす用)12Vの安定化電源WiiのACアダプタ(12V-3A)で代用- タイミングベルト 5m 1つ
- タイミングベルトプーリー 4つ
- リニアシャフト軸 4本(直径8mm・長さ300mmが2本,直径8mm・長さ400mmが2本)
- リニアブッシュ(内径8mm) 8つ
- 3Dプリンターで作った各パーツ
- MDF材
使用したソフトウェア
grbl v1.1「grbl-servo(grbl v0.9j)」という、grblをサーボモーターに対応させたバージョンがあったのでこちらを使用。Arduinoに書き込む。(サーボモーターのPWM制御が可能な61.5Hzを出せるようになった)- bCNC (grbl(arduino)にG-codeを送るためのソフトウェア)
- Inkscape (SVGをG-codeに変換するために使用)
※MI Inkscape Extensionという拡張機能が必要。
使用した道具
2. 部品が届いたので製作開始!
Amazonで頼んだ部品が届きました〜!今回Amazonで購入した部品は以下の2つです。

5m GT2 高品質 タイミングベルト+4個 20歯 穴径:5mm同期タイミングベルトプーリー+2個同期タイミングベルトの錠ばね,3Dプリンター,LINGLONG
- 出版社/メーカー: LINGLONG
- メディア:
- この商品を含むブログを見る

(i) Arduinoにgrblを書き込む
はじめに、Arduinoに「grbl」というファームウェアを書き込んでいきます。
※Arduino IDEはインストールされている前提です。
※Macを使用しているので、Windowsでは上手くいかない場合があるかもしれません
「grbl-servo(grbl v0.9j)」にアクセスし、画面右の緑色のボタン「Clone or download」を押して「Download ZIP」を選択し、自分のPCにファームウェアをダウンロードします。そのZIPファイルは解凍しておきます。
次にArduino IDEを立ち上げて、メニューバーの「スケッチ/ライブラリをインクルード/.ZIP形式のライブラリをインストール」を押して、先ほど解凍したフォルダから「grbl-servo-master/grbl」というフォルダを選択します。そして、メニューバーの「ファイル/スケッチ例/grbl/grblUpload」を押します。すると、次のようなコードが表示されると思います。
そうしたら、ArduinoとPCを接続して、Arduino IDEの画面左上の矢印ボタンを押して、Arduinoにgrblを書き込みます。
これで、ファームウェアの書き込みに関しては終了です。
(ii) CNCシールド等を組み立てる
次に、「Arduino」「CNCシールドV3.0」「A4988」をそれぞれ繋ぎ合わせて、さらに、X軸用のステッピングモーターの接続と、サーボモーターに接続するための3線の配線まで行います。
※ここではまだY軸用のドライバとステッピングモーターは接続していませんが、接続しても問題ありません
上の写真のようにCNCシールドとモータードライバをはめ込んで、配線を行えば終了なのですが、1つずつ説明していきます。
まず、CNCシールドについてですが、Arduinoと上の写真のような向きで差し込みます(上から見ると、Arduino本体と四隅が重なると思います)。このシールドには見てわかる通り、4つのモータードライバを差し込めるようになっており、よく見ると基盤に「X・Y・Z・A」と書いてあるのがわかります。今回はペンプロッターなので、「X・Y」の2つしか使いません。(「Z・A」は3Dプリンターを作るときなどに使います)
次に、モータードライバ「A4988」をシールドに差し込みますが、ここで向きを間違えると、おそらくコンデンサーがやられるので注意しましょう。ヒートシンクもつけたほうが安心です。
そして、モータードライバの横に接続されている4本の線がステッピングモーターの線です。ここで、接続する向きを気にする人もいるかもしれませんが、逆向きに挿しても回転方向が逆向きになるだけなので問題ありません。
理由としては、モータードライバの裏を見てみると、4線と繋がる部分は上から「B・A・A・B」と対称的になっていることがわかると思います。AとA、BとBが繋がっていないといけないのですが、この場合、逆向きに差し込んでも電流の向きが変わるだけで、AとA、BとBの接続に変化はありません。したがって、ステッピングモーターの4線を逆向きに挿しても問題ありません。
最後にペンを動かすためのサーボモーターの接続ですが、本来このCNCシールドV3.0は、grbl v0.8を想定して作られているため、スピンドル(主軸)のスイッチのON・OFFしか制御できない仕様になっています(本来はCNCフライスや3Dプリンターで使用する目的で作られたため、ON・OFFの制御だけで事足りていた)。上の写真のシールド基盤の右中央あたりの「SpnEn」というピンでON・OFFを行えました(grbl v0.8の場合の話)
しかし、今回はファームウェアとして入れたgrbl v0.9では、スピンドルのPWMによる制御が可能となっており、それを利用して、サーボモータを動かします。ここで、grbl v0.9をCNCシールドV3.0で使おうとするとピン配置に注意しなければいけません。下の図はv0.8とv0.9の違いを示した図です。
図を見ると、以下の表の通りに仕様が変わっていることがわかります。
D11 | D12 | |
---|---|---|
grbl v0.8 | Z軸のリミット用 | スピンドルON・OFF用 |
grbl v0.9 | スピンドルのPWM制御用 | Z軸のリミット用 |
これらの事情と回路図を照らし合わせた結果、CNCシールドからPWMの信号をもらうためには「Z+の2つのピンのどちらか」に、信号線を接続すればよいということがわかります。
これで、CNCシールドの組み立て・配線等は終了です。
※もちろん、最終的にはY軸用のモータードライバとステッピングモーターをX軸の時と同じように接続する必要があります
(iii) bCNCのインストール
さて、ここからは、Arduino(grbl)にX軸・Y軸・サーボの制御命令データを送るためのソフトウエアをPCにインストールしていきます。 このようなソフトウェアはたくさんありますが(Universal-G-Code-Sender,Grbl Controlerなど)、今回は bCNCというソフトウェアを使用します。
まずはここから「bCNC」をダウンロードして解凍しておきます。
このソフトはPython2.7でのみ正常に動くので、まずはPython2.7をインストールする必要があります。
私はbCNCのあるディレクトリでのみPython2.7を動かしたかったので、pyenvを使いました。 また、pythonでシリアル通信を行うための「pyserial」というモジュールもインストールします。
(1) pyenvのインストール
この記事からインストールしてください。 qiita.com
(2) python2.7.16のインストールとバージョンの切り替え
$ pyenv install --list //インストールできるPythonのバージョンの一覧が表示される //2.7.xの中では2.7.16が最新であると思うので、それをインストールする $ pyenv install 2.7.16 //次に、ダウンロードしたbCNCのフォルダまで移動します。 $ cd ~/Desktop/bCNC-master/ //Pythonのバージョンをこのディレクトリの中だけ2.7.16に変えます。 $ pyenv local 2.7.16 //バージョンが切り替わっているか確認 $ python --version Python 2.7.16 //このように表示されればOKです。
(3) pyserialのインストール
(2)の続きです。
$ pip install pyserial $ python -c "import serial" //ここで何も表示されなければ、pyserialのインストール完了。
さて、ターミナルから戻り、「bCNC-master/bCNC/」の中にある実行ファイル「bCNC」をダブルクリックで実行します。
するとこのような画面が表示されると思います。
これで、bCNCのインストールは終了です。
あとは、このbCNCに.gcodeという拡張子のファイルを読み込ませて、Arduinoに送信するだけです。
記事が長くなってきたので、次回はSVGファイルからGcodeを生成して、bCNCに読み込ませて、grblに送って、モーターを制御するところを書きたいと思います。
おまけ : G-Codeの説明
先ほどからちょくちょく出ている「G-Code」とは何か?
「G-Code」とは、CNCマシンの主軸の座標や動きを指定する、主に「G〇〇」から始まるコマンドが列記されたデータのことです。私が書いた下のG-codeのサンプルを見るとわかりやすいと思います。
例えば、上のような四角と三角をペンプロッターに描画してほしい場合は、上記のようなG-Codeを送ります。コードは上から順に一行ずつ読まれていって、最後のM02コマンドが読み込まれると終了します。(※終了コマンドは複数存在する)
このサンプルに出てくるコマンドについて解説します。
コマンド | 説明 |
---|---|
G90 | 「アブソリュート命令」と呼ばれ、絶対座標によって制御しますよ、ということを伝える |
G01 | 「直線補完」の動作を指示する命令。今いる位置からG01の後に続く座標まで直線移動をする |
M03 | 主軸を正転(軸を上から見た場合の時計回り)させるための命令。続けて「S〇〇」と回転数を指定する必要があるが、この場合の回転数は環境に依存する(例えば、今回仕様したgrblでは、S0〜255でサーボモーターの回転角0〜180度を制御できるようになっている)厳密にはこれは「Mコード」と呼ばれるものあるが、Gコードとして包括されることが多い。ペンプロッターではこのコマンドでペンを下げる |
M05 | 主軸の回転を止める(元に戻す)。ペンプロッターではこのコマンドでペンをあげる |
ペンプロッターの作成では、最低でも上記の「G01,M03,M05」というコマンドだけ知っていればいいと思います。自分で書くこともないですし。 さて、ここでふと、こんな疑問を持った人もいるかもしれません。
複雑な曲線はどうやって命令するんだろう?
と。答えは簡単で、
曲線を複数の短い直線の集合とみなして、G01コマンドを大量に送ることで制御します。
実際に、曲線が多い図形から生成されたG-Codeの中身をのぞいてみると、そのほとんどがG01コマンドであることがわかると思います。