Imprimimos fotos usando Arduino



Durante mucho tiempo quise hacer algún tipo de proyecto en Ardoino, para que todo funcionara y funcionara. Y, después de un par de meses de diseño, programación y montaje, obtuvimos una mini impresora con la que puede imprimir una variedad de imágenes y texto en las pegatinas más comunes. Si después de ver el video tienes un gran deseo de hacer algo como esto, te pido un gato.

Qué necesitamos


  • Arduino Uno. Para este proyecto, utilicé la placa original italiana Arduino Uno. No puedo garantizar el trabajo en otras juntas.
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • Planos. Lo enviaré sin cargo y a pedido, si escribe aquí.


Realmente implementación


Fabricación de piezas


Esta etapa depende de tu deseo y tus capacidades. Puede cortarlo en la máquina o cortar todas las piezas manualmente. Lo principal que debe tenerse en cuenta aquí es que la calidad y el rendimiento de este proyecto dependerán directamente de su precisión. También debe tener en cuenta este punto: algunos de los detalles que ve en las fotografías pueden diferir ligeramente de los que aparecerán en los dibujos. Cabe señalar de inmediato que los detalles que se muestran en las fotografías pueden diferir ligeramente de los que se adjuntan a los dibujos.



Para aquellos que planean hacer todo manualmente
, , : ( ), ( ), , .

— - .

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

, :






Recogemos las paredes laterales


Hasta ahora, todo es simple: toma las partes y pégalas. Tenga cuidado de asegurarse de que no quede exceso de pegamento en las piezas.


Pega las piernas a la base


Estas patas representan solo un valor estético. Si desea ahorrar algo de tiempo, puede omitir este paso.


Armar el caso


El texto en las placas frontal y posterior se puede cambiar a su gusto.





Hacer una almohadilla para papel


Esta etapa requiere una precisión y minuciosidad especiales del trabajo. De particular dificultad son los rieles en forma de "G" en los que se sostendrá toda esta plataforma.

Debe pegar cuidadosamente las tiras finas exactamente de acuerdo con los riesgos indicados en el dibujo. Para obtener el mejor efecto, utilicé pinzas para la ropa inusuales, pero puedes hacerlo sin ellas. Lo principal es eliminar el exceso de pegamento y asegurarse de que las tiras no se muevan a ningún lado. Además, unimos las tiras más anchas: la tecnología aquí es la misma.





Después de que el pegamento se seque (al menos 20 minutos), intente insertar la almohadilla en el cuerpo. Si ella va allí como un reloj y puede hacer movimientos claros de un lado a otro, entonces tienes mucha suerte: esto es exactamente lo que necesitas. De lo contrario, tomamos papel de lija en nuestras manos y hojeamos los lugares de los rieles de las orugas en las que se acuña.

No debería haber problemas con el encolado de cremalleras. Asegúrese de que se peguen perpendicularmente.



Procedemos al montaje del mecanismo que sostiene el papel. No deberían surgir problemas si recolecta todo en este orden. Primero pegamos los bastidores, fijamos las palancas en ellos. Luego les pegamos una tira de madera contrachapada que sujetará los zorros de papel. Y solo entonces pegamos la parte en la que se apoyarán los resortes.



Algunas fotos más para aclarar cómo recolectar todo esto:



Si todo se hizo correctamente, su impresora debería verse así:



Mecanismo de brochado


Así que finalmente llegamos a los engranajes ... Solo deben colocarse en una varilla preparada de aproximadamente 110 mm de largo como se muestra en la foto a continuación y pegada a superpegamento (debe aplicarse uniformemente a las paredes del orificio central del engranaje). Asegúrese de que los dientes del engranaje encajen en la cremallera.



Después de que se seque el pegamento, intente desplazar suavemente la varilla; la plataforma debe moverse.

Instala el primer servo


En primer lugar, debe preparar el engranaje para el motor. Cada servo viene con varios columpios de plástico. Deben cortarse y girarse como se muestra en la figura a continuación. Y luego pegarlo en el engranaje.



Y ahora pasamos a instalar la unidad. Para comenzar, empuje la almohadilla de papel hasta el fondo de la impresora y desplace el servo en sentido antihorario hasta que se detenga. Luego, debe elegir la posición óptima de la unidad, es decir, arreglar el servo para que los engranajes no tengan una gran reacción, pero no se apoyen entre sí.



Y ahora puedes comprobar si todo funciona para nosotros. Para hacer esto, conecte el servo a su Arduino a través del pin9 y cargue el boceto desde Patrones: Servo> Barrido. Por si acaso, le doy su código a continuación.

Servo barrido
#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 todo funcionó, genial. De lo contrario, intente cambiar la posición del variador o los valores MIN_ANGLE y MAX_ANGLE en el código.

Instala el segundo servo


Aquí todo se hace de manera similar con el primer motor. La única diferencia es que necesita un eje pequeño de ~ 12 mm de largo para asegurar los dos engranajes.



Ponemos un carro de imprenta


