クリエイティブギズモ:DIY小型レーザー彫刻機-スーパーカウの電子製品(動作原理、製造プロセス、注意事項、ホストコンピューター、Cソースコードなど)

たまたま手製のレーザー彫刻機の動画を他の瓶に入れて見たり、かゆみをつくりたかったので、時間を節約するために、まず開発用ボードを購入し、コンピューターによって廃棄された部品やアイテムを見つけました。次に、インターネット上の部品から彫刻機を組み立てるプロセスが開始されました。

まず、完成品の写真に進みます。
ここに画像の説明を挿入
主な付属品:
1.光学式ドライブから2つのステッピングモーターを取り外しました。溶接ワイヤを8個または9個購入しました(溶接ワイヤは脱落しやすいため、ホットメルトガンで固定することをお勧めします)。ポイントの位置)
ここに画像の説明を挿入
2.手持ちの既存の51シングルチップ開発ボード(51シングルチップの最小システムも可能です)
3. 1つの250mwレーザーモジュールと約30または40の12mmヒートシンク
4、2つのL298Nステッピングモータードライブボード1ピース
ここに画像の説明を挿入
あたり6ドルまたは7ドル5、デュポンラインの男性と女性の頭、いくつかの女性と男性の頭(一部はワイヤーで置き換えることもできます)6、小さい水準器(テレビハンガーを購入、一部の絵も送られます)7、ルータースイッチ12V電源1つ(9Vで試してみました)
8. ULN2003購入した6 Mao 1つ


最初はスタンドを作ることでした。廃光学ドライブケースでできたワインボックスを見ました。Xiaomiカメラボックスを使用しました(鉄のシートを切るための道具はなく、材料をローカルで取り出しました)。
底部とカバーはネジまたは接着剤銃で垂直に固定されています。ステッピングモーターの1つは垂直面にネジで固定され、もう1つは水平面に固定されます。レベルメーターで水平と垂直のレベルに注意してください。そうしないと、彫刻された図形が変形します。アクリルなどの平らなプレートを水平光学ドライブスライダーに置き、彫刻として接着ガンで固定しますプラットフォーム、スピリットレベルでレベルを調整することを忘れないでください。

ここに画像の説明を挿入
軟鉄ワイヤーで垂直モーターのスライダーにレーザーモジュールを固定し、水平と垂直になるようにレーザーモジュールの角度を調整するように注意してください。以下は配線です(自分で描いてください、笑わないでください)

開発ボードP1.0-P1.3 P1.4-P1.7をL298NのIn1-In4にデュポンワイヤで接続
し、12V電源の正極(丸穴プラグの中央が正極)をL298Nの12V
12V電源の2つの負極に接続します。2つのL298NのGNDを開発ボードチップのGNDに接続し、ULN2003の左下隅の最初のピン
とL298Nの5VリードからULN2003までのレーザーモジュールのGNDに接続します
DuPontラインの右下隅の下から1番目のピンは、開発ボードP2.0をULN2003の左下隅から2番目のピンに接続し、右下隅から2番目のピンはレーザーの正極に
接続します。L298NのモーターAとBの出力をステッピングモーターAに接続します。 A- B B-(購入したモーターはA A- B B-に従って配置されており、不整合もあります。マルチメーターを使用して抵抗を測定します。AAA-またはB B-間の抵抗は非常に小さく、間違ったモーターは振動しません。順序を変更するだけです)

ここに画像の説明を挿入
開発ボードのUSBポートをコンピュータープログラミングプログラムに接続して彫刻プログラムを開き、4800ボーレートを選択してポートを開き、モーターの動作を写真またはテキストでテストします。
モーターの方向が正しくありません。モーターラインシーケンス全体を交換するだけです。カートンと木材のレーザー出力を約30%調整して彫刻することを忘れないでください。これが全体像です

PCソフトウェア制御チャート
ここに画像の説明を挿入
まあそんなにについて

参照用にMCUソースプログラムを添付します。/
* zアドレス定義
50 1 = x +、2 = x-、3 = y +、4 = y-
51前進および後退ステップ
数が多い52前進および後退ステップのが少ない
53
54/55ワード幅
56
57ローライトスイッチ
58/59レーザー強度
60 x軸速度
61 y軸速度
62印刷開始0,57
63一時停止
64停止標識
65
66左右のマーク
100開始時のグレースケールデータ
* /

