パソコンのCNCプログラムMach3はちょっとお休み。PICのコントローラをやっている。前回は、XまたはY方向にキー入力した数値分、ステップモータを動かすことができるところまで完成した。
今回は、XY方向に同時にステップモータを動かす。CNCであればXY軸に対して斜めに切削することができるようになる。このためには、直線補間という処理が必要となる。下記にその部分を抜き出したソースコードを記載する。
Xの毎ステップごとに計算して、Y軸を動かすかを都度判断する。きっちりと処理するならば、小数点を四捨五入処理を行うところだが、小数点処理は重たい、また、ステップモータ+全ネジの可動部を想定すると、そんなに厳格に処理する必要はない。変数をint型にして、小数点以下を切り捨てにする。前回計算値と比較して、商が整数値となった部分をY値としてY軸のステップモータを駆動する。最初にXとYを比較して、Xが大きければ、X側を1づつカウントアップしていく。Yが大きければ、Y側をカウントアップする。
この割り算を含む(ソースコードの1から4)の処理にかかる処理時間は約800uS。1パルスあたり1mS周期にしているので、これより高速にするためには、処理自体を見直すか、CPUのクロックを上げる必要がありそうだ。(@8MHz)
ソースコードは、
=======================================================================
if(Xstep>=Ystep) // Xの方が大きいので、Xを1step毎送る
{
for(cnt=1; X_step_L >= cnt; cnt++)
{
Y = (Y_step_L * cnt)/X_step_L ;
// 1 Yには割り算した結果、整数値が格納される
Y_stepOut = Y - Y_current ; // 2
Y_current = Y ; // 3
X_stepOut = X_step_L ;
// 4 1-4間の処理時間は800uS @ 8MHz X-TAL
//Xを1step出力する
X_pulse();
if(Y_stepOut == 0) //Yのデータが無いときに、Xパルスにspeedを反映する
{
SpeedCont(speed);
}else
{
//Yを計算した回数step出力する
for(cnt_y=0 ; Y_stepOut > cnt_y ; cnt_y++)
{
Y_pulse();
SpeedCont(speed);
}
}
// LED_0=~LED_0; //処理時間計測用
}
}else // Yの方が大きいので、Yを1step毎送る
{
for(cnt=0; Y_step_L >= cnt; cnt++)
{
X = (X_step_L * cnt)/Y_step_L ;
//Xには割り算した結果、整数値が格納される
X_stepOut = X - X_current ;
X_current = X ;
Y_stepOut = Y_step_L ;
//Yを1step出力する
Y_pulse();
if(X_stepOut == 0)
//Xのデータが無いときに、Yパルスにspeedを反映する
{
SpeedCont(speed);
}else
{
//Yを計算した回数step出力する
for(cnt_x=0 ; X_stepOut > cnt_x ; cnt_x++)
{
X_pulse();
SpeedCont(speed);
}
}
// LED_0=~LED_0; //処理時間計測用
}
}
=======================================================================
回路の全容はこんな感じだ。4x4のテンキーとパラレル(4bit)制御のLCDをつないでいるので、ポートが足りなくなってきた。speed制御も入れたいところだが、どうしたものか。
UIも前回のものに無理やり加えたので、いつもの様にプログラムがスパゲティー化してきた。ここまでプログラムは6KB強。I2C制御の残骸など不要なところも残っている。
今回直線補間の計算がうまく動作しなくて苦労した。デバックに使うprintfもどきのLCDに変数値の内容を表示させる関数を作ってデバックした。わかってしまえば単純なミス。LEDチカチカのデバックでは限界がある。やはり、ツールは重要だ。

もう一つ、このツールが役に立つ。ロジアナだ。チャネル数やスピードはそんなに必要がない。シリアルのものをデバックするにはオシロスコープではちょっときつい。パルスが出るかどうかのチェックには使えるが、ロジックが正しいかどうか検証するには、このロジアナが欠かせない。

この画像でX軸3パルスに対して、Y軸は1パルスが送出されている。

パルス幅や周期を見ている。ドライバーの関数にはスピードを制御するためにspeed値を引数に設定できる。この辺りもこれで確認している。
また、わり算の処理時間を測定するにも別のポートに出力する処理を追記して、ポートのON/OFF時間を測定することで簡単にわかる。
さて、ベースとなる仕掛けができたので、これからどっちに進もうか。このXY制御を使って、フライス盤も可能だが、UIを追加すればハニカム巻の巻線機ができそうだ。X軸をコイルの巻線を駆動して、同時にY軸をハニカムの振り幅制御に使う、例のハート型のカムに相当する動作だ。UIがサクッとできればいいのだが、そうは簡単に行かない。
最近のコメント