/******************************************************************************** * PrinterCaptureInterrupt.ino * ------------------ * Monitor a parallel port printer output and capture each character. Output the * character on the USB serial port so it can be captured in a terminal program. * * By............: Paul Jewell * Date..........: 29th January 2015 * Version.......: 0.1a * Modification : Change Interrupt Routine so Arduino respond "faster" to Printer * Writing Busy Signal directly from interrupt routine * Ecirbaf 12 Jan 2017 * Test on a PC with a "generic Printer Text only" printer * Printing a test page OK * Even if using somme accent characters * Depend How your Terminal Software is handling that. *------------------------------------------------------------------------------- * Wiring Layout * ------------- * * Parallel Port Output Arduino Input * -------------------- ------------- * Name Dir. Pin Name Pin * ---- ---- --- ---- --- * nSTROBE > 1................INT0 2 (as interupt) * DATA BYTE > 2-9.......................3-10 * nACK < 10.........................11 * BUSY < 11.........................12 * OutofPaper < 12................GND * Selected < 13.................5v * GND <> 18-25................GND *------------------------------------------------------------------------------- ********************************************************************************/ int nStrobe = 2; int Data0 = 3; int Data1 = 4; int Data2 = 5; int Data3 = 6; int Data4 = 7; int Data5 = 8; int Data6 = 9; int Data7 = 10; int nAck = 11; int Busy = 12; int led = 13; // use as status led enum States { READY, BUSY, ACK } State; void setup() { // Configure pins pinMode(nStrobe, INPUT_PULLUP); for (int n = Data0; n < (Data7+1); n++) pinMode(n, INPUT_PULLUP); pinMode(nAck, OUTPUT); pinMode(Busy, OUTPUT); pinMode(led, OUTPUT); Serial.begin(38400); // ** Actual com port could at least go this speed ** // while (!Serial) { ; } attachInterrupt(0,Interrupt,FALLING); // ** Name :Interrupt, was clearer for me than DataReady ** // State = READY; delay(100); Serial.println("Initialised"); } void loop() { switch (State) { case READY: digitalWrite(Busy, LOW); digitalWrite(nAck,HIGH); digitalWrite(led, HIGH); break; // case BUSY: // nStrobe signal received by interrupt handler // digitalWrite(Busy, HIGH); // digitalWrite(led, LOW); // ProcessChar(); // State = ACK; // break; // ** All this case is made during Interrupt (Avoid some missed characters with "fast" printer) ** case ACK: digitalWrite(nAck,LOW); delay(1); //milliseconds. Specification minimum = 5 us ** Reduced to 1 is ok ** State = READY; break; } } void Interrupt() { digitalWrite(Busy, HIGH); digitalWrite(led, LOW); ProcessChar(); State = ACK; } void ProcessChar() { byte Char; Char = digitalRead(Data0) + (digitalRead(Data1) << 1) + (digitalRead(Data2) << 2) + (digitalRead(Data3) << 3) + (digitalRead(Data4) << 4) + (digitalRead(Data5) << 5) + (digitalRead(Data6) << 6) + (digitalRead(Data7) << 7); Serial.print((char)Char); }