2012年10月28日日曜日

MACH3の設定


MACH3の設定を行い、それなりに動くようになりました。
忘れないようにキャプチャをとっておきます。
はまった所はパルス幅の設定です。オシロでパルスを見ていたときから気になっていたのですが、MACH3の出力するパルスの幅が数μsecしかなく、PICで正確に拾えるかどうか確信がありませんでした。PICのクロックは8MHzなので計算上は拾えるはずですが、割り込み処理を使っているわけではないので処理のプロセスによっては取りこぼしがあるかもと思っていたのです。MACH3は高性能な工作機械用に作られていることもあり、デフォルトが非常にハイスピードの設定になっているようです。案の定デフォルトの設定ではモータの回転は安定せず、ビビビと変な音がしていました。同じ距離を行き来させても原点に戻ったり戻らなかったりと不安定な状況。
で、パルス幅を調整するのが下の Step Pulse なのですが、入力欄の上に1-5μs と書いてあり、調整幅が狭いように見えます。ところがどっこい、ここには15μsまで入力できるのです。迷わず最大値を入れて試してみると一転してスムースに回ります。

これでよしということで、1mmあたりのパルス数を入力しました。プリンタから取り外したモータは、1.8度/ステップで、これを1-2相のハーフステップ駆動していますので、0.9度/パルスということになります。M6のねじピッチはちょうど1mm/回転ですから、モータの1回転、すなわち400ステップで1mm送られることになります。
理論最小送りは 1/400mm、つまり 2.5μm ということになります。そんな精度出るわけありませんが ^^)

で、動かしてみたのがこれです。
Y軸ですがいい感じです。結構スピードも出せるようです。この程度ではまったく脱調しません。
いいですねえ~



調子に乗って加速度を変えてみます。
パルス速度の変化がかっこいいです。いやあ、すばらしい。思わず自画自賛したくなります。


まだ組み付けはしていませんが、来週末は組み上げて何とか円を書かせてみたいですね。
おっとその前にリミットスイッチつけなきゃいけませんでした。
がんばるぞ。

MACH3 による3軸同時駆動


3つのモータをつないでMACH3から動かしてみました。
すごいです。3軸がばらばらに動いているのを見ると感動します。すばらしい。
MACH3の使い方がいまいちわかってないので、デモプログラムを走らせているだけなんですが、いかにも制御している感じがします。


完成が見えてきました。がんばろう。あともう少し。

ドライバボード組み立て&MACH3動作確認


パラレルポートに配線をしていきます。このコネクタは 100円のレーザプリンタから外した 物です。

ところで、MACH3からの信号を調べていたときにミスを発見しました。このときに調べたプリンタケーブルのピンの配置が間違っていました。D-sub 25pinの13番が1番、アンフェノール36pinの18番が1番と左右逆になっていました。つまり、D-subの1番は素直にアンフェノール36pinの1番につながっていたことになります。失礼しました。

ということで、1番から9番までを使って、X,Y,Z軸のEnable、Direction、Pulse の3本ずつを取り出します。コネクタの基板側の線をぶった切って直接配線(笑


MACH3からの信号を確認します。


適当なGコードを読み込ませてパルス(Step)のラインを見ると...
ちゃんと信号が出ています。ちょいと電圧が低めですがまあ大丈夫でしょう。いざとなったらロジック側の電圧を下げればOKのはず。
ドライバ基板側のロジックに合わせてMACh側をACTIVE LOWにします。EnableもACTIVE LOWにしているのであわせて変更。
PICの内部プルアップを使っていますのでACTIVE LOW を選択しました。こうしておけばケーブルを繋いでいない時も電位の暴れがないし、プリンタポートからのソース電流を流しすぎてPC側のポートを壊す恐れもありません。

実装したドライバ基板に接続して信号を送り込みます。


動作している様子。順調です ^^)

動作確認も済みましたので、100円のMDFボード上に配置します。
抵抗が結構熱くなるのでジャンクの軸流ファンを贅沢に3台配置。奥はやはりジャンクの12V電源。4.3A出力ですので余裕です。そして左奥はプリンタポート。ねじで固定しましたのでがっちりしてそれっぽいです。


