Simple3DScan

Ich habe hier eine kleine Software zum Betrieb eines FabScan Scanners geschrieben. Ein FabScan Scanner ist ein Selbstbau 3D Scanner welcher genutzt werden kann, um ein Objekt einzuscannen. Meine Hauptintention war, dass ich wegen der bestehenden Software das Teil zwar zusammengebaut, dann aber nie genutzt habe.

Zu den Downloads

Schnellstartanleitung zum Programm (Flash)

Hintergründe zum Projekt

FabScan hat zunächst nichts mit mir zu tun und wurde/wird hauptsächlich an der RWTH Aachen als OpenSource Laserscanner entwickelt. Im Grunde besteht das ganze aus Hard- und Software. Von Hardwareseite ist das Ganze ein Drehteller mit Kamera und Linienlaser. Ein Objekt wird auf dem Teller gedreht und ein Linienlaser bestrahlt aus einem Winkel das Objekt. Die Software berechnet Schnittpunkte aus sichtbaren Punkten und Laserlinie und erzeugt eine Punktwolke. Diese kann dann wieder weiterverwendet werden um ein 3D Objekt am PC zu erstellen.

Das Ganze ist eher ein Bastelobjekt. Ich habe mir letztes Jahr einen Bausatz gekauft und erste Erfahrungen damit gemacht. Von der Bauform gibt es etliche Einschränkungen, am besten werden kompakte Objekte gescannt. Die Software hat dazu geführt, dass ich den etwa ein halbes Jahr gar nicht mehr genutzt habe.

  1. Ich verwende normalerweise Windows. Bei dem offiziellen Programm lief bei mir unter Windows – nicht sonderlich viel. Hauptsächlich Abstürze oder es war gar nichts zu sehen. Mit der Software auf Ubuntu Life-CD klappte etwas mehr – aber es wurden teilweise Schritte ausgelassen (teilweise machte er bei mir etwa 300° Umdrehungen statt 360°), oder es stürzte irgendwann einfach ab oder bleib stehen. Deswegen staubte der Scanner eine ganze Weile eher ein.
  2. Hat auch mit dem Windows Punkt zu tun – ich hatte schlichtweg keinerlei Lust, jedes Mal etwas nur dafür zu booten und dann zu überlegen wie bekomme ich es auf mein normales System.
  3. Gerade Windows wird eher (wie auch der Bereich Anleitung) auf der offiziellen Seite gefühlsmäßig vernachlässigt.

Was habe ich also gemacht? Das Ding braucht Platz auf dem Schreibtisch. Und ich hab mir vor 2 Wochen überlegt: Entsorg ich es oder versuch ich noch etwas damit zu machen?

Ich hatte mir auch kurz überlegt, ob ich einen Raspberry Pi zweckentfremde und diesen den Scan mit einem Motortreiber machen lasse. Hier habe ich mich aus folgendem Gründen dagegen entschieden:

  1. Als Hardware ist ein Arduino Klon sehr viel günstiger und reicht aus
  2. Ich müsste die Daten dann doch wieder an meinen PC übertragen um flott weitermachen zu können.
  3. Ein Scanservice auf dem Raspberry heißt: wieder ein Gerät mehr im Netzwerk. Scanner und Drucker bleiben ja eh auf meinem Schreibtisch. Dann einen Raspi mit minimal höherem Stromverbrauch zu nehmen habe ich nicht eingesehen. Ich sehe darin eher zusätzliche Sachen die Fehler machen können.
  4. (Habe ich irgendwie immer noch einen Arduino übrig… evtl. gibt es bald was mit Lichtsteuerung oder ein Modellhovercraft?)
  5. Gibt es bei Kickstarter schon einen (kommerziellen ?) Raspi-3D-Scanner. Und bei Thingiverse. Und …

Was habe ich mir also überlegt? Ich entwickele beruflich mit C# Software. Ein Arduino ist nicht so kompliziert anzusteuern. Also warum baue ich mir nicht einfach selber ein Stück Software dafür? Ein Simple3DScan was bei mir einfach funktioniert?

Vorüberlegungen zur Realisierung

Mit dem Begriff OpenSource bei der Hardware habe ich bestimmte gedankliche Schwierigkeiten. Verwendet wird in der offiziellen OpenSource-Hardware beispielsweise eine Logitech c270 Webcam. Diese ist alles andere als OpenSource. Selbst Kleinigkeiten wie der verwendete Motortreiber (ein Pololu-Shiele A4988) haben Einschränkungen bezüglich des Einsatzgebietes.

Um den ganzen Lizenzkuddelmuddel aus dem Weg zu gehen, habe ich hier eine reine Software zur Ansteuerung neu geschrieben. Dies beinhaltet auch, dass ein eigener Arduino-Sketch entstanden ist (Sketch => ein Arduino Programm), die Software arbeitet nicht mit dem originalen Sketch des RWTH Teams zusammen.

Warnhinweis

Das bei RWTH Aachen vorgestellte Gerät benutzt einen Klasse 3 Laser ( müsste 3R sein). Diese können schädlich für die Augen sein – passender Schutz ist notwendig, je nach Land müssen entsprechende Auflagen beachtet werden (in Unternehmen Lasersicherheitsbeauftragte, Information des Versicherers etc.pp.). Ich übernehme explizit keine Haftung für die Einhaltung von Schutzvorschriften.

Was benötigt man zum Einsatz?

  • einen Laserscanner (z.B. den oben erwähnten Fabscan Cube, es gibt ähnliche Produkte bei Kickstarter oder Thingiverse welche theoretisch mit leichten Anpassungen verwendbar sein sollten).
  • die entsprechenden Treiber.
  • den Sketch auf dem Arduino
  • Strom.
  • die hier vorgestellte Software
  • Sicherheitsvorkehrungen zum Schutz der Augen

Einige Worte zur Hardware 

Am einfachsten bekommt man die Hardware bei Watterott im Kit ( http://www.watterott.com/de/FabScan-Cube-Komplettset ). Das Komplettkit enthält fast alles, was man braucht.

Ich schlage folgende Zusatzartikel vor:

  • Kabel/Jumper Wires (die Motorkabel sind zu kurz)
  • USB Kabel um den Arduino programmieren zu können
  • Buchsen/Stecker – damit man die Kabel nicht direkt auf das Shield löten muss 😉
  • Motormitnehmer. Statt der Holzlösung halten z.B. Pololu-Alu Mounting Hubs das ganze besser, ohne dass es ausnudelt – ist aber nicht unbedingt nötig.
  • Kühlkörper für Motortreiber. Der Motortreiber wird tatsächlich recht schnell heiß, gerade bei 3D-Druckern kennt man es, dass die Dinger aufgeben. Daher sehe ich hier einen Kühlkörper als wichtiges Accessoire. Ich vermute auch ein Teil meiner Scanprobleme kam durch Überhitzung zustande.
  • USB-Switch zum einfacheren Verbinden mit dem Rechner (einzeln schaltbare Ports)
  • Abdeckung und USB-Lampe ( Laser will ich nicht ansehen müssen 😉 )

Sparen kann man teilweise indem nicht ein original Arduino Uno R3 verwendet wird, sondern ein kompatibles Produkt. Ebenso gibt es die WebCam teilweise günstiger. Man kann auch überlegen ob man ein RAMPSshield mit Steppertreibern bei ebay besorgt – die gibt es teilweise recht günstig (dann müssen allerdings Anpassungen am Sketch gemacht werden, man hat aber gleich 3 Motortreiber übrig…).

Auf der offiziellen Seite fehlt leider immer noch die Aufbauanleitung für das aktuelle Modell. Auf http://32b.it/assembly-fabscan-by-wetterott-my-personal-instruction-guide/ ist allerdings eine, die bei mir funktioniert hat (Ich habe nur die Schrauben anders herum in die Kamera gedreht…)

Software: Treiber und Arduino Sketch

Hat man das Gerät zusammengebaut, muss der Treiber für den Arduino installiert und der Arduino noch programmiert werden. Am einfachsten folgt man der Anleitung auf http://arduino.cc/en/Guide/Windows zum erstmaligen Kontakt zwischen Arduino und Windows PC.

Mein Programm – Vorarbeit

Ab jetzt kann man mein Programm nutzen. Ich habe einen Installer zusammengestellt der alles Notwendige (und einiges Unnötige 😉 ) mitliefert. Bitte einfach ausführen.

Als Voraussetzung muss schon alles an Kabeln (Arduino zu PC, Kamera zu PC, Strom zu Arduino) verbunden sein und .net 4.5.1 installiert sein (ab Vista SP2).

Zunächst muss der Arduino Sketch auf den Arduino übertragen werden. Per Default ist der Sketch zum einem im Programminstallationsordner, zum anderen gibt es einen Link (im Startmenü (falls vorhanden)). Im Grunde sollte die Arduino IDE über einen Doppelklick auf Simple3DScanFirmware.ino starten. Dort wie im obigen Beispiel einfach auf kompilieren und übertragen klicken.

Wie startet man einen Scan?

-> Schnellstartanleitung zum Programm als Flash-Video

  1. Anschließen von den USB-Kabeln (Arduino  & Kamera) an dem Rechner und dem Stromkabel an einer eingeschalteten Steckdose. (Der arduino sollte vorher schon einmal mit dem beiligendem Sketch bespielt worden sein)
  2. Starten des Programms
  3. Bei erstem Start Auswählen der Kamera.
  4. Wenn die Webcam richtig ausgerichtet ist, sollte eine blaue Box den Drehteller umschließen. Ansonsten muss die wahrscheinlich noch ausgerichtet werden (Schrauben an der Kamera).]
  5. Der große Drehregler links schaltet die Auflösungen durch. 5 = Die Schöne und das Biest. Streicht die Schöne. Dafür schnell. 1 = aktuell Beste Auflösung. Dafür langsam.
  6. Schalter Scan drücken. Warten. (Abbruch mit gleichem Schalter)
  7. Wenn der Scan fertig ist, kann er irgendwohin gespeichert werden. Das Format ist momentan eine Punktwolke ohne Farbinformation.

