DM: fix for new screen and latest cirpy
This commit is contained in:
parent
445767efb8
commit
284c65bfbe
10 changed files with 292 additions and 350 deletions
0
Adafruit_EPD/__init__.py
Normal file
0
Adafruit_EPD/__init__.py
Normal file
|
|
@ -1,17 +1,21 @@
|
||||||
import time
|
import time
|
||||||
from Adafruit_MCP_SRAM import *
|
from Adafruit_EPD import mcp_sram
|
||||||
import digitalio
|
import digitalio
|
||||||
import busio
|
import busio
|
||||||
from board import *
|
from board import *
|
||||||
|
|
||||||
from adafruit_bus_device.spi_device import SPIDevice
|
|
||||||
|
|
||||||
class Adafruit_EPD(object):
|
class Adafruit_EPD(object):
|
||||||
"""Base class for EPD displays
|
"""Base class for EPD displays
|
||||||
"""
|
"""
|
||||||
|
BLACK = 0
|
||||||
|
WHITE = 1
|
||||||
|
INVERSE = 2
|
||||||
|
RED = 3
|
||||||
|
DARK = 4
|
||||||
|
LIGHT = 5
|
||||||
|
|
||||||
def __init__(self, width, height, rst, dc, busy, srcs=None, cs=None,
|
def __init__(self, width, height, rst, dc, busy, srcs, cs,
|
||||||
spi=None):
|
spi):
|
||||||
self.width = width
|
self.width = width
|
||||||
self.height = height
|
self.height = height
|
||||||
|
|
||||||
|
|
@ -33,7 +37,7 @@ class Adafruit_EPD(object):
|
||||||
|
|
||||||
self.spi_device = spi
|
self.spi_device = spi
|
||||||
|
|
||||||
self.sram = Adafruit_MCP_SRAM(cs=srcs, spi=spi)
|
self.sram = mcp_sram.Adafruit_MCP_SRAM(srcs, spi)
|
||||||
|
|
||||||
def begin(self, reset=True):
|
def begin(self, reset=True):
|
||||||
self._cs.value = True
|
self._cs.value = True
|
||||||
|
|
@ -50,8 +54,11 @@ class Adafruit_EPD(object):
|
||||||
self._cs.value = True
|
self._cs.value = True
|
||||||
self._dc.value = False
|
self._dc.value = False
|
||||||
self._cs.value = False
|
self._cs.value = False
|
||||||
with self.spi_device as spi:
|
outbuf = bytearray(1)
|
||||||
spi.write(bytearray([c]))
|
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self.spi_device.write_readinto(bytearray([c]), outbuf)
|
||||||
|
|
||||||
if data is not None:
|
if data is not None:
|
||||||
self.data(data)
|
self.data(data)
|
||||||
|
|
@ -59,9 +66,12 @@ class Adafruit_EPD(object):
|
||||||
elif end:
|
elif end:
|
||||||
self._cs.value = True
|
self._cs.value = True
|
||||||
|
|
||||||
|
self.spi_device.unlock()
|
||||||
|
return outbuf[0]
|
||||||
|
|
||||||
def data(self, d):
|
def data(self, d):
|
||||||
"""Send data to display."""
|
"""Send data to display."""
|
||||||
self._dc.value = True
|
self._dc.value = True
|
||||||
with self.spi_device as spi:
|
self.spi_device.write(d)
|
||||||
spi.write(d)
|
|
||||||
self._cs.value = True
|
self._cs.value = True
|
||||||
|
self.spi_device.unlock()
|
||||||
159
Adafruit_EPD/il0373.py
Normal file
159
Adafruit_EPD/il0373.py
Normal file
|
|
@ -0,0 +1,159 @@
|
||||||
|
from Adafruit_EPD.epd import Adafruit_EPD
|
||||||
|
from Adafruit_EPD.mcp_sram import Adafruit_MCP_SRAM
|
||||||
|
from micropython import const
|
||||||
|
import time
|
||||||
|
|
||||||
|
IL0373_PANEL_SETTING = const(0x00)
|
||||||
|
IL0373_POWER_SETTING = const(0x01)
|
||||||
|
IL0373_POWER_OFF = const(0x02)
|
||||||
|
IL0373_POWER_OFF_SEQUENCE = const(0x03)
|
||||||
|
IL0373_POWER_ON = const(0x04)
|
||||||
|
IL0373_POWER_ON_MEASURE = const(0x05)
|
||||||
|
IL0373_BOOSTER_SOFT_START = const(0x06)
|
||||||
|
IL0373_DEEP_SLEEP = const(0x07)
|
||||||
|
IL0373_DTM1 = const(0x10)
|
||||||
|
IL0373_DATA_STOP = const(0x11)
|
||||||
|
IL0373_DISPLAY_REFRESH = const(0x12)
|
||||||
|
IL0373_DTM2 = const(0x13)
|
||||||
|
IL0373_PDTM1 = const(0x14)
|
||||||
|
IL0373_PDTM2 = const(0x15)
|
||||||
|
IL0373_PDRF = const(0x16)
|
||||||
|
IL0373_LUT1 = const(0x20)
|
||||||
|
IL0373_LUTWW = const(0x21)
|
||||||
|
IL0373_LUTBW = const(0x22)
|
||||||
|
IL0373_LUTWB = const(0x23)
|
||||||
|
IL0373_LUTBB = const(0x24)
|
||||||
|
IL0373_PLL = const(0x30)
|
||||||
|
IL0373_CDI = const(0x50)
|
||||||
|
IL0373_RESOLUTION = const(0x61)
|
||||||
|
IL0373_VCM_DC_SETTING = const(0x82)
|
||||||
|
|
||||||
|
class Adafruit_IL0373(Adafruit_EPD):
|
||||||
|
def __init__(self, width, height, rst, dc, busy, srcs, cs, spi):
|
||||||
|
super().__init__(width, height, rst, dc, busy, srcs, cs, spi)
|
||||||
|
|
||||||
|
self.bw_bufsize = int(width * height / 8)
|
||||||
|
self.red_bufsize = int(width * height / 8)
|
||||||
|
|
||||||
|
self.begin()
|
||||||
|
|
||||||
|
def begin(self, reset=True):
|
||||||
|
super(Adafruit_IL0373, self).begin(reset)
|
||||||
|
|
||||||
|
while self._busy.value == False:
|
||||||
|
pass
|
||||||
|
|
||||||
|
self.command(IL0373_POWER_SETTING, bytearray([0x03, 0x00, 0x2b, 0x2b, 0x09]))
|
||||||
|
self.command(IL0373_BOOSTER_SOFT_START, bytearray([0x17, 0x17, 0x17]))
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
self.command(IL0373_DISPLAY_REFRESH)
|
||||||
|
|
||||||
|
while self._busy.value == False:
|
||||||
|
pass
|
||||||
|
|
||||||
|
self.command(IL0373_CDI, bytearray([0x17]))
|
||||||
|
self.command(IL0373_VCM_DC_SETTING, bytearray([0x00]))
|
||||||
|
self.command(IL0373_POWER_OFF)
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
def power_up(self):
|
||||||
|
self.command(IL0373_POWER_ON)
|
||||||
|
|
||||||
|
while self._busy.value == False:
|
||||||
|
pass
|
||||||
|
|
||||||
|
time.sleep(.2)
|
||||||
|
|
||||||
|
self.command(IL0373_PANEL_SETTING, bytearray([0xCF]))
|
||||||
|
self.command(IL0373_CDI, bytearray([0x37]))
|
||||||
|
self.command(IL0373_PLL, bytearray([0x29]))
|
||||||
|
b1 = self.height & 0xFF
|
||||||
|
b2 = (self.height >> 8) & 0xFF
|
||||||
|
b3 = self.width & 0xFF
|
||||||
|
b4 = (self.width >> 8) & 0xFF
|
||||||
|
self.command(IL0373_RESOLUTION, bytearray([b1, b2, b3, b4]))
|
||||||
|
self.command(IL0373_VCM_DC_SETTING, bytearray([0x0A]))
|
||||||
|
|
||||||
|
|
||||||
|
def display(self):
|
||||||
|
self.power_up()
|
||||||
|
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self.sram.cs.value = False
|
||||||
|
#send read command
|
||||||
|
self.spi_device.write(bytearray([Adafruit_MCP_SRAM.SRAM_READ]))
|
||||||
|
#send start address
|
||||||
|
self.spi_device.write(bytearray([0x00, 0x00]))
|
||||||
|
self.spi_device.unlock()
|
||||||
|
|
||||||
|
#first data byte from SRAM will be transfered in at the same time as the EPD command is transferred out
|
||||||
|
c = self.command(IL0373_DTM1, end=False)
|
||||||
|
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self._dc.value = True
|
||||||
|
xfer = bytearray([c])
|
||||||
|
outbuf = bytearray(1)
|
||||||
|
for i in range(self.bw_bufsize):
|
||||||
|
outbuf[0] = xfer[0]
|
||||||
|
self.spi_device.write_readinto(outbuf, xfer)
|
||||||
|
self._cs.value = True
|
||||||
|
self.sram.cs.value = True
|
||||||
|
|
||||||
|
time.sleep(.002)
|
||||||
|
|
||||||
|
self.sram.cs.value = False
|
||||||
|
#send read command
|
||||||
|
self.spi_device.write(bytearray([Adafruit_MCP_SRAM.SRAM_READ]))
|
||||||
|
#send start address
|
||||||
|
self.spi_device.write(bytearray([(self.bw_bufsize >> 8), (self.bw_bufsize & 0xFF)]))
|
||||||
|
self.spi_device.unlock()
|
||||||
|
|
||||||
|
#first data byte from SRAM will be transfered in at the same time as the EPD command is transferred out
|
||||||
|
c = self.command(IL0373_DTM2, end=False)
|
||||||
|
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self._dc.value = True
|
||||||
|
xfer = bytearray([c])
|
||||||
|
outbuf = bytearray(1)
|
||||||
|
for i in range(self.bw_bufsize):
|
||||||
|
outbuf[0] = xfer[0]
|
||||||
|
self.spi_device.write_readinto(outbuf, xfer)
|
||||||
|
self._cs.value = True
|
||||||
|
self.sram.cs.value = True
|
||||||
|
self.spi_device.unlock()
|
||||||
|
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def draw_pixel(self, x, y, color):
|
||||||
|
if (x < 0) or (x >= self.width) or (y < 0) or (y >= self.height):
|
||||||
|
return
|
||||||
|
|
||||||
|
if x == 0:
|
||||||
|
x = 1
|
||||||
|
|
||||||
|
addr = int(((self.width - x) * self.height + y)/8)
|
||||||
|
if color == Adafruit_EPD.RED:
|
||||||
|
addr = addr + self.bw_bufsize
|
||||||
|
c = self.sram.read8(addr)
|
||||||
|
|
||||||
|
if color == Adafruit_EPD.WHITE:
|
||||||
|
c = c | (1 << (7 - y%8))
|
||||||
|
elif color == Adafruit_EPD.RED or color == Adafruit_EPD.BLACK:
|
||||||
|
c = c & ~(1 << (7 - y%8))
|
||||||
|
elif color == Adafruit_EPD.INVERSE:
|
||||||
|
c = c ^ (1 << (7 - y%8))
|
||||||
|
|
||||||
|
self.sram.write8(addr, c)
|
||||||
|
|
||||||
|
def clear_buffer(self):
|
||||||
|
self.sram.erase(0x00, self.bw_bufsize, 0xFF)
|
||||||
|
self.sram.erase(self.bw_bufsize, self.red_bufsize, 0xFF)
|
||||||
|
|
||||||
|
def clear_display(self):
|
||||||
|
self.clear_buffer()
|
||||||
|
self.display()
|
||||||
|
|
||||||
77
Adafruit_EPD/mcp_sram.py
Normal file
77
Adafruit_EPD/mcp_sram.py
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import time
|
||||||
|
from micropython import const
|
||||||
|
import digitalio
|
||||||
|
|
||||||
|
from adafruit_bus_device.spi_device import SPIDevice
|
||||||
|
import busio
|
||||||
|
from board import *
|
||||||
|
|
||||||
|
SRAM_SEQUENTIAL_MODE = const(1 << 6)
|
||||||
|
|
||||||
|
class Adafruit_MCP_SRAM:
|
||||||
|
|
||||||
|
SRAM_READ = 0x03
|
||||||
|
SRAM_WRITE = 0x02
|
||||||
|
SRAM_RDSR = 0x05
|
||||||
|
SRAM_WRSR = 0x01
|
||||||
|
|
||||||
|
def __init__(self, cs, spi):
|
||||||
|
# Handle hardware SPI
|
||||||
|
self.spi_device = spi
|
||||||
|
self.cs = cs
|
||||||
|
|
||||||
|
self.cs.direction = digitalio.Direction.OUTPUT
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self.cs.value = False
|
||||||
|
self.spi_device.write(bytearray([Adafruit_MCP_SRAM.SRAM_WRSR, 0x43]))
|
||||||
|
self.cs.value = True
|
||||||
|
self.spi_device.unlock()
|
||||||
|
|
||||||
|
def write(self, addr, buf, reg=SRAM_WRITE):
|
||||||
|
c = bytearray([reg, (addr >> 8) & 0xFF, addr & 0xFF] + buf)
|
||||||
|
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self.cs.value = False
|
||||||
|
self.spi_device.write(c)
|
||||||
|
self.cs.value = True
|
||||||
|
self.spi_device.unlock()
|
||||||
|
|
||||||
|
def read(self, addr, length, reg=SRAM_READ):
|
||||||
|
c = bytearray([reg, (addr >> 8) & 0xFF, addr & 0xFF])
|
||||||
|
|
||||||
|
buf = bytearray(length)
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self.cs.value = False
|
||||||
|
self.spi_device.write(c)
|
||||||
|
self.spi_device.readinto(buf)
|
||||||
|
self.cs.value = True
|
||||||
|
self.spi_device.unlock()
|
||||||
|
return buf
|
||||||
|
|
||||||
|
def read8(self, addr, reg=SRAM_READ):
|
||||||
|
return self.read(addr, 1, reg)[0]
|
||||||
|
|
||||||
|
def read16(self, addr, reg=SRAM_READ):
|
||||||
|
buf = self.read(addr, 2, reg)
|
||||||
|
return (buf[0] << 8 | buf[1])
|
||||||
|
|
||||||
|
def write8(self, addr, value, reg=SRAM_WRITE):
|
||||||
|
self.write(addr, [value], reg)
|
||||||
|
|
||||||
|
def write16(self, addr, value, reg=SRAM_WRITE):
|
||||||
|
self.write(addr, [value >> 8, value], reg)
|
||||||
|
|
||||||
|
def erase(self, addr, length, value):
|
||||||
|
c = bytearray([Adafruit_MCP_SRAM.SRAM_WRITE, (addr >> 8) & 0xFF, addr & 0xFF])
|
||||||
|
|
||||||
|
while not self.spi_device.try_lock():
|
||||||
|
pass
|
||||||
|
self.cs.value = False
|
||||||
|
self.spi_device.write(c)
|
||||||
|
for x in range(length):
|
||||||
|
self.spi_device.write(bytearray([value]))
|
||||||
|
self.cs.value = True
|
||||||
|
self.spi_device.unlock()
|
||||||
|
|
@ -1,129 +0,0 @@
|
||||||
from Adafruit_EPD import *
|
|
||||||
from micropython import const
|
|
||||||
|
|
||||||
IL0376F_PANEL_SETTING = const(0x00)
|
|
||||||
IL0376F_POWER_SETTING = const(0x01)
|
|
||||||
IL0376F_POWER_OFF = const(0x02)
|
|
||||||
IL0376F_POWER_OFF_SEQUENCE = const(0x03)
|
|
||||||
IL0376F_POWER_ON = const(0x04)
|
|
||||||
IL0376F_POWER_ON_MEASURE = const(0x05)
|
|
||||||
IL0376F_BOOSTER_SOFT_START = const(0x06)
|
|
||||||
IL0376F_DTM1 = const(0x10)
|
|
||||||
IL0376F_DATA_STOP = const(0x11)
|
|
||||||
IL0376F_DISPLAY_REFRESH = const(0x12)
|
|
||||||
IL0376F_DTM2 = const(0x13)
|
|
||||||
IL0376F_VCOM1_LUT = const(0x20)
|
|
||||||
IL0376F_WHITE_LUT = const(0x21)
|
|
||||||
IL0376F_BLACK_LUT = const(0x22)
|
|
||||||
IL0376F_GRAY1_LUT = const(0x23)
|
|
||||||
IL0376F_GRAY2_LUT = const(0x24)
|
|
||||||
IL0376F_VCOM2_LUT = const(0x25)
|
|
||||||
IL0376F_RED0_LUT = const(0x26)
|
|
||||||
IL0376F_RED1_LUT = const(0x27)
|
|
||||||
IL0376F_PLL = const(0x30)
|
|
||||||
IL0376F_CDI = const(0x50)
|
|
||||||
IL0376F_RESOLUTION = const(0x61)
|
|
||||||
IL0376F_VCM_DC_SETTING = const(0x82)
|
|
||||||
|
|
||||||
class Adafruit_IL0376F_base(Adafruit_EPD):
|
|
||||||
|
|
||||||
def __init__(self, width, height, rst, dc, busy, srcs=None, cs=None, spi=None):
|
|
||||||
|
|
||||||
super(Adafruit_IL0376F_base, self).__init__(width, height, rst, dc, busy, srcs, cs, spi)
|
|
||||||
|
|
||||||
def begin(self, reset=True):
|
|
||||||
super(Adafruit_IL0376F_base, self).begin(reset)
|
|
||||||
|
|
||||||
while self._busy.value == True:
|
|
||||||
pass
|
|
||||||
|
|
||||||
self.command(IL0376F_POWER_SETTING, bytearray([0x07, 0x00, 0x0D, 0x00]))
|
|
||||||
self.command(IL0376F_BOOSTER_SOFT_START, bytearray([0x07, 0x07, 0x07]))
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
self.command(IL0376F_DISPLAY_REFRESH)
|
|
||||||
|
|
||||||
while self._busy.value == True:
|
|
||||||
pass
|
|
||||||
|
|
||||||
time.sleep(10)
|
|
||||||
|
|
||||||
self.command(IL0376F_CDI, bytearray([0x17]))
|
|
||||||
self.command(IL0376F_VCM_DC_SETTING, bytearray([0x00]))
|
|
||||||
self.command(IL0376F_POWER_SETTING, bytearray([0x02, 0x00, 0x00, 0x00]))
|
|
||||||
self.command(IL0376F_POWER_OFF)
|
|
||||||
|
|
||||||
def power_up(self):
|
|
||||||
self.command(IL0376F_POWER_ON)
|
|
||||||
while self._busy.value == True:
|
|
||||||
pass
|
|
||||||
|
|
||||||
time.sleep(.2)
|
|
||||||
|
|
||||||
self.command(IL0376F_PANEL_SETTING, bytearray([0xCF]))
|
|
||||||
self.command(IL0376F_CDI, bytearray([0x37]))
|
|
||||||
self.command(IL0376F_PLL, bytearray([0x39]))
|
|
||||||
self.command(IL0376F_VCM_DC_SETTING, bytearray([0x0E]))
|
|
||||||
|
|
||||||
def display(self):
|
|
||||||
self.power_up()
|
|
||||||
|
|
||||||
#TODO: we need to do duplex transfers.
|
|
||||||
c = 0x00
|
|
||||||
|
|
||||||
with self.spi_device as spi:
|
|
||||||
spi.write(bytearray(SRAM_READ, 0x00, 0x00)) #should be duplex
|
|
||||||
|
|
||||||
self.command(IL0376F_DTM1, end=False)
|
|
||||||
self._dc.value = True
|
|
||||||
with self.spi_device as spi:
|
|
||||||
spi.write(bytearray(SRAM_READ, 0x00, 0x00))
|
|
||||||
|
|
||||||
for i in range(int(self.width*self.height / 4)):
|
|
||||||
c = spi.write(bytearray([c])) #should be duplex
|
|
||||||
|
|
||||||
self._cs.value = True
|
|
||||||
|
|
||||||
self.command(IL0376F_DTM2, end=False)
|
|
||||||
self._dc.value = True
|
|
||||||
with self.spi_device as spi:
|
|
||||||
for i in range(5000):
|
|
||||||
spi.write(bytearray([0xff]))#TODO actual data
|
|
||||||
self._cs.value = True
|
|
||||||
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
"""
|
|
||||||
def image(self, image):
|
|
||||||
Set buffer to value of Python Imaging Library image. The image should
|
|
||||||
be in RGB mode and a size equal to the display size.
|
|
||||||
|
|
||||||
if image.mode != 'RGB':
|
|
||||||
raise ValueError('Image must be in mode RGB.')
|
|
||||||
imwidth, imheight = image.size
|
|
||||||
if imwidth != self.width or imheight != self.height:
|
|
||||||
raise ValueError('Image must be same dimensions as display ({0}x{1}).' \
|
|
||||||
.format(self.width, self.height))
|
|
||||||
# Grab all the pixels from the image, faster than getpixel.
|
|
||||||
pix = image.load()
|
|
||||||
|
|
||||||
for y in xrange(image.size[0]):
|
|
||||||
for x in xrange(image.size[1]):
|
|
||||||
if x == 0:
|
|
||||||
x = 1
|
|
||||||
p = pix[x, y]
|
|
||||||
if p == (0xFF, 0, 0):
|
|
||||||
#RED
|
|
||||||
addr = ( (self.width - x) * self.height + y) >> 3
|
|
||||||
self.red_buffer[addr] &= ~(1 << (7 - (y%8)))
|
|
||||||
else:
|
|
||||||
#GS
|
|
||||||
bits = (6 - y%4 * 2)
|
|
||||||
addr = ( (self.width - x) * self.height + y) >> 2
|
|
||||||
self.bw_buffer[addr] &= ~(0x3 << bits)
|
|
||||||
if p == (0xFF, 0xFF, 0xFF): #WHITE
|
|
||||||
self.bw_buffer[addr] |= (0x3 << bits)
|
|
||||||
|
|
||||||
elif p == (0x7F, 0x7F, 0x7F): #GRAY
|
|
||||||
self.bw_buffer[addr] |= (0x2 << bits)
|
|
||||||
"""
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
from Adafruit_IL0376F import *
|
|
||||||
|
|
||||||
lut_vcom0 = bytearray([ 0x0E ,0x14 ,0x01 ,0x0A ,0x06 ,0x04 ,0x0A ,0x0A ,0x0F ,0x03 ,0x03 ,0x0C ,0x06 ,0x0A ,0x00 ])
|
|
||||||
lut_w = bytearray([ 0x0E ,0x14 ,0x01 ,0x0A ,0x46 ,0x04 ,0x8A ,0x4A ,0x0F ,0x83 ,0x43 ,0x0C ,0x86 ,0x0A ,0x04 ])
|
|
||||||
lut_b = bytearray([ 0x0E ,0x14 ,0x01 ,0x8A ,0x06 ,0x04 ,0x8A ,0x4A ,0x0F ,0x83 ,0x43 ,0x0C ,0x06 ,0x4A ,0x04 ])
|
|
||||||
lut_g1 = bytearray([ 0x8E ,0x94 ,0x01 ,0x8A ,0x06 ,0x04 ,0x8A ,0x4A ,0x0F ,0x83 ,0x43 ,0x0C ,0x06 ,0x0A ,0x04 ])
|
|
||||||
lut_g2 = bytearray([ 0x8E ,0x94 ,0x01 ,0x8A ,0x06 ,0x04 ,0x8A ,0x4A ,0x0F ,0x83 ,0x43 ,0x0C ,0x06 ,0x0A ,0x04 ])
|
|
||||||
lut_vcom1 = bytearray([ 0x03 ,0x1D ,0x01 ,0x01 ,0x08 ,0x23 ,0x37 ,0x37 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ])
|
|
||||||
lut_red0 = bytearray([ 0x83 ,0x5D ,0x01 ,0x81 ,0x48 ,0x23 ,0x77 ,0x77 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ])
|
|
||||||
lut_red1 = bytearray([ 0x03 ,0x1D ,0x01 ,0x01 ,0x08 ,0x23 ,0x37 ,0x37 ,0x01 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ,0x00 ])
|
|
||||||
|
|
||||||
class Adafruit_IL0376F_200_200(Adafruit_IL0376F_base):
|
|
||||||
|
|
||||||
def __init__(self, rst, dc, busy, srcs=None, cs=None, spi=None):
|
|
||||||
|
|
||||||
super(Adafruit_IL0376F_200_200, self).__init__(200, 200, rst, dc, busy, srcs, cs, spi)
|
|
||||||
|
|
||||||
def power_up(self):
|
|
||||||
super(Adafruit_IL0376F_200_200, self).power_up()
|
|
||||||
|
|
||||||
self.command(IL0376F_RESOLUTION, bytearray([0xC8, 0x00, 0xC8]))
|
|
||||||
self.write_lut()
|
|
||||||
|
|
||||||
def write_lut(self):
|
|
||||||
self.command(IL0376F_VCOM1_LUT, lut_vcom0)
|
|
||||||
self.command(IL0376F_WHITE_LUT, lut_w)
|
|
||||||
self.command(IL0376F_BLACK_LUT, lut_b)
|
|
||||||
self.command(IL0376F_GRAY1_LUT, lut_g1)
|
|
||||||
self.command(IL0376F_GRAY2_LUT, lut_g2)
|
|
||||||
self.command(IL0376F_VCOM2_LUT, lut_vcom1)
|
|
||||||
self.command(IL0376F_RED0_LUT, lut_red0)
|
|
||||||
self.command(IL0376F_RED1_LUT, lut_red1)
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
from Adafruit_EPD import *
|
|
||||||
from micropython import const
|
|
||||||
|
|
||||||
IL91874_PANEL_SETTING = const(0x00)
|
|
||||||
IL91874_POWER_SETTING = const(0x01)
|
|
||||||
IL91874_POWER_OFF = const(0x02)
|
|
||||||
IL91874_POWER_OFF_SEQUENCE = const(0x03)
|
|
||||||
IL91874_POWER_ON = const(0x04)
|
|
||||||
IL91874_POWER_ON_MEASURE = const(0x05)
|
|
||||||
IL91874_BOOSTER_SOFT_START = const(0x06)
|
|
||||||
IL91874_DEEP_SLEEP = const(0x07)
|
|
||||||
IL91874_DTM1 = const(0x10)
|
|
||||||
IL91874_DATA_STOP = const(0x11)
|
|
||||||
IL91874_DISPLAY_REFRESH = const(0x12)
|
|
||||||
IL91874_DTM2 = const(0x13)
|
|
||||||
IL91874_PDTM1 = const(0x14)
|
|
||||||
IL91874_PDTM2 = const(0x15)
|
|
||||||
IL91874_PDRF = const(0x16)
|
|
||||||
IL91874_LUT1 = const(0x20)
|
|
||||||
IL91874_LUTWW = const(0x21)
|
|
||||||
IL91874_LUTBW = const(0x22)
|
|
||||||
IL91874_LUTWB = const(0x23)
|
|
||||||
IL91874_LUTBB = const(0x24)
|
|
||||||
IL91874_PLL = const(0x30)
|
|
||||||
IL91874_CDI = const(0x50)
|
|
||||||
IL91874_RESOLUTION = const(0x61)
|
|
||||||
IL91874_VCM_DC_SETTING = const(0x82)
|
|
||||||
|
|
||||||
class Adafruit_IL91874_base(Adafruit_EPD):
|
|
||||||
|
|
||||||
def __init__(self, width, height, rst, dc, busy, srcs=None, cs=None, spi=None):
|
|
||||||
|
|
||||||
super(Adafruit_IL91874_base, self).__init__(width, height, rst, dc, busy, srcs, cs, spi)
|
|
||||||
|
|
||||||
def begin(self, reset=True):
|
|
||||||
super(Adafruit_IL91874_base, self).begin(reset)
|
|
||||||
|
|
||||||
def update(self):
|
|
||||||
self.command(IL91874_DISPLAY_REFRESH)
|
|
||||||
|
|
||||||
while self._busy.value == True:
|
|
||||||
pass
|
|
||||||
|
|
||||||
time.sleep(10)
|
|
||||||
|
|
||||||
self.command(IL91874_CDI, bytearray([0x17]))
|
|
||||||
self.command(IL91874_VCM_DC_SETTING, bytearray([0x00]))
|
|
||||||
self.command(IL91874_POWER_SETTING, bytearray([0x02, 0x00, 0x00, 0x00]))
|
|
||||||
self.command(IL91874_POWER_OFF)
|
|
||||||
|
|
||||||
time.sleep(10)
|
|
||||||
|
|
||||||
def power_up(self):
|
|
||||||
self.command(IL91874_BOOSTER_SOFT_START, bytearray([0x07, 0x07, 0x07]))
|
|
||||||
self.command(IL91874_POWER_SETTING, bytearray([0x07, 0x00, 0x0A, 0x00]))
|
|
||||||
self.command(IL91874_POWER_ON)
|
|
||||||
|
|
||||||
while self._busy.value == True:
|
|
||||||
pass
|
|
||||||
|
|
||||||
time.sleep(.2)
|
|
||||||
|
|
||||||
self.command(IL91874_PANEL_SETTING, bytearray([0xCF]))
|
|
||||||
self.command(IL91874_CDI, bytearray([0x37]))
|
|
||||||
self.command(IL91874_PLL, bytearray([0x29]))
|
|
||||||
self.command(IL91874_VCM_DC_SETTING, bytearray([0x0A]))
|
|
||||||
|
|
||||||
def display(self):
|
|
||||||
self.power_up()
|
|
||||||
|
|
||||||
#TODO: write data when we get duplex transfer support
|
|
||||||
|
|
||||||
self.update()
|
|
||||||
|
|
||||||
"""
|
|
||||||
def image(self, image):
|
|
||||||
'''Set buffer to value of Python Imaging Library image. The image should
|
|
||||||
be in RGB mode and a size equal to the display size.
|
|
||||||
'''
|
|
||||||
if image.mode != 'RGB':
|
|
||||||
raise ValueError('Image must be in mode RGB.')
|
|
||||||
imwidth, imheight = image.size
|
|
||||||
if imwidth != self.width or imheight != self.height:
|
|
||||||
raise ValueError('Image must be same dimensions as display ({0}x{1}).' \
|
|
||||||
.format(self.width, self.height))
|
|
||||||
# Grab all the pixels from the image, faster than getpixel.
|
|
||||||
pix = image.load()
|
|
||||||
|
|
||||||
for y in xrange(image.size[1]):
|
|
||||||
for x in xrange(image.size[0]):
|
|
||||||
if x == 0:
|
|
||||||
x = 1
|
|
||||||
p = pix[x, y]
|
|
||||||
addr = ( (self.width - x) * self.height + y) >> 3
|
|
||||||
if p == (0xFF, 0, 0):
|
|
||||||
#RED
|
|
||||||
self.red_buffer[addr] &= ~(1 << (7 - (y%8)))
|
|
||||||
elif p == (0, 0, 0):
|
|
||||||
#BLACK
|
|
||||||
self.bw_buffer[addr] &= ~(1 << (7 - (y%8)))
|
|
||||||
else:
|
|
||||||
#WHITE
|
|
||||||
self.bw_buffer[addr] |= (1 << (7 - (y%8)))
|
|
||||||
"""
|
|
||||||
|
|
||||||
def clear_buffer(self):
|
|
||||||
#self.bw_buffer = [0xFF]* (width*height >> 3)
|
|
||||||
#self.red_buffer = [0xFF]* (width*height >> 3)
|
|
||||||
pass
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
from Adafruit_IL91874 import *
|
|
||||||
|
|
||||||
class Adafruit_IL91874_212_104(Adafruit_IL91874_base):
|
|
||||||
def __init__(self, rst, dc, busy, srcs=None, cs=None, spi=None):
|
|
||||||
|
|
||||||
super(Adafruit_IL91874_212_104, self).__init__(212, 104, rst, dc, busy, srcs, cs, spi)
|
|
||||||
|
|
||||||
def power_up(self):
|
|
||||||
super(Adafruit_IL91874_212_104, self).power_up()
|
|
||||||
self.command(IL91874_RESOLUTION, bytearray([0x68, 0x00, 0xD4]))
|
|
||||||
time.sleep(.02)
|
|
||||||
|
|
@ -1,58 +0,0 @@
|
||||||
import time
|
|
||||||
from micropython import const
|
|
||||||
|
|
||||||
from adafruit_bus_device.spi_device import SPIDevice
|
|
||||||
import busio
|
|
||||||
from board import *
|
|
||||||
|
|
||||||
SRAM_READ = const(0x03)
|
|
||||||
SRAM_WRITE = const(0x02)
|
|
||||||
SRAM_RDSR = const(0x05)
|
|
||||||
SRAM_WRSR = const(0x01)
|
|
||||||
|
|
||||||
SRAM_SEQUENTIAL_MODE = const(1 << 6)
|
|
||||||
|
|
||||||
class Adafruit_MCP_SRAM:
|
|
||||||
|
|
||||||
def __init__(self, cs, spi):
|
|
||||||
# Handle hardware SPI
|
|
||||||
self.spi_device = spi
|
|
||||||
|
|
||||||
with self.spi_device as spi:
|
|
||||||
spi.write(bytearray([0xFF, 0xFF, 0xFF]))
|
|
||||||
|
|
||||||
def write(self, addr, buf, reg=SRAM_WRITE):
|
|
||||||
c = bytearray([reg, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF, addr & 0xFF] + bytearray(buf))
|
|
||||||
|
|
||||||
with self.spi_device as spi:
|
|
||||||
spi.write(c)
|
|
||||||
|
|
||||||
def read(self, addr, length, reg=SRAM_READ):
|
|
||||||
c = bytearray([reg, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF, addr & 0xFF] + bytearray(buf))
|
|
||||||
|
|
||||||
buf = bytearray(length)
|
|
||||||
with self.spi_device as spi:
|
|
||||||
spi.readinto(buf)
|
|
||||||
|
|
||||||
return buf
|
|
||||||
|
|
||||||
def read8(self, addr, reg=SRAM_READ):
|
|
||||||
return ord(self.read(addr, 1, reg)[0])
|
|
||||||
|
|
||||||
def read16(self, addr, reg=SRAM_READ):
|
|
||||||
buf = self.read(addr, 2, reg)
|
|
||||||
return (buf[0] << 8 | buf[1])
|
|
||||||
|
|
||||||
def write8(self, addr, value, reg=SRAM_WRITE):
|
|
||||||
self.write(addr, [value], reg)
|
|
||||||
|
|
||||||
def write16(self, addr, value, reg=SRAM_WRITE):
|
|
||||||
self.write(addr, [value >> 8, value], reg)
|
|
||||||
|
|
||||||
def erase(self, addr, length, value):
|
|
||||||
pos = 0
|
|
||||||
while pos < length:
|
|
||||||
buf = [value] * min(64, length - pos)
|
|
||||||
self.write(addr, buf)
|
|
||||||
addr = addr + len(buf)
|
|
||||||
pos = pos + len(buf)
|
|
||||||
35
examples/basic_154.py
Normal file
35
examples/basic_154.py
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
import digitalio
|
||||||
|
import busio
|
||||||
|
from adafruit_bus_device.spi_device import SPIDevice
|
||||||
|
from board import *
|
||||||
|
from Adafruit_EPD.epd import Adafruit_EPD
|
||||||
|
from Adafruit_EPD.il0373 import Adafruit_IL0373
|
||||||
|
|
||||||
|
#create the spi device and pins we will need
|
||||||
|
spi = busio.SPI(SCK, MOSI=MOSI, MISO=MISO)
|
||||||
|
ecs = digitalio.DigitalInOut(D10)
|
||||||
|
dc = digitalio.DigitalInOut(D9)
|
||||||
|
srcs = digitalio.DigitalInOut(D8)
|
||||||
|
rst = digitalio.DigitalInOut(D7)
|
||||||
|
busy = digitalio.DigitalInOut(D6)
|
||||||
|
|
||||||
|
#give them all to our driver
|
||||||
|
display = Adafruit_IL0373(152, 152, rst, dc, busy, srcs, ecs, spi)
|
||||||
|
|
||||||
|
#clear the buffer
|
||||||
|
display.clear_buffer()
|
||||||
|
|
||||||
|
#draw some lines!!
|
||||||
|
for i in range(152):
|
||||||
|
display.draw_pixel(i, i, Adafruit_EPD.RED)
|
||||||
|
display.draw_pixel(152-i, i, Adafruit_EPD.RED)
|
||||||
|
display.draw_pixel(10, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(20, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(30, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(40, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(50, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(60, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(70, i, Adafruit_EPD.BLACK)
|
||||||
|
display.draw_pixel(80, i, Adafruit_EPD.BLACK)
|
||||||
|
|
||||||
|
display.display()
|
||||||
Loading…
Reference in a new issue