Imprimimos imagens usando o Arduino



Durante muito tempo, quis fazer algum tipo de projeto no Ardoino, para que tudo nele se movesse e funcionasse. E, após alguns meses de projeto, programação e montagem, temos uma mini-impressora, com a qual você pode imprimir uma variedade de imagens e texto nos adesivos mais comuns. Se, depois de assistir ao vídeo, você deseja fazer algo assim, peço um gato.

O que nós precisamos


  • Arduino Uno. Para este projeto, usei a placa Arduino Uno italiana original. Não posso garantir trabalho em outras placas.
  • sg-90 — 3 . .
  • . 5 ,
  • . 3 : , - , . - «».
  • . , — .
  • (). — , , . . 1- .
  • .
  • . «» ,
  • 4 . -. , , , .
  • Plantas. Vou enviá-lo gratuitamente e mediante solicitação, se você escrever aqui.


Realmente implementação


Fabricação de peças


Esse estágio depende do seu desejo e de suas capacidades. Você pode cortá-lo na máquina ou cortar todas as peças manualmente. O principal a ser observado aqui é que a qualidade e o desempenho deste projeto dependerão diretamente da sua precisão. Você também precisa considerar este ponto: alguns dos detalhes que você vê nas fotografias podem diferir ligeiramente daqueles que estarão nos desenhos. Deve-se notar imediatamente que os detalhes mostrados nas fotografias podem diferir ligeiramente daqueles anexados aos desenhos.



Para quem planeja fazer tudo manualmente
, , : ( ), ( ), , .

— - .

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

, :






Recolhemos as paredes laterais


Até agora, tudo é simples: pegue as peças e cole-as. Tome cuidado para garantir que não haja excesso de cola nas peças.


Cole as pernas na base


Essas pernas representam apenas valor estético. Se você quiser economizar algum tempo, pode pular esta etapa.


Juntando o caso


O texto nas placas frontal e traseira pode ser alterado a seu gosto.





Fazendo um bloco de papel


Esta etapa requer precisão e detalhamento especiais do trabalho. De particular dificuldade são os trilhos em forma de "G" nos quais toda a plataforma será mantida.

Você precisa colar cuidadosamente tiras finas exatamente de acordo com os riscos indicados no desenho. Para o melhor efeito, usei “prendedores de roupa” incomuns, mas você pode seguramente ficar sem eles. O principal é remover o excesso de cola e garantir que as tiras não se movam em lugar algum. Além disso, colamos as tiras mais amplamente - a tecnologia aqui é a mesma.





Depois que a cola secar (pelo menos 20 minutos), tente inserir a almofada no corpo. Se ela for lá como um relógio e puder fazer movimentos claros para frente e para trás, então você terá muita sorte - é exatamente isso que você precisa. Caso contrário, pegamos uma lixa em nossas mãos e roçamos os locais dos trilhos das esteiras nas quais ele se encaixa.

Não deve haver problemas com a colagem de racks. Certifique-se de que fiquem perpendicularmente.



Prosseguimos com a montagem do mecanismo que sustenta o papel. Os problemas não devem surgir se você coletar tudo nesta ordem. Primeiro colamos as prateleiras, fixamos as alavancas nelas. Em seguida, colamos uma tira de madeira compensada nelas para segurar as raposas do papel. E só então colamos a parte em que as molas se encostam.



Mais algumas fotos para deixar mais claro como coletar tudo isso:



Se tudo foi feito corretamente, sua impressora deve ficar assim:



Mecanismo de brochar


Finalmente chegamos às engrenagens ... Elas só precisam ser colocadas em uma haste pré-preparada com cerca de 110 mm de comprimento, como mostrado na foto abaixo, e coladas em super cola (deve ser aplicada uniformemente nas paredes do orifício central da engrenagem). Verifique se os dentes da engrenagem se encaixam no rack dentado.



Depois que a cola secar, tente rolar a haste com cuidado - a plataforma deve se mover.

Instale o primeiro servo


Primeiro de tudo, você precisa preparar a engrenagem para o motor. Cada servo vem com vários balanços de plástico. Eles devem ser cortados e girados, conforme mostrado na figura abaixo. E depois enfie na engrenagem.



E agora vamos instalar a unidade. Para começar, empurre o bloco de papel totalmente para dentro da impressora e role o servo no sentido anti-horário até parar. Então você precisa escolher a posição ideal do inversor, ou seja, fixar o servo para que as engrenagens não tenham folga grande, mas não se encostem.



E agora você pode verificar se tudo funciona para nós. Para fazer isso, conecte o servo ao seu Arduino via pin9 e carregue o esboço em Patterns: Servo> Sweep. Apenas no caso, eu dou o código abaixo.

Servo sweep
#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);
  } 
} 


Se tudo desse certo, ótimo. Caso contrário, tente alterar a posição do inversor ou os valores MIN_ANGLE e MAX_ANGLE no código.

Instale o segundo servo


Aqui tudo é feito da mesma forma com o primeiro motor. A única diferença é que você precisa de um pequeno eixo com ~ 12 mm de comprimento para prender as duas engrenagens.



