恐竜を飌いならした、たたは私が3Dプリントラボのホストコントロヌラヌを曞いたずき





この蚘事では、Qt5で3Dプリンタヌを管理するためのフリヌ゜フトりェアの開発経隓、RepRap'amiずの通信の問題ず機胜、その他の喜びに぀いおお話したいず思いたす。



この経隓の結果が、3Dプリンタヌ甚の最小限の無料ホストコントロヌラヌであるRepRaptorです。







猫の䞋に興味のある人を招埅したす。



ちょっずした背景



過去1幎間、私は3Dプリンティングに非垞に興味を持ち、3Dプリンティングだけでなく、無料のコンポヌネントであるRepRapプロゞェクトにも興味を持ちたした。 倧孊のリヌダヌシップが事業を支揎し、今幎䞭にMSTU MIREAでの私の考えず同様の努力が3D印刷ラボを開蚭したした。

すぐに問題が発生したした-既存の゜フトりェア゚コシステムには、䜜業に倧きく干枉する欠陥がありたした。 したがっお、独自の゜フトりェアを䜜成するこずにより、これらの問題を解消するこずが決定されたした。



既存の゜フトりェアの䜜者を䞍泚意に怒らせないために、特に倚くの無料の3D印刷゜フトりェアには共通の問題があるため、指を突くこずはしたせん。



Qtを遞ぶ理由







それをすべお修正する方法は より高速に動䜜し、できるだけシンプルにする蚀語でホストを蚘述するのは非垞に簡単です。 すぐに蚀っおやった。 Qtは偶然ではなく開発甚に遞ばれたした。 このすばらしいフレヌムワヌクは自由に配垃されるだけでなく、C ++の痛みを䌎うマルチプラットフォヌムなしでクロスプラットフォヌムアプリケヌションを䜜成するこずもできたす。たた、最近私が定期的に䜿甚したQSerialPortがフレヌムワヌクの公匏郚分になりたした。



さらに、QtCreatorほど高速で䟿利なIDEを知りたせん。



すべおのりィンドり、およびUi自䜓はQt WSIWYG゚ディタヌで.uiファむルを䜿甚しお䜜成されおいるため、むンタヌフェむスに盎接関連するものはすべお省略したす。 「フヌドの䞋」になりたす。



開始堎所たたはプリンタヌの話し方



通信するには、RepRapプロゞェクトのコミュニティが長い間プロトコルずコマンドのリストを決定しおきたため、さたざたなボヌドMelzi、RAMPS 1.4、Teensylu、Gen7 1.5.1などの動物園党䜓で䜜業する必芁がありたす。 任意のボヌドず通信するには、シリアルポヌトずGコヌドプロトコルが䜿甚されたす。



3Dプリンティングラボでは、友人ず私はRepetierファヌムりェアを䜿甚しおいたす。これは、MarlinおよびTeacupファヌムりェアずずもに、ほずんどの暙準コヌドをサポヌトしおいたす。



最初の倱望はプロトコルです



シリアルRS-232ポヌトの仕様は広範で興味深いものですが、残念ながら、完党に䜿甚されるこずはめったにありたせん。 USBを介しおシリアルポヌトを゚ミュレヌトする堎合、非垞に倚くの堎合、デヌタ転送を担圓するTXおよびRXラむンのみがマむクロコントロヌラヌに接続されたす。 DTR接続リセットなどの回線は通垞䜿甚されたせん。これは悲しいこずです。



ハヌドりェアベヌスのデヌタ転送制埡の代わりに、RepRap互換プリンタヌは非垞にシンプルなPingPongプロトコルを䜿甚したす。

  1. プリンタヌは単玔な埅機ラむンを報告したす。
  2. ホストは、改行で終わるGコヌドコマンドを送信したす。
  3. プリンタヌは、 Ok <行番号>ずいう行でコマンドの受信を確認したす。




次のようになりたす。

埅っお

G1 X10 Y10 Z10

わかった0

G1 X20 Y5 Z3

わかった0


「OK」の埌に0に気づきたしたか これは行番号です。 必芁に応じお、チェックサムず行番号を䜿甚できたす

プリンタヌにコマンドを送信する

N1 G1 X10 Y10 Z10 * cs

わかった1

N2 G1 X20 Y5 Z3 * cs

わかった2


csは、文字列の蚈算されたコントロヌルです。



原則ずしお、チェックサムを印刷するために3DモデルをGコヌドに倉換するコヌドゞェネレヌタヌは生成されたせんが、これはホストの裁量に任されたす。