3軸同時に信号を送り込んで見ました。
結構加減速がありますのでLEDの点滅だけでも見ていて飽きません。いい感じです。


さて、これですべてのブロックがほぼ完成です。3軸ステージの送り部分の組み立てとリミットスイッチを残すのみ。早く動かしたいですが、MACH3の使い方が良くわかっていません。
モータを接続して様子を見ながら勉強することにします。


2012年10月27日土曜日

ドライバ基板部品実装


部品実装開始です。


とりあえず一枚作って動作確認します。

パルス源はブレッドボードの555、電源電圧はロジックが5V、モータが12Vです。

問題なく回転することを確認しました。


そのまま二枚目を作製し、動作確認しました。
これでX軸とZ軸分が完成です。

Y軸は L293D を二つ乗せますので配線が面倒です。
何とか作って動作確認しました。

Y軸用基板の裏側の汚いこと。

これでドライバ回路も出来ました。

次はメカ本体と組み合わせてモータトルクの確認、最高速度の見極め、リミットスイッチの動作確認と取り付けです。

明日中に動くかな。

2012年10月26日金曜日

回路図&基板レイアウト


モータドライバ部分の回路図です。簡単。

基板へのレイアウトはこんな感じで。基板はサンハヤトの ICB-87 を使います。
X,Z軸はモータがひとつですのでこれで。
電流制限抵抗は変更の可能性があるので回路図には入れていません。レイアウト上では6本まで乗せられるように場所を確保。110Ω2W品をパラレルで使って調整をしていくつもりです。


Y軸はモータが二つありますので、ドライバも2つ乗せ、完全並列で駆動します。
ポートのレイアウトを変更したので、モータドライバ部分のソフトを再掲載。
リミットスイッチの検出も追加しています。まだリミットスイッチは何も試してないけど。


// BiPolar Stepping Motor Driver for 16F1827
// compiler: MPLAB XC8 Compiler
// 2012/10

// Configration
// RA0,1,6,7: LED indicator or second input
// RA2: enable output to driver
// RA3,4: optional port
// RA5: Limit switch input
// RB0: optional port
// RB1: Enable input from controler
// RB2: Direction
// RB3: Pulse input
// RB4,5,6,7: motor OUTPUT

// Driving method: 1-2 phase

#include <pic.h>

__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &
                PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;
__CONFIG(PLLEN_ON & STVREN_ON & WRT_OFF & BORV_HI & LVP_OFF);


short PulseLevel=1; // memory rotation pulse level in last loop: active low
int StepNumber=0; // increment or decrement by every rotation pulse
// according to the direction

interrupt LimitSwitch()
{



}

void main()
{
    OSCCON=0b01110010; // internal clock 8MHz
OPTION_REG=0b00000000; //intl.pullup enable, INT edge fall
    ANSELA=0b00000000; // No analog for PORTA
    ANSELB=0b00000000; // No analog for PORTB
    TRISA=0b00100000; // Set I/O according to configuration
    TRISB=0b00001111; // Set I/O according to configuration
    PORTA=0b00000000; // reset out put
    PORTB=0b00000000; // reset out put
WPUB=0b00001111; //intl.pullup RB0,1,2,3


    while(1)
{
if((RB1==0) && (RA5==1)) // check enable/disable and Limit Switch status
{
RA2=1; // put enable signal to motor driver

if((RB3==0) && (PulseLevel==1))
{
PulseLevel=0;
if(RB2==0) //check direction CW/CCW
StepNumber++;
else
StepNumber--;

switch(StepNumber%8)
{
case 0:
PORTB = (0b10010000);
PORTA = (0b01000010);
break;
case 1:
PORTB = (0b10000000);
PORTA = (0b00000010);
break;
case 2:
PORTB = (0b10100000);
PORTA = (0b10000010);
break;
case 3:
PORTB = (0b00100000);
PORTA = (0b10000000);
break;
case 4:
PORTB = (0b01100000);
PORTA = (0b10000001);
break;
case 5:
PORTB = (0b01000000);
PORTA = (0b00000001);
break;
case 6:
PORTB = (0b01010000);
PORTA = (0b01000001);
break;
case 7:
PORTB = (0b00010000);
PORTA = (0b01000000);
break;
}
}
else if((RB3==1) && (PulseLevel==0))
PulseLevel=1;
}
else if(RB1==1) // check & put enable/disable
{
PORTB = (0b00000000);
PORTA = (0b00000000);
RA2=0;
}
else if(RA5==0) // Limit Switch detected
{

RA2=0;
PORTB = (0b00000000);
PORTA = (0b11000011); // All LED on

}
}
}

