Wir drucken Bilder mit Arduino



Lange wollte ich eine Art Projekt auf Ardoino machen, damit sich alles darin bewegte und funktionierte. Und nach ein paar Monaten des Entwerfens, Programmierens und Zusammenbaus haben wir einen solchen Minidrucker bekommen, mit dem Sie eine Vielzahl von Bildern und Texten auf die gewöhnlichsten Aufkleber drucken können. Wenn Sie nach dem Anschauen des Videos den großen Wunsch haben, so etwas zu tun, bitte ich um eine Katze.

Was brauchen wir


  • Arduino Uno. Für dieses Projekt habe ich das original italienische Arduino Uno Board verwendet. Ich kann die Arbeit an anderen Boards nicht garantieren.
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • Blaupausen. Ich werde es kostenlos und auf Anfrage senden, wenn Sie hier schreiben .


Eigentlich Umsetzung


Teilefertigung


Diese Phase hängt von Ihrem Wunsch und Ihren Fähigkeiten ab. Sie können es an der Maschine schneiden oder alle Teile manuell schneiden. Die Hauptsache, die hier beachtet werden sollte, ist, dass die Qualität und Leistung dieses Projekts direkt von Ihrer Genauigkeit abhängt. Sie müssen auch diesen Punkt berücksichtigen: Einige der Details, die Sie auf den Fotos sehen, können geringfügig von denen in den Zeichnungen abweichen. Es ist sofort zu beachten, dass die auf den Fotos gezeigten Details geringfügig von denen abweichen können, die den Zeichnungen beigefügt sind.



Für diejenigen, die alles manuell erledigen möchten
, , : ( ), ( ), , .

— - .

. , . . , , ( ) . , / , . , — .

, :






Wir sammeln die Seitenwände


Bisher ist alles einfach: Nehmen Sie die Teile und kleben Sie sie. Achten Sie darauf, dass kein überschüssiger Klebstoff auf den Teilen verbleibt.


Kleben Sie die Beine auf die Basis


Diese Beine repräsentieren nur ästhetischen Wert. Wenn Sie Zeit sparen möchten, können Sie diesen Schritt überspringen.


Den Koffer zusammenstellen


Der Text auf der Vorder- und Rückseite kann nach Ihrem Geschmack geändert werden.





Einen Block für Papier machen


Diese Phase erfordert besondere Genauigkeit und Gründlichkeit der Arbeit. Von besonderer Schwierigkeit sind die "G" -förmigen Schienen, auf denen diese gesamte Plattform gehalten wird.

Sie müssen dünne Streifen sorgfältig genau nach den in der Zeichnung angegebenen Risiken kleben. Für den besten Effekt habe ich solche ungewöhnlichen „Wäscheklammern“ verwendet, aber Sie können sicher darauf verzichten. Die Hauptsache ist, überschüssigen Kleber zu entfernen und sicherzustellen, dass sich die Streifen nirgendwo bewegen. Weiter oben kleben wir die Streifen breiter - die Technologie hier ist dieselbe.





Versuchen Sie nach dem Trocknen des Klebers (mindestens 20 Minuten), das Pad in den Körper einzuführen. Wenn sie wie am Schnürchen dorthin geht und klare Bewegungen hin und her machen kann, dann haben Sie großes Glück - genau das brauchen Sie. Ansonsten nehmen wir Sandpapier in die Hand und überfliegen die Stellen der Schienen, auf denen es eingeklemmt ist.

Es sollte keine Probleme beim Verkleben von Zahnstangen geben. Stellen Sie sicher, dass sie senkrecht haften.



Wir fahren mit dem Zusammenbau des Mechanismus fort, der das Papier hält. Probleme sollten nicht auftreten, wenn Sie alles in dieser Reihenfolge sammeln. Zuerst kleben wir die Gestelle, wir befestigen die Hebel daran. Dann kleben wir einen Sperrholzstreifen auf sie, der die Papierfüchse hält. Und erst dann kleben wir den Teil ein, an dem die Federn anliegen.



Noch ein paar Fotos, um klarer zu machen, wie man das alles sammelt:



Wenn alles richtig gemacht wurde, sollte Ihr Drucker ungefähr so ​​aussehen:



Räummechanismus