Mit der Punktwolke kann man jetzt tun was man will.

Eine einfache Art ist:

  • Öffnen der Punktwolke in Meshlab
  • Normalen über „Filters/Point Set/Compute normals for point sets“ berechnen lassen
  • Eine Oberfläche über „Filters/Point Set/Reconstruct surface“ erzeugen lassen

Wie funktioniert das Programm?

Der C# Bereich

Bei Start werden die ComPorts des Rechners durchgegangen und eine Nachricht geschickt. Findet man einen Arduino mit passendem Sketch, so antwortet dieser freundlich und gilt als erkannt.

AForge wird genutzt um angeschlossene Kameras anzusteuern (und einiges mehr). Bei Start werden die Kameras dem Programm zur Ansteuerung zugefügt.

Jedes Mal wenn ein Bild von der Kamera kommt, wird ein Event geworfen und von dem Programm gefangen. Das ist was man in dem großen Bereich rechts sieht.

Bei Klicken auf Scan wird folgendes gemacht:

  • Der Laser wird eingeschaltet
    •  Zunächst wird eine Position berechnet, an der der Laser auf die Rückwand trifft. Alles was links von dem Laser, unterhalb des Tisches oder am oberen Rand des Bildes ist wird später verworfen (ungültige Positionen)
    •  Zwischen der Laserposition und der Rückwand wird eine Linie gebildet.
  • Mit AForge wird aufgrund der Farbe und Helligkeit der Laser erkannt.
  • Das Laserbild wird in ein „Skelett“ über AForge umgewandelt (habe ich erwähnt, dass AForge eine coole Bibliothek ist?)
  • Die einzelnen Punkte werden berechnet.
    • Von der Kamera wird eine Sichtlinie gebildet
    • Schnittpunkte werden berechnet.
  • Der Teller wird gedreht.
  • Die Erkennung beginnt mit dem nächsten Winkel.

Details finden sich in der Dokumentation.

Zu der Arduinosteuerung

Die C# Ansteuerung sendet ein Kommando an den Arduino.
Das Sketch bestätigt gesendete Behle mit einem ACK.
Damit gilt das Kommando als ausgeführt.

In C# wird hierbei ein Timeout für das Lesen des Com-Ports genutzt. Das vermeidet, das Thread-Sleeps benötigt werden um den Com-Port erst dann abzufragen, wenn der Arduino schon Kommandos zurück geliefert hat (könnte man auch über OnData machen – ist aber eigentlich so simpler). Ach ja – natürlich funktioniert das wieder nicht richtig in Mono, auch deswegen Windows only.

Wie bekommt man die Software?

Einfach hier downloaden.

Aktuelle Informationen

Aktuelle Version

Gibt es noch etwas, was dabei wissenswert wäre? Verbesserungsvorschläge?

