Leggere da una uscita parallela del Pc testi e inviarli ad un display LCD

Ciao ragazzi.
Sono un utente alle prime armi con Arduino ma non a digiuno di circuiti digitali.
Mi sono iscritto a questo Forum per chiedere il vostro aiuto.

Ho una mia vecchia apparecchiatura fatta 20 anni fa gestita da un microprocessore e che inviava i suoi dati ad una stampante parallela Centronics.
Vorrei rimetterla in funzione ma non ho più la stampante con ingresso parallelo.
In questi giorni sto provando a leggere i dati che escono dalla Centronics, e inviarli a un display LCD con una scheda Arduino.

Chiedo.
Ci sono in giro dei programmini o librerie già predisposti per gestire e leggere una uscita Centronics con Arduino?
Grazie del vostro eventuale aiuto.

Saverio.

Ho visto questo:
http://forum.arduino.cc/index.php?topic=74776.0

nid69ita:
Ho visto questo:
Arduino to Printer through Parallel Port - Device Hacking - Arduino Forum

Grazie della segnalazione.
Mi sembra che questo articolo spieghi come inviare un testo da Arduino ad una stampante parallela.
Il mio problema è che devo leggere un testo inviato da una apparecchiatura a microprocessore via centronics, mentre il compito di Arduino è leggere questi dati e presentarli su di un display LCD 16x2.

Saverio.

In sostanza, per ricevere i caratteri inviati verso una stampante CENTRONICS devi leggere lo stato di una porta ad 8 bit (pin da 2 a 9 del connettore CENTRONICS) sincronizzata dal pin 1 (STROBE) normalmente HIGH.

E' passato molto tempo, ma credo di ricordare che per abilitare la trasmissione è necessario che i pin 11 (BUSY), 12 (PE), 13 (SEL) siano LOW e 13 (FAULT) in HIGH, mentre per interromperla (riempimento del buffer di ricezione) il pin 10 (ACK) deve passare da LOW ad HIGH.

cyberhs:
In sostanza, per ricevere i caratteri inviati verso una stampante CENTRONICS devi leggere lo stato di una porta ad 8 bit (pin da 2 a 9 del connettore CENTRONICS) sincronizzata dal pin 1 (STROBE) normalmente HIGH.

E' passato molto tempo, ma credo di ricordare che per abilitare la trasmissione è necessario che i pin 11 (BUSY), 12 (PE), 13 (SEL) siano LOW e 13 (FAULT) in HIGH, mentre per interromperla (riempimento del buffer di ricezione) il pin 10 (ACK) deve passare da LOW ad HIGH.

Il mio problema è che non conosco il "C" di Arduino e lo sto' imparando solo ora per questa applicazione.
A tale scopo mi sono ricordato che 20 anni fa, quando trafficavo con i microprocessori, mi sono fatto una scheda che connessa a tutte le porte del micro mi visualizzava con dei led lo stato di tutti i suoi pin.
Ora per questa scheda, mi sono fatto un connettore che posso collegare tutte le porte di Arduino, così posso controllare lo stato delle sue entrate/uscite.
Questo circuito mi faciliterà non poco il mio lavoro.

Ricordo che per inviare i dati dalla mia apparecchiatura alla stampante usavo solo due segnali di controllo.

Strobe, con il quale il micro informava la stampante che il dato è sulla porta di uscita per l'invio alla stampante.
Busy, con il quale la stampante comunicava al micro che era occupata nella stampa.

In questi giorni mi sono fatto una raccolta di istruzioni di Arduino, poi inizierò i tentativi di programmazione.

Comunque, di sicuro avrò ancora bisogno del vostro aiuto.

Saverio.

Ciao ragazzi.
Non ho trovato aiuto nemmeno sul web per risolvere il mio problema, così ho dovuto "studiare" le istruzioni di Arduino.

Ieri sera, verso l'una di notte, ho emesso una forte esclamazione di soddisfazione.
Ora con una scheda Arduino, posso leggere un testo che una mia vecchia apparecchiatura spedisce attraverso una porta parallela Centronics e leggerlo su di un display LCD 16x2.

Il programma è sicuramente fatto in modo elementare, ma funziona.
Avrei voluto allegarlo, ma non so usare la funzione adatta per presentarlo.

Saverio.

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare ( pulsante </> ).
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Prima di tutto nell'IDE ti conviene usare CTRL+T che ti aiuta a indentare.
Poi lo copi e lo posti, lo evidenzi e premi il primo pulsante a sinistra con simbolo </>
Vedrai che il codice inizierà con il tag [ code] e finirà con [/ code] (senza spazi, li ho messi altrimenti non vedevi)

Grazie Nid.

Ecco il listato del programma per leggere la porta parallela.
Nel programma ho usato un "goto" perché non trovavo altre soluzioni.

Non so come fare, ma se può essere utile ai principianti (come me), posso inserire una foto del circuito di prova che controlla tutte le uscite/ingressi di Arduino.
Questo circuito mi è stato molto utile e mi ha fatto controllare, se le righe del programma scritte davano il risultato richiesto sui pin di Arduino.