では実装開始。



回路&ソフト検討 続き


プログラム確認のために作ったブレッドボード上の回路にモータドライバまで乗せました。実際に回してみようかと。
ボードの上はこんな感じ。配線だらけでなんだかわからんです。が、ちゃんと動いております。


動画はこちら。モータの回転速度変更と方向転換のデモンストレーション(笑



速度変更が出来るようになったので、トルクを見ながらモータに流す電流を決定するための抵抗値の検討をしました。
モータは電気的にはコイルの塊、誘導負荷です。誘導性の抵抗値であるインダクタンスは周波数が高くなると大きくなりDCでゼロになります。つまり電源側から見ると、ゆっくり回す(周波数が低い)と電流がばんばん流れ、高速回転(周波数が高い)すると電流が減少する厄介な負荷に見えます。
高速回転では電流が減少するためにトルクもそれに応じて低下します。高速でトルクを確保しながら低速側は大電流による発熱を抑えて、とバランスが大事です。高速回転でもトルクを確保するためには、電源電圧を高くしてインダクタンスに負けないように電流を突っ込んでやればよいのですが、それでは低速回転のときにとんでもない電流が流れて回路を焼損してしまいます。
ちゃんとしたモータドライバはチョッッピングによって回転数に関係なく擬似的に定電流を作り出したりしますが、安物ドライバにはそんなものついていません。過熱による安全回路が働くまで電流を突っ込みます。ということで、電圧を上げて電流の突入の勢いを確保しつつ抵抗を入れて電流の量は制限するなんてことをやります。アクセル踏みながらブレーキ踏むみたいな。

で、検討した結果、300から400mAくらい流してやれば低速トルクはばっちりということがわかりました。電源電圧を5V程度にすれば外付けの抵抗無しでこのくらいの電流が流れますので良い感じです。しかし、電源電圧が5Vでは高速回転(300rpmくらいかな)させたときに電流値が80mAくらいまで落ちてしまい、ちょっと触っただけでとまるほどトルクがなくなります。ということで、高速トルクを確保するために電圧を上げつつ、電流を400mAに制限するための抵抗値を考えます。
手元にはジャンクの12V電源がありますので、これを有効に活用したいところ。12Vで400mAであれば30Ωです。これからモータコイルのDC抵抗を引いて15から20Ω程度の抵抗を入れればいいでしょう。電圧が倍以上になりますので高速トルクも改善されるはずです。ワッテージも5W程度ですので手持ちの抵抗を並列にすればカバーできそうです。
ここではラフな計算をしておいて、最終調整は実際に回路を組んでからやることにします。

回路も決まりましたので基板上へのレイアウトを考えます。



2012年10月21日日曜日

回路&ソフト検討


モータドライバIC L293D に送る信号は、2つのHブリッジに対してそれぞれ二本、Enableが1本の5本です。そして、MACH3とやり取りする信号は、Enable、Direction、Pulse の3入力(MACH3→モータ)と、リミットスイッチの1出力ですので、少なくともI/Oは9本必要です。さらに、モニタ用のLED4本、予備の入出力などを考えると18ピンのPICを使うことになります。
で、使うことにしたのは 16F1827 です。初めて使うものです。構成は16F84Aをベースにあらん限りの機能を満載した進化の最終形といった風情で、使う機能を考えるとすごくもったいないのですが、秋月で安かったものをたくさん買ってしまったのでまあいいかと。

とりあえずのテスト用プログラムは以下の通り。
新しくなった Hitech XC8 コンパイラ用に書いています。リミットスイッチ割り込み周りはまだ書いておりません。

***************************************************************

// BiPolar Stepping Motor Driver for 16F1827
// compiler: MPLAB XC8 Compiler
// 2012/10

// Configration
// RA0,1,6,7: LED indicator or second input
// RA2: Enable input
// RA3: Direction input
// RA4: Rotation Pulse input
// RA5: Option (input only)
// RB0: INT Limit switch input
// RB1,2: Optional out put
// RB3: Enable out put to motor driver
// RB4,5,6,7: OUTPUT

// Driving method: 1-2 phase

#include <pic.h>

__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &
                PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;
__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_HI & LVP_OFF);