Also kamen wir endlich zu den Zahnrädern ... Sie müssen nur auf eine vorbereitete Stange mit einer Länge von ca. 110 mm gelegt werden, wie auf dem Foto unten gezeigt, und auf Sekundenkleber geklebt werden (dieser muss gleichmäßig auf die Wände des Mittellochs des Zahnrads aufgetragen werden). Stellen Sie sicher, dass die Zahnradzähne zur Zahnstange passen.



Versuchen Sie nach dem Trocknen des Klebers, die Stange vorsichtig zu rollen - die Plattform sollte sich bewegen.

Installieren Sie das erste Servo


Zunächst müssen Sie das Getriebe für den Motor vorbereiten. Jedes Servo wird mit mehreren Kunststoffschaukeln geliefert. Sie müssen wie in der folgenden Abbildung gezeigt geschnitten und gedreht werden. Und dann steck es in den Gang.



Und jetzt fahren wir mit der Installation des Laufwerks fort. Schieben Sie zunächst den Notizblock ganz in den Drucker und drehen Sie das Servo bis zum Anschlag gegen den Uhrzeigersinn. Dann müssen Sie die optimale Position des Antriebs wählen, dh das Servo so befestigen, dass die Zahnräder kein großes Spiel haben, aber nicht aneinander anliegen.



Und jetzt können Sie prüfen, ob bei uns alles funktioniert. Verbinden Sie dazu das Servo über Pin9 mit Ihrem Arduino und laden Sie die Skizze aus den Patterns: Servo> Sweep. Nur für den Fall, ich gebe seinen Code unten.

Servo fegen
#include <Servo.h>

#define MIN_ANGLE 0
#define MAX_ANGLE 180

Servo servo;

void setup() { 
  servo.attach(9);
} 
 
void loop() { 
  for(int i=MIN_ANGLE; i<=MAX_ANGLE; ++i) {
    servo.write(i); 
    delay(15);
  } 
  for(int i=MAX_ANGLE; i>=MIN_ANGLE; --i) {                                
    servo.write(i);
    delay(15);
  } 
} 


Wenn alles funktioniert hat, großartig. Wenn nicht, ändern Sie die Position des Frequenzumrichters oder die Werte MIN_ANGLE und MAX_ANGLE im Code.

Installieren Sie das zweite Servo


Hier wird alles ähnlich mit dem ersten Motor gemacht. Der einzige Unterschied besteht darin, dass Sie eine kleine Achse von ~ 12 mm Länge benötigen, um die beiden Zahnräder zu sichern.



Wir setzen einen Druckwagen


Wenn Sie es geschafft haben, dieses Stadium zu erreichen, sollten Sie hier keine besonderen Schwierigkeiten haben. Das Schwierigste dabei ist, den Wagen sorgfältig zusammenzubauen (damit er nicht heraushängt und sich verkeilt). Möglicherweise müssen Sie mit Sandpapier arbeiten. Das nächste mögliche Problem ist eine schlecht geklebte Zahnstange. Es sollte streng parallel zur Basis des Gehäuses verlaufen. Es ist besser, es zu kleben, wenn sich der Schlitten am weitesten vom Servoantrieb entfernt befindet.



Wir überprüfen diese Baugruppe mit Arduino und der oben genannten Skizze. Wenn alles ordnungsgemäß funktioniert, fahren Sie mit dem nächsten Schritt fort. Wenn nicht, liegt das Problem höchstwahrscheinlich an Zahnrädern oder falsch geklebten Zahnstangen.

Letzter Servo


In diesem Stadium sammeln wir den Hebel für den Filzstift. Wir müssen in der Lage sein, ein seitliches Loch für die Schraube zu bohren, mit dem wir die Schraube festziehen. Stellen Sie sicher, dass das Servo in dem Zustand, in dem der Filzstift abgesenkt ist, eine Position von 90 Grad hat. Dann müssen Sie keine unnötigen Korrekturen im Code vornehmen.



Nach der Installation des Motors ist unser Drucker fast fertig. Ich empfehle, die Oberfläche des Notizblocks mit Klebeband zu verkleben. Während des Debuggens kann der Drucker ernsthaft verschmutzen.



Zuerst ausführen und debuggen


