29 julho 2016

Ligue uma impressora no Arduino

Não seria ótimo se você pudesse imprimir à partir do Arduino ? Não, não estou falando de impressora 3D com Arduino, que futuramente vamos abordar aqui, mas sim de uma impressora que possa imprimir letras, números, códigos de barra e imagens, entre outras coisas. Isso tudo pode ser feito com uma impressora térmica embarcada como essa:

Ligue uma impressora no Arduino

A impressora funciona por impressão térmica direta, ou seja, não precisa de tinta para funcionar. O rolo de papel é facilmente encontrado em papelarias e possui largura de 57mm. É o mesmo papel utilizado em máquinas de cartão de crédito/débito.

A impressora tem um tamanho compacto, sendo ideal para utilização em projetos embarcados, e vem com cabos de dados (comunicação serial) e energia, e vamos mostrar como a ligação dessa impressora no Arduino é bem simples.

Conexões da impressora térmica embarcada


Essa impressora funciona com tensões entre 5 e 9 volts, mas você não deve tentar ligá-la nos 5V da USB, por exemplo, pois ela exige uma fonte de alimentação de pelo menos 1,5A.

Na parte de baixo da impressora, temos os conectores DC (energia) e TTL (comunicação). No conector DC, vamos conectar o cabo de alimentação que vem junto com a impressora (vermelho e preto):

Conexões Impressora Arduino

O cabo de comunicação (Serial/TTL) possui 3 fios nas cores preta (GND), amarelo (Data Out ou TX) e verde (Data In ou RX) e deve ser conectado conforme a imagem acima.

O cabo de energia deve ser ligado na fonte de alimentação externa (5 à 9V), respeitando a polaridade. Eu utilizei um conversor P4 com parafusos para facilitar a conexão:

Adaptador P4 com parafusos

Para testar as funções básicas da impressora, abra a tampa superior e coloque uma bobina de papel com a parte sensível à temperatura virada para a frente.

O botão na parte de cima da impressora, que serve para ejetar papel, serve também para realizar um processo de "auto teste". Para isso, ligue a fonte de alimentação da impressora ao mesmo tempo que mantém esse botão pressionado. Serão impressas várias informações referentes á configuração, como lista de caracteres, versão de firmware, baud rate, etc.

Autoteste impressora térmica


Na parte final da impressão, verifique o "baud rate" com o qual a impressora vêm configurada. Isso é importante para o processo de impressão que faremos adiante, utilizando o Arduino.

Note que enquanto a impressora estiver conectada na fonte de alimentação, o led verde na parte superior pisca em intervalos de 1 segundo.

Conexão da impressora no Arduino


Como mencionamos anteriormente, a impressora se comunica com o Arduino utilizando interface serial/TTL, e vamos utilizar os pinos digitais 5 e 6 para fazer essa comunicação.

Isso é possível pois vamos utilizar no programa a biblioteca SoftwareSerial, que permite criar uma nova porta serial no Arduino utilizando os pinos digitais.

A conexão então fica assim: o fio GND ligado à uma das portas GND do Arduino, o fio verde ligado à porta 5, e o fio amarelo ligado à porta 6:

Mini Impressora termica com Arduino


Vamos agora testar a impressão pelo Arduino.

Imprimindo à partir do Arduino


Para imprimir, vamos usar a biblioteca Adafruit Thermal Printer, que você encontra neste link.

Faça o download da biblioteca, descompacte e renomeie a pasta para algo como Adafruit_Thermal_Printer e coloque-a dentro da pasta LIBRARIES da IDE do Arduino.

O jeito mais simples de testar essa impressora é usando o exemplo A_Printertest da própria biblioteca. Esse exemplo você encontra no menu Arquivo => Exemplos => Adafruit Thermal Printer Library:

Adafruit Printer Test

Carregue esse exemplo e transfira para o Arduino. Em pouco segundos a impressora começa a imprimir uma série de informações sobre fontes, código de barras e outras coisas que você pode fazer com esta biblioteca:

Teste de impressão

Criamos um programa de exemplo para mostrar como você pode imprimir uma informação de acordo com o estado de uma porta.

Nesse exemplo, vamos utilizar um potenciômetro ligado à porta analógica A0, e um botão tipo push-button ligado à porta analógica A1. O esquema de ligação desses componentes adicionados ao circuito anterior fica assim:

Detalhe botão e potenciômetro

Carregue agora o programa abaixo no Arduino. O programa utiliza as funções do programa A_Printer_Test citado anteriormente, e monitora o estado das portas analógicas A0 e A1.

Na linha 19 do programa temos a definição da taxa de transmissão serial, o baudrate, que deve estar de acordo com o valor que foi impresso no autoteste da impressora. No caso, a taxa é de 19200:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//Programa: Mini Impressora termica com Arduino
//Autor: Arduino e Cia

#include "Adafruit_Thermal.h"

#include "SoftwareSerial.h"
//Ligacao no RX (fio amarelo) da impressora
#define TX_PIN 6 
//Ligacao no TX (fio verde) da impressora
#define RX_PIN 5 

SoftwareSerial mySerial(RX_PIN, TX_PIN);
Adafruit_Thermal printer(&mySerial);

void setup()
{
  Serial.begin(9600);
  //Inicializa SoftwareSerial
  mySerial.begin(19200);  
  //Inicializa impressora
  printer.begin();
  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  //Imprime informacoes iniciais
  //Texto centralizado
  printer.justify('C');
  //Negrito
  printer.inverseOn();
  printer.println(F("  www.arduinoecia.com.br  "));
  printer.inverseOff();
  //Avanca uma linha
  printer.feed(1);
  //Altura dupla
  printer.doubleHeightOn();
  //Negrito
  printer.boldOn();
  printer.println(F("Ajuste o potenciometro"));
  printer.println(F("e pressione o botao!"));
  printer.boldOff();
  printer.doubleHeightOff();
  printer.justify('L');
  printer.feed(2);
}

void loop()
{
  //Le os valores do potenciometro e do botao
  int valor_pot = analogRead(A0);
  int valor_botao = digitalRead(A1);
  if (valor_botao == 1)
  {
    //Caso botao seja pressionado, envia para a impressora
    //as informacoes e o valor do potenciometro
    printer.print(F("Botao Pressionado! Valor: "));
    printer.println(valor_pot);
    printer.feed(1);
    //Coloca a impressora em modo sleep
    printer.sleep();      
    delay(300L);
    //Executar antes de imprimir novamente         
    printer.wake();       
    printer.setDefault();
  }
  while (digitalRead(A1) == 1)
  {
    delay(10);
  }
  delay(10);
}

Gire o potenciômetro e pressione o botão para que o valor da porta analógica A0 seja enviado para a impressora:

Teste impressora Arduino Potenciômetro e botão

Interessante, não ? Explore as demais funções da biblioteca e veja como imprimir caracteres com fundo invertido, gráficos, imagens, código de barras, qrcode e muito mais!

2 comentários:

  1. Bom dia, como não tenho conhecimento nesta placa, posso imprimir usando essa placa com cabo de impressora no note ou pc? Obrigado.

    ResponderExcluir
    Respostas
    1. Oi Myro,

      Com um cabo de impressora comum não. A tensão da serial dessa impressora é de 5V, ideal para ligar em placas como o Arduino. A serial do seu PC trabalha com tensão de 12V, se não me engano. Ligando diretamente, iria queimar a sua impressora.

      Nesse caso, o que você pode fazer é usar um cabo conversor serial/ttl e conectar na impressora.

      Abraço!

      Excluir