---Z軸 原点合わせ Auto Tool Zero---

 ネットで検索するとAuto Tool Zeroの記事は、
 それこそあふれるほどあります。自作のプローブを作成
 されてる方も居ます。
 http://www002.upp.so-net.ne.jp/hard-and-soft/Auto_Tool_Zero/Auto_Tool_Zero.html
 今更、という感じもするのですが、自分のために、まとめて
 おきます。
 しばらく前に某オクで、プリセッターなる原点合わせのToolを
 購入しました。

 

 複雑な回路など内蔵されてなくて、早い話、金属のプレートに
 導線を結線しただけの構造で、単なるスイッチの働きをするだ
 けのものです。
 これを使って、Z軸の原点合わせをしますが、○ECさんの
 CNC基板に結線します。私は、汎用入力の13番を使いま
 した。
 汎用入力は、5Vにプルアップされてますので、入力端子を
 グランドにおとせば、スイッチがON状態になるので、直接
 つないでもいいのですが、下図を参考に、間にフォットカプ
 ラーを使った簡単な回路をいれました。

 

 私が作った簡単な回路では、コンデンサーを省略しました。
 このコンデンサーは、スパークよけなんでしょうか、ちょっと
 わかりませんが、この回路でとりあえず、動きます。

   ====追記===
 
      アドバイスいただきました。
      チャタリング防止のためだそうです。
      寿命にも影響するので、つけた方がいいとのことです。
      早速、変更したいと思います。
   =========

    
 

 例によって、抵抗等は、細かい計算等していません。

 

 結線後、MACHで確認してみます。
 Config-Port and Pine でポートとピンにそれぞれ、
 1と13(私の場合)を入力します。

 

 Diagnostic(Alt 7)の画面移ります。鰐口とプレートを
 接触させることで、Digitizeの四角がグリーンの点滅をす
 れば準備完了です。

 

 下記のHPから、スクリプトを入手しました。
 http://www.instructables.com/id/Mach3-Zero-Probe-Tool/
 下記がスクリプトです。赤の部分を使うプローブや自分の
 環境に合わせて変更します。
  ’VB Code Start
  ’-------------------
  CurrentFeed = GetOemDRO(818)
  DoSpinStop()
  ZMove = 20.00 ‘Total lenght of Probe to move before Stop or no Contact Made.
  ZOffset = 1.60 ‘ Plate Hight
  ZSal = ZOffset + 2.00 ‘+ Free Hight, Will possition the Proble 2 MM over the Material.
  StopZmove = 0
  If GetOemLed (825)=0 Then
  DoOEMButton (1010)
  Code “G4 P2.5”
  Code “G31 Z-”& ZMove & “F25”
  While IsMoving()
  Sleep(200)
  Wend
  Probepos = GetVar(2002)
  If Probepos = - ZMove Then
  responce = MsgBox (“**ERROR** ” , 4 , “Probe **ERROR**” )
  Code “G0 Z10”
  StopZmove = 1
  Code “F” &CurrentFeed
  End If
  If StopZmove = 0 Then
  Code “G0 Z” & Probepos
  While IsMoving ()
  Sleep (200)
  Wend
  Call SetDro (2, ZOffset)
  Code “G4 P1”
  Code “G0 Z” & ZSal
  Code “(Z zeroed)”
  Code “F” &CurrentFeed
  End If
  Else
  Code “(Check Ground Probe)”
  End If
  Exit Sub
  ’-------------------
  ’VB Code Stop
 このスクリプトをMACHに書き込みます。
 Operator-Edit Button Scriptをクリック
 すると、Auto Tool Zero の四角が点滅します
 ので、それをクリックして、下記の画面をだします。
 赤矢印のウインドウの中身を削除します。

 

 この窓に、先ほどのスクリプトをコピペします。

 

 File-Saveをクリックして保存します。
 これで、準備ができましたので、RESETを押して、
 Auto Tool Zeroをおすと、MACHが自動で、
 原点を決めます。
 実際はスピンドルが下がってきますが、バラックなので、
 適当なところで、鰐口をプレートに接触させると、ステッピング
 モーターが止まって、反対方向に動き出します、実際は、
 スピンドルが上がります。

 
 実際に動かして見ると、スピンドルが高さがきちんと計測さ
 
 れ、スクリプトに記述した高さでMACHに設定されます。
 別なスクリプトを使うと、X軸、Y軸等も自動でセットできる
 ようです。また、別な治具を使うと円の中心の設定も
 できるようです。

