サイバーエフェクト作製 その1で改めて確認されたことですが、アクリルへのラスター/ベクター描画の画質を安定させるためにレーザ出力の細かな制御、そしてそれを再現する制御が必要です。
一方で、現在のレーザ制御系はバラック配線のままということで、とりあえず動けばOK状態で使っておりますので、信頼性の点でいまいちであります。
これらを何とかしたいという思いをモチベーションにして制御ボックスの作製を進めたいと思います。
すでになんちゃってデザインと、制御系作製の準備は済んでおります。
ということで、今回より本格的に作っていきます。
まずは、サイバーエフェクト作製 その1の問題を解決するためにレーザ出力をデジタル制御できるようにします。
現在の中華レーザ電源はこのような構成になっております。
これは、らせたろきんさんのアドバイスをいただきつつ結線と仕様を調べ、Aliexpressにも採用された由緒正しい情報であります(笑
これによりますと、レーザのパワーコントロールには二つの方法があります。それはTube Current Control 端子に DC0-5V を入れるか、20kHz以上の周波数のPWM信号を入れるかであります。
現在は単純にボリュームによる分圧を使ったDC電圧を入れて制御しています。サーカス配線のボリュームが作業台の上に転がっている有様です。ボリュームによるコントロールは再現性がありません。「大体このへんかなあ」と電流計を見ながら設定をするやり方です。
それに対してPWMは、デューティーを数値で決めることが出来ますので、(電源の再現性が問題なければ)狙った電流値をきっちり出すことが出来ます。
ということで、PWM制御をやる準備をします。
制御 はArduinoでやります。AruduinoのPWM出力を使えば簡単であります。
…..と思っていたのですが 、船田戦闘機さんのArduino日本語リファレンスにてPWMの仕様を見てみると「PWM信号の周波数は約490Hzです。」とあります。これじゃ周波数が低すぎます。このままの周波数で制御をかけると、おそらく電源は490HzでON/OFFするものと思われます。ラスター描画のときは10kHz近い周波数のON/OFFに反応するのですから当然でしょう。
とりあえず、仕様のままにAnalogWriteしてみたのがこちら。確かに490Hzくらいです。
で、「これは困ったな、PIC使うかな」と思いながらもう少し調べていたところ、AVRのタイマーのプリスケーラーをいじって周波数を上げる方法を見つけました。 これならいけそうです。
早速プログラミング、というかスケッチを書きます。初めてのまともなArduinoプログラムであります。最初からお作法を破るのもどうかと思いますが、やむを得ません。
LCD制御などいろいろと関係ないところが挟まっておりますが、肝は赤い所(TCCR1とAnalogWrite)です。
実際にはArduinoMEGA2560 を使いましたので、どのプリスケーラ値をいじるとどのピンに影響するのかわかりませんでした。そこで、影響ありそうなピン全部にAnalogWriteを書いて、オシロスコープでピンをあたって調べました。
その結果、TCCR1は 11/12 番ピンのPWM出力を設定していることがわかりました。
****************************************************************
#include <LiquidCrystal.h>
// initialize
LiquidCrystal lcd(22, 23, 24, 25, 26,27);
//for working time count
unsigned long t1;
unsigned long t2;
//for rotary encoder
volatile byte powerLevel = 0;
#define encoderAinput 3
#define encoderBinput 4
#define encoderSWinput 2
//for Laser ON/OFF
volatile boolean laserOut = false;
#define laserSW 53
#define laserIndicator 52
void setup() {
//pin asign for encoder
pinMode(encoderAinput, INPUT);
pinMode(encoderBinput, INPUT);
pinMode(encoderSWinput, INPUT);
//enable pull up
digitalWrite(encoderAinput, HIGH);
digitalWrite(encoderBinput, HIGH);
digitalWrite(encoderSWinput, HIGH);
//registor setup fot faster PWM
//1/1 prescaler for pin 11/12
TCCR1B &= B11111000;
TCCR1B |= B00000001;
//define interruption
attachInterrupt(1, rotation, CHANGE);
attachInterrupt(0, laserControl, FALLING);
//define LCD
lcd.begin(20, 4);
//show starting message
lcd.print(” CO2 LASER”);
lcd.setCursor(0, 1);
lcd.print(“Cutter/Engraver”);
lcd.setCursor(0, 2);
lcd.print(” Control System”);
lcd.setCursor(0, 4);
lcd.print(” mirata.blogspot.jp”);
//keep showing starting message for a whil
delay(3000);
lcd.clear();
}
void rotation() {
if(!digitalRead(encoderAinput)){
if(digitalRead(encoderBinput)){
if(powerLevel <= 99){
powerLevel ++;
}
}
else{
if(powerLevel >= 1){
powerLevel –;
}
}
}
}
void laserControl() {
if(laserOut){
digitalWrite(laserSW, LOW);
digitalWrite(laserIndicator, LOW);
laserOut = false;
}
else{
digitalWrite(laserSW, HIGH);
digitalWrite(laserIndicator, HIGH);
laserOut = true;
}
}
void loop() {
lcd.print(“LASER Power: ” + String(powerLevel) + “%”);
lcd.setCursor(0, 1);
lcd.print(“duty ratio: ” + String(powerLevel*255/100) + “/255”);
lcd.setCursor(0, 2);
if(laserOut){
lcd.print(“LASER: REMOTE”);
}
else{
lcd.print(“LASER: OFF”);
}
analogWrite(11,powerLevel*255/100);
delay(100);
lcd.clear();
// do nothing
}
****************************************************
で、出してみたのがこちら。
すばらしい。31kHz以上のPWMになっています。これなら大丈夫でしょう。
PWMは出せるようになりましたが、どうやって設定を行うかです。制御系作製の準備の段階では、ボリュームを取り付けていました。もちろんボリュームでも設定は可能です。Arduinoのアナログポートにボリュームで分圧した電圧を入れてやればよいのです。しかしながら、この方法では「LCDで設定値を見ながら調整する」ことは出来るものの、設定値の変化はアナログですのでつまみの微妙な調整が必要です。
これではせっかくデジタルにするいみが半減しますので、設定もデジタルで行えるようにします。
使うのはこちらのロータリーエンコーダ。Aitendoでひとつ80円で買ったやつです。
ロータリーエンコーダは無限に回転するロータリースイッチといったもので、ジョグダイヤルとも呼ばれ、CW/CCWが判別できる信号を出します。信号を出すごとにクリック感があります。
ロータリーエンコーダは、初期は回転角の位置情報を何も持っておらず、最初に認識した点からCW/CCW方向に何ステップ動いたかを出力するだけです。ステッピングモータの出入りが逆転したようなイメージのものです。詳細はこのあたりを見てみてください。
今回使うロータリーエンコーダはプッシュスイッチ統合型で、回転と押し込みを検出できます。押し込みはレーザのEnable/Disableに使うことにします。
ハンダ付けして、
繋ぎます。右下の黒いつまみなのですが、何もわかりませんね。すいません。
CW/CCWを検出するためのスケッチは、上のコードの青い所、レーザのEnable/Disableは紫色のところです。
オシロを繋いで動かしてみます。
ロータリーエンコーダの1クリックあたりDuty比が1/100ずつ変化するようにし、その値をLCDに%表示するようにしました。商用のレーザ加工機でも出力設定を%であらわすものが多いようなので。
ただし、この値はあくまで電流値であってレーザ出力を意味するものではありませんので注意が必要です。原理的にはレーザ出力はレーザ管に流す電流値に比例するものですが、実際はさまざまな要因によってそうはなりません。あくまで目安です。「前回と同じ出力に設定できる」ことが大事なのであって、「20%時が10%の倍のレーザパワー」である必要はないのです。
つまみをいじってパワーとデューティー比を変化させている所を動画で。
LCDにはテストとして、%で示したパワー(注:あくまで電流値)、そのときのPWMデューティー比、そしてつまみを押すたびにトグルで切り替わるレーザのEnable/Disableを REMOTE(Enable)/OFF(Disable)という表現で表示しています。
Enable状態
Disable状態
出力0%ではパルスは出ません。出力はほぼ0Vです。
デューティー50%
90%
100%
100%で出力は5Vフラットになります。
後はこれをレーザ電源に繋ぎ込めばよいはずです。
怖いのでフォトインタラプタか何かで絶縁するようにしたほうが良いでしょう。
コメント
みら太様
ひとつご教示下さいませ。レーザー出力の「電流」とはどこからどこに流れ込む電流をいうのでしょうか。上の電源ユニットの図の中に、測定できる端子がありましたら教えて下さい。
レーザー加工機の出力調整に苦しんでいる者
匿名さんありがとうございます。
電流はズバリレーザ管を通過する電流です。図ではH.V.から流れ出てL-に帰る電流です。
私の管では最大20mA流れます。
電流計はレーザ管のマイナス側(射出側)端子とL-の間に入れています。
中華製の500円くらいの電流計です。
参考になりますかね。