2010年
8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2010-08-19 コンピュータ数値制御

_ AVRでCNC

必要な小型の部品が必要なときに、ちっちゃなNCフライスを使っている。最近は酷使しているので、いつか壊れないか心配している。しかし、市販のものはそれなりに高価である。しかし、ミニフライスにステッピングモーターを取り付けて、それをPCから制御するようなCNCフライスなら、結構安く手に入るらしい。

そこで、いろいろと調べてみたら、専用のソフトを使ってPCのパラレルポートでパルスを作り、それをモータのドライバーに入力している。パラレルポートは、今後姿を消す可能性が高いし、PCでパルスを作っていると、別のタスクが走ると、速度が変化する可能性がある。PCは1ms以下の時計を持っていないので、それ以下の時間制御は苦手で、おそらく空のループを回して時間を制御しているのだろう。そう考えると、PCから座標などのデータを送って、マイコンでパルスを作るようにした方が理想的である。というわけで、AVRでNCを制御する時の問題点を考えてみた。

まずx軸とy軸の同時移動である。直線的に動くためには、x軸とy軸にパルスをどのようなタイミングで送るかを決めなければならない。これは以下のようにすれば良い。それぞれの軸方向にdx,dyだけ動かすとして、dx>=dyとする。このとき、常にx軸にはパルスを送る。x軸にパルスを送るときに、変数にdyを加算し、もしそれがdxの値以上だったら同時にy軸にパルスを送り、dxを減算するということを繰り返す。すると、x軸にdx回パルスを送ったときに、y軸にdy回のパルスを送ることができる。

次に問題なのが、加速と減速時のパルス間隔をどのように決めるかである。加速度を指定したときには、どのようにパルス間隔を変化させれば良いかを、適当に数式をいじって導いた。加速度をa、一つのパルスで動く距離をdとすると、最初のパルス間隔をw0は、sqrt(d/q)となる。現在のパルス間隔w(i)に対して、w(i+1)/w(i)=w0**2/(w(i)**2+w0**2)とすれば良いようだということが分かった。このパルス間隔の割合の数列をあらかじめAVRのFlashに記録しておき、それを用いてパルス間隔を変化させていけば良いだろう。

まだ検討中の課題としては、バックラッシュをどのように処理するかとか、円弧を描くときにはどうするか、などがある。

AVRとCNCで検索をかけると、AVR-CNCというのがすでにあるらしい。同じようなことを考える人はいるものだ。不完全な日本語のページもあったが、機械翻訳がひどかったので、日本語訳を投稿しておいた。いつか採用されるかな。AVR-CNCに関しては、いつかdownloadして、どうゆうものか調べてみよう。

_ 2010/8/20追記

AVR-CNCを読んでみた。まず、PC側のソフトはWindows用だった。AVR側では、加速などは行わず、いきなり特定の速度で軸を動かすようになっていた。直線補間は、先に書いたようなことをx,y,zの三つの軸で行っている。さらに円弧補間もあったが、math.hを使っていたので、tinyでは難しいだろう。バックラッシュの処理はおそらくPC側で行っているのか、AVRのソースには見当たらなかった。