Nous imprimons des images en utilisant Arduino



Pendant longtemps, j'ai voulu faire une sorte de projet sur Ardoino, pour que tout y bouge et fonctionne. Et, après quelques mois de conception, de programmation et d'assemblage, nous avons obtenu une telle mini-imprimante avec laquelle vous pouvez imprimer une variété d'images et de texte sur les autocollants les plus ordinaires. Si après avoir regardé la vidéo vous avez un grand désir de faire quelque chose comme ça, je demande un chat.

De quoi avons nous besoin


  • Arduino Uno. Pour ce projet, j'ai utilisé la carte d'origine italienne Arduino Uno. Je ne peux pas garantir le travail sur d'autres planches.
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • Blueprints. Je vous l'enverrai gratuitement et sur demande, si vous écrivez ici.


En fait la mise en œuvre


Fabrication de pièces


Cette étape dépend de votre envie et de vos capacités. Vous pouvez le couper sur la machine ou couper toutes les pièces manuellement. La principale chose à noter ici est que la qualité et les performances de ce projet dépendront directement de votre précision. Vous devez également tenir compte de ce point: certains des détails que vous voyez sur les photos peuvent différer légèrement de ceux qui seront sur les dessins. Il convient de noter tout de suite que les détails montrés sur les photos peuvent différer légèrement de ceux qui sont attachés aux dessins.



Pour ceux qui prévoient de tout faire manuellement
, , : ( ), ( ), , .

— - .

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

, :






Nous collectons les parois latérales


Jusqu'à présent, tout est simple: prenez les pièces et collez-les. Veillez à ce qu'il ne reste plus de colle sur les pièces.


Collez les jambes à la base


Ces jambes ne représentent qu'une valeur esthétique. Si vous souhaitez gagner du temps, vous pouvez ignorer cette étape.


Assembler l'affaire


Le texte sur les plaques avant et arrière peut être modifié à votre goût.





Faire un bloc de papier


Cette étape nécessite une précision et une minutie particulières du travail. Les rails en forme de "G" sur lesquels toute la plate-forme sera maintenue sont d'une difficulté particulière.

Vous devez coller soigneusement des bandes minces exactement selon les risques indiqués sur le dessin. Pour le meilleur effet, j'ai utilisé des "pinces à linge" inhabituelles, mais vous pouvez vous en passer en toute sécurité. L'essentiel est d'éliminer l'excès de colle et de s'assurer que les bandes ne se déplacent nulle part. Plus loin, nous collons les bandes plus largement - la technologie ici est la même.





Une fois la colle sèche (au moins 20 minutes), essayez d'insérer le tampon dans le corps. Si elle y va comme sur des roulettes et peut faire des mouvements clairs d'avant en arrière, alors vous avez beaucoup de chance - c'est exactement ce dont vous avez besoin. Sinon, nous prenons du papier de verre dans nos mains et effleurons les endroits des rails sur lesquels il se coince.

Le collage des crémaillères ne devrait poser aucun problème. Assurez-vous qu'ils collent perpendiculairement.



Nous procédons à l'assemblage du mécanisme qui détient le papier. Aucun problème ne devrait survenir si vous collectez tout dans cet ordre. On colle d'abord les racks, on fixe les leviers dessus. Ensuite, nous leur collons une bande de contreplaqué qui tiendra les renards de papier. Et alors seulement, nous collons la partie dans laquelle les ressorts butent.



Quelques photos supplémentaires pour mieux comprendre comment collecter tout cela:



Si tout a été fait correctement, votre imprimante devrait ressembler à ceci:



Mécanisme de brochage


Nous avons donc finalement atteint les engrenages ... Il suffit de les mettre sur une tige pré-préparée d'environ 110 mm de long comme indiqué sur la photo ci-dessous et collée à la super-colle (elle doit être appliquée uniformément sur les parois du trou central de l'engrenage). Assurez-vous que les dents d'engrenage s'adaptent à la crémaillère.



Une fois la colle sèche, essayez de faire défiler doucement la tige - la plate-forme doit bouger.

Installez le premier servo


Tout d'abord, vous devez préparer l'engrenage pour le moteur. Chaque servo est livré avec plusieurs balançoires en plastique. Ils doivent être coupés et tournés comme indiqué dans la figure ci-dessous. Et puis collez-le dans l'équipement.



Et maintenant, nous passons à l'installation du lecteur. Pour commencer, poussez le tampon de papier à fond dans l'imprimante et faites défiler votre servo dans le sens antihoraire jusqu'à ce qu'il s'arrête. Ensuite, vous devez choisir la position optimale du variateur, c'est-à-dire fixer le servo de sorte que les engrenages n'aient pas un grand jeu, mais qu'ils ne se touchent pas.



Et maintenant, vous pouvez vérifier si tout fonctionne pour nous. Pour ce faire, connectez le servo à votre Arduino via la broche 9 et chargez l'esquisse à partir de Patterns: Servo> Sweep. Au cas où, je donne son code ci-dessous.

Balayage servo
#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);
  } 
} 


Si tout fonctionnait, tant mieux. Sinon, essayez de modifier la position du lecteur ou les valeurs MIN_ANGLE et MAX_ANGLE dans le code.

Installez le deuxième servo


Ici, tout se fait de la même façon avec le premier moteur. La seule différence est que vous avez besoin d'un petit axe d'environ 12 mm de long pour fixer les deux engrenages.



Nous mettons un chariot d'impression