---CNC CAMソフト NCVC(旋盤・フライス盤) (2)---

 NCVCは優れものです。CNCを始めるにあたって、以前、
 形を切り抜くためのソフトJMM-TOOLを○○ジナルマインド
 さんから購入しました。便利に使ってましたが、複雑な図形
 だと、形状の認識がうまくされなかったので、使うのを止めて
 ました。
 NCVCの解説を読んでいたら、なんとJMM-TOOLと同じ機能
 があるでは、ありませんか。改めて、NCVCは優れものです。
 通常は、DFXファイルを作成するのに、エンドミルの直径を考慮
 して作図します。
 直径の半分だけ、外側にずらしたり、内側にずらしたしておか
 ないと目的の大きさになりません。JMM-TOOLでは、これが
 できるのですが、NCVCでは、機能の一部になってました。
 次のような手順になるようです。
 DFXファイルを読み込みます。

 

 編集--加工指示--形状認識処理 をクリックします。

 

 すると形状やら、加工やらの情報が読み込まれます。

 

 必要に応じて加工内容を個別に編集する必要がありますが、
 ここから、自動処理をクリックすると、

 

 処理内容のウインドウが開きますので、エンドミルに応じた
 オフセット値をセットします。OKをクリックすると、 
 加工パスが作成されます。

 

 一番外側の切り抜きの部分では、オフセットの分
 (エンドミル半径の半分)だけ外側に、円の切削加工等
 では、オフセットの分だけ内側に作成されます。 
 ここから、
 NCデータの生成--形状加工生成--形状加工によるNCデータ作成

 

 を選んで、必要に応じて、切削条件ファイルの編集をししてOKをクリック
 すると、

 

 NCデータが作成されます。
 いままでJMM-TOOLを使わないで作成するときは、
 DFXファイルの作成段階で、エンドミルの半径の分だけ、
 外側や内側にずらした図形を作成してましたが、NCVCの
 形状認識を使うと手間が省けます。
 もっと、JW_CADにも、オフセットの線を引く機能がある
 ようですが、使い方が今一歩です。

---CNC CAMソフト NCVC(旋盤・フライス盤)---

 フリーのCAMソフトNCVCを使ってます。
 sable2015のGコード作成用です。
 旋盤用のCAMソフトはないかあさってましたが、なんと、
 NCVCにその機能がありました。
 旋盤の加工面の図形を入力すると旋盤用のGコードが作成
 されます。

 

 おまけに、オプションの設定で、切削終了後の図形
 も立体表示できます。

 

 多少プログラムの変更が必要ですが、拡張子を「tap」に変更
 すると、Mach3Turnの旋盤用のCNCソフトでもよみ込めます。

 

 それにしてもNCVCは、優れたフリーのソフトです。

---SPINDLEのPWM制御 (基本周波数の変換) (3)---移植ほぼ完了

 PWMの基本周波数変換のためのプログラムを諸兄の
 CSSコンパイラー(高い)から、無料のHI-TEC-Cコンパイラー
 に移植しました。
 諸兄は、200Hz(MCAHの設定)を20000Hzに変換して
 いますが、私は秋月のPWMコントローラーでも使えるように
 100Hz(MACHの設定)を10000Hzに変換するようにしまし
 た。諸兄は、MACHからのPWM信号のサンプリングをTIMER2
 の割込で、50μsごとにやってますが、私のプログラムは、
 基本周波数を半分にしたためと思いますが、倍の100μs
 ごとのサンプリングになりました。
 また、諸兄のプログラムでは、AD変換を使って、マニュアル
 でPWM信号を生成できるようにしてありますが、AD変換
 を加えると、プログラムが面倒なので、省略です。
 テスト用の基盤でやってますので、ユニバサール基盤に
 作り直す予定です。作り直してから、外部割り込みのテスト
 をします。
 PWMの信号を段階的に、プログラムから変化させてます。
 実際は、サンプリングによって、変化させます。
 
 参考のために、作成したプログラムを掲載しますが、テスト
 用に、ダミーが沢山入っています。もちろん、動作の保証
 等はありませんので、あしからずです。