#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define N z [60] // X speed
#define M z [61] // Y speed
sbit xa = P1 ^ 3; //ステップモーター配線の定義モバイルレーザーヘッド
sbit xa_ = P1 ^ 2;
sbit xb = P1 ^ 1;
sbit xb_ = P1 ^ 0;
sbit a = P1 ^ 4;
sbit a_ = P1 ^ 5;
sbit b = P1 ^ 6;
sbit b_ = P1 ^ 7;
/ * sbit a = P1 ^ 4; //ステッピングモーターの配線はモバイルベースボードを定義します
sbit a_ = P1 ^ 5;
sbit b = P1 ^ 6;
sbit b_ = P1 ^ 7;
sbit xa = P1 ^ 3 ;
sbit xa_ = P1 ^ 2;
sbit xb_ = P1 ^ 1;
sbit xb_ = P1 ^ 0; * /
sbit jg = P2 ^ 0;
sbit led = P2 ^ 1; // LED
uchar xdata z [500] = { 0}; //キャッシュ
ucharバフ[3]; //シリアルキャッシュ
uchar x1、x0、y1、y0、cont2 = 0;
uchar xfb = 4、yfb = 4; //歩行フラグ

unsigned char HighRH = 0; //高レベルのリロード値の上位バイトunsigned char HighRL = 0; //高レベルのリロード値の
下位バイト
unsigned char LowRH = 0; //低レベルのリロード値
符号なしcharの上位バイトLowRL = 0; //低レベルの再読み込み値の下位バイト

void delayms(uint xms)
{
uint i、j;
for(i = xms; i> 0; i–)// i = xms即延時约xmsニット秒
for(j = 110; j> 0; j–);
}

/ * PWM、fr周波数、DCデューティサイクルを構成して開始* /
void ConfigPWM(unsigned int fr、unsigned char dc)
{
unsigned int high、low;
unsigned long tmp;

tmp =(11059200/12)/ fr; //
サイクルの計算に必要なカウント値=(tmp dc)/ 100; //高レベル
低の計算に必要なカウント値= tmp-high; //低計算
レベルに必要なカウント値= 65536-high + 12; //高レベルのリロード値を計算して割り込み遅延を補正します
low = 65536-low + 12; //低レベルのリロード値を計算して補正します割り込み遅延
HighRH =(unsigned char)(high >> 8); //高レベルのリロード値は高バイトと低バイトに分割されます
HighRL =(unsigned char)high;
LowRH =(unsigned char)(low >> 8) ; //低レベルのリロード値は上位バイトと下位バイトに分割されます
LowRL =(unsigned char)low;
TMOD&= 0xF0; // T0の制御ビットがクリアされます
TMOD | = 0x01; // T0をモード1として構成
TH0 = HighRH; // T0リロード値のロード
TL0 = HighRL;
ET0 = 1; // T0割り込みを有効にする
TR0 = 1; // T0を開始
jg = 0; //低レベルを出力、レーザーをオフにする
}
/
PWMをオフにする/
void ClosePWM()
{
TR0 = 0; //タイマー0を停止
ET0 = 0; //タイマー0割り込みを無効にする
jg = 0; //低レベルを出力、レーザーをオフにする
}
/
T0割り込みサービス関数、PWM出力を生成* /
void InterruptTimer0()割り込み1
{
if(jg == 0) //現在の出力が低レベルの場合、高レベルの値を読み込み、高レベルを出力します
{
TH0 = LowRH;
TL0 = LowRL;
jg = 1;
}
else //現在の出力が高レベルの場合、低レベルの値を読み込み、出力します低レベル
{
TH0 = HighRH;
TL0 = HighRL;
jg = 0;
}
}

void xfor(uint i)// X軸前進関数、前進ステップ数
{
while(1)
{
if(xfb4)
{
xa = xb = 1;
xb_ = xa_ = 0;
xfb = 1;
私-;
delayms(N);
もし私が
0){xa = xb = 0; break;}
}
if(xfb1)
{
xb = xa_ = 1;
xa = xb_ = 0;
xfb = 2;
私-;
delayms(N);
もし私が
0){xa_ = xb = 0; break;}
}
if(xfb2)
{
xa_ = xb_ = 1;
xb = xa = 0;
xfb = 3; // ステップフラグ
i–;
delayms(N);
if(i
0){xa_ = xb_ = 0; break;}
}
if(xfb3)
{
xa_ = xb = 0;
xb_ = xa = 1;
xfb = 4;
私-;
delayms(N);
もし私が
0){xa = xb_ = 0; 休憩;}
}

}

}

void xbac(uint i)// xxx逆方向関数
{
while(1)
{
if(xfb1)
{
xa_ = xb = 0;
xb_ = xa = 1;
xfb = 4;
i–; //
ステップフラグdelayms(N);
if(i
0){xa = xb_ = 0; break;}
}
if(xfb4)
{
xa_ = xb_ = 1;
xb = xa = 0;
xfb = 3;
私-;
delayms(N);
もし私が
0){xa_ = xb_ = 0; break;}
}
if(xfb3)
{
xb = xa_ = 1;
xa = xb_ = 0;
xfb = 2; // ステップフラグ
i–;
delayms(N);
if(i
0){xa_ = xb = 0; break;}
}
if(xfb2)
{
xa = xb = 1;
xb_ = xa_ = 0;
xfb = 1;
私-;
delayms(N);
もし私が
0){xa = xb = 0; ブレーク;}
}
}
}

