Go Down

Topic: Enviar datos al monitor serial con SD  (Read 2424 times) previous topic - next topic

CaleBit

Hola, me parece que no, únicamente he conectado los TX y RX al arduino y tierra y corriente de la impresora a un cargador de 5volts 2A.

¿Entonces tendría que unir  de la tierra de la impresora un cablesito que lo lleve al arduino?,  tenía esa duda porque en el sketch aparece el pin 7 como output y le conectan una tierra, la verdad no se porqué lo hagan.

¿A eso te refieres?

Saludos y Gracias...

noter

Pues en electrónica no controlo demasiado, así que preferiría que te lo confirme alguien que sepa un poco más, aunque estoy casi convencido de que sí es necesario unir las masas para que arduino e impresora tengan una referencia de voltaje común.

surbyte

Todo siempre tiene que estar referenciado contra GND.
Y que no sea un cablecito fino, debe ser un cable de tal sección, que admita la corriente que circula.
A ver.. si son solo datos, puede ser de poca sección.

Si es el mismo que usas para datos y alimentación debe ser grueso. Que tan grueso? pues la norma que se usa en Argentina y supongo que mundial es 6A por mm2

Si tu Impresora consume 2A digamos... un cable de 0.25 mm2 estará bien. la cuenta da 1.5 pero ambos sabemos que será suficiente, de lo contrario sigue hacia arriba en mm2.
Digo esto porque antes preguntamos como alimentar arduino y la impresora con la misma fuente.


CaleBit

Ok entonces, es de suponer que el pin 7 donde pondré la tierra que va unida a la impresora estaría configurado como OUTPUT verdad, con la categoría que me indicaste.

Por ahora estoy alimentando al arduino por usb y la impresora por una fuente externa.

surbyte

Si usas Software Serial, los pines definidos para TX y RX requieren igual de una tierra pero esa tierra siguie siendo GND, no puede ser un pin.

CaleBit

Estoy usando las librerías de software serial y adafruit thermal.

Ok entonces voy a sacar de la tierra de la impresora hacia GND de arduino.

Gracias por su colaboración.

CaleBit

Gracias por su ayuda he podido imprimir con exito..

Ahora tengo un problema, al mostrar los registros de la sd a la lcd, el registro del TEL: muestra el numero correspondiente y al final del ultimo numero me aparece un simbolo extrano que yo no puse ahi y me aparece en cada registro que se muestra, no le habia toamdo atencion pero parece como un punto o algo asi, alguien sabe como quitarlo, en la impresion no sale pero me gustaria borrarlo o quitarlo.

No tengo idea porque aparece.

Code: [Select]