---SPINDLEのPWM制御 (基本周波数の変換) (2)---TIMER1の設定

 setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); // 262ms
 の262msは、262msごとに割り込みをかける意味ですが、
 なぜ、262msなのか、意味が分からず、あれこれ調べて
 ました。
 ある本で、
 「PICのクロックを8MHZとすると最長262msのタイマー値を
 得ることができます。」
 の記事を見つけました。
 やっと262msの意味がわかりました。次のように計算します。
 タイマーの基準のとなる時間は、
      (1/クロック周波数)×4
 で求められます。私が、プログラムに使っている16F88の
 クロックは8MHzなので、
      (1/8Mhz)×4=0.5μs
 「1」をカウントするために必要な時間は、0.5μsですが、
 プリスケラ-(分周)との組みあわせで使います。
 プリスケラ-を8とすると、「1」をカウントするための時間は、
       0.5μs×8=4μs
 になります。
 TIMER1には、16ビットのカウンターを使うので、
 最大、
   16進数でFFFF(一桁を表すのに4ビット使うので、
                      4桁で16ビット)
   10進数で65535回
 を数えることができます。
 目一杯数えると、
   4μs(一回カウントするための時間)×65535回
                =262140μs
       262140μs=262.14ms
 ということで、262msの時間がかかります。
 やっと262msの数値がでてきました。
 これを使うにあたっては、カウンターをセットする必要が
 あります。
 次のように、二つのレジスタを使って設定します。
 が、
       TIMER1H=0XFF
       TIMER1L=0XFF
 のように、設定すると最大の0XFFFF(16進数)の65535
 の設定ができます
 アップカウンターなので65535を数えるには、
       TIMER1H=0
       TIMER1L=0
       
 のようにします。
 それでは、目的の数値を設定するには、
 どうすれはいいのでしょうか。
 TIMER1Hには、4桁の数字の上位の2桁を、TIMER1Lには、
 4桁の数字の下位2桁をセットしますので、上位2桁と
 下位2桁を取り出す必要があります。
 たとえば、10進数で、8546の85を取り出すには、
       8546÷100
 をやって、小数以下を切り捨ててしまえば、目的の「85」
 の数値を取り出せます。
 これと同じことを、ビットをずらすという命令を使って実現し
 ます。ビットをずらす命令は、2進数で考えますので、
 4桁の数値を2進数にすると16桁になります。
   ○○○○ ○○○○ ○○○○ ○○○○
 赤が目的の数値ですので、右に8こずらすと、
   ○○○○ ○○○○ ○○○○ ○○○○
   
 となり、ずらした後には、0が挿入されますの、これで目的
 の上位2桁を取り出せます。これをするには。
         8546 >> 8
 とします。つまり、85をTIMER1Hにセットするには、
       TIMER1H=(8546 >> 8)
 とすればいいわけです。
 では、下位2桁を取り出すにはどうすればどうすればいいで
 しょうか。
      8546-8500
 をすれば、46の数値がとりだせます。これを実現するのに、
 やはり2進数で考えます。マスクをかけるというような言い方
 をしたりしますが、「and」という演算をします。二つの数値を
 比べて、次のような出力になりますから、
    0と0は0
    1と0は0
    0と1は0
    1と1は1
 
 次のように、16進数で「OOFF」(2進数で0000000011111111)
 とのAND演算をします。

 

 
 
 すると上位2桁が0になって目的の下位2桁の数値が取り
 出せます。実際は、次のようにします。
     TIMER1H=(8546 & OX00FF)
 これで、下位2桁の「46」をセットすることができます。
 8546回数えさせるためには、
    TIMER1H=(8546 >> 8)
    TIMER1L=(8546 & OX00FF)
 と言うように、2行に分けて、記述します。
 
 難しかったです。ここまで理解するのに、3日ぐらいかかり
 ました。

