.. _DisplayBackpackBoardModeSetup: Backpack Board Usage Guide =========================================== Introduction ^^^^^^^^^^^^^^^^^^ BACKPACK (V1.1) Board is built to extend the functionality of the `SyncSign D75R e-ink display `_. With BACKPACK, Developers will be able to design their own communication module, decide how to fetch the information, and when to show them on the e-ink screen. The BACKPACK should contain batteries and serve as a power source. It will communicate with the CPU on the D75R via a standard UART port. Board Layout ^^^^^^^^^^^^^^^^^^ .. image:: ../images/backpack_board.png Board Description ^^^^^^^^^^^^^^^^^^ Developers may design their own **Extension Module** and install it onto the BACKPACK board. By this way, the **Extension Module** will decide what to render on the e-ink screen, then control the power of D75R, and send the data over UART port. As a demonstration, the BACKPACK provides a micro USB port. Please connect it to a host computer and install the CP2102 driver. Then, your computer will serve as the same function of the Extension Module. .. image:: ../images/backpack_chart.png Demonstration & Test ^^^^^^^^^^^^^^^^^^^^^ Prepare (hardware) - Set the SW2 to OFF - Install all the jumpers on J10 - Connect the USB cable to host computer Prepare (software) - Better to use a host computer which runs Mac/Linux, or WSL of Windows - Install the Python3 interpreters - Install the pip3 tool - Install the python library: **pip3 install pyserial** - Connect the USB port to your Linux/Mac host (You may required to install the CP2102 driver) - Check the serial port, e.g., /dev/ttyS1, /dev/SLAB_USBtoUART and modify the define in the example code Test Procedure - Run the example.py: **python3 example.py** - When you see: **[ MANUAL OPERATION ]: Control target power as ON now.** Please switch the SW2 to ON - The D75R will send “HELLO” and “READDATA” to example.py - Then the example.py will send the render document to D75R, you should notice the e-ink screen is refreshing to the new content. - The D75R will send “BYE” when it’s done - Set the SW2 to OFF to turn off the power of D75R Build Your Extension Module ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The **Extension Module** should contain: - A MCU/CPU which can run in low power mode - A communication module, e.g. NB-IoT, LTE-M(eMTC). - A DC/DC, convert input from 5V/6V to a required voltage of extension module Prepare the BACKPACK: - Set the SW2 to OFF - Remove all the jumpers on J10 - Install 4 x AA batteries - Disconnect the USB cable to host computer - Install your **Extension Module** onto J5 & J9 Design of software: - When the Extension Module receives the screen data, it should turn on the power of the D75R (Just like switch the SW2 to on) by setting the CTRL-POWER pin to high level - Then, wait for the D75R sends HELLO and READDATA command - The Extension Module sends the render document to the D75R and wait for it completes the rendering. Then set the CTRL-POWER to low level - Note: the serial communication use SLIP protocol, please see buildSlipPacket() in example.py Attachments ^^^^^^^^^^^^^^^^ Circuit Schematic: .. image:: ../images/d75r_backpack_v1.1_schematic.png Example Code: :: ''' **** SyncSign Backpack Testing **** This is a demo code runs on Linux/Mac. Prepare: 1. Connect the USB port to your Linux/Mac host (You may required to install the CP2102 driver) 2. Check the serial port, e.g., /dev/ttyS1, /dev/SLAB_USBtoUART and modify the define in the code 3. Install the python library: `pip3 install pyserial` How to test: 1. Manually set the power pin to HIGH on the demo board, then 2. `python3 example.py` ''' import serial import binascii import struct UARTPORT = '/dev/cu.SLAB_USBtoUART' ser = None CHECKSUM_MAGIC = 0xEF SS_HELLO = 0xA0 SS_BYEBYE = 0xA1 SS_READ_DATA = 0x3F layoutDocument = u""" { "items": [ { "type": "TEXT", "data": { "text": "HELLO WORLD", "font": "YANONE_KAFFEESATZ_44_B", "block": { "x": 24, "y": 30, "w": 496, "h": 60 } } } ] } """ """ Calculate checksum of a blob """ def checksum(data, state=CHECKSUM_MAGIC): for b in data: if type(b) is int: # python 2/3 compat state ^= b else: state ^= ord(b) return state def buildSlipPacket(cmd=None, data=b""): chk = checksum(data) packet = struct.pack(b'>> HELLO command received") ser.write(buildSlipPacket(SS_HELLO)) # say HELLO print('waiting for READDATA command') data = readOnePacket() if data == b'\x00\x3f\x00\x00\xef\x00\x00\x00': print(" >>> READDATA command received") ser.write(buildSlipPacket(SS_READ_DATA, bytes(layoutDocument, "utf-8"))) # say HELLO print('waiting for BYE command') data = readOnePacket() if data == b'\x00\xa1\x08\x00\xef\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff': print(" >>> BYE command received") powerCtrl(False) if __name__ == '__main__': run() Example Code: - calc_checksum.py :: CHECKSUM_MAGIC = 0xEF """ Calculate checksum of a blob """ def checksum(data, state=CHECKSUM_MAGIC): for b in data: if type(b) is int: # python 2/3 compat state ^= b else: state ^= ord(b) return state data = b'1234567890\xFF' print(hex(checksum(data))) - calc_checksum.c :: #include #include #define CHECKSUM_MAGIC 0xEF // Calculate checksum of a blob uint8_t checksum(uint8_t *data, uint32_t len) { uint8_t state = CHECKSUM_MAGIC; for (int i=0; i