Zunächst schließen wir das Servo an unser Arduino Uno an. Es ist zu diesem Zeitpunkt nicht erforderlich, es im Drucker zu platzieren. Die Arbeit ist unpraktisch. Wir verbinden den ersten Motor mit Pin2, den zweiten mit Pin4, den dritten mit Pin6. Laden Sie als Nächstes diese Skizze herunter. Beachtung! Dieser Code funktioniert nicht in der IDE, neuerer Version 1.6.4 (Ich habe versucht, ausführliche Kommentare abzugeben, und der gesamte Code wird nicht näher erläutert):

Dreh mich um
#include <Servo.h>

/*
*  MiniPrinter
*  Designed in May 2015
*  By Alexandrow Yegor
*/

// ,        Servo
struct Motor {
  int min_angle, max_angle;
  Servo servo;
};

#define IMG_W 64 // 
#define IMG_H 64 // 
int STEP = 2;    //    1 
#define IDLING_MS 4 // ,     1 
#define WRITING_MS 8

struct Motor motor_x, motor_y, motor_p;
byte img[IMG_W/8]; //  
                   //  =  

struct Motor newMotor(int pin, int a1, int a2) { // 
  struct Motor m;

  m.servo.attach(pin);
  m.min_angle = a1;
  m.max_angle = a2;

  return m;
}


void gotoStart() {
   motor_p.servo.write(motor_p.max_angle); // 
   delay(15);
   
   //   (0; 0)
   motor_x.servo.write(motor_x.min_angle);
   motor_y.servo.write(motor_y.min_angle); 
   delay(IDLING_MS * STEP * IMG_W + 150);
}

void finish() { // 
    motor_p.servo.write(motor_p.max_angle); 
    delay(15);
    motor_x.servo.write(motor_x.min_angle);
    motor_y.servo.write(motor_y.max_angle);
    delay(IDLING_MS * STEP * IMG_W + 150);
}

void setup() { //
  Serial.begin(9600);
  motor_y = newMotor(2, 50, 180);
  motor_x = newMotor(4, 30, 160);
  motor_p = newMotor(6, 90, 99);
  gotoStart();
}

//,      ,     
boolean nextWayIsEmpty(int i) {
  for(; i<IMG_W; ++i) {
    if(!(img[i/8] & (1 << 7-(i%8)))) continue;
    else return false;
  }
  
  return true;
}

void printImg() {
  gotoStart();
  int x = 0;
  for(int y=0; y<IMG_H; ++y) {
      for(int i=0; i<IMG_W/8; ++i) img[i] = Serial.read();
      Serial.write(61);//  ,          
      
      for(int i=0; i<STEP; ++i) { //       ,  STEP
          motor_x.servo.write(motor_x.min_angle); //   
          motor_y.servo.write(motor_y.min_angle + y*STEP + i); 
          delay(IDLING_MS * STEP * x + 30);
          
          for(x=0; x<IMG_W; ++x) {
            
            if(nextWayIsEmpty(x)) {
              motor_p.servo.write(motor_p.max_angle); delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
              break;
            }
            
            //  (/),    
            motor_p.servo.write((img[x/8] & (1 << 7-(x%8))) ? motor_p.min_angle : motor_p.max_angle);
            delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
            
            //     X
            motor_x.servo.write(motor_x.min_angle + x*STEP);
            delay(((img[x/8] & (1 << 7-(x%8))) ? WRITING_MS : IDLING_MS) * STEP); 
        }
        
        // 
        motor_p.servo.write(motor_p.max_angle); delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
      }
    
    // 
    motor_p.servo.write(motor_p.max_angle); delay(IDLING_MS * (motor_p.max_angle-motor_p.min_angle));
  }
    
  gotoStart();
  Serial.flush();
}

//  
//     ,    
//    

void checkMessage() {
    if(Serial.available()) {
      delay(10);
      byte msg[] = {Serial.read(), Serial.read()};
      
      if(msg[0] == 'P' && msg[1] == 'R') printImg(); //
      if(msg[0] == 'S' && msg[1] == 'T') gotoStart(); //   (0; 0)
      if(msg[0] == 'C' && msg[1] == 'L') finish(); //" "
      if(msg[0] == 'S' && msg[1] == 'Z') STEP = Serial.read(); //    
      if(msg[0] == 'P' && msg[1] == 'T') { //     (PT+1 -   , PT-2  2  )
        if(Serial.read() == '+') {
          byte b = Serial.read();
          motor_p.min_angle += b-'0';
          motor_p.max_angle += b-'0';
        } else {
          byte b = Serial.read();
          motor_p.min_angle -= b-'0';
          motor_p.max_angle -= b-'0';
        }
      }  
    }
}