void muestra_registro(void){
  printer.wake();
  if (myFile) {
    if (myFile.available()) {
      nom[myFile.readBytesUntil(',', nom, 20)] = '\0';
      tel[myFile.readBytesUntil('\n', tel, 20)] = '\0';
      Serial.println(nom);
      Serial.println(tel);
     
      lcd.clear();
      lcd.setCursor (0, 0);
      lcd.print (" !PRESIONA EL BOTON!");
      lcd.setCursor (0, 1);
      lcd.print ("(Y Borra Tus claves)");
      lcd.setCursor (0, 2);
      lcd.print (nom);
      lcd.setCursor (0, 3);
      lcd.print (tel);

       printer.println(" ");
       printer.justify('C');
       printer.setSize('M');
       printer.println(nom);
       delay (700);
       
       printer.justify('C');
       printer.setSize('M');
       printer.println(tel);
       printer.println (" ");
       printer.println (" ");

       printer.printBitmap (Logo_width, Logo_height, Logo_Data);
       
       printer.sleep();
       printer.setDefault();
     





Tampoco he podido imprimir un logo en la impresora con un mapa de bits, utilice el programa LCD assistant para crear el mapa pero la impresion solo manda caracteres raros, me causa un poco de curiosidad porque el ejemplo de Adafruit trae una imagen y si la imprimio la impresora y segui los mismos pasos y no lo he logrado.

Gracias por su tiempo, ayuda y colaboracion.

noter

Deberías poner el código entero, pues el símbolo tal vez aparezca por algo producido fuera del fragmento que has puesto. No obstante, por ir ubicando el error, podías poner un "chivato" para ver si el símbolo se imprime antes o después del número:

Code: [Select]

lcd.print (tel);
lcd.print ("-");


Si el símbolo aparece antes del guión, el problema debe estar en esta función. Si aparece tras el guión, habrá que buscarlo en otro sitio.
Respecto a lo del logo, habría que ver el código que has puesto para dicha funcionalidad.

CaleBit

Ok gracias noter comenzare a hacer algunas pruebas, asi de primera vista me parecio que el simbolo es como un tipo cursor que al congelarse la pantalla se queda ahi delante del ultimo numero.

Respecto al logo, es un mapa de bits que hice con el programa LCD assistant, no lo puede poner todo por que es muy largo pero pongo la parte del codigo que utilizo.

Code: [Select]


//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------
#ifndef _Logo_h_
#define _Logo_h_

#define Logo_width  150
#define Logo_height 150

 
 static const uint8_t PROGMEM Logo_Data [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,


#endif // _Logo_h_






Ya solo utilizo la funcion printer.printBitmap (Logo_width, Logo_height, Logo_Data);
para imprimirlo, esta parte del codigo es una pestana del otro codigo.


Gracias por su colaboracion

Lucario448

Logo_Data solo tiene 0x00, ¿no será que por eso está imprimiendo una imagen "vacía"?

CaleBit

A decir verdad no puse todo el mapa de bits completo, solo una pequeña parte. Lo genere con LCD assistant

La impresión que sale es muy borrosa, en algunas otras ocasiones me imprimió solo símbolos pero ahora solo como rayas

Gracias Lucario.

CaleBit

Hola he estado experimentando problemas en la impresion de algunos contactos, no se si alguien los haya tenido antes, tambien no se si sea la impresora pero al pulsar el boton a veces solo me imprime el nombre y el tel no como si se quedara sin tinta(aunque no usa), pero asi lo muestra, a veces si imprime los dos datos y a veces solo uno. El codigo que utilizo es el miso que deje abajo.

Pero lo vuelvo a poner.

Code: [Select]


void muestra_registro(void){
  printer.wake();
  if (myFile) {
    if (myFile.available()) {
      nom[myFile.readBytesUntil(',', nom, 20)] = '\0';
      tel[myFile.readBytesUntil('\n', tel, 20)] = '\0';
      Serial.println(nom);
      Serial.println(tel);
      
      lcd.clear();
      lcd.setCursor (0, 0);
      lcd.print (" !PRESIONA EL BOTON!");
      lcd.setCursor (0, 1);
      lcd.print ("(Y Borra Tus claves)");
      lcd.setCursor (0, 2);
      lcd.print (nom);
      lcd.setCursor (0, 3);
      lcd.print (tel);

       printer.println(" ");
       printer.justify('C');
       printer.setSize('M');
       printer.println(nom);
       delay (700);
      
       printer.justify('C');
       printer.setSize('M');
       printer.println(tel);
       printer.println (" ");
       printer.println (" ");

       printer.printBitmap (Logo_width, Logo_height, Logo_Data);
      
       printer.sleep();
       printer.setDefault();
      





Alguna idea...

noter

De momento más preguntas que ideas, porque en principio no se ve nada irregular en el código.

- ¿El delay(700) lo has puesto por alguna razón, o por intentar depurar el fallo?
- ¿Es necesario repetir el justify y el setSize antes de la impresión de tel? ¿No "recuerda" la impresora esos parámetros dados ya en la línea anterior?
- ¿El bitmap sí te lo está imprimiendo? (Prueba a quitarlo, por si acaso está influyendo a la impresión de tel).
- Sería interesante ver la declaración de printer (mejor aún el código completo) y también saber qué arduino estás utilizando (doy por sentado que el uno, pero por si acaso).

A ver si conseguimos dar con el problema.

CaleBit

Asi es noter el delay (700)lo puse para tratar de depurar esa falla (la impresora), pero sigue igual.

Ya hice los cambios redundantes de lo que me comentabas, el bitmap tambien lo quite por que no encontre una solucion para el, intente volviendo a crear el mapa de bits con diferentes medidas pero siguio igual, imprimio solo rayas.

El arduino que utilizo es el UNO y es generico pero acabo de comprar el original para tratar de descartar esto tambien, no sin antes confirmar que el codigo no es el problema, segui el consejo que me diste buscando el error del simbolo extrano que me muestra en la LCD despues de pulsar el boton mostrar, pero tambien no encontre el fallo, solo tengo estas dos fallitas que ahora me tienen en jacke.

Gracias por su enorme ayuda y paciencia, adjunto el codigo

Code: [Select]

#include <EEPROM.h>
#include <Adafruit_Thermal.h>
#include <SoftwareSerial.h>
#define TX_PIN 6
#define RX_PIN 5
#include <Wire.h>
#include <SD.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd (0X27,2,1,0,4,5,6,7,3, POSITIVE);

File myFile;

const byte chipSelect = 10;
const byte Coin = 2; // pin siguiente registro
const byte Salir = 3; // tomaré este pin como el de salir a demo
unsigned long millis_inicio=0, millis_espera=0;
bool demo=true; // si estamos en modo demo (o mostrando registro)
int sigFase=0; // siguiente fase de la demo a ejecutar
bool estadoAnteriorSalir = LOW;     // guardado del último estado de los botones...
bool estadoAnteriorMostrar = LOW;   // ...para saber si cambió el estado
char nom[20]; // buffer de almacenamiento temporal
char tel[20]; // buffer de almacenamiento temporal
unsigned long regActual;


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

void setup() {

  pinMode(7, OUTPUT);  digitalWrite(7, LOW); 
  pinMode (Salir, INPUT_PULLUP);
  pinMode(Coin, INPUT_PULLUP);

  lcd.begin(20, 4);
  mySerial.begin (19200);
  printer.begin ();

 
  lcd.print ("    COMPROBANDO");
  delay(1000);
  lcd.setCursor (5, 1);
  lcd.print ("HARDWARE...");
  delay (4000);
  lcd.setCursor (6, 2);
  lcd.print ("ESPERE");
  delay (1000);
  lcd.setCursor(7, 3);
  lcd.print ("POR FAVOR");
  delay (5000);
  lcd.clear ();
  delay (1000);

 
  pinMode (chipSelect, OUTPUT);
  lcd.setCursor (0, 1);
  lcd.print ("Inicializando SD...");
  delay (1000);
 

  if (!SD.begin(chipSelect)) {
    lcd.setCursor (1, 2);
    lcd.print("ERROR al iniciar SD");
    delay (1000);

    lcd.setCursor (0, 3);
    lcd.print (" ***Inserta la SD***");
    delay (5000);
    lcd.clear ();
    delay (1000);
    return;

  }

  lcd.setCursor (0, 2);
  lcd.print(" ...BOOT exitoso");
  delay (4000);
  lcd.clear ();
 
  myFile = SD.open ("Datos.txt"); //
  if (myFile) {
     
    EEPROM.get(0,regActual);
    if (regActual<myFile.size()){
      myFile.seek(regActual);
    }

  } else lcd.print ("No se pudo abrir");
}


void loop() {
      lcd.setCursor (0, 2);
      lcd.print ("NOM:");
      lcd.setCursor(0, 3);
      lcd.print ("TEL:");

  if (digitalRead(Coin) != estadoAnteriorMostrar) {  // Cambio estado pulsador
    estadoAnteriorMostrar = !estadoAnteriorMostrar; // cambiamos el último estado
    if (estadoAnteriorMostrar == LOW) { // si el cambio es de no pulsado a pulsado
      muestra_registro(); // muestra registro siguiente
      demo=false; // salimos de modo demo (quedará registro fijo en pantalla)
    }
  }
  else if (digitalRead(Salir) != estadoAnteriorSalir) { // Lo anterior con el pulsador de salida a demo
    estadoAnteriorSalir = !estadoAnteriorSalir;
    if (estadoAnteriorSalir == LOW) {
      millis_espera=0L; // establecemos espera a cero para que no espere para repintar
      demo=true;  // cambiamos a modo demo, con lo que en el siguiene paso continuaremos con nuestra demo.
    }
  }
 
  if (demo) {
    muestraDemo();  // si estamos en modo demo entramos en el control de la demo
  }
}


void muestraDemo(void) {
  if ( (millis() - millis_inicio) >= millis_espera ) { // si ha pasado millis_espera desde la última fase, entramos a fase nueva
      switch (sigFase){
      case 0:
        lcd.clear();
        lcd.setCursor (0, 0);
        lcd.print("   Bienvenidos a:");
        lcd.setCursor(2, 1);
        lcd.print("Mi proyecto ");
        millis_espera = 7000;
        break;
     
      case 1: // Aprovechamos para poner todos los casos en los que hay lo mismo (borrado de pantalla y espera 1000)
      case 3:
      case 5:
        lcd.clear();
        millis_espera = 500;
      break;
     
      case 2:
        lcd.setCursor(0, 0 );
        lcd.print(" No esperes mas");
        lcd.setCursor(0, 1 );
        lcd.print("Aprende");
        millis_espera = 7000;
        break;
     
      case 4:
        lcd.setCursor(0, 0 );
        lcd.print("APROVECHA");
        lcd.setCursor(2, 1 );
        lcd.print("<<<LOS CURSOS>>>");
        millis_espera = 7000;
        break;
     
      case 6:
       
      break;
      // caso 5 igual que 1 y 3
    }
    millis_inicio=millis();
  sigFase++;  // siguiente fase
  if (sigFase > 7) sigFase=0; // si hemos pasado de la 7, rebobinamos
  }
}

// muestra el siguiente registro
void muestra_registro(void){
 
  if (myFile) {
    if (myFile.available()) {
      nom[myFile.readBytesUntil(',', nom, 20)] = '\0';
      tel[myFile.readBytesUntil('\n', tel, 20)] = '\0';
     
      lcd.clear();
      lcd.setCursor (0, 0);
      lcd.print (" !PRESIONA EL BOTON!");
      lcd.setCursor (0, 1);
      lcd.print (" Y Borra Tus claves");
      lcd.setCursor (0, 2);
      lcd.print (nom);
      lcd.setCursor (0, 3);
      lcd.print (tel);

       printer.println(" ");
       printer.justify('C');
       printer.setSize('M');
       printer.println(nom);
       printer.println(tel);
       printer.println(" ");
       printer.println(" ");
     
       printer.sleep();
       delay (500L);
       printer.wake();
       printer.setDefault();
     
         
    } else {
     
      Serial.println ("Final del Archivo");
      myFile.seek (0L);
      lcd.clear ();
      lcd.print ("<Final del Archivo>");
      lcd.setCursor (0, 2);
      lcd.print ("NOM:");
      lcd.setCursor(0, 3);
      lcd.print ("TEL:");

    }

    EEPROM.put(0,myFile.position());
 
  } else {
    lcd.clear();
    lcd.print ("ERROR: no hay SD");
    lcd.setCursor (0, 1);
    lcd.print ("o archivo no exs");
  }
}







Tambien quite el serial.print que imprime los valores en el monitor porque veo que son innecesarios y pude imprimir sin ellos...

Gracias por ayuda y colaboracion

noter

A ver si lo que ocurre es que softwareSerial no es capaz de trabajar en tu programa a 19200. Aprovechando que no utilizas el monitor serie, ¿Por qué no usas directamente el puerto Serie hardware (pines 0 y 1) en lugar de chupar procesador?
Cambia las líneas que precedo comentadas aquí:
Code: [Select]

unsigned long regActual;

// Quitamos softwareserial, es decir, la línea siguiente la comento o la elimino.
// SoftwareSerial mySerial(RX_PIN, TX_PIN);

// asignamos Serial, en lugar del softwareserial
Adafruit_Thermal printer(&Serial);     

void setup() {

  pinMode(7, OUTPUT);  digitalWrite(7, LOW);
  pinMode (Salir, INPUT_PULLUP);
  pinMode(Coin, INPUT_PULLUP);

  lcd.begin(20, 4);
// Iniciamos Serial, en lugar del softwareserial
  Serial.begin (19200);
  printer.begin ();


Go Up