what are some dirt cheap, small e-ink displays?
I had, for a brief period of time, considered the idea of tinkering with the eink displays; and followed up with e-Ink Corporation. They are the folks holding the eInk IP. They referred me to PrimeView, which is a well established LCD manufacturing company. (And as I googled to do some fact-checking, it turns out PVI has now acquired EInk.)
I was able to talk my way into some datasheets and pricing data. I'm afraid it doesn't look good for the average tinkerer. They were quoting $ 200.00 per piece for the display. and 4.50 per piece for the controller (in sample quantities). The panels were quoted at 60.00/pc for production volumes. Of course, that latter quote would depend on the volume - and I suspect Amazon gets much better pricing! (BTW, this was for the 6" panel, quoted around December 2007)
If you are really serious about it, they did offer their development kit for around $3,000.
Given that the technology is still relatively new and much of the key technology (versus the enabling technology) is under a lot of patent protection, it'll be a while before we'll see commodity (generic) e-ink displays.
Here is my experience of the SeeedStudio E-Ink.
http://www.picaxeforum.co.uk/showthread.php?23583-E-ink-on-PICAXE-see-it-now-!
The Seeedstudio E-ink is an Arduino compatible shield. ( However, it's not quite fully Arduino compatible !. See Seeedstudio Forum : http://www.seeedstudio.com/forum/viewtopic.php?p=16432#p16432)
Here is the PICAXE code :
#PICAXE 28X2
Eeprom %00001111, ( %00000000 ) ' %00000000
Eeprom %00011111, ( %11000000 ) ' %11000000
Eeprom %00101111, ( %00110000 ) ' %00110000
Eeprom %00111111, ( %11110000 ) ' %11110000
Eeprom %01001111, ( %00001100 ) ' %00001100
Eeprom %01011111, ( %11001100 ) ' %11001100
Eeprom %01101111, ( %00111100 ) ' %00111100
Eeprom %01111111, ( %11111100 ) ' %11111100
Eeprom %10001111, ( %00000011 ) ' %00000011
Eeprom %10011111, ( %11000011 ) ' %11000011
Eeprom %10101111, ( %00110011 ) ' %00110011
Eeprom %10111111, ( %11110011 ) ' %11110011
Eeprom %11001111, ( %00001111 ) ' %00001111
Eeprom %11011111, ( %11001111 ) ' %11001111
Eeprom %11101111, ( %00111111 ) ' %00111111
Eeprom %11110000, ( %00000000 ) ' %00000000
Eeprom %11110001, ( %11000000 ) ' %11000000
Eeprom %11110010, ( %00110000 ) ' %00110000
Eeprom %11110011, ( %11110000 ) ' %11110000
Eeprom %11110100, ( %00001100 ) ' %00001100
Eeprom %11110101, ( %11001100 ) ' %11001100
Eeprom %11110110, ( %00111100 ) ' %00111100
Eeprom %11110111, ( %11111100 ) ' %11111100
Eeprom %11111000, ( %00000011 ) ' %00000011
Eeprom %11111001, ( %11000011 ) ' %11000011
Eeprom %11111010, ( %00110011 ) ' %00110011
Eeprom %11111011, ( %11110011 ) ' %11110011
Eeprom %11111100, ( %00001111 ) ' %00001111
Eeprom %11111101, ( %11001111 ) ' %11001111
Eeprom %11111110, ( %00111111 ) ' %00111111
Eeprom %11111111, ( %11111111 ) ' %11111111
pause 5000
sertxd ("Eink_8",cr,lf)
setfreq m16
Symbol Eink_CS1 = S.6 ' Chip select for Eink driver
Symbol Eink_DC = S.5 ' Data/Command control for Eink driver
Symbol GT_CS2 = S.4 ' Chip select for character ROM
Symbol i = w4
Symbol Xs = b10
Symbol Xe = b11
Symbol Ys = b12
Symbol Ye = b13
Symbol Char = b14
Symbol Char16 = w8
Symbol Char16Lo = b16
Symbol Char16Hi = b17
Symbol CommandByte = b18
Symbol DataByte = b19
Symbol t = b20
HIGH Eink_CS1
HIGH Eink_DC
HIGH GT_CS2
hspisetup spimode00e, spimedium
sertxd ("hspisetup done",cr,lf)
Gosub initEink
sertxd ("init done",cr,lf)
Gosub clearScreen
sertxd ("clear done",cr,lf)
Ys = 170
Xs = 2 : Ys = 179
for t = 0 to 13
lookup t, ( "PICAXE RULES !" ),Char
Ys = Ys - 8 : Gosub displayChar
next
sertxd ("line 1 done",cr,lf)
Xs = 7 : Ys = 179
for t = 0 to 20
lookup t, ( "Eink from Seeedstudio" ),Char
Ys = Ys - 8 : Gosub displayChar
next
sertxd ("line 2 done",cr,lf)
Xs = 12 : Ys = 179
for t = 0 to 18
lookup t, ( "Cheers, from Buzby." ),Char
Ys = Ys - 8 : Gosub displayChar
next
sertxd ("line 3 done",cr,lf)
Gosub refreshScreen
sertxd ("refreshScreen done",cr,lf)
sertxd ( "Done",cr,lf )
End
' =================================================================
writeComm:
LOW Eink_DC
LOW Eink_CS1
hspiout ( CommandByte )
HIGH Eink_CS1
return
' =================================================================
writeData:
HIGH Eink_DC
LOW Eink_CS1
hspiout ( DataByte )
HIGH Eink_CS1
return
' =================================================================
clearScreen:
CommandByte = 0x24 : Gosub writeComm
HIGH Eink_DC
LOW Eink_CS1
For i = 0 to 3095
hspiout (0xFF)
Next i
HIGH Eink_CS1
Pause 1000
return
' =================================================================
initEink:
CommandByte = 0x10 : Gosub writeComm ' exit deep sleep mode
DataByte = 0x00 : Gosub writeData
CommandByte = 0x11 : Gosub writeComm ' data enter mode
DataByte = 0x03 : Gosub writeData
CommandByte = 0x44 : Gosub writeComm ' set RAM x address start/end, in page 36
DataByte = 0x00 : Gosub writeData ' RAM x address start at 00h;
DataByte = 0x11 : Gosub writeData ' RAM x address end at 11h(17)->72: [because 1F(31)->128 and 12(18)->76]
CommandByte = 0x45 : Gosub writeComm ' set RAM y address start/end, in page 37
DataByte = 0x00 : Gosub writeData ' RAM y address start at 00h;
DataByte = 0xAB : Gosub writeData ' RAM y address start at ABh(171)->172: [because B3(179)->180]
CommandByte = 0x4E : Gosub writeComm ' set RAM x address count to 0
DataByte = 0x00 : Gosub writeData
CommandByte = 0x4F : Gosub writeComm ' set RAM y address count to 0
DataByte = 0x00 : Gosub writeData
CommandByte = 0xF0 : Gosub writeComm ' booster feedback used, in page 37
DataByte = 0x1F : Gosub writeData
CommandByte = 0x22 : Gosub writeComm ' display updata sequence option ,in page 33
Databyte = 0xC0 : Gosub writeData ' enable sequence: clk -> CP
Gosub configureLUTRegister
CommandByte = 0x2C : Gosub writeComm ' vcom
DataByte = 0xA0 : Gosub writeData
CommandByte = 0x3C : Gosub writeComm ' board
DataByte = 0x63 : Gosub writeData
CommandByte = 0x22 : Gosub writeComm ' display updata sequence option ,in page 33
DataByte = 0xC4 : Gosub writeData ' enable sequence: clk -> CP -> LUT -> initial display -> pattern display
return
' =================================================================
configureLUTRegister:
CommandByte = 0x32 : Gosub writeComm ' write data to LUT register
HIGH Eink_DC
LOW Eink_CS1
hspiout ( 0x00,0x00,0x00,0x55,0x00,0x00,0x55,0x55,0x00,0x55, _
0x55,0x55,0xAA,0xAA,0xAA,0xAA,0x15,0x15,0x15,0x15, _
0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01,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, _
0x22,0xFB,0x22,0x1B,0x00,0x00,0x00,0x00,0x00,0x00 )
HIGH Eink_CS1
return
' =================================================================
refreshScreen:
CommandByte = 0x20 : Gosub writeComm
Gosub closeBump
Pause 2000
return
' =================================================================
closeBump:
CommandByte = 0x22 : Gosub writeComm
DataByte = 0x03 : Gosub writeData
CommandByte = 0x20 : Gosub writeComm
return
' =================================================================
#rem
Xs --> X start address 0~17
Xe --> X end address 0~17
Ys --> Y start address 0~171
Ye --> Y end address 0~171
#endrem
setPositionXY:
LOW Eink_CS1
LOW Eink_DC
hspiout ( 0x44 )' set RAM x address start/end command
HIGH Eink_DC
hspiout ( Xs , Xe )
LOW Eink_DC
hspiout ( 0x45 )' set RAM y address start/end command
HIGH Eink_DC
hspiout ( Ys , Ye )
LOW Eink_DC
hspiout ( 0x4E )' set RAM x address count to Xs
HIGH Eink_DC
hspiout ( Xs )
LOW Eink_DC
hspiout ( 0x4F )' set RAM y address count to Ys
HIGH Eink_DC
hspiout ( Ys )
HIGH Eink_CS1
return
' =================================================================
#rem
display character in the Eink screen:
x:the X start address,X value can be 0 to 14;
y:the Y start address, Y vlue can be 171 to 7;
the charater diplay erea is from x to x+3 in X position and from y to y-7 in Y position
unicode_char:the character machine code
*/
void E_ink::displayChar(INT8U x,INT8U y,INT16U unicode_Char)
{
INT16U i;
getCharMatrixData(unicode_Char);
converCharMatrixData();
setPositionXY(x,x+3,y,y-7);
writeComm(0x11); /*data enter mode command */
writeData(0x05); /*set Y-mode:X address is increment and y address decrement */
writeComm(0x24);
for(i=0;i<32;i++)
{
writeData(matrixdata_conver[i]);
}
}
#endrem
displayChar:
' Make address of character in ROM
Char16 = Char - 0x20 * 16
' Reset scratchpad pointer
ptr = 0
' Get 16 bytes character data from ROM into scratchpad
LOW GT_CS2
hspiout (0x03,0,Char16Hi,Char16Lo)
hspiin (@ptrinc, @ptrinc, @ptrinc, @ptrinc,@ptrinc, @ptrinc, @ptrinc, @ptrinc, _
@ptrinc, @ptrinc, @ptrinc, @ptrinc,@ptrinc, @ptrinc, @ptrinc, @ptrinc )
HIGH GT_CS2
#rem
sertxd ("chardata",cr,lf)
ptr = 0
sertxd (Char, " ", #@ptrinc,",", #@ptrinc,",", #@ptrinc,",", #@ptrinc,",",#@ptrinc,",", #@ptrinc,",", #@ptrinc,",", #@ptrinc,",", _
#@ptrinc,",", #@ptrinc,",", #@ptrinc,",", #@ptrinc,",",#@ptrinc,",", #@ptrinc,",", #@ptrinc,",", #@ptrinc, cr, lf )
for ptr = 0 to 15
b0 = @ptr
sertxd (#bit7,#bit6,#bit5,#bit4,#bit3,#bit2,#bit1,#bit0,cr,lf)
next
#endrem
' Convert data bytes into twos
for i = 0 to 7
ptr = i ' Get single byte
b0 = @ptr
' original in b0, result in w0 - Thanks to hippy !
b1 = b0 | $0F : Read b1, b1
b0 = b0 | $F0 : Read b0, b0
ptr = i + 16 : @ptr = inv b0
ptr = i + 24 : @ptr = inv b1
next i
for i = 8 to 15
ptr = i ' Get single byte
b0 = @ptr
' original in b0, result in w0 - Thanks to hippy !
b1 = b0 | $0F : Read b1, b1
b0 = b0 | $F0 : Read b0, b0
ptr = i + 24 : @ptr = inv b0
ptr = i + 32 : @ptr = inv b1
next i
Xe = Xs + 3
Ye = Ys - 7
Gosub setPositionXY
CommandByte = 0x11 : Gosub writeComm ' /*data enter mode command */
DataByte = 0x05 : Gosub writeData ' /*set Y-mode:X address is increment and y address decrement */
CommandByte = 0x24 : Gosub writeComm
HIGH Eink_DC
LOW Eink_CS1
for ptr = 16 to 47
hspiout (@ptr)
next
HIGH Eink_CS1
return
There are really only two active chips on the Shield, a character ROM and the E-ink driver.
The code reads the ROM to get the the bit patterns, re-arranges the bits, then sends to the E-ink driver.
I couldn't find any manufacturer's name on the E-ink display itself, unless the manufacturer is called 'Good Display' !. ( These are the only words on the back, and a part number GDE021A1 ) ( EDIT : I just Googled the part number again, and this time it found the manufacturer. It is Good Display ! )
My thoughts are that this is perfect for the right application, I just need to find that application.
PervasiveDisplays 1.44" e-Paper display is 13.87 USD (8.8 USD for 100pc.) 128 x 96 Pixels, 111dpi, Outer Dimension in mm: 40.512 x 28.80 x 1.00. http://www.pervasivedisplays.com/products/144
But: it is not as tiny as 10x10mm, and quite sure it is not as quick as required. But at least the prices are significant lower now.