見出し画像

ペンプロッターを作る③~Grblを設定してCNCjsでXYスライダーを動かす~

前回までの記事。

本記事ではペンプロッターを動かしてみます。

Grblの設定

grbl-servoライブラリを修正する

前回の記事でZ軸方向の制御にサーボモータを使用することにしました。サーボモータを使用するため、今回、Grblにはcprezzi/grbl-servoを使用してみます。ダウンロードした「grbl」フォルダをArduino IDEのライブラリフォルダに保存します。ライブラリフォルダの場所は、Arduino IDEの「ファイル」-「基本設定」で確認できます。

ここで、「cpu_map.h」の30~50行目を以下のように書き換えます。

変更前。

#ifdef CPU_MAP_ATMEGA328P // (Arduino Uno) Officially supported by Grbl.

  // Define serial port pins and interrupt vectors.
  #define SERIAL_RX     USART_RX_vect
  #define SERIAL_UDRE   USART_UDRE_vect

  // Define step pulse output pins. NOTE: All step bit pins must be on the same port.
  #define STEP_DDR        DDRD
  #define STEP_PORT       PORTD
  #define X_STEP_BIT      2  // Uno Digital Pin 2
  #define Y_STEP_BIT      3  // Uno Digital Pin 3
  #define Z_STEP_BIT      4  // Uno Digital Pin 4
  #define STEP_MASK       ((1<<X_STEP_BIT)|(1<<Y_STEP_BIT)|(1<<Z_STEP_BIT)) // All step bits

  // Define step direction output pins. NOTE: All direction pins must be on the same port.
  #define DIRECTION_DDR     DDRD
  #define DIRECTION_PORT    PORTD
  #define X_DIRECTION_BIT   5  // Uno Digital Pin 5
  #define Y_DIRECTION_BIT   6  // Uno Digital Pin 6
  #define Z_DIRECTION_BIT   7  // Uno Digital Pin 7
  #define DIRECTION_MASK    ((1<<X_DIRECTION_BIT)|(1<<Y_DIRECTION_BIT)|(1<<Z_DIRECTION_BIT)) // All direction bits

変更後。

#ifdef CPU_MAP_ATMEGA328P // (Arduino Uno) Officially supported by Grbl.
#define GRBL_PLATFORM "Atmega328p"
#define KEYS_CLONE true

  // Define serial port pins and interrupt vectors.
  #define SERIAL_RX     USART_RX_vect
  #define SERIAL_UDRE   USART_UDRE_vect

  // Define step pulse output pins. NOTE: All step bit pins must be on the same port.
  #define STEP_DDR        DDRD
  #define STEP_PORT       PORTD
  #ifdef KEYS_CLONE
  #define X_STEP_BIT      5  // CLONE NANO Digital Pin 5
  #define Y_STEP_BIT      6  // CLONE NANO Digital Pin 6
  #define Z_STEP_BIT      7  // CLONE NANO Digital Pin 7
  #else
  #define X_STEP_BIT      2  // Uno Digital Pin 2
  #define Y_STEP_BIT      3  // Uno Digital Pin 3
  #define Z_STEP_BIT      4  // Uno Digital Pin 4
  #endif // KEYS_CLONE
  #define STEP_MASK       ((1<<X_STEP_BIT)|(1<<Y_STEP_BIT)|(1<<Z_STEP_BIT)) // All step bits

  // Define step direction output pins. NOTE: All direction pins must be on the same port.
  #define DIRECTION_DDR     DDRD
  #define DIRECTION_PORT    PORTD
  #ifdef KEYS_CLONE
  #define X_DIRECTION_BIT   2  // CLONE NANO Digital Pin 2
  #define Y_DIRECTION_BIT   3  // CLONE NANO Digital Pin 3
  #define Z_DIRECTION_BIT   4  // CLONE NANO Digital Pin 4
  #else
  #define X_DIRECTION_BIT   5  // Uno Digital Pin 5
  #define Y_DIRECTION_BIT   6  // Uno Digital Pin 6
  #define Z_DIRECTION_BIT   7  // Uno Digital Pin 7
  #endif // KEYS_CLONE
  #define DIRECTION_MASK    ((1<<X_DIRECTION_BIT)|(1<<Y_DIRECTION_BIT)|(1<<Z_DIRECTION_BIT)) // All direction bits

grbl-servoをインストールする

ライブラリフォルダに「grbl」フォルダを追加すると、Arduino IDEを開いたときに、「ファイル」-「スケッチ例」に「grbl」が追加されています。

上記のように「cpu_map.h」を書き換えた後、Arduino IDEを開き、「ファイル」-「スケッチ例」-「grbl」-「grblUpload」をそのままArduino Nanoに書き込みます。

CNCjsの設定

ペンプロッターの制御にはCNCjsを使用します。

以下のページからインストーラをダウンロードして、インストールします。

CNCjsからGrblの設定を行う

CNCjsのコンソール欄からGrblの設定を行います。

コンソールに以下を入力すると、Grblの設定を確認できます。

> $$

今回は以下のように設定してみました。