short PulseLevel=1; // memory rotation pulse level in last loop: active low
int StepNumber=0; // increment or decrement by every rotation pulse
// according to the direction


void main()
{
    OSCCON=0b01110010; // internal clock 8MHz
    ANSELA=0b00000000; // No analog for PORTA
    ANSELB=0b00000000; // No analog for PORTB
    TRISA=0b00111100; // Set I/O according to configuration
    TRISB=0b00000001; // Set I/O according to configuration
    PORTA=0b00000000; // reset out put
    PORTB=0b00000000; // reset out put

    while(1)
{
if(RA2==0) // check enable/disable
{
RB3=1; // put enable signal to motor driver

if((RA4==0) && (PulseLevel==1))
{
PulseLevel=0;
if(RA3==0)
StepNumber++;
else
StepNumber--;

switch(StepNumber%8)
{
case 0:
PORTB = (0b10010000);
PORTA = (0b01000010);
break;
case 1:
PORTB = (0b10000000);
PORTA = (0b00000010);
break;
case 2:
PORTB = (0b10010000);
PORTA = (0b10000010);
break;
case 3:
PORTB = (0b00100000);
PORTA = (0b10000000);
break;
case 4:
PORTB = (0b01100000);
PORTA = (0b10000001);
break;
case 5:
PORTB = (0b01000000);
PORTA = (0b00000001);
break;
case 6:
PORTB = (0b01010000);
PORTA = (0b01000001);
break;
case 7:
PORTB = (0b00010000);
PORTA = (0b01000000);
break;
}
}
else if((RA4==1) && (PulseLevel==0))
PulseLevel=1;
}
if(RA2==1)
RB3=0; // check & put enable/disable
}
}

*******************************************************************