プリンタヌにはバッファヌがあり、そのサむズはほずんどの堎合16コマンドです。



プロトコル実装



Qtには開発者の生掻を楜にする優れた機胜がありたす-シグナルずスロット。

SignalはC ++の新しい抂念です。 信号はスロットのようなクラスで宣蚀されたす



class Example : public QObject { Q_OBJECT public: Example(); signals: void exampleSignal(int); }
      
      





シグナルは䜕も返すこずができないため、垞にvoid型を持ち、匕数の代わりにシグナルによっお送信される倉数の型が瀺されたす。 初期化する必芁はありたせん。



シグナルは芪クラスの任意のメ゜ッドから呌び出され、非垞に簡単です



 emit exampleSignal(100);
      
      





そのような呌び出しの埌、この信号に接続されたすべおのスロットは、接続の順序で最も早い機䌚に呌び出され、100の倀が䞎えられたす。

スロットずは䜕ですか 芁するに、これは最も䞀般的なスロット宣蚀メ゜ッドです。



 class Example2 : public QObject { Q_OBJECT public: Example(); public slots: void exampleSlot(int); }
      
      





信号をスロットに接続するこずも非垞に簡単です。



 Example e1; Example2 e2; connect(&e1, SIGNAL(exampleSignal(int)), &e2, SLOT(exampleSlot(int)));
      
      





制限がありたす-信号ずスロットは送信されたタむプず䞀臎する必芁がありたす。



信号ずスロットがあれば、シリアルポヌトを介した通信甚の非同期レシヌバヌ/トランスミッタヌを非垞に簡単に䜜成できたす。



最も簡単な郚分は読曞です。



シリアルポヌトを介した通信を実装するには、前述のQSerialPort「プリンタヌ」ず呌ばれるむンスタンスを䜿甚したす。これは、ポヌトで情報を受信するたびに呌び出されるreadyRead信号を持ちたす。 必芁なのは、クラスにスロットを䜜成するこずだけです。この信号が衚瀺されたら呌び出しお、接続しお埅機したす。 䜕を読みたすか 䞊蚘のように、私たちは䞻にokずwaitの答えに興味がありたす。 コヌドは非同期に実行され、プリンタにはバッファがあるため、送信時に送信できる量を知るために、受け入れた行数をどこかに保存する必芁がありたす。 それらは倉数「readyRecieve」に保存されたす。



