スクラップDVDドライブ、L293Dを使用してミニCNC2Dプロッタを作成する方法
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
| ||||
|
このプロジェクトについて
写真のように2枚のスクラップDVDドライブを配置します <図>
1。 ArduinoIDEをダウンロード
2。 ProcessingIDEをダウンロード
3。 Arduino IDEを開き、からダウンロードしたコードをロードします ここ 。
4。 Processing IDEを開き、からダウンロードしたコードをロードします。 ここ 。
スクラップDVDドライブを開き、内部移動トレイを取り外します。ステッパー機構を備えたこのトレイは、X軸とY軸として機能します。機械の組み立て方法を理解するために、添付の写真をご覧ください。空のDVDドライブケースに穴を開け、ナットボルトを使用してX軸とY軸をそれぞれのDVDケースに取り付けます。
次に、それらを互いに垂直に配置します。
Gコード
このCNCマシンと互換性のあるgコードファイルを作成するには、Inkscapeを使用する必要があります。
Inkscapeは、Windows、Mac OS X、Linuxで動作するプロ品質のベクターグラフィックソフトウェアです。イラスト、アイコン、ロゴ、図、地図、Webグラフィックなど、さまざまなグラフィックを作成するために、世界中のデザインの専門家や愛好家によって使用されています。 Inkscapeは、ネイティブ形式としてW3CオープンスタンダードSVG(Scalable Vector Graphics)を使用しており、無料のオープンソースソフトウェアです。ここからInkscapeをダウンロードしてインストールします。
( 重要 :0.48.5バージョンをダウンロード)次に、画像をgコードファイルにエクスポートできるようにするアドオンをインストールする必要があります。このアドオンは、インストールに関する注意事項とともにここにあります。
Gコードファイルの作成方法については、YouTubeのビデオをフォローしてください。
- gctrlファイルを処理IDEにアップロードし、処理ウィンドウで[再生]ボタンをクリックします。
- 最初に「p」を押して通信ポートを選択します
- 必要に応じて、キーボードから1、2、または3ボタンを押してジョギング速度を設定できます
- 「g」を押してGコードファイルをロードします
- gコードファイルを選択してEnterキーを押すとすぐに、マシンをプロットする準備が整います
これで、プロッタの準備が整いました。いくつかの既製のGコードファイルのダウンロードリンク:
- https://www.dropbox.com/s/bazynxife4k1trv/Hisoka.gcode?dl=0
- https://www.dropbox.com/s/h6bkdr5lhegbj6a/papay.gcode?dl=0
- https://www.dropbox.com/s/ueku5ckt6m4cmg4/spong1.gcode?dl=0
ご清聴ありがとうございました!完全な図については、このリンクにアクセスしてください。
<図>
<図>
<図>
<図>
<図>
<図>
<図>
マシンをライブで見るためのビデオ:
コード
- ArduinoCNCコード
- コードの処理
ArduinoCNCコード Arduino
このコードをArduinoにアップロードします#include#include #define LINE_BUFFER_LENGTH 512char STEP =MICROSTEP; //上下のサーボ位置constint penZUp =95; const int penZDown =83; // PWMピンのサーボ10constint penServoPin =10; // DVDステッパーには適切ですが、ここではそれほど重要ではありませんconst int StepsPerRevolution =48; //サーボサーボpenServoを制御するサーボオブジェクトを作成します。 // L293D用のこのArduinoピンを使用してX軸とY軸のステッパーを初期化しますH-bridgeAF_SteppermyStepperY(stepsPerRevolution、1); AF_Stepper myStepperX(stepsPerRevolution、2); / *構造体、グローバル変数* / struct point {float x;フロートy;フロートz; }; // plotheadstructポイントacturatorPosの現在の位置; //描画設定はOKである必要がありますfloatStepInc =1; int StepDelay =0; int LineDelay =0; int penDelay =50; // 1ミリメートル進むためのモーターステップ//使用スケッチをテストして100ステップ進みます。線の長さを測定します。 // mmあたりの歩数を計算します。ここに入力します。floatStepsPerMillimeterX=100.0; float StepsPerMillimeterY =100.0; //ロボットの限界をmm単位で描画します//最初はOKです。うまく校正されていれば、50mmまで上がる可能性があります。 float Xmin =0; float Xmax =40; float Ymin =0; float Ymax =40; float Zmin =0; float Zmax =1; float Xpos =Xmin; float Ypos =Ymin; float Zpos =Zmax; //デバッグ出力を取得するにはtrueに設定します。booleanverbose=false; //解釈する必要があります//移動用のG1 // G4 P300(150ms待機)// M300 S30(ペンダウン)// M300 S50(ペンアップ)/ /(//他のコマンドを破棄します!/ ********************** * void setup()-初期化******* **************** / void setup(){//セットアップSerial.begin(9600); penServo.attach(penServoPin); penServo.write(penZUp); delay(100); //必要に応じて減少myStepperX.setSpeed(600); myStepperY.setSpeed(600); //初期デフォルト位置に設定して移動//未定//通知!!! Serial.println( "Mini CNC Plotter alive and killing! "); Serial.print(" X範囲は "); Serial.print(Xmin); Serial.print(" to "); Serial.print(Xmax); Serial.println(" mm。 "); Serial。 print( "Y範囲は"); Serial.print(Ymin); Serial.print( "to"); Serial.print(Ymax); Serial.println( "mm。");} / ***** ***************** * void loop()-メインループ*********************** / void loop(){delay( 100); char line [LINE_BUFFER_LENGTH]; char c; int lineIndex; bool lineIsComment、lineSemiColon; lineIndex =0; lineSemiColon =false; lineIsComment =false; while(1){//シリアル受信-主にGrblから、セミコロンのサポートを追加while(Serial.available()> 0){c =Serial.read(); if((c =='\ n')||(c =='\ r')){//行の終わりに達しましたif(lineIndex> 0){//行が完了しました。次に実行してください! line [lineIndex] ='\ 0'; //文字列を終了しますif(verbose){Serial.print( "Received:"); Serial.println(行); } processIncomingLine(line、lineIndex); lineIndex =0; } else {//空またはコメント行。ブロックをスキップします。 } lineIsComment =false; lineSemiColon =false; Serial.println( "ok"); } else {if((lineIsComment)||(lineSemiColon)){//すべてのコメント文字を破棄するif(c ==')')lineIsComment =false; //コメントの終わり。行を再開します。 } else {if(c <=''){//ホワイトペースと制御文字を破棄します} else if(c =='/'){//ブロック削除はサポートされていません。文字を無視します。 } else if(c =='('){//コメントフラグを有効にし、 ')'またはEOLまでのすべての文字を無視します。 lineIsComment =true; } else if(c ==';'){lineSemiColon =true; } else if(lineIndex> =LINE_BUFFER_LENGTH-1){Serial.println( "ERROR --lineBuffer overlay"); lineIsComment =false; lineSemiColon =false; } else if(c> ='a' &&c <='z'){//大文字の小文字line [lineIndex ++] =c-'a '+' A '; } else {line [lineIndex ++] =c; }}}}}} void processIncomingLine(char * line、int charNB){int currentIndex =0; char buffer [64]; // 1つのパラメータstructpointnewPosには64で十分であることを願っています。 newPos.x =0.0; newPos.y =0.0; //解釈する必要があります//移動するG1 // G4 P300(150ms待機)// G1 X60 Y30 // G1 X30 Y50 // M300 S30(ペンダウン)// M300 S50(ペンアップ)// (//他のコマンドを破棄します!while(currentIndex =Xmax){x1 =Xmax; } if(x1 <=Xmin){x1 =Xmin; } if(y1> =Ymax){y1 =Ymax; } if(y1 <=Ymin){y1 =Ymin; } if(verbose){Serial.print( "Xpos、Ypos:"); Serial.print(Xpos); Serial.print( "、"); Serial.print(Ypos); Serial.println( ""); } if(verbose){Serial.print( "x1、y1:"); Serial.print(x1); Serial.print( "、"); Serial.print(y1); Serial.println( ""); } //座標をステップに変換x1 =(int)(x1 * StepsPerMillimeterX); y1 =(int)(y1 * StepsPerMillimeterY); float x0 =Xpos; float y0 =Ypos; //座標の変化を調べましょうlongdx =abs(x1-x0); long dy =abs(y1-y0); int sx =x0 dy){for(i =0; i =dx){over- =dx; myStepperY.onestep(sy、STEP); } delay(StepDelay); }} else {for(i =0; i =dy){over- =dy; myStepperX.onestep(sx、STEP); } delay(StepDelay); }} if(verbose){Serial.print( "dx、dy:"); Serial.print(dx); Serial.print( "、"); Serial.print(dy); Serial.println( ""); } if(verbose){Serial.print( "Going to("); Serial.print(x0); Serial.print( "、"); Serial.print(y0); Serial.println( ")"); } //次の行が送信されるまでの遅延delay(LineDelay); //位置を更新しますXpos =x1; Ypos =y1;} // penvoid penUp(){penServo.write(penZUp);を発生させますdelay(penDelay); Zpos =Zmax; digitalWrite(15、LOW); digitalWrite(16、HIGH); if(verbose){Serial.println( "Pen up!"); }} // penvoid penDown(){penServo.write(penZDown);を下げますdelay(penDelay); Zpos =Zmin; digitalWrite(15、HIGH); digitalWrite(16、LOW); if(verbose){Serial.println( "Pen down。"); }}
コードの処理 Java
このコードをProcessingIDEにアップロードしますimport java.awt.event.KeyEvent; import javax.swing.JOptionPane; importprocessing.serial。*; Serial port =null; //オペレーティングシステムに適切な行を選択して変更します/ /インタラクティブポートを使用するにはnullのままにします(プログラムで「p」を押します)String portname =null; // String portname =Serial.list()[0]; // Mac OS X // String portname ="/ dev / ttyUSB0"; // Linux // String portname ="COM6"; // Windowsbooleanストリーミング=false; float speed =0.001; String [] gcode; int i =0; void openSerialPort(){if(portname ==null)return; if(port!=null)port.stop(); port =new Serial(this、portname、9600); port.bufferUntil( '\ n');} void selectSerialPort(){String result =(String)JOptionPane.showInputDialog(frame、 "Arduinoボードに対応するシリアルポートを選択してください。"、 "シリアルポートを選択してください"、JOptionPane。 QUESTION_MESSAGE、null、Serial.list()、0); if(result!=null){portname =result; openSerialPort(); }} void setup(){size(500、250); openSerialPort();} void draw(){background(0); fill(255); int y =24、dy =12; text( "INSTRUCTIONS"、12、y); y + =dy; text( "p:シリアルポートを選択"、12、y); y + =dy; text( "1:ジョグあたり速度を0.001インチ(1 mil)に設定"、12、y); y + =dy; text( "2:ジョグあたり速度を0.010インチ(10 mil)に設定"、12、y); y + =dy; text( "3:ジョグあたり速度を0.100インチ(100 mil)に設定"、12、y); y + =dy; text( "矢印キー:x-y平面でジョギング"、12、y); y + =dy; text( "Page Up&Page Down:Jog in z axis"、12、y); y + =dy; text( "$:grbl設定の表示"、12、y); y + =dy; text( "h:家に帰る"、12、y); y + =dy; text( "0:ゼロマシン(現在の場所にホームを設定)"、12、y); y + =dy; text( "g:gコードファイルをストリーミング"、12、y); y + =dy; text( "x:gコードのストリーミングを停止します(これは即時ではありません)"、12、y); y + =dy; y =高さ-dy; text( "現在のジョグ速度:" +速度+ "ステップあたりのインチ"、12、y); y- =dy; text( "現在のシリアルポート:" +ポート名、12、y); y- =dy;} void keyPressed(){if(key =='1')speed =0.001; if(key =='2')speed =0.01; if(key =='3')speed =0.1; if(!streaming){if(keyCode ==LEFT)port.write( "G91 \ nG20 \ nG00 X-" +速度+ "Y0.000 Z0.000 \ n"); if(keyCode ==RIGHT)port.write( "G91 \ nG20 \ nG00 X" +速度+ "Y0.000 Z0.000 \ n"); if(keyCode ==UP)port.write( "G91 \ nG20 \ nG00 X0.000 Y" +速度+ "Z0.000 \ n"); if(keyCode ==DOWN)port.write( "G91 \ nG20 \ nG00 X0.000 Y-" +速度+ "Z0.000 \ n"); if(keyCode ==KeyEvent.VK_PAGE_UP)port.write( "G91 \ nG20 \ nG00 X0.000 Y0.000 Z" +速度+ "\ n"); if(keyCode ==KeyEvent.VK_PAGE_DOWN)port.write( "G91 \ nG20 \ nG00 X0.000 Y0.000 Z-" +速度+ "\ n"); if(key =='h')port.write( "G90 \ nG20 \ nG00 X0.000 Y0.000 Z0.000 \ n"); if(key =='v')port.write( "$ 0 =75 \ n $ 1 =74 \ n $ 2 =75 \ n"); // if(key =='v')port.write( "$ 0 =100 \ n $ 1 =74 \ n $ 2 =75 \ n"); if(key =='s')port.write( "$ 3 =10 \ n"); if(key =='e')port.write( "$ 16 =1 \ n"); if(key =='d')port.write( "$ 16 =0 \ n"); if(key =='0')openSerialPort(); if(key =='p')selectSerialPort(); if(key =='$')port.write( "$$ \ n"); } if(!streaming &&key =='g'){gcode =null; i =0;ファイルfile =null; println( "ファイルを読み込んでいます..."); selectInput( "処理するファイルを選択してください:"、 "fileSelected"、file); } if(key =='x')streaming =false;} void fileSelected(File selection){if(selection ==null){println( "ウィンドウが閉じられたか、ユーザーがキャンセルを押しました。"); } else {println( "ユーザーが選択しました" + selection.getAbsolutePath()); gcode =loadStrings(selection.getAbsolutePath()); if(gcode ==null)return;ストリーミング=true;ストリーム(); }} void stream(){if(!streaming)return; while(true){if(i ==gcode.length){ストリーミング=false;戻る; } if(gcode [i] .trim()。length()==0)i ++;そうでなければ壊れます。 } println(gcode [i]); port.write(gcode [i] + '\ n'); i ++;} void serialEvent(Serial p){String s =p.readStringUntil( '\ n'); println(s.trim()); if(s.trim()。startsWith( "ok"))stream(); if(s.trim()。startsWith( "error"))stream(); // XXX:本当に?}
回路図
図に示すようにすべてのコンポーネントを接続します 製造プロセス