Colocamos um carro de impressão


Se você conseguiu chegar a esse estágio, não deve ter dificuldades especiais aqui. A coisa mais difícil aqui é montar cuidadosamente o carro (para que ele não fique pendurado), talvez você precise trabalhar com uma lixa. O próximo problema possível é uma cremalheira mal colada. Ele deve ficar estritamente paralelo à base do alojamento, é melhor colá-lo quando o carro estiver na posição mais distante do servoconversor.



Verificamos esta montagem usando o Arduino e o esboço acima mencionado, se tudo funcionar como deveria, e prossiga para a próxima etapa. Caso contrário, o problema provavelmente se deve a engrenagens ou a uma cremalheira colada incorretamente.

Último servo


Nesta fase, recolhemos a alavanca da caneta de feltro. Precisamos ser capazes de fazer um furo lateral para o parafuso, com o qual iremos apertar o parafuso. Tente garantir que, no estado em que a caneta com ponta de feltro seja abaixada, o servo tenha uma posição de 90 graus, para que você não precise fazer correções desnecessárias no código.



Depois de instalar o motor, nossa impressora estará quase pronta. Eu recomendo colar a superfície do bloco de papel com fita adesiva; durante o processo de depuração, a impressora pode ficar seriamente suja.



Primeira execução e depuração


Para começar, conectamos o servo ao nosso Arduino Uno, não é necessário colocá-lo dentro da impressora nesta fase; será inconveniente trabalhar. Conectamos o primeiro motor ao pino2, o segundo ao pino4, o terceiro ao pino6. Em seguida, faça o download deste esboço. Atenção! Esse código não funciona no IDE, 1.6.4 mais recente (tentei comentar em detalhes e todo o código claramente, não vou abordar muito dele):

Me vire
#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();
}



Se você já testou e depurou todos os sistemas até este ponto, não deverá haver problemas: o bloco de papel deve se torcer levemente e o carro de impressão deve ocupar a posição esquerda extrema. Se alguma das opções acima não atingir as bordas ou, ao contrário, encostar nas paredes, tente selecionar os parâmetros na função setup ().

Se você encontrar problemas mais sérios, recomendo que você leia cuidadosamente todo o tutorial novamente e verifique se fez tudo corretamente. Além disso, será bom verificar cada motor novamente usando a primeira lista (servo sweep).

Em seguida, conectamos nossa impressora ao computador e executamos este programa (precisamos do java instalado).

Primeiro, selecionamos a porta serial à qual a impressora está conectada e pressionamos o botão “OK”, após o qual a impressora deve torcer levemente o bloco de papel. Depois clique no botão "Log". Abrimos uma janela do terminal. Em seguida, digite o comando CL - a impressora deve empurrar o teclado para dentro. Se você digitar ST, a impressora retornará à sua posição original. Você também pode enviar vários comandos em uma linha, por exemplo: CLSTCL. O principal é não usar espaços e outros personagens entre as equipes.



Se conseguirmos lidar com isso, vá em frente - instale a alavanca com uma caneta de feltro. Primeiro, fixe a caneta com ponta de feltro na alavanca. a distância da ponta até a borda inferior da alavanca deve ser de aproximadamente 25 mm. Depois, você precisa parafusar o parafuso para que a caneta de feltro fique fixa e não desapareça. Agora, basta colocar esta alavanca no eixo do servo - a distância da ponta da caneta com o papel deve ser de aproximadamente 7 mm. Mais precisamente, a altura pode ser ajustada usando os comandos PT + 1 e PT-1. Eles ajustam o ângulo do marcador, em vez de 1, pode haver qualquer número de 0 a 9.

E agora chegou o momento mais crucial - imprimir a primeira foto. Imagens pequenas de 64x64 são mais adequadas. Eu recomendo usar este Mario:


Download

Primeiro, você precisa abrir a imagem:



Usando os controles deslizantes à direita, você pode ajustar o contraste da imagem ao seu gosto. Vale lembrar que quanto mais pixels pretos, mais a imagem será impressa.



É tudo. Depois, basta pressionar o botão "Imprimir" e admirar como sua criação funciona. O único problema possível nesta fase é pressionar a caneta com ponta de feltro. Ele pressiona demais ou não pressiona. Além de controlar a altura da caneta com ponta de feltro através do terminal, você pode tentar ajustar a altura manualmente.

Além disso, por seu próprio risco, você pode alterar os valores das variáveis ​​globais no esboço: brinque com a velocidade e o tamanho da impressão.

Assim que estiver satisfeito com a qualidade da imagem resultante, você pode colocar o Arduino em segurança no estojo da impressora, apertando-o com parafusos - isso pode ser considerado seu projeto, você pode mostrar a todos os seus amigos!

Conclusão


Só isso, espero que você esteja interessado neste projeto. Obviamente, ele tem suas desvantagens de recursos de implementação, portanto ainda há espaço para aprimoramento, aprimoramento e desenvolvimento. Ficarei feliz em receber conselhos, perguntas e sugestões nos comentários.

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


All Articles