62 Kommentare

  1. Hallo,

    besten Dank für deine Software. Endlich keine „BlueScreen“ mehr.
    Super!
    Wenn noch ein Verbesserungsvorschlag- dann, ist es möglich einen zweiten Stepper (Laser) anzusteuern?
    Ich habe mir den Stepper an den Laser gebaut, da bei Heise (Hardwarehacks) stand der Scan würde verbessert.
    Nur die Fabcansoftware steuerte ihn überhaupt nicht an.

    Besten Dank schon für deine Mühe – super Arbeit !

    1. Danke, das mit dem zweiten Stepper ist für mich deshalb ein Problem, da ich keinen habe. Testweise ist es möglich in der 0.0.3 einen zweiten Stepper zu aktivieren – aber ich konnte daher nicht testen was wirklich rauskommt.

      In dem Programmordner liegt die Konfigurationsdatei des Programms. In dem Abschnitt Laser müsste MotorEnabled auf true stehen, damit das Programm versucht einen Motor am Laser zu verwenden. Was dabei wirklich herauskommt, weiß ich allerdings wie gesagt nicht.

  2. Moin,

    vielen Dank für die Win Version Wolfgang !
    Ich würde mich auch über ein paar zusätzliche Features freuen, hier meine Vorschläge:

    1.
    Laser Stepper per Button aktivierbar.
    Einstellbar ‚von – bis ° ‚ um die Mittleachse herum

    2.
    Button für Beleuchtung Ein/Aus

    3.
    Eine (Ein-/Aus-schaltbare) Kalibrierungsmarke /Linie damit man den Laser lotrecht einstellen kann.

    4.
    Einen Laser Ein/Aus Button (für Pkt. 3, bzw. einfach die Möglichkeit haben)

    5.
    Einen ‚Refresh-Button falls man z.B. die Cam nachträglich einsteckt.

    1. Was ich auch noch sinnvoll finden würde ist die Möglichkeit die folgenden Werte eingeben und speichern zu können:

      //position of the c270
      public static float CAM_POS_X = 0.0f; //precise by construction
      public static float CAM_POS_Y = 5.0; //5.57f;
      public static float CAM_POS_Z = 29.75f; //30.9f;

      //position of the turntable
      public static float TURNTABLE_POS_X = 0.0f; //not used by calculations
      public static float TURNTABLE_POS_Y = 0.0f; //not used by calculations
      public static float TURNTABLE_POS_Z = 7.5f; //precise by construction

      Diese sind bei Dir wahrscheinlich fest in der Software verankert, ich finde jedenfalls keine Möglichkeit diese Werte anzupassen.

      1. Sind sie eigentlich nicht. Allerdings ist das ganze undokumentiert.

        Das einzige was momentan fest ist ist das Einzeichnen des Turntables, das wollte ich bei Gelegenheit noch ändern.

        Im Programmverzeichnis liegt (jeweils für x86/x64 getrennt) eine Configuration.XML.

        Die entsprechenden Werte sind:
        /Camera/WorldCoordinates/X
        /Camera/WorldCoordinates/Y
        /Camera/WorldCoordinates/Z

        und
        /Turntable/WorldCoordinates/X
        /Turntable/WorldCoordinates/Y
        /Turntable/WorldCoordinates/Z

        ist die Camera eine andere wäre noch /WorldWidth erwähnenswert -> 24.6 ist die c270 sichtbare Breite.

        Ach ja – ist die Datei Müll einfach löschen, beim nächsten Start wird sie wieder leer mit initialen Werten neu angelegt.

        5.57 müßte die c270 sein, 5.0 die c920 oder bin ich da leicht falsch?

    2. Mit einem zweiten Stepper habe ich ein paar Probleme, da ich keinen habe. 😉

      In dem Programmordner liegt die Konfigurationsdatei des Programms. In dem Abschnitt Laser müsste MotorEnabled statt auf false auf true stehen, damit das Programm versucht einen Motor am Laser zu verwenden. Was dabei wirklich herauskommt, weiß ich allerdings wie gesagt nicht.

      Zu Laser Ein-/Ausschalten:
      Starte das Programm statt normal mit dem Parameter -Advanced .
      Beispiel wenn es installiert ist: Rechtsklick auf das Programm, Eigenschaften und am Ende sollte dann …Simple3DScan.exe“ -Advanced statt Simple3DScan.exe“ stehen. Bei dem Start ist dann links das Controlpanel unter Control. (das verschieben rechts -> links damit ich merke wo ich drin bin 😉 ).

      Ist MotorEnabled = true, so sollten hier übrigens 2 Marker kommen. SwipeMin ist von den Monitorkoordianten in % der orange linke Marker an dem der Laser theoretisch stoppen sollte, SwipeRight der Rote rechte.

      1. >> public static float CAM_POS_Y = 5.0; //5.57f;

        Ich benutze die C270. Allerdings habe ich diese nicht fest an dem Gehäuse befestigt sondern ‚beweglich‘ per Federn, Schrauben und Grundplatte montiert.
        Dadurch hat sich bei mir die Entfernung zum Turntable verkleinert.

  3. V 0.03 -advanced
    Der Laser sweept. Ich hatte allerdings ein paar Aussetzer,
    was aber durchaus an der Hardware liegen kann.
    Ich werde den Motorstrom mal erhöhen.

    Der Sweep geht bei mir über die rechte Linie hinweg, links passt es.

    Wenn es nicht zuviel Arbeit macht, dann wäre im Installer der Hinweis auf die Version ganz nett. Auch in der Titelleiste des Programmes könnte es z.Z. noch gut stehen.

    Gescannt habe ich aber erst einmal nur auf Stufe 5 mit Sweep. Natürlich dauert nun so ein Scanvorgang auch um einiges länger, das muss jedem klar sein 😉
    Aber bereits im Schnellschuss sieht es für mich so aus als ob das Ergebnis nun detaliierter sei.
    Ich habe noch größere Probleme mit Refexionen in den FabScan-Gehäuse. Diese muss ich ert einmal in den Griff bekommen bevor ich mehr sagen kann.

    Vielen Dank aber jetzt schon einmal für die schnelle Umsetzung der ‚Wünsche‘

  4. Sweep sollte er auch ohne advanced machen, advanced war für mich der Testmodus mit 2ter Tabseite um die Motorsteuerung etc.pp. zu probieren. Die Woche werde ich wohl nebenbei zu nichts kommen.

    Und wie gesagt: mangels zweitem Stopper ist das sweep ein Schuss ins Blaue (war im Sketch für arduino schon drin).

    Wie weit geht er rechts etwa drüber? Er sollte etwa 1.8 Grad drüber gehen, damit danach die Richtung klar ist.

    Reflektionen klingen etwas merkwürdig, ist das der 5 MW Laser von Watterott?

  5. Verstehe ich nicht, was klingt daran merkwürdig?

    Neben den Punkten des Scanobjektes finden sich in der Pointcloud ein Haufen Punkte die nicht zu diesem gehören. Man kann z.B. die Oberfäche des hölzernen Turntables erkennen sowie etliche zusätzliche Points innerhalb des Scanraumes. Ich werde den Innenraum mal probehalber mit mattschwarz ‚auskleiden‘. Mal sehen ob mir das weiter hilft. Aber ein Bildchen sagt mehr als tausend Worte:
    https://www.dropbox.com/s/uo1om09gjkfvz4n/PCould.png?dl=0

    Jo, der Laser stammt aus dem Bausatz. Ein weiterer verursacht aber ähnliche ‚Probleme‘.

    1. Der mitgenommene Hintergrund – kann es sein dass das keine Reflektion ist, sondern der Abstand Kamera-Hintergrund zu kurz ist? Dann sollte er den Winkel nach unten zum Table auch nicht haben und nimmt den mit auf. Bzw. ist die Oberfläche nur der Turntable oder die gesamte Holzoberfläche?

      1. unten ist es rund (wie der Turntable)
        und dieser ‚Hintergrund‘ ist kreisförmig in den Abmessungen des Turntables.
        Diese äussere ‚Eimerform‘ entsteht seit ich mit dem Laser sweepe. Vorher hatte ich zwar auch ‚verirrte‘ Points im Scannraum und auch etliche unten beim Turntable, aber alles nicht so extrem wie jetzt.
        Ich warte z.Z. auf mattschwarze Folie mit der ich den Innenraum auskleiden will. Dann kann ich mehr dazu sagen.

  6. Wolfgang, nachdem ich meine Box innen schwarz ausgekleidet habe funktioniert die Soft leider nicht mehr. 0-Byte Dateien werden geschrieben.
    Das Problem hatte ich auch mit Processing, aber nachdem ich diesen Wert hier verändert habe:
    //threshold between black and white… allowed values: 0.00f-1.00f
    public static float IMAGE_FILTER_THRESHOLD = 0.03f; //default: 0.1f
    startet Processing wieder.
    Dieser Wert ist nicht in der XML Datei, wäre es Dir evtl. möglich diesen Wert, sofern er in deiner Win Version überhaupt so vorhanden ist, per xml Datei zugänglich zu machen? Ich würde gerne damit etwas herum spielen und sehen ob sich nun mein ‚Reflexions-Problem‘ mit der schwarzen Box minimiert hat.

  7. Danke Wolfgang, ist ja echt ein umfangreiches Update geworden.
    Schön das Du dir die Zeit nimmst mir/uns weiter zu helfen.
    Nun werde ich wohl erst mal einmal einige Zeit brauchen um alles aus zu probieren 🙂

  8. Ich habe heute mit den Filtern rum gespielt (ohne so recht zu wissen was ich da mache) und habe nach vielen vielen Versuchen endlich so etwas wie einen Scan hin bekommen.

    Bei den Filtern wäre es gut so etwas wie einen -Set to default- Button zu haben.
    Evtl. wäre es auch gut so etwas wie eine Preset-Liste dafür zu haben, sprich eine Liste von Einstellungen speichern zu können (named) und je nach Bedarf wieder aufrufen zu können.

    Was mir auffiel (0.1.1):
    Die x64 Version bekomme ich unter Win7 64 Pro nicht zum laufen.
    Im Taskmanager sehe ich dabei die Simple3dScan.exe unter Prozesse.
    Die X32 startet.
    Turntable Radius steht auf 675 nach Programstart.
    Nach Beendigung von S3DS.exe wird das Prg geschlossen aber der der Prozess nicht beendet.

    Eine Idee noch:
    Ich generiere bei den Versuchen öfter 0Byte Files, Meshlab stürzt damit dann ab.
    Ist nur Kosmetik, aber evtl. könnte man eine Warnung einbauen das keine Punktwolke erzeugt wurde wenn die Größe 0 Byte beträgt.
    Auch habe ich pcd (ply) Dateien gehabt die in Blender nicht angezeigt wurden und Meshlab, CloudCompare etc. mit der Warnung -falscher Header- nicht geöffnet wurden
    Die hatten dann wohl auch keinen Inhalt.
    Da ich heute Unmengen von Versuchen gemacht habe kann ich es nicht mehr genauer beschreiben.

    Und noch eine:
    In dem Filter-Tab wäre evtl. ein Vorschau Fenster (wie beim Control-Tab) recht vorteilhaft damit man nicht ewig hin und her schalten muss und sofort das Ergebnis sehen kann.

    Ansonsten wieder eine prima Arbeit!
    Ach, die Filtereinstellungen für den Elefanten, sind das die default Werte mit dem das Prg installiert wird oder welche Einstellungen hast Du dafür benutzt?

    1. Set to default sollte einfach sein (Unter der Woche werde ich aber zu nichts kommen). Mehrere Listen könnten es leicht problematisch zu machen die Configuration zu übernehmen (im Moment sollte sie von einer alte Version kopierbar sein).

      Bei schwarzem Hintergrund hätte ich versucht Hue/Helligkeit und Rotwert zu ändern. (oder den HSL ganz aus zu machen – klappt aber nur bei nicht roten Objekten…)

      Ich habe momentan nur einen W8Pro zum Testen. Da hatte ich bisher weder bei 32 noch 64 Bit Probleme. 6.25 steht bei mir bei Turntable. Wie er bei dir auf 675 kommt, habe ich gerade gar keine Idee. Ist es eine bestimmte Windows Sprachversion?

      Gibt es den bei der 64 Bit Version eine Logdatei? Und bei dem nicht beendendem 32 Bit Prozess? Die sind in der Version noch nicht so prickelnd – sollten aber hilfreicher sein.

      Bei 0 Byte Dateien wäre eine Warnung nicht schlecht – ich überlege da noch ob nicht die Warnung kommen soll wenn kein Laser erkannt wurde (was aber auch während dem Scan vorkommen kann und bei einer einzelnen Linie nicht so störend sein sollte) und bei 0 Byte halt keine Ergebnisdatei geschrieben wird.

      Oh – PCD habe ich ehrlich gesagt nicht mehr ausprobiert – das war nur von der .. sagen wir 0.0.0 alpha noch drin. Ich habe bei Blender einen CSV Import genutzt.

      Die Ergebnisse bei dem Elefanten sind die Defaultfilter.

      1. Es liegt bei mir an der Configuration.xml.
        Wenn diese Datei nicht vorhanden ist
        oder sich dort ein Schreibfehler eingeschlichen hat
        z. B. anstatt 6.75 dort 6,75 steht, dann startet weder x86 noch x64 richtig.
        Der Prozess wird zwar aufgerufen aber nicht mehr beendet. Die Log Datei bleibt leer.
        Ich hatte um das o.a. 675 Problemchen zu erzeugen die config xml umbenannt in .xm_ und sofort tritt das Problem auf. Es wird keine neue config.xml erzeugt und das Programm ‚hängt‘. Der Prozess wird nicht beendet.
        Es ist auch egal wie ich die Datei umbenenne immer das selbe Ergebnis.
        Und wenn ein Inhalt dieser Config falsch ist, ensteht das selbe Problem.
        Gut, das sollte normal nicht vorkommen das jemand händisch editiert, aber es ist immer vom DAU auszugehen 🙂

        Die von Dir empfohlenen Filter hatte ich auch so eingestellt gehabt, aber einzig das entfernen meiner Tot_Schwarzmatten Folie ermöglichte wieder ein Scanergebnis.
        Diese Folie ist rauh, das wird wohl den Laserbeam entsprechend beeinträchtigen.

        Da ich auf die oben genannte Weise keine neue XML Datei erzeugen konnte muss ich wohl eine Neuinstallation machen um evtl. noch einmal das 675 Problem zu bekommen. Ich werde berichten.

        1. und weiter geht’s:

          Ich habe heute S3D per Deinstaller von der Platte gefegt um das Prg. neu zu installieren inklusive Rechner runter fahren und dann ein Neustart.
          Was war zu sehen? Der Deinstaller löscht nicht alle Verzeichnisse und Dateien, x86 und x64 Dir bleiben bestehen. Das bedeutet, das auch die darin enthaltene config.xml erhalten bleibt, Aber das war ja nicht das was ich wollte. Also den Rest von Hand gelöscht. Nun das Prg. neu installiert. Ein Blick in die ’neuen‘ x64 und x86 Dirs zeigt, dass keine (default) config.xml bei der Installation erzeugt wurde. Ok, dann erzeugt also der erste Programmstart diese Dateien, so dachte ich. Aber weder ein x86 oder x64, weder als user oder admin, bewegte das Programm dazu ‚voll durch zu starten‘.
          Es war wieder jeweils als Prozess sichtbar der nicht verschwand.
          Ich hatte mir, zur Sicherheit, vorher eine ‚alte‘ config.xml auf den Desktop gezogen. Gut so. Diese nun in x64 und x86 Dir kopiert und ups.., geht immer noch nicht. Aber da war doch was?
          xml Datei in Notepad++ geöffnet und ja.., ich hatte tatsache die Version gesichert in der ich 6 Komma 75 stehen hatte. Kennen wir schon, mach aus Komma einen Punkt und siehe da: x64 und x86 starten nun.

          Ach ja, eine Info noch, in den Fehlerfällen wurde jeweils immer nur eine leere log Datei geschrieben.

          Das 675 Problem war wahrscheinlich durch eine bereits bestehende xml ins Spiel gekommen da ich in das Dir der Vorgänger Version installiert hatte, diese aber vorher nicht vom Installer komplett von der Platte gefegt worden war.

          Ich hoffe mit diesen etwas umfangreichen Beschreibungen kannst Du was anfangen.

          1. Um es zu ordnen.

            Für den Installer nutze ich ein erstmalig ein fertiges Tool namens AdvancedInstaller was die Installation und Deinstallation automatisch machen sollte… Ich bin allerdings auch nicht sicher ob eine evtl vom Benutzer angepasste Config gelöscht werden sollte. (Bei der kostenlosen Version lies sich kein Update erzeugen sondern nur Neuinstallationen).

            Bei der Installation wird genau darum keine Configuration.xml von irgendwo kopiert. Bei dem ersten Programmstart wird eine neue Konfiguration bei Programmstart erzeugt. Unter anderem steht in der auch drin wohin geloggt werden soll. Danach wird der Logger instanziiert und eine leere Logdatei angelegt. Bevor das Programm nun irgend etwas anderes tut, wird in de Logdatei die Version geschrieben ->
            z.B.
            2015.03.25 21:20:37.249 Info Main(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\Program.cs:37)
            Program Version 0.1.1

            Danach wird versucht einen arduino mit dem Sketch zu finden. Und dann erst die Oberfläche geladen.

            Bei Programmende wird die Konfiguration die bis dahin im Programm durchgereicht wird geschrieben.

            Jetzt habe ich rein gedanklich ein Problem – vor der Erzeugung der Konfiguration weiß der Logger noch nicht wohin er loggt. Die Konfiguration müsste also bei dir schon innerhalb des Programms erzeugt worden sein. Der Logger sollte auch Schreibzugriff auf das Verzeichnis haben – sonst wäre keine Datei erzeugt worden. Allerdings ist das erste was er macht tatsächlich ein reines Schreiben der Programmversion – und die steht sogar recht fest im Programm. Ah… der schreibt die auch nur beim Schließen des Programms.
            Das der Logger früher schreibt ist eine fehlende Zeile.
            -> Nur Debugfasssung ZIP

            Bei dem Rest weiß ich erstmal nicht weiter. Wenn ich es bei mir installiere startet es ohne Fehler (x86/x64) – egal ob ich den Ordner vorher komplett leere oder nicht. Nutzt du den Standardpfad (In Users\xyz\Appdata) oder einen anderen?

            Schwarz gibt es übrigens auch eine FabScan-Ausführung -> http://www.thingiverse.com/thing:74879 – evtl hat der aber eine matte oder weniger diffuse Oberfläche.

            Ist die Halterung für die Kamera von der du schriebst eigentlich ähnlich der offiziellen mit den 3 Federn ( https://hci.rwth-aachen.de/fabscan2014_front ) oder ganz was anderes?

  9. Debug Version 0.1.3

    Der Pfad:
    C:\Users\Online\AppData\Roaming\Wolfgang Schmidt\
    Dort den Ordner aus der Zip eingefügt ->
    C:\Users\Online\AppData\Roaming\Wolfgang Schmidt\Simple3DScan
    Simple3DScan.exe gestartet. Kein Erfolg, wie gehabt, S3D hängt. (Admin und User)
    Log:
    /*
    2015.03.26 16:40:25.553 Info Main(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\Program.cs:37)
    Program Version 0.1.3

    2015.03.26 16:40:25.584 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:39)
    Starting Void .ctor(Int32, System.String)

    2015.03.26 16:40:25.584 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:43)
    Starting arduino connection with baudrate:9600

    2015.03.26 16:40:25.584 Info FindComPort(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:85)
    Starting System.String FindComPort()

    2015.03.26 16:40:25.584 Info DetectArduino(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:200)
    Starting Boolean DetectArduino()
    */

    Sieht so aus als findet das Prg. den Arduino nicht?

    Aber:
    config.xml in diesen Ordner kopiert. S3D.exe gestartet und -> Funktion!
    Warum funktioniert es dadurch?

    Das neue Log File ist recht lang:
    /*
    2015.03.26 16:44:19.374 Info Main(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\Program.cs:37)
    Program Version 0.1.3

    2015.03.26 16:44:19.389 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:39)
    Starting Void .ctor(Int32, System.String)

    2015.03.26 16:44:19.389 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:43)
    Starting arduino connection with baudrate:9600

    2015.03.26 16:44:19.389 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:57)
    Exit Void .ctor(Int32, System.String)

    2015.03.26 16:44:19.389 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\SimpleScanMainForm.cs:26)
    Starting Void .ctor(ArduinoConnection.ArduinoCommands)

    2015.03.26 16:44:19.467 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ScanControl.cs:70)
    Starting Void .ctor()

    2015.03.26 16:44:19.498 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\CameraControl.cs:66)
    Starting Void .ctor()

    2015.03.26 16:44:19.498 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\CameraControl.cs:71)
    Exit Void .ctor()

    2015.03.26 16:44:19.514 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ScanControl.cs:75)
    Exit Void .ctor()

    2015.03.26 16:44:19.514 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ManualControl.cs:33)
    Starting Void .ctor()

    2015.03.26 16:44:19.514 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\CameraControl.cs:66)
    Starting Void .ctor()

    2015.03.26 16:44:19.514 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\CameraControl.cs:71)
    Exit Void .ctor()

    2015.03.26 16:44:19.514 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ManualControl.cs:38)
    Exit Void .ctor()

    2015.03.26 16:44:19.545 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ConfigurationControl.cs:20)
    Starting Void .ctor()

    2015.03.26 16:44:19.717 Info InitCameraValues(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ConfigurationControl.Camera.cs:25)
    Starting Void InitCameraValues()

    2015.03.26 16:44:19.717 Info SetMaxFrameSizes(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ConfigurationControl.Camera.cs:99)
    Starting Void SetMaxFrameSizes(System.String)

    2015.03.26 16:44:19.779 Info SetMaxFrameSizes(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ConfigurationControl.Camera.cs:112)
    Exit Void SetMaxFrameSizes(System.String)

    2015.03.26 16:44:19.779 Info InitCameraValues(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ConfigurationControl.Camera.cs:43)
    Exit Void InitCameraValues()

    2015.03.26 16:44:19.795 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ConfigurationControl.cs:35)
    Exit Void .ctor()

    2015.03.26 16:44:19.795 Info Init(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ScanControl.cs:97)
    Starting Void Init(ArduinoConnection.ArduinoCommands)

    2015.03.26 16:44:19.795 Info ActivateLaser(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:112)
    Starting Void ActivateLaser(Boolean)

    2015.03.26 16:44:19.810 Info ActivateLaser(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:115)
    Exit Void ActivateLaser(Boolean)

    2015.03.26 16:44:19.810 Info Init(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ScanControl.cs:105)
    Exit Void Init(ArduinoConnection.ArduinoCommands)

    2015.03.26 16:44:19.810 Info Init(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ManualControl.cs:48)
    Starting Void Init(ArduinoConnection.ArduinoCommands)

    2015.03.26 16:44:19.810 Info ActivateLaser(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:112)
    Starting Void ActivateLaser(Boolean)

    2015.03.26 16:44:19.810 Info ActivateLaser(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:115)
    Exit Void ActivateLaser(Boolean)

    2015.03.26 16:44:19.810 Info Init(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\UI\ManualControl.cs:54)
    Exit Void Init(ArduinoConnection.ArduinoCommands)

    2015.03.26 16:44:19.826 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:16)
    Starting Void .ctor()

    2015.03.26 16:44:19.826 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:21)
    Exit Void .ctor()

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    Exit System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:52)
    Starting System.String GetString(System.String, Configuration.Language)

    2015.03.26 16:44:19.826 Info GetString(c:\Entwicklung\Simple3DScan\Simple3DScan\Translator\Translate.cs:65)
    */

    Der Cube aus Thingiverse ist aus Karton. Da ist die Oberfläche glatt.
    Die Verloursfolie ist rauh, das macht die Oberfläche schwarz bei jedem Reflexionswinkel.

    Ja, das ist das Teil. Habe ich nachempfunden und gedruckt.

    1. „FindComPort .. Starting
      DetectArduino .. Starting
      Sieht so aus als findet das Prg. den Arduino nicht?
      Aber:
      config.xml in diesen Ordner kopiert. S3D.exe gestartet und -> Funktion!
      Warum funktioniert es dadurch?“

      Mea culpa.

      Die Originalversionen machen Folgendes: Kommando an Arduino. X Millisekunden warten. Nächstes Kommando.

      Ich mache : Kommando an Arduino und auf Rückantwort reagieren.

      Klappt bei normalen Kommandos auch im Fehlerfall, da Ich einen Timeout gesetzt habe nach dem spätestens ein Kommando fertig sein sollte.

      Klappt bei mir auch, da der erste Com-Port der Arduino des FabScan ist.

      Bei der Suche habe ich genau den TimeOut vergessen zu setzen. Heißt: Wenn da ein anderer Com-Port davor ist sagt das Programm sozusagen „Hallo“ und wartet darauf, dass entweder eine Anwort kommt oder ein Fehler auftritt. Kommt da einfach gar keine Antwort – wartet er ewig.

      Wenn du schon eine Konfigurationsdatei hast, steht da ein COM-Port drin. Wird versucht den zu erreichen, wird der Timeout gesetzt – also ist es dann egal ob der antwortet oder nicht, spätestens nach 2 Sekunden geht es weiter.

      Das zweite sieht unfertig aus – ist er abgestürzt?

  10. Nein, aber es kann evtl. sein das ich nicht alle vom Log kopiert hatte.

    Ich hoffe ich bringe dich nicht zur Verzweifelung, aber es geht auch mit der 0.1.4 noch nicht. Wieder die Zip entpackt, das extrahierte Verzeichnis in den Pfad und ohne config gestartet. Habe lange gewartet, Prg. hängt aber wie gehabt. Mein Port ist übrigens COM13, evtl. ist das noch eine interessantee Info.

    Log:
    2015.03.27 18:45:19.373 Info Main(c:\Entwicklung\Simple3DScan\Simple3DScan\Simple3DScan\Program.cs:37)
    Program Version 0.1.4

    2015.03.27 18:45:19.373 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:39)
    Starting Void .ctor(Int32, System.String)

    2015.03.27 18:45:19.373 Info .ctor(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:43)
    Starting arduino connection with baudrate:9600

    2015.03.27 18:45:19.373 Info FindComPort(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:85)
    Starting System.String FindComPort()

    2015.03.27 18:45:19.373 Info DetectArduino(c:\Entwicklung\Simple3DScan\Simple3DScan\ArduinoConnection\ArduinoCommands.cs:200)
    Starting Boolean DetectArduino()

    1. Nächster Versuch mit erweitertem Log – Übrigens sollte es relativ egal sein, wohin das ZIP entpackt wird (USB Stick o.ä.) – es gibt nur bestimmte Verzeichnisse (Programme/Program FIles) in welche das Programm ohne Adminrechte nicht schreiben darf.

  11. Super Arbeit Wolfgang, das funktioniert (bei mir) jetzt.
    Die X64- bzw. X32 Version starten durch, die neue Vorschau funktioniert auch.

    Einen weiteren Wunsch hätte ich noch …duck…:
    Die Position und die Größe des Programm-Fensters könnten noch gespeichert werden.
    Wäre schön wenn beim nächsten Programmstart diese Werte geladen werden und Größe und Fensterposition wieder hergestellt werden.

    Ideen die mir noch vorschweben möchte ich auch gerne noch zur Diskussion stellen:

    M. E. wäre es noch hilfreich wenn ich den Sweepbereich ‚optisch‘ einstellen könnte.
    Im Config Tab den Laser nach den gewünschten Sweep Min Position und Sweep Max Position (Winkel) per Button fahren und jeweils Button ‚Save Pos‘ betätigen und diese Werte dann in den Config-Laser-Tab übernehmen.

    ‚Autopositionierung‘ des Lasers auf ‚Center Turntable‘
    Wäre das möglich? Könnte man den Laser per Hand einmal mittig ausrichten (speichern) und danach diese Position immer wieder per Button anfahren?
    Zugegeben, man kann dieses ja immer wieder per Hand annähernd hin drehen oder auch in dem Control Tab per Button hinfahren, aber es wäre schon eine schöne Sache wenn das Programm, bei Bedarf, diesen Winkel (Pos) genau anfahren könnte.

    Falls man beim rumprobieren den Laser nicht wieder in Mittelstellung gebracht hat könnte das Prg vor dem Scan den Laser dann auch mittig fahren.

    Ok, das wären erst mal wieder so meine Ideen, Gedanken.
    Vielleicht ist ja wieder etwas Brauchbares dabei.

    1. HI,
      gut wenn’s jetzt klappt.

      „Könnte man den Laser per Hand einmal mittig ausrichten (speichern) und danach diese Position immer wieder per Button anfahren?“

      Schon so irgendwie.
      Vielleicht zum Hintergrund: In dem Projekt werden Stepper-Motoren und keine Servos verwendet. Bei einem Servo gibst du dem Ding vereinfacht einen Winkel mit und der fährt den dann an. Bei einem Stepper gibt du Schritte an die er in eine Richtung macht. Für die Ansteuerung eines Winkels kannst du dann ungefähr die Schritte berechnen und dem sagen, dass er da hin soll – und am Ende ist er da oder evtl auch nicht (der Tisch dreht z.B. nicht immer bei den 200*16 Schritten die der Motor für eine volle Umdrehung macht wirklich um genau 360 °).
      Im Grunde kann man den Laser bewegen und mit der Linie nachsehen wo er ist. Und evtl. versuchen immer feiner ranzuschwingen. Technisch auch machbar.

      Jetzt kommt das aber:
      Wenn man einstellt: man hat einen Lasermotor, dann fährt das Programm ihn zuerst auf eine Startposition (links) und schwenkt dann rüber. Die Mittenposition ist dann egal.
      Wenn man einstellt: man hat keinen Lasermotor – gibt es ja theoretisch nichts zum bewegen. Also wären das da eher 2 Haken: hat Lasermotor und nutzt Lasermotor. Ein Button auf der manuellen Seite wäre auch machbar (sozusagen er versucht egal ob man einen Laser eingestellt hat oder nicht eine Position anzufahren), Ich weiß nur nicht was von beiden einen Nutzer mehr oder weniger verwirrt.

      Dann:
      Die Mittelstellung ist zwar schön symmetrisch, aber ist sie auch gut? Ich habe ja immer mal versucht etwas nicht allzu symmetrisches zu scannen. Die Kamera schaut von vorne auf das Objekt. Der Laser kommt ganz grob aus einem 45° Winkel. Wenn es von der Kamera aus einen Überhang gibt, so führt das bei mir meistens dazu, dass die Laserlinie hinter dem Objekt ist (bei dem bemühten Elefanten: der Laser leuchtet z.B. hinter einem Ohr den Elefanten am Kopf an, aber das Ohr selbst verdeckt von der Kamera aus die Reflektion). Ich habe es deswegen meist ein klein bisschen weiter links von der Mitte genutzt (was natürlich etwas was genau in der Mitte ist ausschließt). Die beste Stellung von dem Laser würde ich vom Objekt abhängig machen.

      Ich überleg da noch..

  12. Hallo Wolfgang,

    hatte leider lange keine Zeit für den Fabscan. Umso überraschter war ich zu sehen wie dein Programm sich entwickelt hat. Großen Respekt !

    Ich habe offenbar leider nur ein kleines Bedienungsproblem. Mein Laser dreht sich immer aus dem Kamerabereich (links wenn links am Objekt positioniert oder rechts wenn rechts vom Objekt). Dann dreht der Teller und der Scan beginnt. Ich habe mit den Werten unter Konfiguration gespielt, konnte aber nichts dran ändern.
    Ich denke ich mach da einen Fehler.
    Und noch eine kleine Frage zum Aufnahmebild. Die senkrechten Linien (rot und gelb) welche Bedeutung haben sie? Ich hoffe ich hab da nicht überlesen.

    Vielen Dank im Voraus
    Gunther

    1. Erst mal eine Frage: in welche Richtung dreht bei dir der Laser, wenn du den linken Button in der manuellen Kontrolle drückt?

      Die beiden Linien entsprechen der Einstellung des Sweep Bereiches.
      Links sollte gelb = Laser min sein, rechts rot = Laser max(Reminders an mich selbst: nicht nur bei Programmstart setzen – wird dieses WE nur nichts, da Besuch) . Zuerst sollte der Laser knapp über einen der beiden Ränder (gelb, rot) fahren, dann immer knapp über den jeweils anderen bei einem Scan). Positionskontrolle ist momentan glaub ich nur auf der Filterleiste sichtbar – da sollte eine (ebenfalls rote…. ) Linie da gezeigt werden, wo der Laser ist.

      1. Hallo Wolfgang,

        danke für den Tipp mit der Drehrichtung. Ich habe den Motor umgesteckt und siehe da, alles funktioniert!
        Besten Dank !!

  13. Hallo Wolfgang, erstmal vielne Dank für deine Software. Die Installation hat problemslos geklappt und das flashen des Arduinos auch.
    Leider habe ich noch keinen Schrittmotor (bin aber heiß auf den ersten Scan), also habe ich einfach einen Klotz auf den Drehteller gestellt, somit wird immer das gleiche Bild gemacht, da die Software ja nicht weiß das sich der Drehteller nicht dreht, richtig?
    Es sollte sich eine Zylinder-Punktewolke ergeben.

    Der Scan läuft durch sowohl als ascii und als pcd, aber bei Ergebnisfiles sind leer.
    Wo könnten mein Fehler liegen? Ich habe die Filter so eingestellt, dass ich in der Vorschau eine klare weiße Linie sehe.

    Gruss Steffen

  14. Hallo Wolfgang, danke für deine Antowrto, die Filter waren wohl „zu scharf“ eingestellt, jetzt habe ich die rote Linie und auch auswertbare Ergebnisse.

    Gruss Steffen

  15. Hallo Wolfgang,
    erstmal Danke für die Software. Leider kriege ich diese weder auf einem Windows 8.1 noch auf einem Windows 10 Laptop zum Laufen. Bei beiden wird automatisch COM3 als Arduino Port erkannt obwohl der Arduino an einem anderen Port hängt. COM3 scheint irgendein internes USB Gerät zu sein dass in der Systemsteuerung nicht auftaucht. Gibt es irgendwo (config Datei etc.) eine option den COM Port manuell einzustellen?
    Vielen Dank!

    1. Hallo,

      ja. Im Programmverzeichnis ist eine .XML Configurationsdatei.

      Wenn es installiert ist unter:
      C:\Users\BENUTZERNAME\AppData\Roaming\Wolfgang Schmidt\Simple3DScan\x64 (bzw. x86)
      Configuration.xml

      Einfach mit einem Texteditor ändern von z.B.
      COM3 9600

      auf z.B. für COM10
      COM10 9600

      VG
      Wolfgang

    2. Mea Culpa – Die Zip der 0.18 hat meine Konfiguration enthalten – ist im Download ausgetauscht.

      3 Möglichkeiten
      1. Rücksetzen der Config auf Standartwerte innerhalb des Programms
      2. Löschen der Configuration.XML – die wird bei Programmstart neu erzeugt
      3. Ändern des Com Ports direkt in der Configuration.xml

  16. Dear Wolfgang,

    Congratulations for your project !

    It works great ! The only thing that I’m stuck at is that whenever I try to import a 3D scan into meshlab I’m getting this popup window that says „Error: Header not found“ and it only does this with files created with simple3d.

    I’ve been researching this matter over the internet but haven’t found a solution yet.

    It doesn’t behave like that with files created with fabscan.

    Can you help me out on this ? I appreciate your time and effort for creating this software.

    Regards,
    Robert

    1. Hi Ton,

      english or german?

      Normally if you uploaded the arduino Sketch from this Project the program should detect it automatically.

      In the program directory (do not use program files as this would need aditional rights for writing, e.g. as admin) a configuration file should be created. in the Arduino section you can also manually put the COM port – but normally it should be automatically found

      Can you tell me which os you are using (32/64 bit, win 7/8/10, Special language?)

      Regards
      Wolfgang

  17. Wolfgang,

    Thanks for the reactie i use windows 10, 64 bit.
    The configuration file have i see there is no com port in.
    Where do i put the command for the com port en what is the command, i see only the baud rate 9600.
    Language german and english are for me all dificult to write, i can understand all (with help from google).

    Greatz Ton

  18. Hallo, Klasse arbeit!
    Allerdings finde ich (vieleicht auch andere) es ungünstig das der Comport nicht gewählt werden darf. Somit ist es schon vorbei wenn ich das arduinoboard auf einen anderen usbport stecke ohne was umzustellen. oder wenn ich den Comport woanders für brauche wenn gerade gescanned werden soll. Des Weiteren muss ich wohl einmal von dem Rechner den Arduino flashen. Das heisst somit die Arduinosoftware aufzuspielen. was ich eventuell auch garnicht will. Weil anders findet Simple3dscan nicht meinben arduinoclone ohne ftdi chip (ob es am clone liegt weiss ich jetzt nicht).
    Des Weiteren würde es mich freuen wenn die Stepper Schritte einen weiteren bereich bekommen könnten. Somit könnte man mit riemenscheiben eine höhere auflösung bekommen.
    Und die leuchte kann bei mir nicht über die Oberfläche nicht geschaltet werden. Laser und Motor (Drehteller) gehen.

    mfg , kask

    1. Hi,

      1. Bei der 0.2.0 sollte der COM-Port wählbar sein. Davor war er nur in der Configuration.xml umstellbar. 0.2.0 ist noch nicht auf der Webseite – momentan eigentlich vorwiegend, da ich nur einen COM-Port aktuell habe und das noch nicht testen konnte. http://wolfgangschmidt.info/download/Test/Debug.zip hat das mit allerdings einem Austausch eines Oberflächenelements

      2. Flashen – ja. Die Software sucht den COM Port der auf eine Nachricht eine bestimmte Antwort schickt. Dazu muss der Arduino erst mal die Software drauf haben.

      3. Wie ist das mit dem Bereich gemeint?

      4. LED ist eher experimentell drin und auf extrem seicht geschaltet (um nicht gleich eine LED zu schrotten, nur weil ein Widerstand nicht da ist). Bisher hatte ich das nur im Code genutzt. Muss mal überlegen wo die Helligkeit konfiguriert wird.

      Gruß
      Wolfgang

  19. Wolfgang,

    Nach viel expirimentieren kom ich nicht weiter.
    Kanst du mich vieleicht weiter helphen?
    Ich krieg die turntable nicht arbetend.
    Habe die firmware uploaded und probiere mit de monitore von ardieno zu sehen was spatierd.
    Ich bekomme nur E auf das schirm was ich auch type.
    As ich sketch lade wo nur die stepper arbeited dan functionierd alles correct.
    Die laser geht auch nicht an mit deine program Debug.
    Das wehlen von die comport arbeidet correct, nur bekomme ich nicht das unteren shirm dien runde who man de turntable dreht.
    Hoffenlich kans du mich weiter hilfen.

    Grusse Ton Rijnaard

    1. Hi Ton,

      Ich verstehe deinen Beitrag nicht ganz.

      Du hast die Firmware aus dem S3d Projekt verwendet?

      Was ist mit E gemeint?

      Meinst du http://wolfgangschmidt.info/download/Test/Debug.zip als 0.2 Vorabversion ?

      Hast du den alten Fabscan mit Pololu 4988 Treibern?

      Der zweite Tab oben ist ja zum Testen der Richtung. Wenn du was machst, kannst du mir das log davon schicken (wird im Programmverzeichnis angelegt)

      Und mit was funktioniert es?
      Gruß

      Wolfgang

  20. Wolfgang.

    Nein ich habe die firmare aud deine zip file gebraugt.

    Al ich IDE arduino started und danach die monitor lade sehe ich eine E stehen. Gib ich ein befehl dan bekomme ich immer ein E. Stimt das?

    Ja stimt die debu datei

    Nein ich habe die platine for 2 monaten zuruck gekauft.
    Hier konnen 4 stepper drivers auf gesetst werden.
    Ja ich arbeite mit ein A 4988

    Ich gehe noch probieren dir die log zu shieken.

    Jedenfals danke fur deine antwordt.

    Grusse Ton

  21. Wolfgang,

    Du hast telepathi ich habe alles auf neu installiert um dir ein schone neues log zu geben,
    Und jetz arbeited alles ein want frei.
    Ich gehe jet alles wieder einbouwen und dan mall versuchen op alles korrect arbeitet.

    Danke fur alles.

    P ich mis in deine program en exit is das noch was om zu zu fuggen.
    Die keuze van der com port is auch eine schonen zufugung.

    Grusse Ton

  22. Hello.

    I am trying to use your program and I am having some issues.
    I am using a custom built stepper motor driver. I built it from MOSFET’s using the following schematic: https://upload.wikimedia.org/wikipedia/commons/5/5e/Bipolar_Stepper_Motor_H-bridge.png
    I can control it from 4 pins. In the Arduino Sketch, I made the control using the Stepper library. All works well until I try to scan using SimpleScan. I saw that your best quality settings have the following options:
    – degrees: 1.125,
    – steps: 10.
    These settings make my stepper rotate 1 full rotation plus some additional steps. I modified the degrees to 1.8, because the motor that I use is a bipolar 200 steps Nema17. Afterwards, the stepper rotates just one full rotation but the program finishes the scan much quicker. I think that this has to do with the steps parameter. Can you tell me, please, how is the scan influenced by this option? Thank you.

    Have a nice day.

    Mihai

    1. Hi Mihai,

      The resolution settings mean : do n steps between each image capture. the n steps are equal to x degrees.
      If you have “10” and “1.8” it says: “between capturing images do 10 steps for 1.8“.

      So if you say 1.8 you want only 1 step. (“between each image capture do 1 step for 1.8 °” = totally 200 steps. )

      With original setup the used Nema17 has 200 Steps and the pololu driver can do 16 microsteps per step. It says to do 10 microsteps for 1.25 degrees. (a microstep is 360/(200*16) = 0.1125 degree * 10 = 1.125 degree).
      The programm will compute during scan that it needs to call the stepper for 3200 microsteps.
      If you set it now just to 1.8 without changing the steps it will think: 10 steps are 1.8 degree so for 360 degree call 2000 microsteps.

      Please note: Normally the x angle is computed:
      If you start the program and go to the third tab configuration first update the settings for turntable – set microsteps to one. Go to page resolution afterwards. If you turn the knob labeled steps the angle is computed automatically by 360 / ( number of steps * microsteps) – so if you turn it to 1 after setting the microsteps to 1 it computes 1.8.

      Best regards,
      Wolfgang

  23. Vielen Dank für das Programm! Alles arbeitet.
    Ich benutze ein Android-Smartphone, von un-Webcam, wie Sie rieten. Es stellt sich eine große Videoübertragungsverzögerung aus, so dass der Scan kommt ein wenig verschwommen aus. Sie können die Zeit zwischen dem Drehteller und dem Capture-Kamera Laser erhöhen?
    Mit freundlichen Grüßen, Michael.

  24. Hello,

    Our Arduino is not responsive to the software.
    Our ports are correctly defined.
    We think it’s because we don’t use the correct Arduino code.
    Is the Arduino code (to program the Arduino) the same as the original Fabscan Arduino code?
    If not, where can we find the correct code please?

    Thank you very much!

    1. Hi,

      It is not the same as the original Fabscan. If you install it you will have a link in the starmenu to the Simple3DScanFirmware.ino file – if you use the zip file the folder Simple3DScanFirmware contains the ino file – it is also in the install directory in this subfolder.

      Best regards
      Wolfgang

      1. Hello,

        Thanks for your answer. We’ve found the code for our Arduino.
        Can we use your code with our stepper motor driver L298 with Dual H-Bridge?
        We have to connect 4 wires to the driver, but the code is build for drivers with 3 wires (enable, step, direction) we guess. Is there another version, or what do we have to change please?

        Thank you!

        1. Hi,

          The Arduino-Code is for the Fabscan Shieldwith A4988 Drivers ( http://www.watterott.com/de/Arduino-FabScan-Shield with http://www.watterott.com/de/Pololu-A4988-Schrittmotortreiber ).

          I’m afraid that for the L298 you need to change the arduino sketch ( the part with performSteps ) to the appropriate code of the driver.
          As I have no L298 I can only make a guess how it works.
          Mihai Ignat above also seems to used a H-Bridge with a 4 PIN setup, and i have a ULN2003A at home which works with 4 pins after changes of the sketch ( but there i use some low level code because it does not work well with the stepper library) .
          At the moment i’m in easter holidays with my family, so it’s a bit of a problem to send more detailed instructions.
          If i see it right you would only need to include the stepper library as in example on page http://tronixlabs.com.au/news/tutorial-l298n-dual-motor-controller-module-2a-and-arduino/ below (not the above one)

          Put as first line of the code
          #include

          Then you would need to put a variable for the stepper on top of the code (after the defines would be a good place
          const int stepsPerRevolution = 200; (The Nema17 has 200 steps, if you use another one use the appropriate value)
          Stepper myTableStepper(stepsPerRevolution, 8,9,10,11); //<- change to your used pins then in void setup myTableStepper.setSpeed(60); //or slower and change performSteps to void performSteps(int stepper, int dir, int numberOfSteps) { if(dir == ClockWise) { myTableStepper.step(numberOfSteps); } else { myTableStepper.step(-numberOfSteps); } delay(3); // don't know if a wait is necessary } // note: here i have only put arough thing for one stepper, not the distinction which is in the code for table or laser stepper So this is nothing i can test right now. Oh, and note that you wil need to set the resolution in programm, see the settings above at the post of Mihai Ignat to 200 steps and 1 microstep Does it work? Best regards Wolfgang

          1. Hi,

            just a guess at it depends on what „messy“ means.

            1. Turntable needs to be adjusted to camera. The top of the blue eclips needs to touch the top of the turntable (vertical alingment) and it needs to be in the middle (horizontal alignment). Vertical can lead otherwise to issues that either turntable is catched or lower part of object is not catched. Horizontal scatters the scan – part geometry wont be correct.

            2. There where different cameras/camera holder. The geometry of the build needs to be correct (in the settings tab). This applies to the coordinates of turntable, camera (lens) and laser. Think of it like the program knows a line between laser and back of case. If a red point is detected it tries to compute it somewhere on this line. The program knows from the settings what the camera can see and computes a line between camera and back and the point where the line from laser to back crosses. So if the geometry does not fit somewhere, „wobblings“ can occur.

            3. As different cameras where used they also had different field of views (what the camera can see). It is not only the resolution, but also the angle the camera uses. Therefore on the camera tab there is also a way to setup the size the camera sees. (one camera has maybe 20 cm horizontal on a 1024 resolution, another one 30 cm). The predefined values in the program are for the c270 on the later fabscan cube.

            4. Laser motor – if you look from top on the scan and see something like lines it is most likely that the motor of the turntable moves in wrong direction – check cables.

            5. If you don’t use a motot for the laser and the thing seems to be mirrored it should also be the direction o turntable motor (can be checked on second tab.)

            6. Other messy things can occur due to light and the object itself. http://wolfgangschmidt.info/simple3dscan-0-1-6-kurzinfos-zu-filtern/ if you look at the images, in the fourth you see that the filters does not filter enough. Good would be the lowest image where you can see that the laser is detected very sharply without scatters. On the http://wolfgangschmidt.info/0-bytes/ page you can also see that different objects can make different problems. Object one has fur, therefore the light is broken within the fur and makes the line on the object thicker on some parts. Object two is reflecting and makes it nearly impossible to scan it correctly without applying powder or paint to the object. Last object is very dark and does not reflect good – but could be scanned with correct filters – also some points will be missing.

            7. Something else. 😉

            Maybe you could send a picture of the scanned object and the result.

            P.S.
            you can also set the turntable height to remove it form the scan ,-)

  25. Lieber Wolfgang.
    Leider ist mir gestern der Spannungsregler und einige Pin’s vom Fabscan hingegangen.
    Es sind die Pins für Motor 1.
    Deswegen fehlt jetzt eine Spule und der Motor knattert.
    Gibt es eine Möglichkeit in der Firmware den Motor auf Steckplatz 2/3/4 zu setzen? – Sonst brauche ich ein neues FabScan shield.
    Deine Software läuft sonst, konnte sie aber noch nicht zum scannen benützen.
    Tolle Arbeit!

    1. Hi,

      Einen anderen Slot für den Motortreiber zu nutzen ist eigentlich nicht kompliziert. Wenn du die .ino Datei In der Arduino Software aufmachst, beginnt die mit

      #define TableStepperEnablePinPin 2
      #define TableStepperStepPinPin 3
      #define TableStepperDirectionPin 4

      Die 2, 3, 4 tauscht du gegen die passenden (stehen drunter für die anderen Positionen – werden halt momentan nicht genutzt, z.b. 11,12,13 für den dritten Stepper) aus und lädst das neu hoch. Schau dir aber die Nummerierung auf dem Board an, welcher der zweite und welcher der dritte ist.

      Der Spannungsregler ist aber doch eigentlich auf dem Motortreiber.

      Gruß
      Wolfgang

  26. Wolfgang,

    Thanks for a great Windows version of this project! All seems to work for me except the selection of the precision steps. I have a Nema 17 motor(200 steps, 1.8 deg.) but I cannot select 1 step in precision, only down to 2. Therefore I am only getting 100 steps of resolution. Can you help with this? I am using windows 7 64 bit, version 2.1 of your simple3dscan program.(same in other versions)

    Thanks again,
    Tony

    1. Hi

      Sorry for the Lage response, vacation.

      Have you tried to click more on the outside oft the circle?

      In the program folder is an XML with the configuration, simple change 2 to 1 and start the program

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.