で、ブレッドボードにさくっと組み立てて動作させます。
とか言いながら、実際はいつもどおりデバッグで数時間のた打ち回ります(笑

タクトスイッチでポチポチ1ステップずつ進める動作がうまくいきましたので、555を使って可変周波数の発振回路を作り、高速動作させて見ました。動作スキームは1-2相駆動です。
回路図は全体を固めてから描くつもりです。

ブレッドボードはこんな感じ。右が555です。

動作の様子を動画にしました。
半固定VRをいじるとLEDの点滅速度が変化するのがわかります。




2012年10月20日土曜日

メカ部ほぼ完成


組み立てがほぼ終わりました。
全体の構成はこんな感じ。ほぼ設計図通りの出来です。

前から

後ろから

このアングルが良いかな。


全軸のモータを動かしてみたいところですが、基板が出来上がるまで我慢です。

ということで、次は制御基板の作製です。面倒ですが回路図からちゃんとひくべきでしょうね。
早く動かしてみたいし、ほぼ頭の中に回路は出来てるので回路図面なしの直作製でもいいのですが、後々のメンテのことを考えてあわてずにやることにします。
今回ちゃんと機械図面をひいてあたりを確認してから作ることでほとんどトラブルなしでここまで来ました。やはり図面は大事です。

製作続行


Y軸(X軸といいたいところですが、前後方向ですのでJISに倣ってY軸ということに)の一本が動き始めましたので、残りの部分を作りました。

もう一本のY軸。モータ二個でひとつの軸を動かすのはなんとも危ないような気がするのですが、とりあえず作ってから考えることにします。同期とかどうするんだろう。


すっかり慣れてしまった接着作業で順調に組み立てて行きます。

接着剤の乾燥を待つ間にZ軸に取り掛かります。
下の写真はねじの方向を間違えたとこ(笑

ガイドのシャフトはこんな感じのレイアウトになります。

Z軸ステージを乗せてシャフト位置を調整します。
短いのでなかなか難しいです。


何とか位置を出し、ねじで本固定、モータを積んで寸切りねじまで入れました。
ほぼ完成です。これを使ってX軸を作っていきます。


X軸のシャフトとベアリングの構造もY軸と同じです。基本寸法を同じにしているのでほいほいと作っていきます。それにしてもベアリングだらけ。安かったので無駄遣いしてもぜんぜん気になりません。

これがX軸のベース。

Z軸が重いのでシャフトの位置出しが難しいです。


何とか組み付けて接着剤で仮固定しました。
このあとは何度もやったねじ止めによる本固定です。



買ったもの



パラレルケーブルです。MACH3でCNCルーターをコントロールするときにPCとマシンを接続するために使います。
24ピンありますので、X,Y,Z軸の enable、回転方向、パルス、リミットスイッチ入力、A軸(加工用スピンドル)のON/OFF、回転数制御、非常停止、などなどいろいろやっても十分な端子数です。
ハードオフで 100円。 ハードオフで100円以外のものかった事がないような気が...


D-SUB がPC側、アンフェノールがマシン側です。なぜかアンフェノールは32ピン。
ということで、接続を確認せねばなりません。この手のケーブルは安物だと全ピン配線されてなかったり標準接続と違ってたりします。特にジャンクなので見ておく必要があります。

接続を調べてみました。一本ずつテスターであたります。
下のようになってました。


もうひとつ買い物。 みんな大好きレーザーです。


こんな感じでクロスのラインを書いてくれます。頭を回すことでフォーカス調整も可能です。
ワークの位置出しの基準線につかうとかっこいいんじゃないかと思ってなんとなく買いました。


これは DealExtreme です。
これ。

2012年10月14日日曜日

動き始めました


寸切りねじを入れたところはこんな感じ。
設計通り両端に寸切りねじを固定するためのベアリングを入れてみましたが、回転が重くなりそうなのでモータと逆側の片方だけにしました。(下の写真はまだ両方についています)

可動部を動かすための高ナットを長ねじにねじ込んで、可動部との間をとりあえず発泡スチロールの板に両面テープを貼り付けたもので仮固定します。

ドライバを配線していざスタート。
動く様子は動画でどうぞ。ゆっくりですがスムースに動いております。


いろいろ苦労もありましたが、ようやく動き始めました。
まだモータ駆動条件の調整が必要ですが、加減速駆動など複雑な動作での検証が必要ですのでPICでプログラムするのはちと面倒です。ということで、ここから先はMACH3を使って条件出しをしていくことにします。
こないだ取り外したパラレルコネクタの配線、PCとPICの接続等の作業に入ります。
動き出したのでますます元気が出てきました!

軸1本完成


上下レールの位置が決まりましたので、反対側の支持板も仮止めします。
 接着剤は良く見る黄色いボトルに赤いふたの木工用ボンド。それにしてもつけ過ぎ...


で、支持板が固定されたらねじで本固定します。

二枚の支持板をM3の長ねじで固定して出来上がり。
いい感じです。ほとんどガタもなく、少し傾けてやるとすーっと可動部が動きます。
これは良い。


2012年10月13日土曜日

製作続行


届いたベアリングでさっそく可動部を組み立ててみました。
いい感じです。
まずは一軸だけ作ってモータ駆動のテストと課題出しをすることにします。


ベースの上に仮固定した下レール(9mmφシャフト)に可動部をのせ、上レールの位置を探ります。
スライドさせながらスムースな動きと、ガタツキの具合を調整し、上レールをクランプで固定します。

スペーサとして使う9mm角の棒を切り出します。久しぶりの糸鋸。ジグソー使うまでもないし。


で、シャフト位置が固定されるようスペーサを接着します。

反対側の板をあてて、これも接着。都度可動部の動きを確認しながらの作業です。

反対側の端部も同様に処理。


買ったもの


M6トラス35mmねじ、M3ナベ40mmねじ、ナットなど。合計 282円。近所のナフコにて。

そして....
ついに到着しましたベアリング50個!


まあ、中国製&50個で $17 という破格の値段を考慮すれば少々のことは我慢できます。品質は日本製と比べるべくもありません。なんかごろごろごりごりしています。ですが、今回の工作精度はそれよりはるかに低いので何の問題もないのです。
購入したのはこれ。

これでCNCフライス、正確にはそのためのXYZステージを作るためのほとんどの部品はそろいました。