スピンドルの制御をlinuxcncからしようとして、あれこれやっていましたが、旋盤本体のコントローラーについているボリュームで速度制御をするのと、linuxcncから指示した速度に制御するのを両立するのに苦労しています。最初はlinuxcncからのPWM出力をLPFして、本体のボリュームからのアナログ指示出力とORをとればよいと思ったんですが、コントローラーの入力のインピーダンスの関係か、PWM出力を最大に絞ってもスピンドルが相変わらず回転していたり、回転数の安定性が低かったりとあまりうまくいきませんでした。
現在の構想は、arduinoを使って、linuxcncから出力されたPWM出力と、本体コントローラーのボリュームのアナログ電圧を両方読み取り、デジタル的にORを計算して指示値をDA出力しようというものです。
手持ちでArduinoに使われているatmega328pはあるので、これでワンチップArduinoを作ります。
ワンチップarduinoは、こちらの情報を参考にして、board をatmega328 on a breadboard (8MHz internal clock)としてコンパイルし、バイナリーファイルを出力(.hexファイル)。それを、Atmel Ice を使ってICSP接続したターゲットにAtmel Studio 7 で書き込みを行います。
Atmega328p のヒューズは、CKDIV8 を入れているとクロックが1MHz になってしまいますのでこれは外しておく必要がありますので注意。
arduino で走らせるプログラムは、linuxcncからのpwm パルスの読み取りを行い、ボリュームからanalog 入力を読み込み、比較して大きいほうを出力として採用してanalogWrite()でPWM出力を出すのを繰り返すだけです。pwm パルスは0.1sec 内には来ているのが前提でプログラムを書きました。
フィルターしてきれいなanalog output を作りたいので、PWMの周期をいじくって16kHz 周期のPWMを作り、10kohm + 10uFのフィルターを通しました。ひょっとしたらopampで受けてやる必要があるかもしれませんが、つないで試して様子を見ることにします。
デバッグのため、一応TTL serial I/Oも実装して、状況を57600bpsでレポートさせつつ、低回転時にスピンドルを止めたりしやすいようにプログラムをいじるつもりで。
作成したボードはこちら。

Atmega328のデータシートの読み込み不足でTTL serial のTX,RXが思ってたのと逆だったり、ミスが多い。
ワンチップArduino作ったら1日終わっちゃった。。。旋盤につないで試すところまでいかず。
9/30 旋盤に実際につないで試してみましたところ、良好。ボリュームを回すとスピンドルを回せて、linuxcnc から制御をかけたら、その通り動く。やはりデジタル制御はよい。凝ってフィルターをかけてもよいけど、とりあえずそこまでしなくてもよさそう。
pwm 値(0-255)と実際のスピンドルのrpm の関係を測定してみた。
pwm | rpm |
9 | 70 |
36 | 350 |
126 | 1220 |
241 | 2380 |
70rpm とかは定格外なので、ちゃんと回ってませんが。ほぼ比例しているので問題なし。
10/1 スピンドルの制御はとりあえず良さそうなので、制御プログラムにメジアンフィルター+アベレージフィルターを入れてさらに安定な回転数になるようにしてみました。
そのうえで、コントロールボックスの中に追加した制御回路を収納して完成としました。

stepconfで再び設定をいじくります。ねじ切りなどを考えると軸をそれなりの速さで動かせる必要はありそうなので、脱調しない速さを探ります。
X軸のモーターは2GTベルトが滑ってしまうため、2mm/sec 程度の速さが限界でした。
Z軸のモーターは、モータートルクは十分ですが、パルスの応答が30us程度が限界のため、減速をしていることもあり、10mm/sec程度の速さが限界でした。
旋盤のGコードに不慣れなので、切削は相変わらずマニュアル的にやっていますが、徐々に慣れていきたいと思います。
手始めにlinuxcnc のG76 threading cycle の練習ということで、P1.0 のとP0.5のねじを塩ビ管に切ってみました。こんなに簡単にねじが作れていいのか!というぐらい簡単でした。
