苦学生の道楽

面白そうなものを作る!

アプリや電子工作など、「楽しそう!」と思ったものに片っ端から触れていく人の活動記録です

CNCペンプロッターの作成 その1

当ブログを見ていただき、ありがとうございます。

私は現在、理系大学に通っているのですが、思っていた以上に課題が多くて毎日辛いです...(切実)

中でも特に大変なのが、、、そう。手書きレポートなんです。

多くの理系大学には「(化学・物理)実験」という授業が存在しており、実験が終わった一週間後までにその実験についてのレポートを書く必要があるのです。

このレポートの大変さは実験によって様々なのですが、大変なものになると1週間でレポート30枚を書かなくてはならない場合もあります。

そしてなんと、、、大学や所属学科によってはこの膨大な量のレポートを「全て手書き」で書かなければいけないという指定があったりします!(涙)

Twitterで「手書きレポート」で検索すると、この手書きレポートへの不満が山のように出てきます。

うんうん。みなさん、手書きレポートに苦しまれていますね。

そもそも、この「実験」という授業は、研究室に入って学会に論文を提出するための練習でもあるはずなんですが、一体誰がこの時代に論文を手書きで出すんでしょうか。Texとかの使い方の講義をした方がよっぽど有意義であると思いますね...。

そこで、、、

「手書きレポートなんて機械にやらせればいいんだ!!」

...という発想に至りまして、実際に作ってみることにしました。


1. 準備

さて、まずは材料の準備です。幸い、CNCフライスを自作する記事は以前に読んだことがあったので、それを参考に、秋月とAmazonとAliexpressで材料を調達しました。

材料

使用したソフトウェア

使用した道具


2. 部品が届いたので製作開始!

Amazonで頼んだ部品が届きました〜!今回Amazonで購入した部品は以下の2つです。 f:id:tamu19:20190817012902p:plain

f:id:tamu19:20190817012507j:plain 中身はしっかりと揃っていました。これで早速モーターの制御を行います。

(i) Arduinoにgrblを書き込む

はじめに、Arduinoに「grbl」というファームウェアを書き込んでいきます。
※Arduino IDEはインストールされている前提です。
※Macを使用しているので、Windowsでは上手くいかない場合があるかもしれません

「grbl」というファームウェアは、NCマシンの制御命令として用いられる「G-code」を解読して、ステッピングモータードライバにその命令通りの動きをするような信号を送り出すためのソフトウェアです。

「grbl-servo(grbl v0.9j)」にアクセスし、画面右の緑色のボタン「Clone or download」を押して「Download ZIP」を選択し、自分のPCにファームウェアをダウンロードします。そのZIPファイルは解凍しておきます。

次にArduino IDEを立ち上げて、メニューバーの「スケッチ/ライブラリをインクルード/.ZIP形式のライブラリをインストール」を押して、先ほど解凍したフォルダから「grbl-servo-master/grbl」というフォルダを選択します。そして、メニューバーの「ファイル/スケッチ例/grbl/grblUpload」を押します。すると、次のようなコードが表示されると思います。 f:id:tamu19:20190817032130p:plain そうしたら、ArduinoとPCを接続して、Arduino IDEの画面左上の矢印ボタンを押して、Arduinoにgrblを書き込みます。
これで、ファームウェアの書き込みに関しては終了です。

(ii) CNCシールド等を組み立てる

次に、「Arduino」「CNCシールドV3.0」「A4988」をそれぞれ繋ぎ合わせて、さらに、X軸用のステッピングモーターの接続と、サーボモーターに接続するための3線の配線まで行います。 ※ここではまだY軸用のドライバとステッピングモーターは接続していませんが、接続しても問題ありません f:id:tamu19:20190817034730j:plain f:id:tamu19:20190817034559j:plain 上の写真のように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線を逆向きに挿しても問題ありません。 f:id:tamu19:20190817041844j:plain

最後にペンを動かすためのサーボモーターの接続ですが、本来この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の違いを示した図です。

f:id:tamu19:20190817050049p:plain https://github.com/grbl/grbl/wiki/Connecting-Grbl

図を見ると、以下の表の通りに仕様が変わっていることがわかります。

D11 D12
grbl v0.8 Z軸のリミット用 スピンドルON・OFF用
grbl v0.9 スピンドルのPWM制御用 Z軸のリミット用

これらの事情と回路図を照らし合わせた結果、CNCシールドからPWMの信号をもらうためには「Z+の2つのピンのどちらか」に、信号線を接続すればよいということがわかります。 f:id:tamu19:20190817052648j:plain

これで、CNCシールドの組み立て・配線等は終了です。
※もちろん、最終的にはY軸用のモータードライバとステッピングモーターをX軸の時と同じように接続する必要があります

(iii) bCNCのインストール

さて、ここからは、Arduino(grbl)にX軸・Y軸・サーボの制御命令データを送るためのソフトウエアをPCにインストールしていきます。 このようなソフトウェアはたくさんありますが(Universal-G-Code-Sender,Grbl Controlerなど)、今回は bCNCというソフトウェアを使用します。

まずはここから「bCNC」をダウンロードして解凍しておきます。

github.com

このソフトは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」をダブルクリックで実行します。 するとこのような画面が表示されると思います。 f:id:tamu19:20190817074306p:plain これで、bCNCのインストールは終了です。 あとは、このbCNCに.gcodeという拡張子のファイルを読み込ませて、Arduinoに送信するだけです。
記事が長くなってきたので、次回はSVGファイルからGcodeを生成して、bCNCに読み込ませて、grblに送って、モーターを制御するところを書きたいと思います。


おまけ : G-Codeの説明

先ほどからちょくちょく出ている「G-Code」とは何か?

「G-Code」とは、CNCマシンの主軸の座標や動きを指定する、主に「G〇〇」から始まるコマンドが列記されたデータのことです。私が書いた下のG-codeのサンプルを見るとわかりやすいと思います。 f:id:tamu19:20190817061830j:plain 例えば、上のような四角と三角をペンプロッターに描画してほしい場合は、上記のようなG-Codeを送ります。コードは上から順に一行ずつ読まれていって、最後のM02コマンドが読み込まれると終了します。(※終了コマンドは複数存在する)
このサンプルに出てくるコマンドについて解説します。

コマンド 説明
G90 「アブソリュート命令」と呼ばれ、絶対座標によって制御しますよ、ということを伝える
G01 「直線補完」の動作を指示する命令。今いる位置からG01の後に続く座標まで直線移動をする
M03 主軸を正転(軸を上から見た場合の時計回り)させるための命令。続けて「S〇〇」と回転数を指定する必要があるが、この場合の回転数は環境に依存する(例えば、今回仕様したgrblでは、S0〜255でサーボモーターの回転角0〜180度を制御できるようになっている)厳密にはこれは「Mコード」と呼ばれるものあるが、Gコードとして包括されることが多い。ペンプロッターではこのコマンドでペンを下げる
M05 主軸の回転を止める(元に戻す)。ペンプロッターではこのコマンドでペンをあげる

ペンプロッターの作成では、最低でも上記の「G01,M03,M05」というコマンドだけ知っていればいいと思います。自分で書くこともないですし。 さて、ここでふと、こんな疑問を持った人もいるかもしれません。

複雑な曲線はどうやって命令するんだろう?

と。答えは簡単で、

曲線を複数の短い直線の集合とみなして、G01コマンドを大量に送ることで制御します。

実際に、曲線が多い図形から生成されたG-Codeの中身をのぞいてみると、そのほとんどがG01コマンドであることがわかると思います。