void loop() {
  checkMessage();
}



Wenn Sie bis zu diesem Zeitpunkt bereits alle Systeme getestet und getestet haben, sollte es keine Probleme geben: Der Papierblock sollte leicht zucken und der Druckwagen sollte die Position ganz links einnehmen. Wenn einer der oben genannten Punkte die Kanten nicht erreicht oder umgekehrt an den Wänden anliegt, versuchen Sie, die Parameter in der Funktion setup () auszuwählen.

Wenn Sie auf ernstere Probleme stoßen, empfehle ich Ihnen, das gesamte Tutorial noch einmal sorgfältig zu lesen und zu überprüfen, ob Sie alles richtig gemacht haben. Außerdem ist es schön, jeden Motor anhand der ersten Auflistung (Servo Sweep) erneut zu überprüfen.

Als nächstes schließen wir unseren Drucker an den Computer an und führen dieses Programm aus (Java muss installiert sein).

Zuerst wählen wir die serielle Schnittstelle aus, an die der Drucker angeschlossen ist, und drücken die Taste „OK“. Danach sollte der Drucker den Papierblock leicht drehen. Klicken Sie dann auf die Schaltfläche "Protokoll". Wir haben ein Terminalfenster geöffnet. Geben Sie als Nächstes den CL-Befehl ein. Der Drucker sollte das Pad nach innen drücken. Wenn Sie ST eingeben, kehrt der Drucker in seine ursprüngliche Position zurück. Sie können auch mehrere Befehle hintereinander senden, z. B.: CLSTCL. Die Hauptsache ist, keine Leerzeichen und andere Charaktere zwischen den Teams zu verwenden.



Wenn wir damit fertig wurden, fahren Sie fort - installieren Sie den Hebel mit einem Filzstift. Befestigen Sie zuerst den Filzstift am Hebel. Der Abstand von der Spitze zur Unterkante des Hebels sollte ca. 25 mm betragen. Dann müssen Sie die Schraube so festschrauben, dass der Filzstift fixiert ist und nicht verschwunden ist. Legen Sie nun einfach diesen Hebel auf die Achse des Servos - der Abstand zwischen der Spitze des Filzstifts und dem Papier sollte ca. 7 mm betragen. Genauer gesagt kann die Höhe mit den Befehlen PT + 1 und PT-1 eingestellt werden. Sie passen den Winkel des Markers an, statt 1 kann es eine beliebige Zahl von 0 bis 9 geben.

Und jetzt ist der wichtigste Moment gekommen - das Drucken des ersten Bildes. Kleine 64x64-Bilder sind am besten geeignet. Ich empfehle die Verwendung dieses Mario:


Download

Zuerst müssen Sie das Bild öffnen:



Mit den Schiebereglern rechts können Sie den Kontrast des Bildes nach Ihrem Geschmack einstellen. Es ist zu beachten, dass das Bild umso länger gedruckt wird, je mehr schwarze Pixel vorhanden sind.



Das ist alles. Dann klicken Sie einfach auf die Schaltfläche "Drucken" und bewundern, wie Ihre Erstellung funktioniert. Das einzig mögliche Problem in dieser Phase ist das Drücken des Filzstifts. Er wird entweder zu stark oder gar nicht drücken. Sie können nicht nur die Höhe des Filzstifts über das Terminal steuern, sondern auch versuchen, die Höhe manuell anzupassen.

Sie können auch auf eigenes Risiko die Werte globaler Variablen in der Skizze ändern: Spielen Sie mit der Geschwindigkeit und Größe des Drucks.

Sobald Sie mit der Qualität des resultierenden Bildes zufrieden sind, können Sie das Arduino sicher in das Druckergehäuse einsetzen, indem Sie es mit Schrauben festschrauben - dies kann als Ihr Projekt betrachtet werden, das Sie allen Ihren Freunden zeigen können!

Fazit


Das ist alles, ich hoffe du warst an diesem Projekt interessiert. Natürlich hat es seine Nachteile bei den Implementierungsfunktionen, sodass noch Raum für Verbesserungen, Verbesserungen und Entwicklungen besteht. Ich freue mich über Ratschläge, Fragen und Anregungen in den Kommentaren.

Source: https://habr.com/ru/post/de383877/


All Articles