2014年9月18日木曜日

スピンドル回転数を計測する

IMG 4489

センサ、回路、Arduino、3Dプリントしたセンサ台

スピンドル回転数を計測する

最近、非接触の磁気式回転数センサを使ってエンドミルの回転数を計測する事に成功したので記事にしておきます。RC用モータを使ってスピンドルを自作する場合の参考になるかと思います。



 

回転数を測りたくなった理由

TinyGはPWM出力があり、そこにRC用のESCを繋ぐ事でスピンドルモーターの回転数を制御できます。しかし、TinyG上で設定できるのは出力するパルス幅だけで、そのパルス幅でモータの回転数がいくつになるかははっきりとは分かりません。

主軸回転数がはっきりと分からないと、重要な加工条件である切削速度や1刃あたり送りが算出できないと言うことになります。これでは教えてもらった加工条件を参考にすることもできませんので、少々困ったことになります。

加工条件の善し悪しは切削面やびびり音である程度は感覚的に見当がつきますが、実際に削ってみないと分からないと言うのは困り者です。アルミ加工で失敗を繰り返した結果、やはり回転数がわからないとつらいと思うようになりました。

計測用センサの構築

回転数を計測する方法はいくつか考えられます。まずは直接回転を計測する方法ですが、光センサで刃先の反射を捉える方式。あるいは間接的に測定する方法として、モータにかかる電圧から逆算する方法も考えられます。RC用モータは1Vあたり何回転という性能(KV値)が記載されている事が多いので電圧×KV値で算出できます。

今回は磁気式の非接触センサで回転を検出できそうだったので、これを利用する事にしました。元々は歯車の歯を検出する用途のようなので、エンドミルの刃先も検出できるであろうとの目論見です。

センサは秋月電子通商で2個300円のOH182/Eです。これとArduinoを使って回転数計を見よう見まねでつくりました。

センサと回路の構成

IMG 4487

回路。センサ台はセンサ横置きにしたが、垂直に配置しないと検出しないため後で作り直した。

白状すると、とりあえずセンサとArduinoをつなげれば良いと思っていたんですが、どうやらデータシートをみるとそうでない様子。幸いWebで回路図を公開しておられる方がいたので、そちらを参考にさせて頂きました。ただし、Arduinoのアナログ入力で電圧を読むので、コンパレータ部は不要と考えて省略しています。が、きちんと理解していないので正解かは(汗

電源はArduino UNOの5V電源出力から。ブレッドボード上で0.01μFコンデンサと100Ω抵抗でGNDと出力を分岐し、GNDはArduinoのGND、出力はアナログの0番に繋いでやります。回路はコレだけです。

Arduino側のコード

Arduino側のコードは下記の通りです。1秒の間、1ミリ秒ごとに電圧を観測し、出力電圧が上昇したら刃先を検出したと見なしています。1秒経過すると、[1秒間に刃先を検出した回数]÷[エンドミルの刃数]×60の計算式でRPMを算出します。サンプルコードだとエンドミルの刃数は2としています。1ミリ秒ごとに計測した電圧を保管している配列がcharなのはメモリの節約です。

(しかし今考えると別に電圧配列で保存しなくても良いなとか思ってきました…)

計算されたRPM値はArduino IDEのシリアルモニタに表示されます。約1秒ごとに更新されていく形です。

int sec = 0;//開始からの秒数
unsigned char tv[1000];//1秒間の計測値
int count=0;

void setup() {
  Serial.begin(9600) ;      // ArduinoIDEとシリアル通信の準備を行う
}

void loop() {
  int ans;
  ans = analogRead(0) ;              // アナログ0番ピンからセンサー値を読込む
  tv[count]  = map(ans,0,1023,0,255) ;     // センサー値を8bitに変換する
  
  if(count==999){ // countが999なら1秒経過したので計測結果をrpmで表示
    int hit = 0;
    int rpm = 0;
    
    // 1秒間の回転数を平均して算出する
    // 1秒間に何回刃先を検出したかをカウントしてrpmを算出
    // 2枚刃のエンドミルを前提として計算
    
    for (int i=1;i2) {//電圧アップしたら刃先検出
        hit++;
      }
    }
    
    rpm = hit * 30;
    
    Serial.print("RPM: ");
    Serial.print(rpm);             // 値をパソコン(IDE)に送る
    Serial.print(", Time(second): ");
    Serial.println(sec);
    
    sec++;
    count = 0; //カウントを初期化
  }else{
    count ++;
  }
  delayMicroseconds(997) ;                      // 1ミリ秒毎に繰り返す
}

回転数の計測

非接触とは言え検知距離がかなりシビア(カタログ上〜2mm、試したところ〜1mm)なので、センサが刃先に巻き込まれないよう、3Dプリンタでセンサ台を作ってセンサを安定して配置できるようにしました。

Sensor

Arduinoのシリアルモニタに表示された計測結果

検知範囲が狭いのが難点ですが、現在これを使ってTinyGの設定値をキャリブレーション中です。なお、TinyGのスピンドル設定方法等に付いてはまたいずれ…

0 件のコメント:

コメントを投稿