Si lograste llegar a esta etapa, entonces no deberías tener ninguna dificultad especial aquí. Lo más difícil aquí es ensamblar cuidadosamente el carro (para que no se cuelgue y se acuñe), puede que tenga que trabajar con papel de lija. El siguiente problema posible es una cremallera mal pegada. Debe ir estrictamente paralelo a la base de la carcasa, es mejor pegarlo cuando el carro está en la posición más alejada del servoaccionamiento.



Verificamos este ensamblaje usando Arduino y el boceto mencionado anteriormente, si todo funciona como debería, entonces procedemos al siguiente paso. De lo contrario, el problema probablemente se deba a engranajes o cremallera pegada incorrectamente.

Último servo


En esta etapa, recogemos la palanca para el rotulador. Necesitamos poder perforar un orificio lateral para el tornillo, con el cual apretaremos el tornillo. Intente asegurarse de que en el estado en que se baja el rotulador, el servo tiene una posición de 90 grados, luego no tiene que hacer correcciones innecesarias en el código.



Después de instalar el motor, nuestra impresora estará casi lista. Recomiendo pegar la superficie de la almohadilla de papel con cinta adhesiva; durante el proceso de depuración, la impresora puede ensuciarse seriamente.



Primera ejecución y depuración


Para comenzar, conectamos el servo a nuestro Arduino Uno, no es necesario colocarlo dentro de la impresora en esta etapa, será un inconveniente trabajar. Conectamos el primer motor al pin2, el segundo al pin4, el tercero al pin6. A continuación, descargue este boceto. ¡Atención! Este código no funciona en el IDE, más reciente 1.6.4 (intenté comentar en detalle y todo el código claramente, no voy a entrar en gran parte de él):

Dame la vuelta
#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 ya ha probado y depurado todos los sistemas hasta este punto, entonces no debería haber problemas: la almohadilla de papel debería moverse ligeramente y el carro de impresión debería ocupar la posición más a la izquierda. Si alguno de los anteriores no llega a los bordes o, por el contrario, se apoya contra las paredes, intente seleccionar los parámetros en la función setup ().

Si encuentra problemas más serios, le recomiendo que vuelva a leer cuidadosamente todo el tutorial nuevamente y verifique si hizo todo correctamente. Además, será bueno revisar cada motor nuevamente usando la primera lista (Servo Sweep).

Luego, conectamos nuestra impresora a la computadora y ejecutamos este programa (necesitamos Java instalado).

Primero, seleccionamos el puerto serie al que está conectada la impresora y presionamos el botón "Aceptar", después de lo cual la impresora debe girar ligeramente la almohadilla de papel. Luego haga clic en el botón "Iniciar sesión". Hemos abierto una ventana de terminal. Luego, ingrese el comando CL: la impresora debe empujar la almohadilla hacia adentro. Si ingresa ST, la impresora volverá a su posición original. También puede enviar varios comandos seguidos, por ejemplo: CLSTCL. Lo principal es no usar espacios y otros personajes entre los equipos.



Si logramos hacer esto, adelante: instale la palanca con un rotulador. Primero, fije el rotulador en la palanca. La distancia desde su punta hasta el borde inferior de la palanca debe ser de unos 25 mm. Luego debe atornillar el tornillo para que el rotulador quede fijo y no se haya ido. Ahora solo coloque esta palanca en el eje del servo: la distancia desde la punta del rotulador hasta el papel debe ser de aproximadamente 7 mm. Más precisamente, la altura se puede ajustar con los comandos PT + 1 y PT-1. Ajustan el ángulo del marcador, en lugar de 1 puede haber cualquier número del 0 al 9.

Y ahora ha llegado el momento más crucial: imprimir la primera imagen. Las imágenes pequeñas de 64x64 son las más adecuadas. Recomiendo usar este Mario:


Descargar

Primero necesitas abrir la imagen:



Usando los controles deslizantes de la derecha, puede ajustar el contraste de la imagen a su gusto. Vale la pena recordar que cuantos más píxeles negros, más tiempo se imprimirá la imagen.



Es todo Luego, simplemente presione el botón "Imprimir" y admire cómo funciona su creación. El único problema posible en esta etapa es presionar el rotulador. Él empujará demasiado fuerte o no empujará en absoluto. Además de controlar la altura del rotulador a través del terminal, puede intentar ajustar la altura manualmente.

Además, bajo su propio riesgo, puede cambiar los valores de las variables globales en el boceto: juegue con la velocidad y el tamaño de la impresión.

Tan pronto como esté satisfecho con la calidad de la imagen resultante, puede colocar de forma segura el Arduino en la carcasa de la impresora atornillándolo con tornillos; esto puede considerarse su proyecto, ¡puede presumir ante todos sus amigos!

Conclusión


Eso es todo, espero que te haya interesado este proyecto. Por supuesto, tiene sus inconvenientes de las características de implementación, por lo que todavía hay espacio para mejoras, mejoras y desarrollo. Estaré encantado de cualquier consejo, pregunta y sugerencia en los comentarios.

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


All Articles