Si vous avez réussi à atteindre ce stade, vous ne devriez pas avoir de difficultés particulières ici. La chose la plus difficile ici est d'assembler soigneusement le chariot (de sorte qu'il ne dépasse pas et ne se coince pas), vous devrez peut-être travailler avec du papier de verre. Le prochain problème possible est une crémaillère mal collée. Il doit être strictement parallèle à la base du boîtier, il est préférable de le coller lorsque le chariot est le plus éloigné du servo variateur.



Nous vérifions cet assemblage à l'aide d'Arduino et du croquis susmentionné, si tout fonctionne comme il se doit, puis passons à l'étape suivante. Sinon, le problème est probablement dû à des engrenages ou à une crémaillère mal collée.

Dernier servo


À ce stade, nous récupérons le levier du stylo-feutre. Nous devons être en mesure de percer un trou latéral pour la vis, avec lequel nous allons serrer la vis. Essayez de vous assurer que dans l'état où le stylo-feutre est abaissé, le servo a une position de 90 degrés, vous n'avez donc pas à faire de corrections supplémentaires dans le code.



Après avoir installé le moteur, notre imprimante sera presque prête. Je recommande de coller la surface du bloc de papier avec du ruban adhésif; pendant le processus de débogage, l'imprimante peut être gravement sale.



Première exécution et débogage


Pour commencer, nous connectons le servo à notre Arduino Uno, il n'est pas nécessaire de le placer à l'intérieur de l'imprimante à ce stade, il sera gênant de fonctionner. Nous connectons le premier moteur à la broche2, le second à la broche4, le troisième à la broche6. Ensuite, téléchargez ce croquis. Attention! Ce code ne fonctionne pas sur l'IDE, plus récent 1.6.4 (j'ai essayé de commenter en détail et tout le code clairement, je n'entrerai pas dans le détail):

Tourne-moi
#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();
}



Si vous avez déjà testé et débogué tous les systèmes jusqu'à ce point, il ne devrait y avoir aucun problème: le bloc de papier devrait légèrement trembler et le chariot d'impression devrait occuper la position la plus à gauche. Si l'un des éléments ci-dessus n'atteint pas les bords ou, à l'inverse, repose contre les murs, essayez de sélectionner les paramètres dans la fonction setup ().

Si vous rencontrez des problèmes plus graves, je vous recommande de relire attentivement l'intégralité du didacticiel et de vérifier si vous avez tout fait correctement. De plus, il sera agréable de vérifier à nouveau chaque moteur en utilisant la première liste (balayage des servos).

Ensuite, nous connectons notre imprimante à l'ordinateur et exécutons ce programme (nous avons besoin de Java installé).

Tout d'abord, nous sélectionnons le port série auquel l'imprimante est connectée et appuyez sur le bouton "OK", après quoi l'imprimante devrait tordre légèrement le bloc de papier. Cliquez ensuite sur le bouton «Journal». Nous avons ouvert une fenêtre de terminal. Ensuite, entrez la commande CL - l'imprimante doit pousser le tampon vers l'intérieur. Si vous entrez ST, l'imprimante reviendra à sa position d'origine. Vous pouvez également envoyer plusieurs commandes d'affilée, par exemple: CLSTCL. L'essentiel est de ne pas utiliser d'espaces et autres personnages entre les équipes.



Si nous avons réussi à y faire face, allez-y - installez le levier avec un feutre. Fixez d'abord le feutre sur le levier. la distance entre son extrémité et le bord inférieur du levier doit être d'environ 25 mm. Ensuite, vous devez visser la vis de sorte que le stylo-feutre soit fixé et ne soit pas parti. Maintenant, placez simplement ce levier sur l'axe du servo - la distance entre la pointe du feutre et le papier doit être d'environ 7 mm. Plus précisément, la hauteur peut être ajustée à l'aide des commandes PT + 1 et PT-1. Ils ajustent l'angle du marqueur, au lieu de 1, il peut y avoir n'importe quel nombre de 0 à 9.

Et maintenant, le moment le plus crucial est venu - l'impression de la première photo. Les petites images 64x64 sont les mieux adaptées. Je recommande d'utiliser ce Mario:


Télécharger

Vous devez d'abord ouvrir l'image:



À l'aide des curseurs de droite, vous pouvez régler le contraste de l'image à votre goût. Il convient de rappeler que plus il y a de pixels noirs - plus la photo sera imprimée longtemps.



C'est tout. Il vous suffit ensuite d'appuyer sur le bouton «Imprimer» et d'admirer le fonctionnement de votre création. Le seul problème possible à ce stade est d'appuyer sur le feutre. Il poussera trop fort ou ne poussera pas du tout. En plus de contrôler la hauteur du feutre à travers le terminal, vous pouvez essayer de régler la hauteur manuellement.

De plus, à vos risques et périls, vous pouvez modifier les valeurs des variables globales dans l'esquisse: jouez avec la vitesse et la taille de l'impression.

Dès que vous êtes satisfait de la qualité de l'image résultante, vous pouvez placer en toute sécurité l'Arduino dans le boîtier de l'imprimante en le vissant avec des vis - cela peut être considéré comme votre projet, vous pouvez le montrer à tous vos amis!

Conclusion


C'est tout, j'espère que ce projet vous a intéressé. Bien sûr, il a ses inconvénients de fonctionnalités de mise en œuvre, il y a donc encore place à l'amélioration, à l'amélioration et au développement. Je serai heureux de tout conseil, questions et suggestions dans les commentaires.

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


All Articles