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!

17 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
  2. Legal....
    Com este código consegui funcional a impressora DP-Q802P, parabéns!!!
    Só não consegui localizar no manual e nem na biblioteca.
    Alguém saberia me informar?

    ResponderExcluir
  3. Quero imprimir os dados de um cartão SD. Uma lista, porém, um a um por click. Há como

    ResponderExcluir
  4. Seria possivel imprimir através do celular ????

    ResponderExcluir
    Respostas
    1. Oi Benedito,

      Diretamente eu creio que não, mas você pode, por exemplo, enviar as informações via Bluetooth, receber no Arduino e mandar imprimir pela serial.

      Abraço!

      Excluir
  5. Olá amigos, alguem sabe que linguagem essa impressora fala? Se é epl?

    ResponderExcluir
  6. Como faço para ligar um sensor de gas junto e imprimir o que ele medir?

    ResponderExcluir
    Respostas
    1. Bom dia,

      Você pode usar o exemplo do botão para conectar o sensor de gás no circuito e imprimir o valor do sensor de tempos em tempos.

      Abraço!

      Excluir
  7. Saberia informar se consigo rodar essa impressora no raspbarry pi?

    Teria algum exemplo?

    Agradeço desde já.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Por favor dê uma olhada nesse link, tem um tutorial sobre como usar essa impressora com Raspberry Pi: http://blog.filipeflop.com/embarcados/camera-instantanea-com-raspberry-pi.html

      Abraço!

      Adilson

      Excluir
  8. Boa tarde....
    eu tenho pic18f e uso o mikroC esta impresso funciona???
    miltolima@hotmail.com

    ResponderExcluir
  9. Olá amigo! você poderia postar como conectar um receptor bluetooth para imprimir através do celular.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Interessante a sua ideia. O que pensa em imprimir?

      Abraço!

      Adilson

      Excluir
  10. Como é uma mine impressora pra teste, poderia ser usada para imprimir pequenos lembretes, seria legal.

    ResponderExcluir
    Respostas
    1. Bacana.. vou pensar em algo... ;)

      Abraço e obrigado!

      Adilson

      Excluir
  11. Dá para adaptar para imprimir numa multifuncional HP J4660?

    ResponderExcluir