Proyecto de impresora para turnos

Hola a todos,

Estoy pensando en hacer un sistema manejado por un arduino para que al pulsar un botón se imprima un ticket con el número de turno para ser atendido y algún logotipo de la tienda. El código como tal es una tontería, un contador, un pulsador y poco más.

He estado buscando bastante por internet sobre impresoras de este tipo y creo que las más fáciles de usar son las propias que vende Adafruit, pero para mi tienen el inconveniente de que no tienen autocorte de papel, el decir, hay que pegar un tirón, con el consiguiente problema de que la máquina se caiga de su sitio.

Luego he visto en Aliexpress bastantes de lo que ellos llaman "impresora térmica de kiosko", que si tienen autocorte y puerto serie, pero me surgen las siguientes dudas. (No pongo ningún enlace porque no estoy seguro de que esté permitido).

  • ¿Podré usar la librería de Adafruit con estas impresoras? En principio pienso que sí, pero que opináis vosotros??
  • ¿Cómo podré ejecutar el autocorte? Supongo que será enviando alguna serie de caracteres especiales, pero no veo nada ni en la información del fabricante ni en la librería de adafruit. No sé si se sigue un estandar en este tipo de impresoras o cada una implementa esto como quiere.

Un saludo y muchas gracias

Las impresoras estan pensadas para trabajar con puerto serie RS232 asi que lo minimo que necesitas es un modulo RS232 para Arduino. Luego todo se reduce a tener el manual de códigos d ela impresora. Si no lo tienes, vas muerto!!! OJO con eso. Todo lo que viene de ALiexpress (me puedo equivocar) suele no tener manual. No será una verdad absoluta pero si no ves manual pdf en la web… huye y busca otra. Paga mas pero compra algo que tenga los códigos de comandos para cortar, poner bold, italica, etc, etc, etc,

Lo que este en Adafruit funciona con elementos que ellos venden, yo me aseguraría comprar y tener un paquete seguro a arriesgarme y probar.

Vaya, pensaba que sería más fácil. Alguna vez he comprado pantallas para arduino en el mismo sitio y han funcionado con las librerias de Adafruit, pero claro, como las de Adafruit no tienen corte tampoco tienen comando para ejecutarlo...

¿Conocéis alguna impresora con la que pueda hacerlo? Es imprescindible que tenga corte automático por lo que comenté antes.

Si ya lo has hecho bueno, no digo nada pero el comando de corte como lo vas a adivinar sin conocerlo?

fmreja:
Luego he visto en Aliexpress bastantes de lo que ellos llaman “impresora térmica de kiosko”, que si tienen autocorte y puerto serie

Dame un ejemplo de una, a ver si se puede encontrar alguna hoja de datos o lo que sea…

  • Hola, lo primero muchas gracias por el interés que os estáis tomando.

Hoy he seguido buscando por internet y he encontrado exactamente lo que quiero hacer:

Arduino con impresora térmica

Según parece en el video, tiene una shield ethernet y a través de ella se conecta a la impresora.

Voy a seguir buscando ¿Sabéis algo de esto?.

Un saludo a todos.

Lucario te pedía marca y modelo, eso que has puesto no muestra una marca y su modelo.
Como va a buscar un manual de algo que no se ve?
Intenta dar una Marca y Modelo de lo que pensabas comprar.

Perdón, he puesto el enlace sobre la marcha.

Aún no he comprado nada, hará que no vea que es factible hacerlo. La impresora del vídeo es una star ts700ii

fmreja:
Hoy he seguido buscando por internet y he encontrado exactamente lo que quiero hacer:

Arduino con impresora térmica

Según parece en el video, tiene una shield ethernet y a través de ella se conecta a la impresora.

Eso se debe a que la impresora usa una LAN como interfaz de control.

Sin embargo, como dijo surbyte, sigo sin saber sobre la que tienes en mente; así que, con menos razón, sabré su interfaz de control.

