Go Down

Topic: Proyecto de impresora para turnos (Read 1 time) previous topic - next topic

fmreja

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.

Code: [Select]
/*------------------------------------------------------------------------
  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.

surbyte

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

writeBytes es privado como bien has dicho.


fmreja

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

surbyte

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.

fmreja

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

Lucario448

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
¿Y qué tal este?

Según de lo que he medio leído del manual, DTR se utiliza para indicar algún estado particular de la impresora según la situación actual; para efectos del Arduino creo que DTR va a una entrada digital simple.



Algo que no me queda claro, es si esa línea solo envía un pulso (algo que el Arduino lo deberá capturar con una interrupción externa); o es como un GPIO comandado por el programa terminal. Esto lo supongo ya que es la forma en que la IDE puede reiniciar el microcontrolador automáticamente al momento de subir un programa.

fmreja

Hola de nuevo,

ya tengo la impresora en casa y he estado haciendo pruebas.

En el tema de conexión está correcto porque le envío datos y los imprime, aunque lo único que saca son caracteres raros. Supongo que esto será por que no interpreta bien lo que le envío.

He estado también liado con el manual de comandos de la impresora y la librería thermal de adafruit, pero veo que la función a la que debería tener acceso (writebytes) está en un fichero .cpp y no se si eso tendría que compilarlo después de modificarlo o sólo guardarlo. Ahora es con lo que más desorientado estoy, no se como enviarle los comandos que reconoce la impresora.

Me podríais poner algún ejemplo o indicarme como modificarlo para enviar los comandos que entiende la impresora.

Un saludo y muchas gracias

Lucario448

En el tema de conexión está correcto porque le envío datos y los imprime, aunque lo único que saca son caracteres raros. Supongo que esto será por que no interpreta bien lo que le envío.
¿No será que la impresora tiene interruptores DIP?
Según de lo que leí, estos configuran parámetros como tasa de baudios y configuración de trama (paridad, bits de parada y negociación). A ver si no es que algo ande mal por ahí...


He estado también liado con el manual de comandos de la impresora y la librería thermal de adafruit, pero veo que la función a la que debería tener acceso (writebytes) está en un fichero .cpp y no se si eso tendría que compilarlo después de modificarlo o sólo guardarlo. Ahora es con lo que más desorientado estoy, no se como enviarle los comandos que reconoce la impresora.

Me podríais poner algún ejemplo o indicarme como modificarlo para enviar los comandos que entiende la impresora.
¿Dices que el ejemplo de prueba de la librería no funciona con la impresora? De ser así, revisa que las configuraciones del serial coincidan; si no, quizá sea simplemente de cambiar los códigos que se envían en las distintas funciones (como la de ajustar la justificación, tamaño de la fuente, etc.) por las que tu impresora reconoce para ejecutar una acción igual o similar a la esperada. Quizá hasta quieras agregar una función pública que con solo llamarla haga el tan buscado corte del papel.


writeBytes() es una función "privada" ("oculta") de la clase; por eso no la puedes llamar así no más. Además no tiene mucha ciencia, equivale a hacer Serial.write() múltiples veces.


PD: si vas a modificar la librería, no toques el sketch A_printertest (excepto en la parte de adjuntar el puerto serial de tu elección); así sabrás cuando la modificación es exitosa y tu impresora hace justo lo que el ejemplo dice.

fmreja

Bueno, ahora que está todo solucionado os comento...

Finalmente he usado una librería para la Epson TM-T88 que está disponible en el buscador del IDE. Ha sido muy directa, no he tenido que tocar nada salvo mirar las funciones que tiene. Supongo que seguirá también el estandar ESC/POS y por eso ha funcionado bien.

Un saludo y muchas gracias por vuestra ayuda.

Go Up