Modificación librería Adafruit_Thermal.h Función Cortar papel

Hola a todos, esta es la primera ves que escribo en el foro de Arduino normalmente leo para solucionar mis problemas pero en este caso encontré una solución parcial y ya no se como dar una mejor solución

Entrando al Tema

La librería adafruit thermal.h no tiene el comando de cortar papel, revisando la librería "GitHub - adafruit/Adafruit-Thermal-Printer-Library: Arduino Library for Small Thermal Printers" en especifico "Adafruit_Thermal.cpp" dentro veo que los comandos usados se relacionan a los códigos ascii que reconoce la impresora ejemplo la imagen que e subido,
Capture

Aquí vemos una parte del código que esta dentro de "Adafruit_Thermal.cpp"

void Adafruit_Thermal::justify(char value) {
  uint8_t pos = 0;

  switch (toupper(value)) {
  case 'L':
    pos = 0;
    break;
  case 'C':
    pos = 1;
    break;
  case 'R':
    pos = 2;
    break;
  }

  writeBytes(ASCII_ESC, 'a', pos);
}

viendo el código de arriba modifique la letra del código ascii para agregar la función de cortar papel "a" por "i"

void Adafruit_Thermal::cortar(char value) {
  uint8_t pos = 0;

  switch (toupper(value)) {
  case 'L':
    pos = 0;
    break;
  }

  writeBytes(ASCII_ESC, 'i', pos);

ahora corta el papel, lo cual seria una solución parcial, explico el por que.

Con esta librería la impresión es muy lenta a pesar de que la impresora trabaja de mejor forma.

Si la impresora la conecto directamente al serial o con la librería "SoftwareSerial.h" trabaja de forma correcta con una velocidad de impresión mejor, ejemplo 3 o 4 veces mas rápido que usando la librería.

Ahora lo que intento es agregar el código ascii a mi programación sin librería pero de todas las formas que e intentado me da error o no hace nada.

ejemplo:
writeBytes(ASCII_ESC, 'i');
mySerial.write(0x49);
y otras formas que no recuerdo

Como creen que seria la mejor forma de agregar el código ASCII o HEX o DEC.

Gracias por su tiempo intente explicarlo de la mejor forma posible

Es lo mismo porque un micro solo maneja binario. ASCII, hexa, octal, decimal solo nos facilitan las cosas a los humanos.

Sin ver el código cualquier propuesta sería una pérdida de tiempo porque sería intentar adivinar donde está el problema.

Hola gracias por responder aquí subiré los 2 códigos, uno usando la librería y otro sin librería

Este seria el programa usando la librería de Adafruit_Thermal.h el cual imprime y corta pero a una velocidad lenta

#include "Adafruit_Thermal.h"
#include "SoftwareSerial.h"

#define TX_PIN 14 
#define RX_PIN 27 


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


void setup() {
 
  mySerial.begin(115200);  
  printer.begin();        
  print_report();
}

void loop() {
}

void print_report() {

    printer.println(F("   ARDUINO"));
    printer.println(F("    FORO"));
    printer.println(F("    PRUEBA"));
    printer.println(F(""));
    printer.println(F(""));
  
  printer.feed(3);

  printer.cortar('L');  //Comando agregado por mi para cortar 

  printer.sleep();      // Tell printer to sleep
  delay(3000L);         // Sleep for 3 seconds
  printer.wake();       // MUST wake() before printing again, even if reset
  printer.setDefault(); // Restore printer to defaults
}

El siguiente programa seria sin librería pero no corta el papel e imprime a una mejor velocidad

#include "SoftwareSerial.h"

#define TX_PIN 14 
#define RX_PIN 27 


SoftwareSerial mySerial(RX_PIN, TX_PIN); 


void setup() {
 mySerial.begin(115200);  
 print_report();
}

void loop() {


}

void print_report(){



  mySerial.println ("    ARDUINO");
  mySerial.println ("   FORO");
  mySerial.println ("    PRUEBA");

//writeBytes(ASCII_ESC, 'i'); //prueba que no funciona
 // mySerial.write(0x49);
}

Estoy ocupando un Esp32 que tiene una velocidad en baudios 115200 y la impresora que estoy utilizando la estoy manejando de forma serial y trabaja a una velocidad de baudios 115200

Lo primero que veo en la libreria Adafruit es que usan 19200 y tu 115200.
Entra a la libreria adafruit y cambia la velocidad

Linea 38 y 39

#define BAUDRATE                                                               \
  19200 //!< How many bits per second the serial port should transfer

Antes prueba haciendolo entu codigo sin modificar nada
Colocalo asi

#define BAUDRATE  115200

Ahi tienes la diferencia de velocidad según mi entender.

ya lo ice antes porque igual note eso pero no cambia la velocidad de impresión

Para que se entienda mejor aquí un video

La explicación de por qué es lenta está en los comentarios del código de la librería, son los inconvenientes que surgen cuando se hacen "cosas" genéricas y no saber exactamente las capacidades del receptor.
La librería está hecha teniendo en cuenta que la impresora puede ser lenta y al no haber posibilidades de handshaking (porque el puerto serial de arduino no lo tiene), se hizo pensando en el peor caso.

Habría que ver que resultado da un código como el tuyo si imprimes más que unas pocas líneas.
Tal vez empiecen a perderse caracteres por desbordamiento del buffer de la impresora.
Ese tipo de detalles hay que tenerlos presentes pero siempre un código desarrollado "a medidad" va a ser mejor (o debería serlo) que uno genérico.

Si e notado la perdida de caracteres o el cambio de letra ya sea usando la librería o sin usarla, ya tengo una solución parcial funciona para lo que quiero hacer pero no me agrada mucho como queda.

#include "Adafruit_Thermal.h"
#include "SoftwareSerial.h"

#define TX_PIN 14 
#define RX_PIN 27 


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


void setup() {
 
  mySerial.begin(115200);  
  printer.begin();        
  print_report();
}

void loop() {
}

void print_report() {
  delay(100);
  mySerial.println ("    ARDUINO");
  delay(100);
  mySerial.println ("   FORO");
  delay(100);
  mySerial.println ("    PRUEBA");
  delay(100);
  mySerial.println ("    veremos ");
  delay(100);
  mySerial.println ("   que pasa");
  delay(100);
  mySerial.println ("    de esta forma");
  delay(100);
  mySerial.println ("    ARDUINO");
  delay(100);
  mySerial.println ("   FORO");
  delay(100);
  mySerial.println ("    PRUEBA");
  delay(100);  
  mySerial.println ("    ARDUINO");
  delay(100);
  mySerial.println ("   FORO");
  delay(100);
  mySerial.println ("    PRUEBA");
  delay(100);
  mySerial.println ("    veremos ");
  delay(100);
  mySerial.println ("   que pasa");
  delay(100);
  mySerial.println ("    de esta forma");
  delay(100);
  mySerial.println ("    ARDUINO");
  delay(100);
  mySerial.println ("   FORO");
  delay(100);
  mySerial.println ("    PRUEBA");
  delay(100);  

  
  printer.feed(3);

  printer.cortar('L');  //Comando agregado por mi para cortar 

  printer.sleep();      // Tell printer to sleep
  delay(3000L);         // Sleep for 3 seconds
  printer.wake();       // MUST wake() before printing again, even if reset

}

aquí les dejo una imagen de la impresión con y sin librería que son los papeles pequeños y el papel largo es el resultado del código que acabo de enviar.

la flecha muestra el carácter que cambio por la perdida de datos yo creo.

Hola,
debería funcionarte, para corte de papel, así:

mySerial.write((char)0x1b); //imprimir <esc>
mySerial.write((char)0x69); //imprimir 'i'

Ahora bien,
Lo que te están comentando es que al no existir negociación entre arduino e impresora, Arduino no sabe si se ha terminado o no de imprimir y por ello la velocidad es lenta.

Normalmente las impresoras tiene diferentes lineas de datos para identificar el estado como CD (Carrier detect) que detecta si el cable está conectado en la impresora, o RTS,CTS,DTR etc que la impresora indica que está ocupada (buffer lleno, por ejemplo, etc). a esto se le llama control por hardware de la impresora.

Dado que esto es complejo simularlo (mayor número de cables y conversiones TTL a RS232), se usa también protocolos XON-XOFF que quizá es lo que te aconsejaría. a esto se le llama control por software de la impresora.
¿cómo funcionan las impresoras con control por software? pues cuando el buffer de la impresora está lleno, la impresora manda un caracter "XOFF" que suele ser el 0x13 y cuando está de nuevo preparada para imprimir la impresora manda un "XON" que suele ser el carácter 0x11.
Aunque esto es bastante más lento que el control por hardware te previene de pérdidas de caracteres.

Aunque todo esto es dependiendo de la impresora que dicho sea de paso no has mencionado la marca/modelo para saber si es posible configurarla con xon/xoff
mete en tu aplicación algo para saber si recibes de la impresora algún caracter y te lo saque por el monitor serial cuando te imprime "&rduino"...

Saludos.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.