Definitivamente la que tengo en mente es la star tsp700II. Tiene todo lo que necesito: corte automático, puede imprimir el logotipo de la tienda y es bastante rápida por lo que he podido ver.

El precio de la impresora nueva es bastante alto, alrededor de los 280€, por lo que optaría por comprarla de 2ª mano. No he encontrado ninguna con interfaz LAN, las que he visto son con interfaz USB, aunque he visto que se pueden comprar los otros interfaces y sustituirlos fácilmente.

En cuanto vea que es posible hacer lo que busco compro una y empiezo a probar.

Esta es una que he visto: Impresora

Un saludo

Acto seguido usa tu navegador y busca en GOogle:
Star TSP700II programmer manual y acá el resultado.

Ahora comprendes porque te pedíamos marca y modelo?

Ok, ya tengo bajado el manual, aunque veo que la mayoría de comandos empiezan por un y ni que decir tiene que nunca he programado nada similar. ¿Me podríais poner un ejemplo de línea de código?

He visto algunas líneas en internet que lo ponen así:
Serial.write( 27 ); es decir, como si sustituyesen el por el “Serial write”.

Entiendo que al ser impresora serie la comunicación empezaría con el

void setup(){
   Serial.begin(XXXXX);
}

void loop(){
   Serial.println("Esto es un ejemplo");
}

normal como si fuese para el terminal, no? me equivoco? ¿Cambiaría si fuese por USB?

Un saludo y muchas gracias.

Si ese es el código con el que empiezas los comandos.
Apoyate en la librería de Adafruit que habias dicho. Mira que tan similar es, tal vez sea 100% igual.
Siempre es bueno usar algo conocido.
Tal vez algunos pequeños cambios en la librería te resuelvan el problema.

Estoy comparando una con otra y no se parecen en nada (o yo no sé encontrar las similitudes).

En la impresora he visto que aunque pone puerto serie, por el número de pines del conector yo diría que es pararlelo. ¿Me recomendais esa o la usb?

Una vez que la tenga ya empezaré a trastear y a hacer pruebas con los comandos, porque al menos de esta impresora parece que hay bastante información en la web del fabricante.

No me entiendes.
Hablo de la librería no de la impresora.
Porque no pones el link de la librería que mencionabas antes.

Nota: Usa etiquetas. Si no sabes, lee de nuevo las reglas del foro.

Bueno encontré una librería para impresora Térmica y tiene cosas como ésta

writeBytes(ASCII_ESC, '7');   // Esc 7 (print settings)

excactamente lo que decía.
Aprovecha las rutinas que te puedan servir y si no te sirven completamente copias y usas lo que si te sirve.

Ejemplo en el manual de la STAR dice en la página 4. al final

“d” “n” 1B 64 n Cut command to the auto cutter

asi que usando la rutina que te menciono envias

writeBytes(ASCII_ESC, 'd', 'n');

y cortas el papel

Hola, os voy contando lo que voy haciendo, vayamos por partes:

  • El tema de la impresora ya está resuelto, compré una como la que hemos visto estos días por Ebay de segunda mano. En principio debe llegar para mediados de la semana que viene.

  • En cuanto a la conexión arduino/impresora, he estado leyendo cosas por el foro y he visto que necesitaba un conversor RS232 a TTL. He comprado uno esta mañana también en Ebay, este en concreto:
    RS232 a TTL

También he comprado 2 conectores para soldar, uno serie macho de 9 pines y otro también macho de 25 pines. La intención es hacer un cable con este esquema:

Y conectar el de 25 pines a la impresora, una vez hecho el cable conectar el de 9 pines al conversor RS232 a TTL y de ahí al arduino.

  • En cuanto al tema software: He probado a escribir alguna sentencia en el mismo fichero de ejemplo de la librería Adafruit Thermal y me da error de compilación en la última sentencia (La que realmente necesito). He puesto otras sentencias encontradas en el manual de adafruit y nada, todas con error. No la marca con otro color, como si no la reconociese.
