epd1in54b.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. # /*****************************************************************************
  2. # * | File : EPD_1in54.py
  3. # * | Author : Waveshare team
  4. # * | Function : Electronic paper driver
  5. # * | Info :
  6. # *----------------
  7. # * | This version: V3.0
  8. # * | Date : 2018-11-05
  9. # * | Info : python2 demo
  10. # * 1.Remove:
  11. # digital_write(self, pin, value)
  12. # digital_read(self, pin)
  13. # delay_ms(self, delaytime)
  14. # set_rotate(self, rotate)
  15. # set_pixel(self, frame_buffer, x, y, colored)
  16. # set_absolute_pixel(self, frame_buffer, x, y, colored)
  17. # display_string_at(self, frame_buffer, x, y, text, font, colored)
  18. # draw_line(self, frame_buffer, x0, y0, x1, y1, colored)
  19. # draw_horizontal_line(self, frame_buffer, x, y, width, colored)
  20. # draw_vertical_line(self, frame_buffer, x, y, height, colored)
  21. # draw_rectangle(self, frame_buffer, x0, y0, x1, y1, colored):
  22. # draw_filled_rectangle(self, frame_buffer, x0, y0, x1, y1, colored):
  23. # draw_circle(self, frame_buffer, x, y, radius, colored):
  24. # draw_filled_circle(self, frame_buffer, x, y, radius, colored):
  25. # * 2.Change:
  26. # get_frame_buffer -> getbuffer
  27. # display_frame -> display
  28. # * 3.How to use
  29. # epd = epd1in54b.EPD()
  30. # epd.init()
  31. # image = Image.new('1', (epd1in54b.EPD_WIDTH, epd1in54b.EPD_HEIGHT), 255)
  32. # ...
  33. # drawing ......
  34. # ...
  35. # epd.display(getbuffer(image))
  36. # ******************************************************************************/
  37. # Permission is hereby granted, free of charge, to any person obtaining a copy
  38. # of this software and associated documnetation files (the "Software"), to deal
  39. # in the Software without restriction, including without limitation the rights
  40. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  41. # copies of the Software, and to permit persons to whom the Software is
  42. # furished to do so, subject to the following conditions:
  43. #
  44. # The above copyright notice and this permission notice shall be included in
  45. # all copies or substantial portions of the Software.
  46. #
  47. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  48. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  49. # FITNESS OR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  50. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  51. # LIABILITY WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  52. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  53. # THE SOFTWARE.
  54. #
  55. import epdconfig
  56. import Image
  57. import RPi.GPIO as GPIO
  58. # Display resolution
  59. EPD_WIDTH = 200
  60. EPD_HEIGHT = 200
  61. # EPD1IN54B commands
  62. PANEL_SETTING = 0x00
  63. POWER_SETTING = 0x01
  64. POWER_OFF = 0x02
  65. POWER_OFF_SEQUENCE_SETTING = 0x03
  66. POWER_ON = 0x04
  67. POWER_ON_MEASURE = 0x05
  68. BOOSTER_SOFT_START = 0x06
  69. DEEP_SLEEP = 0x07
  70. DATA_START_TRANSMISSION_1 = 0x10
  71. DATA_STOP = 0x11
  72. DISPLAY_REFRESH = 0x12
  73. DATA_START_TRANSMISSION_2 = 0x13
  74. PLL_CONTROL = 0x30
  75. TEMPERATURE_SENSOR_COMMAND = 0x40
  76. TEMPERATURE_SENSOR_CALIBRATION = 0x41
  77. TEMPERATURE_SENSOR_WRITE = 0x42
  78. TEMPERATURE_SENSOR_READ = 0x43
  79. VCOM_AND_DATA_INTERVAL_SETTING = 0x50
  80. LOW_POWER_DETECTION = 0x51
  81. TCON_SETTING = 0x60
  82. TCON_RESOLUTION = 0x61
  83. SOURCE_AND_GATE_START_SETTING = 0x62
  84. GET_STATUS = 0x71
  85. AUTO_MEASURE_VCOM = 0x80
  86. VCOM_VALUE = 0x81
  87. VCM_DC_SETTING_REGISTER = 0x82
  88. PROGRAM_MODE = 0xA0
  89. ACTIVE_PROGRAM = 0xA1
  90. READ_OTP_DATA = 0xA2
  91. class EPD:
  92. def __init__(self):
  93. self.reset_pin = epdconfig.RST_PIN
  94. self.dc_pin = epdconfig.DC_PIN
  95. self.busy_pin = epdconfig.BUSY_PIN
  96. self.cs_pin = epdconfig.CS_PIN
  97. self.width = EPD_WIDTH
  98. self.height = EPD_HEIGHT
  99. lut_vcom0 = [
  100. 0x0E, 0x14, 0x01, 0x0A, 0x06, 0x04, 0x0A, 0x0A,
  101. 0x0F, 0x03, 0x03, 0x0C, 0x06, 0x0A, 0x00
  102. ]
  103. lut_w = [
  104. 0x0E, 0x14, 0x01, 0x0A, 0x46, 0x04, 0x8A, 0x4A,
  105. 0x0F, 0x83, 0x43, 0x0C, 0x86, 0x0A, 0x04
  106. ]
  107. lut_b = [
  108. 0x0E, 0x14, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A,
  109. 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x4A, 0x04
  110. ]
  111. lut_g1 = [
  112. 0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A,
  113. 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04
  114. ]
  115. lut_g2 = [
  116. 0x8E, 0x94, 0x01, 0x8A, 0x06, 0x04, 0x8A, 0x4A,
  117. 0x0F, 0x83, 0x43, 0x0C, 0x06, 0x0A, 0x04
  118. ]
  119. lut_vcom1 = [
  120. 0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37,
  121. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  122. ]
  123. lut_red0 = [
  124. 0x83, 0x5D, 0x01, 0x81, 0x48, 0x23, 0x77, 0x77,
  125. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  126. ]
  127. lut_red1 = [
  128. 0x03, 0x1D, 0x01, 0x01, 0x08, 0x23, 0x37, 0x37,
  129. 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  130. ]
  131. # Hardware reset
  132. def reset(self):
  133. epdconfig.digital_write(self.reset_pin, GPIO.HIGH)
  134. epdconfig.delay_ms(200)
  135. epdconfig.digital_write(self.reset_pin, GPIO.LOW) # module reset
  136. epdconfig.delay_ms(200)
  137. epdconfig.digital_write(self.reset_pin, GPIO.HIGH)
  138. epdconfig.delay_ms(200)
  139. def send_command(self, command):
  140. epdconfig.digital_write(self.cs_pin, GPIO.LOW)
  141. epdconfig.digital_write(self.dc_pin, GPIO.HIGH)
  142. epdconfig.spi_writebyte([command])
  143. epdconfig.digital_write(self.cs_pin, GPIO.HIGH)
  144. def send_data(self, data):
  145. epdconfig.digital_write(self.cs_pin, GPIO.LOW)
  146. epdconfig.digital_write(self.dc_pin, GPIO.HIGH)
  147. epdconfig.spi_writebyte([data])
  148. epdconfig.digital_write(self.cs_pin, GPIO.HIGH)
  149. def wait_until_idle(self):
  150. while(epdconfig.digital_read(self.busy_pin) == 0): # 0: idle, 1: busy
  151. epdconfig.delay_ms(100)
  152. def set_lut_bw(self):
  153. self.send_command(0x20) # vcom
  154. for count in range(0, 15):
  155. self.send_data(self.lut_vcom0[count])
  156. self.send_command(0x21) # ww --
  157. for count in range(0, 15):
  158. self.send_data(self.lut_w[count])
  159. self.send_command(0x22) # bw r
  160. for count in range(0, 15):
  161. self.send_data(self.lut_b[count])
  162. self.send_command(0x23) # wb w
  163. for count in range(0, 15):
  164. self.send_data(self.lut_g1[count])
  165. self.send_command(0x24) # bb b
  166. for count in range(0, 15):
  167. self.send_data(self.lut_g2[count])
  168. def set_lut_red(self):
  169. self.send_command(0x25)
  170. for count in range(0, 15):
  171. self.send_data(self.lut_vcom1[count])
  172. self.send_command(0x26)
  173. for count in range(0, 15):
  174. self.send_data(self.lut_red0[count])
  175. self.send_command(0x27)
  176. for count in range(0, 15):
  177. self.send_data(self.lut_red1[count])
  178. def init(self):
  179. if (epdconfig.module_init() != 0):
  180. return -1
  181. # EPD hardware init start
  182. self.reset()
  183. self.send_command(POWER_SETTING)
  184. self.send_data(0x07)
  185. self.send_data(0x00)
  186. self.send_data(0x08)
  187. self.send_data(0x00)
  188. self.send_command(BOOSTER_SOFT_START)
  189. self.send_data(0x07)
  190. self.send_data(0x07)
  191. self.send_data(0x07)
  192. self.send_command(POWER_ON)
  193. self.wait_until_idle()
  194. self.send_command(PANEL_SETTING)
  195. self.send_data(0xCF)
  196. self.send_command(VCOM_AND_DATA_INTERVAL_SETTING)
  197. self.send_data(0x17)
  198. self.send_command(PLL_CONTROL)
  199. self.send_data(0x39)
  200. self.send_command(TCON_RESOLUTION)
  201. self.send_data(0xC8)
  202. self.send_data(0x00)
  203. self.send_data(0xC8)
  204. self.send_command(VCM_DC_SETTING_REGISTER)
  205. self.send_data(0x0E)
  206. self.set_lut_bw()
  207. self.set_lut_red()
  208. return 0
  209. def getbuffer(self, image):
  210. buf = [0xFF] * (self.width * self.height / 8)
  211. # Set buffer to value of Python Imaging Library image.
  212. # Image must be in mode 1.
  213. image_monocolor = image.convert('1')
  214. imwidth, imheight = image_monocolor.size
  215. if imwidth != self.width or imheight != self.height:
  216. raise ValueError('Image must be same dimensions as display \
  217. ({0}x{1}).' .format(self.width, self.height))
  218. pixels = image_monocolor.load()
  219. for y in range(self.height):
  220. for x in range(self.width):
  221. # Set the bits for the column of pixels at the current position.
  222. if pixels[x, y] == 0:
  223. buf[(x + y * self.width) / 8] &= ~(0x80 >> (x % 8))
  224. return buf
  225. def display(self, blackimage, redimage):
  226. if (blackimage != None):
  227. self.send_command(DATA_START_TRANSMISSION_1)
  228. for i in range(0, self.width * self.height / 8):
  229. temp = 0x00
  230. for bit in range(0, 4):
  231. if (blackimage[i] & (0x80 >> bit) != 0):
  232. temp |= 0xC0 >> (bit * 2)
  233. self.send_data(temp)
  234. temp = 0x00
  235. for bit in range(4, 8):
  236. if (blackimage[i] & (0x80 >> bit) != 0):
  237. temp |= 0xC0 >> ((bit - 4) * 2)
  238. self.send_data(temp)
  239. if (redimage != None):
  240. self.send_command(DATA_START_TRANSMISSION_2)
  241. for i in range(0, self.width * self.height / 8):
  242. self.send_data(redimage[i])
  243. self.send_command(DISPLAY_REFRESH)
  244. self.wait_until_idle()
  245. ##
  246. # @brief: clear the frame memory with the specified color.
  247. # this won't update the display.
  248. ##
  249. def Clear(self):
  250. self.send_command(DATA_START_TRANSMISSION_1)
  251. for i in range(0, self.width * self.height / 8):
  252. self.send_data(0xFF)
  253. self.send_data(0xFF)
  254. self.send_command(DATA_START_TRANSMISSION_2)
  255. for i in range(0, self.width * self.height / 8):
  256. self.send_data(0xFF)
  257. self.send_command(DISPLAY_REFRESH)
  258. self.wait_until_idle()
  259. # after this, call epd.init() to awaken the module
  260. def sleep(self):
  261. self.send_command(VCOM_AND_DATA_INTERVAL_SETTING)
  262. self.send_data(0x17)
  263. self.send_command(VCM_DC_SETTING_REGISTER) #to solve Vcom drop
  264. self.send_data(0x00)
  265. self.send_command(POWER_SETTING) #power setting
  266. self.send_data(0x02) #gate switch to external
  267. self.send_data(0x00)
  268. self.send_data(0x00)
  269. self.send_data(0x00)
  270. self.wait_until_idle()
  271. self.send_command(POWER_OFF) #power off
  272. ### END OF FILE ###