---SPINDLEのPWM制御 (基本周波数の変換) (1)---

 諸兄の作ったプログラムを、穴の開くほどながめていました。
 タイマー0、タイマー1、タイマー2、外部割り込みを使ってます。
 一部、数値の意味の分からないところもありますが、同じもの
 が時間をかければできそうな気がしました。
 ちなみに、それぞれの割り込みは、
  タイマー0・・・・・・MACHからのPWM信号の有無の検出
             出力用PWMの初期設定
  タイマー1・・・・・・マニュアルでのLCDとLEDの点滅
  タイマー2・・・・・・MACHからのPWM信号のHとLの時間
             の計測
  外部割り込み・・・PWMの一周期の検出とDUTY比の計算
             PWM信号の有無の検出(追記)
 をしてるようです。
 分からなかったのが、タイマー2がPWMの信号も生成して
 るはずですが、割り込みにも使われているので、ここがわ
 りませんでした。
 PWMの生成と一緒にタイマー2の割り込みも実行できる
 ようで、やっと、その資料も見つけました。
 ちょっと、離れると、細かい設定の仕方を忘れてしまいます。
 諸兄のCコンパイラーは、CCSのようで、私が使っているのは、
 無料のHI-TECH-Cなので、割り込みや細かい記述(文法)が
 違います。また、いろいろあさりながら、楽しみます。

---SPINDLEのPWM制御---

 sable2015のスピンドルに、ブラシレスモーター(模型用)や
 ちょっと前に発売になった専用の20VのDCモーターを使った
 りしてます。
 どちらにも一長一短があるのですが、DCモーターの方が静か
 なので、こちらを使おうかと思いました。
 ブラシレスモーターは、既存のインターフェースを使って、速度
 制御したことがあるのですが、DCモーターということで、
 秋月の「PWM(スイッチング方式)DCモーター速度可変キット」
 を使って、マニュアル操作とMACHからの制御の切り替えができ
 ないかと、思いつきました。
 マニュアルは、簡単に接続すればいいのですが、MACHから
 となると、一工夫が必要なようです。
 MACHからのPWMで直接モーターを制御するには、
 問題があると諸兄のHPにはあります。
 「周波数の設定は任意に変えられる。 高くも設定できるのだが、
 階調が低下するので実用的ではない。
 例えば、カーネル周波数が35KHzの場合にPWM周波数を1KHzに
 すると階調は35段階だ。
 殆んどの人が聞こえない15KHzを選ぶと階調は2.3段階になって
 しまう。」

 この意味がなんとなく分かりました。秋月の「PWM(スイッチング方式)
 DCモーター速度可変キット」は、PWMの基本周波数は、10KHz
 と記載があります。
 詳しいことは分かりませんが、搭載してあるパワーMOSFETを制御
 するにあたって、この周波数が最適なんでしょうね。
 とすると、諸兄が言っているように、MACHで、基本周波数を高く
 すると、階調の問題が・・・・・・・・・・・・・・・。
 カーネルの周波数を25000Hzとして、MACHの設定を、
 「PWM(スイッチング方式)DCモーター速度可変キット」と同じ
 10kHzにすると、おおよそ、低・中・高の3段階ぐらいの切り替え
 しかできないことになってしまうようです。
 階調のことを考えると、MACHの基本周波数を低めにして、
 コンバートの回路でもつくる必要があるんでしょうね。
 一つまた、勉強しました。

