Making a typewriter with an old keyboard and a dot matrix printer by furri
Contest Winner
This project shows how to recycle an old keyboard and a dot matrix printer to make a typewriter.

What and how.

The idea is connect the keyboard to the printer with a basic and cheap interface, i have used Arduino because is a fast development board for this kind of  projects and have a large community behind. The board read the keyboard signals (use a data/clock system) and transform this info about the character to the printer. Parallel format controlling the strobe.



Hardware.

Is very basic too, a keyboard adapter with clock, data, power and GND (figure-1), a printer adapter with 8 data bits, strobe and GND (figure-2) all this

Connected to Arduino as figure-3.

Software.

The source code.

// Typewriter with an old AT Keyboard and a Dot Matrix printer.
// 2011 www.xbot.es
// Francisco Reinoso "furri"

#include <PS2Keyboard.h> // library to use a PS2Keyboard with Arduino
#include <string.h>
#include <stdio.h>

#define KBD_CLK_PIN 3
#define KBD_DATA_PIN 2
#define d0 4
#define d1 5
#define d2 6
#define d3 7
#define d4 8
#define d5 9
#define d6 10
#define d7 11
#define strobe 12
#define autofd 13

PS2Keyboard keyboard;

int caracter = 0;

void setup() {
keyboard.begin(KBD_DATA_PIN);
pinMode(d0, OUTPUT);
pinMode(d1, OUTPUT);
pinMode(d2, OUTPUT);
pinMode(d3, OUTPUT);
pinMode(d4, OUTPUT);
pinMode(d5, OUTPUT);
pinMode(d6, OUTPUT);
pinMode(d7, OUTPUT);
pinMode(strobe, OUTPUT);
pinMode(autofd, OUTPUT);
digitalWrite(autofd,HIGH);
digitalWrite(strobe,HIGH);
Serial.begin(9600);
delay(1000);
}

#define is_printable(c) (!(c&0x80)) // don't print if top bit is set

void imprime(int letra)
{
// decode character into 8 bits
if (letra >= 128) { letra = letra - 128; digitalWrite(d0,HIGH); } else { digitalWrite(d0,LOW); }
if (letra >= 64) { letra = letra - 64; digitalWrite(d1,HIGH); } else { digitalWrite(d1,LOW); }
if (letra >= 32) { letra = letra - 32; digitalWrite(d2,HIGH); } else { digitalWrite(d2,LOW); }
if (letra >= 16) { letra = letra - 16; digitalWrite(d3,HIGH); } else { digitalWrite(d3,LOW); }
if (letra >= 8) { letra = letra - 8; digitalWrite(d4,HIGH); } else { digitalWrite(d4,LOW); }
if (letra >= 4) { letra = letra - 4; digitalWrite(d5,HIGH); } else { digitalWrite(d5,LOW); }
if (letra >= 2) { letra = letra - 2; digitalWrite(d6,HIGH); } else { digitalWrite(d6,LOW); }
if (letra >= 1) { digitalWrite(d7,HIGH); } else { digitalWrite(d7,LOW); }
// send the character to the printer
digitalWrite(strobe,LOW);
delayMicroseconds(2);
digitalWrite(strobe,HIGH);
}

void loop() {
if(keyboard.available()) {
byte c = keyboard.read();
if ( c == 13 ) { Serial.print(c); imprime(10); }
else
{
if ( is_printable(c) ) { Serial.print(c); imprime(c); } // don't print special characters
}
}
}


Fuzzy-Wobble says: May 30, 2012. 3:00 PM
Been trying this all day and have had no luck. Hopefully you can offer some guidance.

First off, do you tie all the grounds to ground, or just strobe and d0-d7?
http://www.hilmanind.com/pinouts/cent36.htm - looks like there are 15 total grounds.

What about auto-feed, what are you doing with it?

What did you do with all the wires you didn't need? just leave the dangling?

Thanks!
thegriffy100 says: Apr 2, 2011. 2:36 PM
i want a dot matrix printer
do you think that you could invent a code that writes without the keyboard
you rock
furri (author) says: May 13, 2011. 1:01 AM
print without keyboard, easy... What do you want to print?

"I'm the gosth of the printer... HaHaHA"

a good joke.
Gernerakos says: May 12, 2011. 11:31 PM
what kind of arduino do I need?
is it works whit uno?
furri (author) says: May 13, 2011. 12:58 AM
any arduino works
splazem says: Mar 7, 2011. 7:05 PM
Wow.
hg341 says: Mar 7, 2011. 1:56 PM
i love it
rimar2000 says: Mar 7, 2011. 8:31 AM
Awesome!
Pro

Get More Out of Instructables

Already have an Account?

close

PDF Downloads
As a Pro member, you will gain access to download any Instructable in the PDF format. You also have the ability to customize your PDF download.

Upgrade to Pro today!