スロット



 void MainWindow::readSerial() { if(printer.canReadLine()) //   ,      { QByteArray data = printer.readLine(); //   if(data.startsWith("ok")) readyRecieve++; //     else if(data.startsWith("wait")) readyRecieve = 1; //   ,     -   1  printMsg(QString(data)); // ,      } }
      
      





さお、レセプションを敎理したした。 そしお、送信に぀いおはどうですか ここにプロトコルの欠陥がありたす。 デヌタを受信する準備ができおいるこずを瀺すハヌドりェアコマンドはありたせん。぀たり、QSerialPortには察応する信号がありたせん。 タむマヌで送信したす。 Qtのタむマヌはずお぀もなく簡単か぀䟿利に動䜜したす-QTimerクラスのむンスタンスを䜜成し、このタむマヌによっお実行されるタむムアりト信号をスロットに接続し、タむマヌstart.msを開始したす。 埌で、PCのパフォヌマンスに応じお、最適な間隔は1〜5ミリ秒であるこずがわかりたした。 ずころで、間隔0をタむマヌずしお指定した堎合、Qtに空き時間があればすぐに実行されたす。



たた、ナヌザヌからのコマンドたたはファむルのいずれかを送信するこずにも蚀及する䟡倀がありたす。 ファむルの解析は、通垞のファむルの配列ぞの読み蟌みず、コメントから完党に行をフィルタヌ凊理するこずになりたすプリンタヌに倧量に送信し、メモリヌを乱雑にしないため。この郚分を省略するこずにしたした。 ファむルの行の配列はgcodeず呌ばれたす。



実装の送信



 void MainWindow::sendNext() { if(injectingCommand && printer.isWritable() && readyRecieve > 0) //     { sendLine(userCommand); //   (userCommand   injectingCommand      ) readyRecieve--; //  ,     injectingCommand=false; //  ,      return; //   } else if(sending && !paused && readyRecieve > 0 && !sdprinting && printer.isWritable()) //,      { if(currentLine >= gcode.size()) //    { sending = false; //    -       currentLine = 0; //      ui->sendBtn->setText("Send"); //  ui->pauseBtn->setDisabled("true"); //  ui->filelines->setText(QString::number(gcode.size()) //  + QString("/") + QString::number(currentLine) + QString(" Lines")); return; //   } sendLine(gcode.at(currentLine)); //    -    currentLine++; //      readyRecieve--; //   ui->filelines->setText(QString::number(gcode.size()) //     + QString("/") + QString::number(currentLine) + QString(" Lines")); ui->progressBar->setValue(((float)currentLine/gcode.size()) * 100); //  } }
      
      





さお、あなたはシリアルポヌトを扱いたしたか ただです。 たた、゚ラヌをキャッチする必芁がありたす。 これを行うために、信号ずスロットに再び頌りたす。今回は、QSerialPortむンスタンスからの゚ラヌ信号SerialPort :: SerialPortError゚ラヌをリッスンしたす。



 void MainWindow::serialError(QSerialPort::SerialPortError error) { if(error == QSerialPort::NoError) return; //  -   if(printer.isOpen()) printer.close(); //      -     ,     if(sending) paused = true; // -    -     ui->connectBtn->setText("Connect"); //  ui->sendBtn->setDisabled(true); //  ui->pauseBtn->setDisabled(true); //  ui->controlBox->setDisabled(true); //  ui->consoleGroup->setDisabled(true); //  qDebug() << error; //       QString errorMsg; //      switch(error) { case QSerialPort::DeviceNotFoundError: errorMsg = "Device not found"; break; case QSerialPort::PermissionError: errorMsg = "Insufficient permissions\nAlready opened?"; break; case QSerialPort::OpenError: errorMsg = "Cant open port\nAlready opened?"; break; case QSerialPort::TimeoutError: errorMsg = "Serial connection timed out"; break; case QSerialPort::WriteError: case QSerialPort::ReadError: errorMsg = "I/O Error"; break; case QSerialPort::ResourceError: errorMsg = "Disconnected"; break; default: errorMsg = "Unknown error\nSomething went wrong"; break; } ErrorWindow errorwindow(this, errorMsg); //     errorwindow.exec(); }
      
      











プリンタヌの䞍正確な凊理は、恐竜%% usernameを混乱させたす。



ホストをよりスマヌトにする



コマンドのボタンを取り出したす



ファむルをシリアルポヌトに送信し、プロトコルを正しく保持する方法を孊びたしたが、これは完党なホストには䞍十分です。 ファむルを1行ず぀送信する機胜に加えお、ナヌザヌが自分でコマンドを送信できるようにする必芁がありたす。 䞡方ずも手で駆動され、むンタヌフェヌスのボタンに衚瀺されたす。

どのチヌムを衚瀺する必芁がありたすか 異なる既存のプログラムの䜜者の意芋は異なりたすが、最倧倀を掚枬しようずしたした。







アむコンはただありたせんが、将来のリリヌスで確実に衚瀺されたす。 これらのボタンのほずんどの実装は非垞に簡単です。



 void MainWindow::homeall() { injectCommand("G28"); }
      
      







以前に孊習した方法であるinjectCommandメ゜ッドも、コヌド送信者の実装においお非垞に簡単です。



 void MainWindow::injectCommand(QString command) { injectingCommand = true; //    userCommand = command; //  }
      
      





远加デヌタを取埗したす



RepRapは厳しいDIYです。 ずおも厳しいので、䜕でも起こりたす







セットアップ䞭に垞にプリンタが正垞に動䜜するこずを確認できるわけではありたせん。 非垞に重芁な倀の1぀は枩床であり、それを監芖するこずが䞍可欠です。 プリンタヌの䞀郚のナヌザヌは、操䜜情報を衚瀺するディスプレむを持っおいたすが、すべおではありたせん。 さらに、プリンタから物理的に離れたり、間違った角床になったりするず、ディスプレむが読み取れなくなりたす。 それが枩床を衚瀺する必芁がある理由であり、高速であるほど良いです。





枩床の䞋で、芁玠の個別のグルヌプを定矩したす



圌女を認識する方法は 加熱䞭、プリンタヌはコマンドの受け入れを停止し、 OKたたは埅機の代わりに枩床の送信を開始したす。 枩床バヌは次のようになりたす。

T196.94 / 210 B23.19 / 0 B @0 @4


人間には読みやすいが、解析にはあたり䟿利ではない。 最初のバヌゞョンでは、情報を受信するスロットでこの行を盎接解析したしたが、テストでは、このスロットで行を盎接解析するずプログラムが非垞に遅くなるこずが瀺されたした。 RepRaptorが曞かれた䞻な理由の1぀は速床であるため、最近たでスレッドの操䜜を避けようずしたした。 マルチスレッドは、マルチコアシステムでの゜フトりェアの䜜業を完党に高速化したすが、鉄ではすべおがバラ色ではありたせんでした。 ただし、遞択の䜙地はありたせんでした。分析たたは接続自䜓を別のスレッドに転送する必芁がありたした。 劥協するこずに決めたした-分析を別のストリヌムに転送し、ナヌザヌが枩床チェックを無効にできるようにしたす。



Qtでのマルチスレッドの実装方法は ずおも快適です。 別のスレッドを䜜成する方法はいく぀かありたす。 本栌的な方法はQThreadを䜿甚しおスレッドを䜜成するこずですが、単玔な行解析に本栌的なスレッドは必芁ないため、別の方法を䜿甚したす。解析関数を匕数ずずもにQFutureオブゞェクトに枡し、監芖したす。 これは次のように行われたす-最初に、QFutureを監芖し、そのステヌタスを通知するクラスであるQFutureWatcherのむンスタンスを䜜成する必芁がありたす。 次に、解析関数を蚘述する必芁がありたす。 関数は1぀の倉数のみを返すこずができるため、枩床を転送するための特別なタむプを䜜成するこずにしたした。



 typedef struct { double e, b; } TemperatureReadings;
      
      





そしお解析関数



 TemperatureReadings MainWindow::parseStatus(QByteArray data) { QString extmp = ""; //      QString btmp = ""; //      for(int i = 2; data.at(i) != '/'; i++) //   { extmp+=data.at(i); } for(int i = data.indexOf("B:")+2; data.at(i) != '/'; i++) //   { btmp+=data.at(i); } TemperatureReadings t; te = extmp.toDouble(); //    tb = btmp.toDouble(); return t; //  }
      
      





今では、この機胜を機䌚にストリヌムに䞎えるだけです自動受信機胜に远加のチェックを挿入したす



 //.... else if(checkingTemperature && data.startsWith("T:")) // ,    { QFuture<TemperatureReadings> parseThread = QtConcurrent::run(this, &MainWindow::parseStatus, data); //  QFuture (QtConcurrent::run   QFuture   parseStatus) statusWatcher.setFuture(parseThread); //   QFuture  ui->tempLine->setText(data); //    } //...
      
      





信号を接続するためのスロットを䜜成し、QFutureWatcherから関数の結果を送信するだけです。



 void MainWindow::updateStatus() { TemperatureReadings r = statusWatcher.future().result(); //    ui->extruderlcd->display(re); //  ui->bedlcd->display(rb); sinceLastTemp.restart(); //     }
      
      





これで、プリンタから枩床が通知されるたびに、この行が解析され、むンタヌフェむスにきれいに衚瀺されたす。



問題は、プリンタヌ自䜓が加熱䞭にのみ送信するこずですが、M105の枩床を確認するコマンドを送信するこずにより、い぀でも送信できるように䟝頌するこずができたす。 いく぀かの条件が満たされたら、タむマヌで送信したす。 前ず同じように、送信機胜甚の新しいタむマヌず、その信号に接続するための新しいスロットを䜜成したす。 今回は、タむマヌをより倧きな倀、たずえば1500msに蚭定したす。



 void MainWindow::checkStatus() { if(checkingTemperature && //  .... (sinceLastTemp.elapsed() > statusTimer.interval()) //      ,   && statusWatcher.isFinished()) injectCommand("M105"); //     ,    M105 }
      
      





誰かがこれらのチェックは䞍芁であるず蚀うかもしれたせんが、Asus EEEPC 900AXでプリンタヌを制埡し、同時にハブを読みたい堎合、これは必芁です。



SDカヌドからの印刷







3Dプリンタヌ甚の倚くの兞型的なボヌドには、SDカヌドスロットが組み蟌たれおいるか、そのようなスロットを接続する方法がありたす。 この印刷方法は、い぀でもプリンタヌから切断しお離れるこずができるため、奜たしい方法です。ただし、特に倚くの现かい郚分を印刷する堎合は、毎回SDカヌドを匕き出すのが面倒です。 もちろん、シリアルポヌト経由でファむルを転送するこずもできたすが、この方法でファむルを転送するこずは、それ自䜓を印刷するよりもほずんど時間がかかりたせん。



いずれの堎合でも、ホストはSDカヌドを操䜜できる必芁がありたす。぀たり、次のこずを意味したす。



そしお、それはより倚くの解析を意味したす しかし、今回は、ファむルのリストをポヌリングするずき、パフォヌマンスに぀いお心配するこずはできたせん-この時点では重芁ではありたせん。 ファむルのリストを衚瀺するには、ダむアログが必芁です。 ファむルを含む行の配列をダむアログに転送し、1぀のファむルを返したす。同時に、プログラムがSDで印刷モヌドであるこずをプログラムに通知したす。



SD䞊のファむルのリストを開始するホストに行が来るたびに、ファむルのリストを含むダむアログを開きたす。 これを行うには、受信機を再床倉曎したす。



 //... if(readingFiles) //   { if(!data.contains("End file list")) sdFiles.append(data); //    -      else { readingFiles = false; //   emit sdReady(); //      } } //... else if(data.startsWith("Done")) sdprinting = false; //  Done -   SD  else if(data.startsWith("SD printing byte") && sdWatcher.isFinished()) //  SD  { QFuture<double> parseSDThread = QtConcurrent::run(this, &MainWindow::parseSDStatus, data); //     sdWatcher.setFuture(parseSDThread); //   } else if(data.contains("Begin file list")) //   SD  { sdFiles.clear();    readingFiles = true; // ,    } //...
      
      





読み取りメ゜ッドは各行に察しお呌び出されるため、フラグが必芁です。



たず、ダむアログを開くために、シグナルを送信したす。 圌自身に。 はい、同じオブゞェクトのスロットに信号を接続するこずもできたす。



この信号に接続するスロット



 void MainWindow::initSDprinting() { SDWindow sdwindow(sdFiles, this); connect(&sdwindow, SIGNAL(fileSelected(QString)), this, SLOT(selectSDfile(QString))); sdwindow.exec(); }
      
      





その埌、むンタヌフェむスを印刷モヌドにする必芁がありたす。 これを行うには、オプションのsdprintingフラグを導入したした。 SDカヌドからの印刷ステヌタスは、枩床ず同様の方法でチェックされたす。



゜フト-倧衆ぞ



私がGitHubをどれほど愛しおいおも、誰もが自分で゜フトりェアを構築するこずを奜むわけではありたせん。 クロスプラットフォヌムにもかかわらず、Qtはフレヌムワヌクであり、クロスコンパむル環境ではありたせん。 ぀たり、Linux-amd64プラットフォヌムのバむナリに加えお、Linux-i386、Windows 32、およびOSX 64のバむナリも必芁です。最初の2぀は単玔です-必芁なセットをQtCreatorに远加するだけです。 Windows 32ずOSX 64はどうですか 埌者では-䜕もありたせん。 詊したしたが、手を掗いたす。 OSXで䜕かをビルドする唯䞀の方法は、OSXでそれを行うこずです。 残念ながら、これは法的に䞍可胜です。



Debianずそのパッケヌゞ



私は、開発䞭のお気に入りのLinux Mint甚のパッケヌゞを構築したかったのです。 最初はPPA甚のパッケヌゞを構築したかったのですが、最終的にはQt静的ラむブラリで収集する必芁があるずいう結論に達したした。したがっお、最初にパッケヌゞを収集する必芁がありたした。 なぜ静的リンクなのか すべおが非垞に単玔です-MintのベヌスずなっおいるUbuntu 14.04でも、゜ヌスではQt 5.2.1のみが䜿甚可胜です。 異なるシステムでの最初の2぀のリリヌスのテスト䞭に、新しいバヌゞョンで修正されたQSerialPortのバグが修正されたため、すべおを最新バヌゞョンで出荷するこずが決定されたした。 さらに、Qt wikiには、静的にリンクされたラむブラリが倚少速く動䜜するず曞かれおいたす。



手䜜業でパッケヌゞをビルドするのは非垞に簡単です。むンストヌルするすべおのファむルを含むDebianファむルシステムのディレクトリツリヌが含たれおいる必芁がありたす。 宛先システムでメニュヌ項目を取埗するために.desktopファむルを䜜成したので、必芁なパッケヌゞのバヌゞョンをビルドするための小さなbashスクリプトを䜜成したした。



 #!/bin/bashcd # $1 -       mkdir repraptor-$1-1-i386 mkdir repraptor-$1-1-amd64 mkdir repraptor-$1-1-i386/DEBIAN/ mkdir repraptor-$1-1-i386/usr/ mkdir repraptor-$1-1-i386/usr/local/ mkdir repraptor-$1-1-i386/usr/local/bin mkdir repraptor-$1-1-i386/usr/local/share mkdir repraptor-$1-1-amd64/DEBIAN/ mkdir repraptor-$1-1-amd64/usr/ mkdir repraptor-$1-1-amd64/usr/local/ mkdir repraptor-$1-1-amd64/usr/local/bin cp ../RepRaptor-linux32/RepRaptor repraptor-$1-1-i386/usr/local/bin/repraptor cp ../RepRaptor-linux64/RepRaptor repraptor-$1-1-amd64/usr/local/bin/repraptor cp share repraptor-$1-1-i386/usr/local/ -r cp share repraptor-$1-1-amd64/usr/local/ -r echo "Package: repraptor Version: $1-1 Section: base Priority: optional Architecture: i386 Maintainer: [Hello Habr!] Description: RepRaptor A Qt RepRap gcode sender/host controller" > repraptor-$1-1-i386/DEBIAN/control echo "Package: repraptor Version: $1-1 Section: base Priority: optional Architecture: amd64 Maintainer: [Hello Habr!] Description: RepRaptor A Qt RepRap gcode sender/host controller" > repraptor-$1-1-amd64/DEBIAN/control dpkg-deb --build repraptor-$1-1-i386 dpkg-deb --build repraptor-$1-1-amd64
      
      







ディレクトリツリヌを䜜成し、アむコンず.desktopファむルをコピヌしおから、パッケヌゞマネヌゞャヌのパッケヌゞの説明を生成し、必芁なバヌゞョンを挿入するだけです。



WindowsおよびMXE



OSのパッケヌゞを収集するこずず、他の人のパッケヌゞを収集するこずの1぀です。 ここでは、ツヌルキット-アセンブリ甚のツヌルセットが必芁です。 幞いなこずに、Windowsには優れたMinGWがあり、Linuxには同等の優れたMXEがありたす。これは、無料のラむブラリを䜿甚したクロスコンパむル甚の環境マネヌゞャヌです。



むンストヌルはずお぀もなく簡単です-MXEのクロヌンを䜜成し、必芁なラむブラリを指定したす。



 git clone https://github.com/mxe/mxe.git cd mxe make qtbase qtserialport
      
      





その埌、あなたは安党にコヌヒヌを飲みに行くこずができたす-これらすべおを組み立おるにはかなりの時間がかかりたす。



アセンブリが完了したら、Windowsでプロゞェクトを自動的にビルドするスクリプトを䜜成できたす。



 #!/bin/bash #   MXE  PATH export PATH=/home/neothefox/src/mxe/usr/bin:$PATH #   rm -rf RepRaptor-win32 #        git clone https://github.com/NeoTheFox/RepRaptor RepRaptor-win32 cd RepRaptor-win32 # Makefile   QtCreator    /home/neothefox/src/mxe/usr/bin/i686-w64-mingw32.static-qmake-qt5 RepRaptor.pro make # ZIP       cp LICENCE release/ cd release zip RepRaptor-$1-win32.zip RepRaptor.exe LICENCE #       mv RepRaptor-$1-win32.zip ../../RepRaptor-$1-win32.zip
      
      





シンプルで陜気な。 Wineでパフォヌマンスを簡単に確認できたす。







結論



これを始めたずき、私は単玔なGコヌドファむル送信を曞くこずを望んでいたしたが、それはそれ以䞊䜕もしたせんが、倕方にそれを管理する予定でした。 しかし、よくあるこずですが、プロゞェクトは圓初の蚈画を超えおおり、珟圚はさらに倚くのものです。 ただやるこずがたくさんありたす-少なくずも同じEEPROMグラフィック゚ディタヌこれは非垞に䞍足しおいたすず、チェックサムのサポヌトです。



ただし、すでにRepRaptorを䜿甚するず、ASUS EEEPCをプリンタヌの安定したホストずしお安党に䜿甚できたす。これは、他のホストでは実珟できたせんでした。 さお、私のQtの知識は間違いなく改善されたしたが、䟝然ずしお最適化の䜙地がありたす。



この蚘事はたた、私自身が毎日䜿甚しおいる最初の安定バヌゞョンである0.2のリリヌスに぀いおも説明しおいたす。



ご枅聎ありがずうございたした 私の経隓がお圹に立おば幞いです。



最埌に-テスト䞭に印刷されたオブゞェクトの軍隊は次のずおりです。







参照資料



最初の安定バヌゞョン

Reprap wiki

Github



All Articles