---MACH3からのPWM信号---

 MACH3からのPWM信号をパラレルポートで確認しました。
 Dsub25ピンから信号を取り出すのに、秋月の
    RS232 GENDER CHANGER
 を使いました。Dsub25コネクターを二つ組み合わせて、
 ストレートの結線を作ってももよかったのですが、細かい作業
 になるので、やめました。

 

 

 これの1ピン(出力)、14ピン(出力)、25ピン(GND)にブレッド
 ボード用の線をハンダ付けし、ケースの隙間から引き出して、
 ケースをとじました。

 

 これで、ショート等の事故が少なくなります。
 SmoothStepperと同じで設定で、回転数1000~10000まで、
 確認してみました。ポート1の14ピンに出力してます。
 回転数に応じて、きれいにパルスの幅が倍増していくの
 が確認できました。
 1000回転の設定で、パルス幅は、約1msです。

 

 5000回転の設定で、パルス幅は、約5msです。

 

 上限に設定した、10000回転で、約10msです。

 

 今回は、コントロ-ルボードを通さないで、パラレルポートから直接
 とりだしました。応答もよく、きれいな波形でした。
 実際のコントロールに使うには、いろいろ工夫がいるんだろうな
 と思いました。
 便利な道具も販売されているようで、MACHのPWM信号を
 電圧に変換するボードもあるようです。

 

---SmoothStepperからPWM信号---

 SmoothStepperはやはり、優れものでした。あれこれ、悩み
 ましたが、きちんと、PWMの信号が出ていました。
 あの大きさで、ポート2.5個分ぐらいのインターフェースを
 もっているのですから、しょうしょう高めでも納得です。
 ========================
 でも、パラレルポートって、どうなんでしょうか。もう、そろそろ
 時代の遺物の仲間入りでしょうか。もともとは、プリンター等
 のインターフェースですし、今では、プリンターは、USBで、
 パラレルポートは、使いませんから、パラレルポートの用途は
 特殊なものになりつつあるような気がします。ネットで検索
 すると、まだあるようですが、需要は、あるのでしょうか。
 =========================

 結局、SmoothStepperからのPWMの信号を確認できなかった
 のは、初歩的なMACHの操作ミスでした。
 今回も諸兄のHPをみながら、設定をしました。私の設定は、

 

 で、出力をSmoothStepperのポート2の17ピンに割り当てました。

 

 PWMを選択して、PWMBaseFreqを 100にしました。
 PullySelectionを、

 

 のように設定し、SmoothStepperのUSB SmoothStepper Configを、

 

 のようにしました。Base Hzがここにもあるので、SpindleSetup
 の数値と一応そろえました。
 この設定で、MACHのエラーもでなくなりました。
 PWMの信号が確認できなかったは、出力するための、
 Spindle Speedに希望の回転数を入力しないで、操作したから
 でした。ここで、はまったようです。
 設定を済ませた後、Spindle Speedをクリック、数値を入力リターン、
 F5(Spindle CW F5をクリック)で、あっけなくパルスが確認
 できました。
 たくさん参考になるHPを諸兄が作ってあります。

 ここや、ここ(11ページ~13ページ)
 を参考にしました。
 全部のピンを確認した訳では、ありませんが、Ports and Pin
 
 の設定で、PWMの設定をするのに、ポート1を選んで、Step
 だけの設定をして、Dirの設定を0のままにしておっくと、MACH
 に設定をしてくださいと怒られてしまいます。ポート2だと、そのま
 ま通ってしまいますので、もしかして、SmoothStepperは、Spindle
 の設定で、ポート1は考えてないのかな、と思いました。
 
 基本周波数の設定やらプーリーの設定やら、意味が分からず
 に設定しました。システムに見合った設定できるように、また、
 勉強です。

パルスジェネレーターの出力

 パルスジェネレーターの出力をオシロに入れてみましたが、
 メーカーサイトを見ると、いくつかの種類があるようです。

 

 プルアップしなくても、出力がでたので、オープンコレクタで
 はないのかな。CMOSかプルアップの出力なんでしょうか、
 この辺は、ちょっと分かりません。詳しい方は、きっと、すぐ
 分かるのでしょうが。