/*------------------------------------------------------------------------
  Example sketch for Adafruit Thermal Printer library for Arduino.
  Demonstrates a few text styles & layouts, bitmap printing, etc.

  IMPORTANT: DECLARATIONS DIFFER FROM PRIOR VERSIONS OF THIS LIBRARY.
  This is to support newer & more board types, especially ones that don't
  support SoftwareSerial (e.g. Arduino Due).  You can pass any Stream
  (e.g. Serial1) to the printer constructor.  See notes below.

  You may need to edit the PRINTER_FIRMWARE value in Adafruit_Thermal.h
  to match your printer (hold feed button on powerup for test page).
  ------------------------------------------------------------------------*/

#include "Adafruit_Thermal.h"
#include "adalogo.h"
#include "adaqrcode.h"

// Here's the new syntax when using SoftwareSerial (e.g. Arduino Uno) ----
// If using hardware serial instead, comment out or remove these lines:

#include "SoftwareSerial.h"
#define TX_PIN 6 // Arduino transmit  YELLOW WIRE  labeled RX on printer
#define RX_PIN 5 // Arduino receive   GREEN WIRE   labeled TX on printer

SoftwareSerial mySerial(RX_PIN, TX_PIN); // Declare SoftwareSerial obj first
Adafruit_Thermal printer(&mySerial);     // Pass addr to printer constructor
// Then see setup() function regarding serial & printer begin() calls.

// Here's the syntax for hardware serial (e.g. Arduino Due) --------------
// Un-comment the following line if using hardware serial:

//Adafruit_Thermal printer(&Serial1);      // Or Serial2, Serial3, etc.

// -----------------------------------------------------------------------

void setup() {

  // This line is for compatibility with the Adafruit IotP project pack,
  // which uses pin 7 as a spare grounding point.  You only need this if
  // wired up the same way (w/3-pin header into pins 5/6/7):
  pinMode(7, OUTPUT); digitalWrite(7, LOW);

  // NOTE: SOME PRINTERS NEED 9600 BAUD instead of 19200, check test page.
  mySerial.begin(19200);  // Initialize SoftwareSerial
  //Serial1.begin(19200); // Use this instead if using hardware serial
  printer.begin();        // Init printer (same regardless of serial type)

  // The following calls are in setup(), but don't *need* to be.  Use them
  // anywhere!  They're just here so they run one time and are not printed
  // over and over (which would happen if they were in loop() instead).
  // Some functions will feed a line when called, this is normal.
}

void loop() {

  printer.println(" ");
  printer.writeBytes(ASCII_ESC, '7');
}

Me da la impresión de que la función a la que quiero acceder (wireBytes) es privada y no se como acceder a ella correctamente. Seguiré leyendo/trasteando a ver si logro algún resultado.

Irme corrigiendo lo que podáis.

Un saludo y muchas gracias.

Mi mejor respuesta sería que agregues algo a la clase para que haga lo que deseas.

writeBytes es privado como bien has dicho.

Entonces, entiendo que debería reescribir los métodos privados del fichero .cpp y hacerlo usando el comando "writeBytes" y los comandos que acepta la impresora, no?. Hay que hacer algún tipo de compilación posterior o simplemente los dejo así en fichero de texto.cpp?

¿Qué os parece lo que os he puesto en mi post anterior? Voy por el buen camino con el tema hardware?

Un saludo

Si el tema hardware esta resuelto. Pero creo que usas demasiadas lineas.
Con RX TX y GND suficiente. A lo sumo Tendras que unir CTS y DTR pero puedes empezar solo con las 3 primeras.

Las 2 últimas líneas que me indicas serían un problema porque no están en el conversor. No he encontrado uno como el que hay d ejemplo el foro que si incluye esas líneas