$0=10 (Step pulse time, microseconds)
$1=25 (Step idle delay, milliseconds)
$2=0 (Step pulse invert, mask)
<span class="marker-red">$3=2 (Step direction invert, mask)</span>
$4=0 (Invert step enable pin, boolean)
$5=0 (Invert limit pins, boolean)
$6=0 (Invert probe pin, boolean)
$10=3 (Status report options, mask)
$11=0.010 (Junction deviation, millimeters)
$12=0.002 (Arc tolerance, millimeters)
$13=0 (Report in inches, boolean)
$20=0 (Soft limits enable, boolean)
$21=0 (Hard limits enable, boolean)
$22=0 (Homing cycle enable, boolean)
$23=0 (Homing direction invert, mask)
$24=25.000 (Homing locate feed rate, mm/min)
$25=500.000 (Homing search seek rate, mm/min)
$26=250 (Homing switch debounce delay, milliseconds)
$27=1.000 (Homing switch pull-off distance, millimeters)
$30=1000 (Maximum spindle speed, RPM)
$31=0 (Minimum spindle speed, RPM)
$32=0 (Laser-mode enable, boolean)
$100=54.05662 (X-axis travel resolution, step/mm)
$101=54.05662 (Y-axis travel resolution, step/mm)
$102=250.000 (Z-axis travel resolution, step/mm)
$110=500.000 (X-axis maximum rate, mm/min)
$111=500.000 (Y-axis maximum rate, mm/min)
$112=500.000 (Z-axis maximum rate, mm/min)
$120=10.000 (X-axis acceleration, mm/sec^2)
$121=10.000 (Y-axis acceleration, mm/sec^2)
$122=10.000 (Z-axis acceleration, mm/sec^2)
$130=200.000 (X-axis maximum travel, millimeters)
$131=200.000 (Y-axis maximum travel, millimeters)
$132=200.000 (Z-axis maximum travel, millimeters)

`$100``$101`の部分を変更しました。コンソールに以下のように入力して設定します。

> $3=2
> $100=54.05662
> $101=54.05662

それぞれのパラメータの詳細はこちらで詳しく解説されています。

$3(モータの回転方向)

$3でモータの回転方向を設定します。ペンを動かす座標系に合わせてX軸方向とY軸方向のステッピングモータの回転方向(モータの出力軸と反対側から見て)を設定しました。Z軸方向についてはサーボモータを用いるので別で設定します。

$$
\begin{array}{c|c|c|c}
\textbf{\$3} & \textbf{X軸} & \textbf{Y軸} & \textbf{Z軸} \\ \hline
 0 & 時計回り & 時計回り & 時計回り \\ \hline
 1 & 反時計回り & 時計回り & 時計回り \\ \hline
 2 & 時計回り & 反時計回り & 時計回り \\ \hline
 3 & 反時計回り & 反時計回り & 時計回り \\ \hline
 4 & 時計回り & 時計回り & 反時計回り \\ \hline
 5 & 反時計回り & 時計回り & 反時計回り \\ \hline
 6 & 時計回り & 反時計回り & 反時計回り \\ \hline
 7 & 反時計回り & 反時計回り & 反時計回り
\end {array}
$$

$100、$101(1mm毎のステップ数)

ステッピングモータのマイクロステッピング

X軸とY軸について、ジャンパーピンを3つとも差し込んで、マイクロステッピングを「1/32 step」に設定しました。

$$
\begin{array}{c|c|c|c}
\textbf{MS1} & \textbf{MS2} & \textbf{MS3} & \textbf{マイクロステッピング} \\ \hline
 Low & Low & Low & 1/1 step \\ \hline
 High & Low & Low & 1/2 step \\ \hline
 Low & High & Low & 1/4 step \\ \hline
 Low & Low & High & 1/8 step \\ \hline
 High & Low & High & 1/16 step \\ \hline
 Low & High & High & 1/32 step \\ \hline
 High & High & High & 1/32 step \\
\end {array}
$$

28BYJ-48の減速比

ステッピングモータ28BYJ-48のギア列については、こちらのページで詳しい解説がありました。

28BYJ-48内のモータ軸からギア列を介した出力軸までのギア減速比を計算すると以下のようになります。

$$
\dfrac{9}{32} \times \dfrac{11}{22} \times \dfrac{9}{26} \times \dfrac{10}{31} = 0.015703
$$

ラック・アンド・ピニオン機構

今回作成するペンプロッターのXYスライダーは、ラック・アンド・ピニオン機構で動作させます。ここで用いるピニオンギアはモジュール $${m = 1}$$ の $${z = 12}$$ 歯なので、ピニオンギアが1回転するごとに、ラックギアのピッチ円の直径 $${d}$$ は、

$$
d = m z = 1 \times 12 \mathrm{\, (mm)}
$$

となるため、28BYJ-48出力軸1回転ごとにラックギアが進む距離は、

$$
\pi d = 37.6991 \mathrm{\, (mm/回転)}
$$

となります。

1mmあたりの28BYJ-48のステップ数

これらをまとめると、XYスライダーが1mm進むために必要な28BYJ-48のステップ数は、

$$
32 \times \dfrac{1}{0.015703} \times \dfrac{1}{37.6991} = 54.05662 \mathrm{\, (step/mm)}
$$

となるので、この値を`$100``$101`に入力します。

動作確認

手入力で動かしてみる

下記のボタンでXYスライダーを動かしてみます。

狙い通りの動きをしているようなら次へ進みます。

NGCファイルを作成して動かしてみる

ここまでの設定で、Gコードを作成してXYスライダーを動かしてみます。

G90 G00 X0.Y0.;
G01 X10.Y0. F100.;
X10.Y10.;
X0.Y10.;
X0.Y0.;
%

CNCjsで「G-codeのアップロード」ボタンから上記ファイルを読み込んで、「▶」ボタンを押して実行します。

動作の様子はこのようになりました。

この記事が気に入ったらサポートをしてみませんか?