void yfor(uint i)// y轴前先函数
{
while(1)
{
switch(yfb)
{
case 4:{a = b = 1; b_ = a_ = 0; yfb = 1; 私-; delayms(M); もし私が0){a = b = 0; break;}}
ケース1:{b = a_ = 1; a = b_ = 0; yfb = 2; 私-; delayms(M); もし私が
0){a_ = b = 0; break;}}
ケース2:{a_ = b_ = 1; b = a = 0; yfb = 3; 私-; delayms(M); もし私が0){a_ = b_ = 0; break;}}
ケース3:{b_ = a = 1; a_ = b = 0; yfb = 4; 私-; delayms(M); もし私が
0){a = b_ = 0; break;}}
}
if(i == 0)break;
}
}

void ybac(uint i)// yy后退函数
{
while(1)
{
switch(yfb)
{
ケース1:{a = b_ = 1; b = a_ = 0; yfb = 4; 私-; delayms(M); もし私が0){a = b_ = 0; break;}}
ケース4:{b_ = a_ = 1; a = b = 0; yfb = 3; 私-; delayms(M); もし私が
0){a_ = b_ = 0; break;}}
ケース3:{a_ = b = 1; b_ = a = 0; yfb = 2; 私-; delayms(M); もし私が0){a_ = b = 0; break;}}
ケース2:{b = a = 1; a_ = b_ = 0; yfb = 1; 私-; delayms(M); もし私が
0){a = b = 0; break;}}
}
if(i == 0)break;
}
}

ボイドdazi(UINT zik)//印刷機能を変更する機能を印刷する
{
UINT X;
。JG = 1。

for(x=0;x<zik;x++)//执行zik个循环,x轴右移zik步
                    {
                      while(z[63]);        //暂停等待
                            if(z[64]==1) break;//停止标志 跳出循环
                            SBUF=255;                    // 每开始打印一个点,向上位机发送255,上位机进度显示用
                            jg=1;              //开激光
                            delayms((z[99+x]*(z[58]*256+z[59]))/100);
                        jg=0;              //关闭激光
                    if(z[66]==1)
                    {
                    xbac(1);
                    }        
         else
                     {
                     xfor(1);
                     }                         
                    }          
            if(z[64==1])    z[64]=0;
        else{yfor(1);}             //y轴进一行
        z[62]=0;                   //一行打印完成
            SBUF=1;                    //发送信息,表示打印一行完成 

}

/ *シリアルポート設定機能、ボー通信ボーレート/
void ConfigUART(unsigned int baud)
{
/
SCON = 0x50; //シリアルポートをモード1に設定
TMOD&= 0x0F; // T1
TMODの制御ビットをクリア| = 0x20 ; // T1をモード2として構成
TH1 = 256-(11059200/12/32)/ baud; // T1のリロード値を計算
TL1 = TH1; //初期値はリロード値と等しい
ET1 = 0; // T1割り込みを無効にする
ES = 1; //シリアル割り込みを有効にする
TR1 = 1; // T1を開始* /

SCON = 0X50; //作業モード1に設定
// TMOD = 0X20; //カウンター作業モード2を設定

TMOD&= 0x0F; // T1制御ビットをクリア
TMOD | = 0x20; // T1をモード2として構成

PCON = 0X80; //ボーレートを2倍にする
TH1 = 0Xf3; //ボーレートが4800であることに注意してください
TL1 = 0Xf3;
ES = 1; //受信割り込みを開く
EA = 1; //合計割り込みを開く
TR1 = 1;

}

void chuanlo()割り込み4
{
if(RI)
{
buff [cont2] = SBUF; //毎回3バイト、高アドレス、低アドレス、データ、、

cont2 ++;
if(cont2 == 3)//受信した3バイトごとに、アドレスにデータを書き込みます
{
z [(buff [0] 256)+ buff [1]] = buff [2];
cont2 = 0;
SBUF = 0; // テストするためにこのコード行をここに追加
*************
}
RI = 0;

}
if(TI)
{
TI = 0;

……………………

スペースの制限により、コードの一部のみを書き込むことができます

最後に、コメントや提案があれば、私にメッセージを残してください。一緒に学び、一緒に進めましょう。
完全なコードまたはデザインファイルが必要な場合は、メッセージまたはプライベートメッセージを下に残してください。表示され次第、返信します。

ありがとう!

97件の元の記事を公開 200件の賞賛 80,000回以上の閲覧

おすすめ

転載: blog.csdn.net/weixin_44212493/article/details/104334577