工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

スクラップDVDドライブ、L293Dを使用してミニCNC2Dプロッタを作成する方法

コンポーネントと消耗品

>
Arduino UNO
マシンのブレイン
× 1
L293Dモーターシールド
軸のステッピングモーターを制御する
× 1
タワープロサーボモーター9g
Zaxis移動ペンを上に、ペンを下に
× 1
Scrap DVD Dr
機械的なX軸とY軸
× 1
ジャンパー線(汎用)
× 1

アプリとオンラインサービス

>
Arduino IDE
処理中のIDE
Inkscape

このプロジェクトについて

写真のように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:本当に?} 

回路図

図に示すようにすべてのコンポーネントを接続します

製造プロセス

  1. 自宅でDIY宿題ライティングマシンを作る
  2. Arduinoを使用してモニターをAmbilightにする
  3. ArduinoUnoを使用した人間検出ロボティクスシステム
  4. ラズベリーモーターシールドを使用したAndroid制御玩具
  5. カスタマイズ可能なパンチ可能なキーボードボタンの作り方
  6. Arduinoを使用して地球の質量を測定する方法
  7. PHPを使用してArduinoと通信するWebサイトを作成する方法
  8. Arduinoで音楽を作る方法
  9. Arduinoベースの自動ドア開口部の作り方
  10. ArduinoBluetooth制御車の作り方
  11. ArduinoとProcessingIDEを使用してコンパスを作成する方法