Saverio.

  // include the library code:
  #include <LiquidCrystal.h>

 // initialize the library with the numbers of the interface pins
  LiquidCrystal lcd(12, 13, 8, 9, 10, 11);

  int prova=0;  //  variabile prova
  int puls=0;  //  variabile lettuta dato da inviare al display

   void setup() {
  
  DDRD=(INPUT);  //  configura la porta D come ingresso

   pinMode(17,OUTPUT);   //  pin busy - Pin analogico
   pinMode(16,INPUT);  //  pin strobe - Pin analogico
  
   pinMode(15,OUTPUT);  //  led di prova - Pin analogico
   pinMode(19,OUTPUT);  //   solo prova

   lcd.begin(16,2);
 
   lcd.setCursor(0,0);

   }

      void loop() {
     
     digitalWrite(19,LOW);   
 
      digitalWrite (17,LOW);  //  metti a 1 il busy - rx disponibile

      prova=digitalRead(16);  //  controlla se strobe=0  - dato uscita tx pronto
  
      if (prova==LOW) {
     
      digitalWrite (17,LOW);  //  metti a 1 il busy - rx disponibile

      delay(2);
  
      puls=(digitalRead,PIND);   //  leggi dato da inviare al display
 
      digitalWrite (17,HIGH);  //  metti a 1 il busy - rx non disponibilesolo per prova
 
     delay(10);

//      trasformare il numero tasto in cararrere ASCII

    int i=puls;  //   initializing variables
    char puls=char(i); 
 
 //  _________________________________
 
    if (puls<19) goto casa;  // elimina i caratteri di controllo stampante con valore meno del numero 19
 
    lcd.print (puls);  //  presenta il dato sul display
    
    puls=0;  //  azzera la variabile puls
    
     delay(2);
   
   }

   else
   
   {
   
     casa:
     
    delay(2);

   }

   }

Una foto la puoi allegare. Dove scrivi c'e' sotto la scritta "Attachments... options"
Se premi quello si apre un menu e puoi allegare files

Mi sono permesso di riscrivere il tuo codice SENZA il goto, bastava invertire il test e nell'if mettere le 2 righe che saltavi:

#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 13, 8, 9, 10, 11);

int prova = 0; //  variabile prova
int puls = 0; //  variabile lettuta dato da inviare al display

void setup() {
  DDRD = INPUT; //  configura la porta D come ingresso
  pinMode(17, OUTPUT);  //  pin busy - Pin analogico
  pinMode(16, INPUT);   //  pin strobe - Pin analogico
  pinMode(15, OUTPUT);  //  led di prova - Pin analogico
  pinMode(19, OUTPUT);  //   solo prova
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
}

void loop() {
  digitalWrite(19, LOW);
  digitalWrite (17, LOW); //  metti a 1 il busy - rx disponibile
  prova = digitalRead(16); //  controlla se strobe=0  - dato uscita tx pronto
  if (prova == LOW)
  { digitalWrite (17, LOW); //  metti a 1 il busy - rx disponibile
    delay(2);
    puls = (digitalRead, PIND); //  leggi dato da inviare al display
    digitalWrite (17, HIGH); //  metti a 1 il busy - rx non disponibilesolo per prova
    delay(10);
    //      trasformare il numero tasto in cararrere ASCII
    int i = puls; //   initializing variables
    char puls = char(i);
    //  -------------------------------------
    if (puls >= 19) // elimina i caratteri di controllo stampante con valore meno del numero 19
    { lcd.print (puls);  //  presenta il dato sul display
      puls = 0;          //  azzera la variabile puls
    }
  }
  delay(2);
}

Inoltre nel primo if, finivi la parte vera con delay(2) e nell'else facevi delay(2), tanto vale farlo solo 1 volta dopo l'if, cioè:

if( test) 
{  ....
  delay(2);   // (#)
}
else
{ delay(2);  // fa solo questo, ed è stessa cosa di istruzione al punto -> (#)
}
if(test)
{   ...
}
delay(2);

Consiglio: i numeri dei pin sarebbe meglio metterli come costanti e poi usare quei nomi nel programma, cosa che rende chiaro il codice.
Esempio, il pin 17 tu scrivi come commento "pin busy - Pin analogico" ma se poi incontri nel programma 17 devi andare in testa al programma per ricordarti che cosa fa quel pin.
Se invece dichiari all'inizio:

const byte PinBusy=17;  //  pin busy - Pin analogico
...
 pinMode(PinBusy, OUTPUT);  
...
digitalWrite (PinBusy, LOW);

Mi rendo perfettamente conto che la stesura del mio listato era elementare ed arruffato.
Presto lo rifarò apportando le modifiche suggerite.

Come annunciato, allego una foto dove si vede una mia scheda che mi ha aiutato moltissimo nel controllo passo passo del funzionamento del mio programma.

Come si vede, tutte le uscite/ingresso di Arduino, sono visualizzate da un led. In questo modo ho sotto controllo i risultati delle mie istruzioni.

Un circuito simile lo consiglio a chi si avvicina ad Arduino non avendo nessuna esperienza precedente di programmazione.

Saverio.