Difference between revisions of "Template:Raspberry Pi Guides for SPI e-Paper"

From Waveshare Wiki
Jump to: navigation, search
m (Text replacement - "https://www.waveshare.com/w/upload/" to "https://files.waveshare.com/upload/")
 
(152 intermediate revisions by 2 users not shown)
Line 1: Line 1:
= Users Guides of Raspberry Pi =
+
 
 +
=Working With Raspberry Pi=
 +
Provide BCM2835, WiringPi, file IO, RPI (Python) library demos.
 
==Hardware connection==
 
==Hardware connection==
If the e-Paper you have is the HAT version which has 40pin GPIO, you can directly attach the e-Paper HAT on Raspberry Pi, otherwise, you can connect your e-Paper to Raspberry Pi by 8pins cable provided.
+
When connecting the Raspberry Pi, if the driver board has a 40pin header, you can directly plug it into the 40PIN header of the Raspberry Pi, and pay attention to the pins. If you choose to connect with an 8PIN cable, please refer to the pin correspondence table below<br />
:To connect the e-Paper, you can following the table below
+
For the 1.02inch e-paper Module, the pin header is used, and the wiring needs to be connected according to the following table<br />
{|border=1; style="width:600px;" align="center"
+
{|border=1; style="width:100%; max-width:700px;" align="center"
|+Connect to Raspberry Pi
+
|+ Correspondence between connecting pins of Raspberry Pi
|- style="background:#228B22; color:white" align="center"
+
|- style="background:green; color:white" align="center"
 
|rowspan="2"|e-Paper
 
|rowspan="2"|e-Paper
 
| colspan="2" | Raspberry Pi
 
| colspan="2" | Raspberry Pi
|- style="background:#228B22; color:white" align="center"
+
|- style="background:green; color:white" align="center"
|BCM2835||Board
+
|BCM2835 encoding
 +
|Board physical pin number
 
|- align="center"
 
|- align="center"
 
|VCC||3.3V||3.3V
 
|VCC||3.3V||3.3V
Line 27: Line 30:
 
|BUSY||24||18
 
|BUSY||24||18
 
|}
 
|}
Take the 7.5inch HD e-Paper (B) connected to the e-paper Driver HAT as an example, just plug it directly into the Raspberry Pi:<br/>
 
[[File:7.5inchrasp.png]]<br/>
 
  
==Enable SPI interface==
+
Take the 7.5inch HD e-Paper (B) connected to the e-paper Driver HAT as an example, just plug it directly into the Raspberry Pi:<br />
:The communication interface of e-Paper is SPI, to use it, we should firstly enable SPI interface of SPI
+
[[file:7.5inch_e-Paper(B)800-480_1.jpg|700px]]
:Open terminal of Raspberry Pi, and open configuration by the following command
+
 
sudo raspi-config
+
==Enable SPI Interface==
:Choose Interfacing Options -> SPI -> Yes
+
*Open the Raspberry Pi terminal and enter the following command in the config interface:
:[[File:RPI open spi.png]]
 
:Restart Raspberry Pi
 
sudo reboot
 
==Install libraries==
 
<font color=red>
 
Note: If you use the Bullseye image, please use apt instead of apt-get to install libraries, the Bullseye image could only support ptyhon3.
 
</font>
 
<br />
 
Open terminal of Raspberry Pi and run the following commands to install corresponding libraries:
 
*Install BCM2835 libraries
 
 
<pre>
 
<pre>
#Open the Raspberry Pi terminal and run the following command
+
sudo raspi-config
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz
+
Choose Interfacing Options -> SPI -> Yes Enable SPI interface
tar zxvf bcm2835-1.68.tar.gz
 
cd bcm2835-1.68/
 
sudo ./configure && sudo make && sudo make check && sudo make install
 
# For more information, please refer to the official website: http://www.airspayce.com/mikem/bcm2835/
 
 
</pre>
 
</pre>
*Install WiringPi libraries
+
[[File:RPI open spi.png|500px]]<br/>
#Open the Raspberry Pi terminal and run the following command
+
Then reboot your Raspberry Pi:<br/>
  sudo apt-get install wiringpi
+
  sudo reboot
#For Raspberry Pi systems after May 2019 (earlier than before, you may not need to execute), you may need to upgrade:
+
*Check /boot/config.txt, and you can see 'dtparam=spi=on' was written in.
wget https://project-downloads.drogon.net/wiringpi-latest.deb
+
[[File:Raspberry Pi Guides for 4.37 e-Paper.jpg]]
sudo dpkg -i wiringpi-latest.deb
+
*To make sure SPI is not occupied, it is recommended to close other drivers' coverage. You can use ls /dev/spi* to check whether SPI is occupied. If the terminal outputs /dev/spidev0.1 and /dev/spidev0.1, SPI is not occupied.
gpio -v
+
[[File:Raspberry Pi Guides for 4.37 e-Paper02.jpg]]
# Run gpio -v and version 2.52 will appear. If it does not appear, the installation is wrong
+
==Install Library==
#Bullseye branch system use the following command:
+
===Install BCM2835===
git clone https://github.com/WiringPi/WiringPi
 
cd WiringPi
 
./build
 
gpio -v
 
# Run gpio -v and version 2.60 will appear. If it does not appear, it means that there is an installation error
 
</pre>
 
*Install Python2 libraries
 
 
<pre>
 
<pre>
sudo apt-get update
+
#Open the Raspberry Pi terminal and run the following command
sudo apt-get install python-pip
+
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
sudo apt-get install python-pil
+
tar zxvf bcm2835-1.71.tar.gz
sudo apt-get install python-numpy
+
cd bcm2835-1.71/
sudo pip install RPi.GPIO
+
sudo ./configure && sudo make && sudo make check && sudo make install
sudo pip install spidev
+
# For more information, please refer to the official website: http://www.airspayce.com/mikem/bcm2835/
 
</pre>
 
</pre>
*Install Python3 libraries
+
*Install WiringPi
 
<pre>
 
<pre>
sudo apt-get update
+
#Open the Raspberry Pi terminal and run the following command:
sudo apt-get install python3-pip
+
sudo apt-get install wiringpi
sudo apt-get install python3-pil
+
#For Raspberry Pi systems after May 2019 (Earlier than the previous can not be implemented), an upgrade may be required to:
sudo apt-get install python3-numpy
+
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo pip3 install RPi.GPIO
+
sudo dpkg -i wiringpi-latest.deb
sudo pip3 install spidev
+
gpio -v
</pre>
+
#Running gpio -v will bring up version 2.52, if it doesn't, it means there was an installation error.
  
==Download demo codes==
+
#The Bullseye branch system uses the following command:
Open the terminal of Raspberry Pi and clone demo codes by the following commands:
+
git clone https://github.com/WiringPi/WiringPi
<pre>
+
cd WiringPi
sudo git clone https://github.com/waveshare/e-Paper
+
./build
 +
gpio -v
 +
# Run gpio -v and version 2.60 will appear, if it does not appear, it means there is an installation error
 
</pre>
 
</pre>
==Examples==
+
*Download program (already downloaded can be skipped):
===C===
 
*Enter the folder of C examples
 
 
<pre>
 
<pre>
cd ~/e-Paper/RaspberryPi_JetsonNano/
+
sudo apt-get install p7zip-full
cd c
+
wget  https://files.waveshare.com/upload/3/39/E-Paper_code.7z
 +
7z x E-Paper_code.7z -O./e-Paper
 +
cd e-Paper/RaspberryPi_JetsonNano/
 
</pre>
 
</pre>
*Modify the main.c file for corresponding e-Paper
+
*Downloading the program via GitHub (alternate method, you can skip it if you've already downloaded it).<br/>
 +
Access to GitHub is not very smooth at the moment, so we recommend downloading from our website using the method above.
 
<pre>
 
<pre>
sudo nano examples/main.c
+
git clone https://github.com/waveshare/e-Paper.git
 +
cd e-Paper/RaspberryPi_JetsonNano/
 
</pre>
 
</pre>
{{#switch:{{FULLPAGENAME}}
+
Compile the program (Note: -j4 is compiled using 4 threads, the number can be modified; EPD=epd1in02d is to specify a macro definition, epd1in02d corresponds to the test program in the main function).
|1.54inch e-Paper F Pi=
 
 
 
|5.65inch e-Paper Pi=
 
[[File:RaspberryPi_guides_for_5in65.png|400px]]
 
|#default=
 
: For example, if you want to update a 2.7inch e-Paper/2.7inch e-Paper HAT, you should modify the main.c file, uncomment the line EPD_2in7_test(), comment others, and save.
 
:[[File:E-paper_rpi_change_main.png|500px]]
 
}}
 
*Compile codes
 
 
<pre>
 
<pre>
 +
# At this point in the e-Paper/RaspberryPi_JetsonNano
 +
cd c
 
sudo make clean
 
sudo make clean
sudo make
+
sudo make -j4 EPD=epd1in02d
 
</pre>
 
</pre>
*Try to run the example
+
*Run the demo:
 +
sudo ./epd
 +
===Run Python Library===
 +
*Install Python Library:
 
<pre>
 
<pre>
sudo ./epd
+
sudo apt-get update
</pre>
+
sudo apt-get install python3-pip
 
+
sudo apt-get install python3-pil
===Supports type===
+
sudo apt-get install python3-numpy
;1.02inch(128×80):
+
sudo pip3 install RPi.GPIO
EPD_1in02d_test():Example for 1.02inch e-Paper/1.02inch e-Paper Module
+
sudo pip3 install spidev
 
 
;1.54inch(1.54inch e-paper c:152×152,others:200×200):
 
EPD_1in54_test(): Example for 1.54inch e-paper V1(Balck/White): This version is stopped production which can be bought before 2019-11-22;<br />
 
EPD_1in54_V2_test(): Example for 1.54inch e-paper V2(Balck/White): This is the current version that can be bought now (2020-07-29). The e-Paper has V2 sticker on the backside. <br />
 
EPD_1in54b_test(): Example for 1.54inch e-paper B(Black/White/Red);<br />
 
EPD_1in54b_V2_test(): Example for 1.54inch e-Paper B V2 (Black/White/Red);<br />
 
EPD_1in54c_test(): Example for 1.54inch e-paper C(Black/White/Red); <br />
 
 
 
;2.7inch(264×176):
 
EPD_2in7_test(): Example for 2.7inch e-paper(Black/White);<br />
 
EPD_2in7b_test(): Example for 2.7inch e-paper B(Black.White/Red);<br />
 
EPD_2in7b_V2_test(): Example for 2.7inch e-paper B V2(Black.White/Red);<br />
 
 
 
;2.9inch(296×128):
 
EPD_2in9_test(): Example for 2.9inch e-paper(Black/White);<br />
 
EPD_2in9_V2_test(): Example for 2.9inch e-paper V2(Black/White);<br />
 
EPD_2in9bc_test(): Example for 2.9inch e-paper B(Balck/White/Red) and 2.9inch e-paper C(Black/White/Yellow);<br />
 
EPD_2in9b_V3_test(): Example for 2.9inch e-paper B V3 (Balck/White/Red);<br />
 
EPD_2in9d_test(): Example for 2.9inch e-paper D(Black/White);
 
 
 
;2.13inch(2.13inch e-Paper:250×122,others:212×104):
 
EPD_2in13_test(): Example for 2.13inch e-paper V1(Black/White), this version is stopped production and it can be bought before 019-05-15;<br />
 
EPD_2in13_V2_test(): Example for 2.13inch e-paper V2(Black/White) This is the current version with sticker V2 on the backside (2020-07-29);<br />
 
EPD_2in13_V3_test(): Example for 2.13inch e-paper V3(Black/White) This is the current version with sticker V3 on the backside (2020-07-29);<br />
 
EPD_2in13bc_test():Example for 2.13inch e-paper B(Black/White/Red)and 2.13inch e-paper C(Blackj/White/Yellow);<br />
 
EPD_2in13b_V3_test():Example for 2.13inch e-paper B V3(Black/White/Red)<br />
 
EPD_2in13d_test(): Example for 2.13inch e-paper D(Black/White);<br />
 
 
 
;2.66inch (152 x 296):
 
EPD_2in66_test(): Example for 2.66inch e-Paper (Black/White);<br />
 
EPD_2in66b_test(): Example for 2.66inch e-Paper B (Black/White/Red); <br />
 
 
 
;3.7inch (280 x 480):
 
EPD_3in7_test(): Example for 3.7inch e-Paper(Black/White); <br />
 
 
 
;4.01inch (640x400):
 
EPD_4in01_test(): Example for the 4.01inch e-Paper HAT (F);<br />
 
 
 
;4.2inch(400×300):
 
EPD_4in2_test(): Example for 4.2inch e-paper(Black/White);<br />
 
EPD_4in2bc_test(): Example for 4.2inch e-paper B(Black/White/Red);<br />
 
EPD_4in2b_V2_test(): Example for 4.2inch e-paper B V2(Black/White/Red);<br />
 
 
 
;5.65inch (600x448):
 
EPD_5in65f_test(): Example for for 5.65inch e-Paper F (Seven-color);
 
 
 
;5.83inch(600×448):
 
EPD_5in83_test(): Example for 5.83inch e-paper(Black/White);<br />
 
EPD_5in83_V2_test(): Example for 5.83inch e-paper V2(Black/White);<br />
 
EPD_5in83bc_test(): Example for 5.83inch e-paper B(Black/White/Red)and 5.83inch e-paper C(Black/White/Yellow);<br />
 
EPD_5in83b_V2_test(): Example for 5.83inch e-paper B V2(Black/White/Red)<br />
 
 
 
;7.5inch(V1:640×384, V2:800×480):
 
EPD_7in5_test(): Example for 7.5inch e-paper(Black/White), this version is stopped production and it can be bought before 2019-12-07;<br />
 
EPD_7in5bc_test(): Example for 7.5inch e-paper B(Black/White/Red)and 7.5inch e-paper C(Black/White/Yellow),7.5inch e-paper B V1 version is stop production and it can be bought before 2019-12-07;<br />
 
EPD_7in5_V2_test(): Example for 7.5inch e-paper V2(Black/White), This is the current version with V2 sticker on the backside (2020-07-29)<br />
 
EPD_7in5bc_V2_test():Example for 7.5inch e-paper B V2(Black/White/Red); This is the current version with V2 sticker on the backside. (2020-07-29);<br />
 
 
 
;7.5inch (HD: 880 x 528)
 
EPD_7in5_HD_test(): Example for 7.5inch e-Paper HD (Black/White); <br />
 
EPD_7in5b_HD_test(): Example for 7.5inch e-Paper B HD (Black/White/Red); <br />
 
===Python===
 
<div class="cautionSec">PS: The system of the Bullseye branch only supports Python3. </div>
 
*Enter the folder of python code
 
<pre>
 
cd python/examples
 
ls -al
 
 
</pre>
 
</pre>
:[[File:E-paper_rpi_change_python1.png|500px]]
+
*Install the function library (Python2)
*Run the responding example
 
{{#switch:{{FULLPAGENAME}}
 
|4.01inch e-Paper HAT (F)=
 
 
<pre>
 
<pre>
sudo python epd_4in01f_test.py
+
sudo apt-get update
</pre>
+
sudo apt-get install python-pip
or
+
sudo apt-get install python-pil
<pre>
+
sudo apt-get install python-numpy
sudo python3 epd_4in01f_test.py
+
sudo pip install RPi.GPIO
</pre>
+
sudo pip install spidev
|5.65inch e-Paper Module (F)=
 
<pre>
 
sudo python epd_5in65f_test.py
 
</pre>
 
or
 
<pre>
 
sudo python3 epd_5in65f_test.py
 
</pre>
 
|#Default=
 
<pre>
 
sudo python epd_xxx_test.py
 
sudo python3 epd_xxx_test.py
 
</pre>
 
}}
 
 
 
===Supports type===
 
;1.02inch(128×80):
 
epd_1in02_test.py:Example for 1.02inch e-Paper/1.02inch e-Paper Module
 
 
 
;1.54inch(1.54inch e-paper c:152×152,others:200×200):
 
epd_1in54_test.py: Example for 1.54inch e-paper V1(Balck/White): This version is stopped production which can be bought before 2019-11-22;<br />
 
epd_1in54_V2_test.py: Example for 1.54inch e-paper V2(Balck/White): This is the current version which can be bought now (2020-07-29). The e-Paper has V2 sticker on the backside. <br />
 
epd_1in54b_test.py: Example for 1.54inch e-paper B(Black/White/Red);<br />
 
epd_1in54b_V2_test.py: Example for 1.54inch e-paper B V2(Black/White/Red);<br />
 
epd_1in54c_test.py: Example for 1.54inch e-paper C(Black/White/Red);br />
 
 
 
;2.7inch(264×176):
 
epd_2in7_test.py: Example for 2.7inch e-paper(Black/White);<br />
 
epd_2in7b_test.py: Example for 2.7inch e-paper B(Black.White/Red);<br />
 
epd_2in7b_V2_test.py: Example for 2.7inch e-paper B V2(Black.White/Red);<br />
 
 
 
;2.9inch(296×128):
 
epd_2in9_test.py: Example for 2.9inch e-paper(Black/White);<br />
 
epd_2in9_V2_test.py: Example for 2.9inch e-paper V2(Black/White);<br />
 
epd_2in9bc_test.py: Example for 2.9inch e-paper B(Balck/White/Red) and 2.9inch e-paper C(Black/White/Yellow);<br />
 
epd_2in9b_V3_test.py: Example for 2.9inch e-paper B V3(Balck/White/Red;<br />
 
epd_2in9d_test.py: Example for 2.9inch e-paper D(Black/White);
 
 
 
;2.13inch(2.13inch e-Paper:250×122,others:212×104):
 
epd_2in13_test.py: Example for 2.13inch e-paper V1(Black/White), this version is stopped production and it can be bought before 019-05-15;<br />
 
epd_2in13_V2_test.py: Example for 2.13inch e-paper V2(Black/White) This is the current version with sticker V2 on the backside (2020-07-29);<br />
 
epd_2in13bc_test.py: Example for 2.13inch e-paper B(Black/White/Red)and 2.13inch e-paper C(Black/White/Yellow);<br />
 
epd_2in13b_V3_test.py: Example for 2.13inch e-paper B V3(Black/White/Red)<br />
 
epd_2in13d_test.py: Example for 2.13inch e-paper D(Black/White);<br />
 
 
 
;2.66inch (152 x 296):
 
epd_2in66_test.py: Example for 2.66inch e-Paper (Black/White); <br />
 
epd_2in66b_test.py: Example for 2.66inch e-Paoer (Black/White/Red);<br />
 
 
 
;3.7inch (280 x 480):
 
epd_3in7_test.py: Example for 3.7inch e-Paper (Black/White); <br />
 
 
 
;4.01inch (640x400):
 
epd_4in01f_test.py: Example for 4.01inch e-Paper (Seven-color);<br />
 
 
 
;4.2inch(400×300):
 
epd_4in2_test.py: Example for 4.2inch e-paper(Black/White);<br />
 
epd_4in2bc_test.py: Example for 4.2inch e-paper B(Black/White/Red);<br />
 
epd_4in2b_V2_test.py: Example for 4.2inch e-paper B V2(Black/White/Red);<br />
 
 
 
;5.65inch (600x448):
 
epd_5in65f_test.py: Example for 5.65inch e-Paper F (Seven-color);
 
 
 
;5.83inch(600×448):
 
epd_5in83_test.py: Example for 5.83inch e-paper(Black/White);<br />
 
epd_5in83_V2_test.py: Example for 5.83inch e-paper V2(Black/White);<br />
 
epd_5in83bc_test.py: Example for 5.83inch e-paper B(Black/White/Red)and 5.83inch e-paper C(Black/White/Yellow);<br />
 
epd_5in83b_V2_test.py: Example for 5.83inch e-paper B V2(Black/White/Red)<br />
 
 
 
;7.5inch(V1:640×384, V2:800×480):
 
epd_7in5_test.py: Example for 7.5inch e-paper(Black/White), this version is stopped production and it can be bought before 2019-12-07;<br />
 
epd_7in5_V2_test.py: Example for 7.5inch e-paper V2(Black/White), This is the current version with V2 sticker on the backside (2020-07-29)<br />
 
epd_7in5bc_test.py: Example for 7.5inch e-paper B(Black/White/Red)and 7.5inch e-paper C(Black/White/Yellow),7.5inch e-paper B V1 version is stopped production and it can be bought before 2019-12-07;<br />
 
epd_7in5b_V2_test.py: Example for 7.5inch e-paper B V2(Black/White/Red); This is the current version with V2 sticker on the backside. (2020-07-29);<br />
 
 
 
;7.5inch (HD 880 x 528):
 
epd_7in5_HD_test.py: Example for 7.5inch e-Paper HD (Black/White); <br />
 
epd_7in5b_HD_test.py: Example for 7.5inch e-Paper B HD (Black/White/Red); <br />
 
 
 
==Description of codes (API)==
 
The libraries for Raspberry Pi and Jetson Nano are same. Examples contain three parts, hardware interface, EPD driver and the GUI functions.
 
===C===
 
;Hardware interface
 
:Two libraries are used by C example,WiringPi and BCM2835. The codes use wiringPi by default, if you want to use BCM2835, you can modify RaspberryPi&JetsonNano\c\Makefile file, modify lines 13 and 14. Change it as below:
 
:[[File:E-paper_Driver_HAT_RPI_Makefile.png|400px]]
 
*Data type
 
<pre>
 
#define UBYTE  uint8_t
 
#define UWORD  uint16_t
 
#define UDOUBLE uint32_t
 
</pre>
 
*Init and Exit
 
<pre>
 
void DEV_Module_Init(void);
 
void DEV_Module_Exit(void);
 
</pre>
 
:Note: The Init() and Exit() function are used to configure GPIOs . EPD enter sleep mode after Exit() function is used, and the consumption of e-Paper should be 0 in sleep mode if the PCB is Rev2.1 version.
 
*GPIO Read/Write
 
<pre>
 
void DEV_Digital_Write(UWORD Pin, UBYTE Value);
 
UBYTE DEV_Digital_Read(UWORD Pin);
 
</pre>
 
*SPI transmit data
 
<pre>
 
void DEV_SPI_WriteByte(UBYTE Value);
 
</pre>
 
; EPD driver
 
:The driver file are saved under RaspberryPi&JetsonNano\c\lib\e-Paper
 
:[[File:E-paper_Driver_HAT_RPI_epd.png]]
 
*Initial EPD
 
:For 1.54inch e-Paper, 1.54inch e-Paper V2, 2.13inch e-Paper, 2.13inch e-Paper V2, 2.13inch e-Paper (D), 2.9inch e-Paper and 2.9inch e-Paper (D), partial refresh is supported. You can set Mode = 0 for full refresh and Mode =1 for partial refresh
 
<pre>
 
void EPD_xxx_Init(UBYTE Mode);
 
</pre>
 
:For other e-Paper
 
<pre>
 
void EPD_xxx_Init(void);
 
</pre>
 
*Trasmite one frame of e-Paper and display
 
:For black/white e-Paper
 
<pre>
 
void EPD_xxx_Display(UBYTE *Image);
 
</pre>
 
:For three-color e-Paper
 
<pre>
 
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
 
</pre>
 
:'''There are exception:'''
 
:For 2.13inch e-Paper (D) and 2.13inch e-Paper (D), if you want to do partial refresh, you should use function
 
<pre>
 
void EPD_2IN13D_DisplayPart(UBYTE *Image);
 
void EPD_2IN9D_DisplayPart(UBYTE *Image);
 
</pre>
 
:For 1.54inch e-Paper V2 and 2.13inch e-Paper V2. you should first display static background (base image) and then dynamicly display (display Part) when partial refresh.
 
<pre>
 
void EPD_1IN54_V2_DisplayPartBaseImage(UBYTE *Image);
 
void EPD_1IN54_V2_DisplayPart(UBYTE *Image);
 
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
 
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
 
</pre>
 
*Sleep mode
 
<pre>
 
void EPD_xxx_Sleep(void);
 
</pre>
 
: To wake up module, you should set hardware reset (re power on it) or call the init function.
 
===GUI functions===
 
GUI files can be found in RaspberryPi&JetsonNano\c\lib\GUI\GUI_Paint.c(.h) directory
 
:[[File:E-paper_Driver_HAT_GUI.png]]
 
The fonts can be found in the RaspberryPi&JetsonNano\c\lib\Fonts directory
 
:[[File:E-paper_Driver_HAT_Fonts.png]]
 
 
 
; Create an image buffer
 
<pre>
 
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
 
</pre>
 
*Image: the Image buffer
 
*Width: width of the image
 
*Height: Height of the image
 
*Rotate: Rotate angle
 
*Color: Color of the image
 
 
 
;Select image buffer
 
<pre>
 
void Paint_SelectImage(UBYTE *image)
 
</pre>
 
* The image buffer, it is a pointer of image buffer's first address
 
 
 
;Rotate image
 
:This function should be used after Paint_SelectImage()
 
<pre>
 
void Paint_SetRotate(UWORD Rotate)
 
</pre>
 
*Rotate: The angle rotated. It should be ROTATE_0, ROTATE_90, ROTATE_180, ROTATE_270
 
*Note: For different orientation, the position of the first pixel is different, here we take 1.54inch as example
 
[[File:SPI-epaper-C-0.png|150px]][[File:SPI-epaper-C-90.png|150px]][[File:SPI-epaper-C-180.png|150px]][[File:SPI-epaper-C-270.png|150px]]
 
;Mirroring
 
<pre>
 
void Paint_SetMirroring(UBYTE mirror)
 
</pre>
 
*mirror: The type of mirroring. (MIRROR_NONE, MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN)
 
 
 
; Set Pixel
 
: This function is used to set the position and types of the pixel
 
<pre>
 
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
 
</pre>
 
*Xpoint: The x-axis coordination of pixel
 
*Ypoint: The y-axis coordination of pixel
 
*Color: The color of the pixel
 
 
 
;Clear
 
: This function is used to clear the e-Paper
 
<pre>
 
void Paint_Clear(UWORD Color)
 
</pre>
 
*Color: The color of the display
 
 
 
; Clear window
 
: This function is used to clear a partial area
 
<pre>
 
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
 
</pre>
 
*Xstart: The x-axis coordination of the start point
 
*Ystart: The y-axis coordination of the start point
 
*Xend: The x-axis coordination of the end point
 
*Yend: The y-axis coordination of the end point
 
*Color: The color of the windows
 
 
 
; Draw point
 
This function is used to draw point.
 
<pre>
 
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
 
</pre>
 
*Xpoint: The x-axis coordination of point
 
*Ypoint: The y-axis coordination of point
 
*Dot_Pixel: The size of the point
 
<pre>
 
typedef enum {
 
DOT_PIXEL_1X1  = 1, // 1 x 1
 
DOT_PIXEL_2X2  , // 2 X 2
 
DOT_PIXEL_3X3  , // 3 X 3
 
DOT_PIXEL_4X4  , // 4 X 4
 
DOT_PIXEL_5X5  , // 5 X 5
 
DOT_PIXEL_6X6  , // 6 X 6
 
DOT_PIXEL_7X7  , // 7 X 7
 
DOT_PIXEL_8X8  , // 8 X 8
 
} DOT_PIXEL;
 
</pre>
 
*Dot_Style: The style of the point
 
<pre>
 
typedef enum {
 
  DOT_FILL_AROUND  = 1,
 
  DOT_FILL_RIGHTUP,
 
} DOT_STYLE;
 
</pre>
 
 
 
; Drawn Line
 
<pre>
 
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
 
</pre>
 
This function is used to draw a line
 
*Xstart: The start x-axis coordination of the line
 
*Ystart: The start y-axis coordination of the line
 
*Xend: The end x-axis coordination of the line
 
*Yend: The end y-axis coordination of the line
 
*Line_width: The width of the line
 
<pre>
 
typedef enum {
 
DOT_PIXEL_1X1  = 1, // 1 x 1
 
DOT_PIXEL_2X2  , // 2 X 2
 
DOT_PIXEL_3X3  , // 3 X 3
 
DOT_PIXEL_4X4  , // 4 X 4
 
DOT_PIXEL_5X5  , // 5 X 5
 
DOT_PIXEL_6X6  , // 6 X 6
 
DOT_PIXEL_7X7  , // 7 X 7
 
DOT_PIXEL_8X8  , // 8 X 8
 
} DOT_PIXEL;
 
</pre>
 
*Line_style: The style of the line
 
<pre>
 
typedef enum {
 
LINE_STYLE_SOLID = 0,
 
LINE_STYLE_DOTTED,
 
} LINE_STYLE;
 
</pre>
 
 
 
; Draw rectangle
 
Draw a rectangle from (Xstart, Ystart) to (Xend, Yend).
 
<pre>
 
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
 
</pre>
 
*Xstart: Start coordinate of X-axes of the rectangle
 
*Ystart: Start coordinate of Y-axes of the rectangle
 
*Xend: End coordinate of X-end of the rectangle
 
*Yend: End coordinate of Y-end of the rectangle
 
*Color: color of the rectangle
 
*Line_width: The width of edges, 8 sides are available;
 
<pre>
 
typedef enum {
 
DOT_PIXEL_1X1  = 1, // 1 x 1
 
DOT_PIXEL_2X2  , // 2 X 2
 
DOT_PIXEL_3X3  , // 3 X 3
 
DOT_PIXEL_4X4  , // 4 X 4
 
DOT_PIXEL_5X5  , // 5 X 5
 
DOT_PIXEL_6X6  , // 6 X 6
 
DOT_PIXEL_7X7  , // 7 X 7
 
DOT_PIXEL_8X8  , // 8 X 8
 
} DOT_PIXEL;
 
 
 
 
</pre>
 
*Draw_Fill: set the rectangle full or empty.
 
<pre>
 
typedef enum {
 
DRAW_FILL_EMPTY = 0,
 
DRAW_FILL_FULL,
 
} DRAW_FILL;
 
</pre>
 
 
 
;Draw character (ASCII)
 
Set(Xstart Ystart) as letf-top point, draw a ASCII character.
 
<pre>
 
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
 
</pre>
 
Parameter:
 
*Xstart: X coordinate of the left-top pixel of character;
 
*Ystart: Y coordinate of the left-top pixel of character;
 
*Ascii_Char:Ascii character;
 
*Font: 5 fonts are available;
 
*:font12:7*12
 
*:font16:11*16
 
*:font20:14*20
 
*:font24:17*24
 
*Color_Foreground: color of character;
 
*Color_Background: color of background;
 
 
 
;Draw String
 
Set point (Xstart Ystart) as the left-top pixel, draw a string.
 
<pre>
 
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
 
</pre>
 
Parameters:
 
*Xstart: X coordinate of left-top pixel of characters;
 
*Ystart: Y coordinate of left-top pixel of characters;
 
*pString:Pointer of string
 
*Font: 5 fonts are available:
 
*:font8:5*8
 
*:font12:7*12
 
*:font16:11*16
 
*:font20:14*20
 
*:font24:17*24
 
*Color_Foreground: color of string
 
*Color_Background: color of the background
 
 
 
;Draw Chinese characters
 
this function is used to draw Chinese fonts based ON GB2312 fonts.
 
<pre>
 
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
 
</pre>
 
Parameters:
 
*Xstart: Coordinate of left-top pixel of characters;
 
*Ystart: Coordinate of left-top pixel of characters;
 
*pString:Pointer of string;
 
*Font: GB2312 fonts:
 
*:font12CN:11*21(ascii),16*21 (Chinese)
 
*:font24CN:24*41(ascii),32*41 (Chinese)
 
*Color_Foreground: color of string
 
*Color_Background: color of the background
 
 
 
;Draw number
 
Draw a string of numbers, (Xstart, Ystart) is the left-top pixel.
 
<pre>
 
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
 
</pre>
 
Parameter:
 
*Xstart: X coordinate of left-top pixel;
 
*Ystart: Y coordicate of left-to pixel;
 
*Nummber: the numbers displayed. the numbers are saved in int format, the maximum is 2147483647;
 
*Font: 5 fonts are available:
 
*:font8:5*8
 
*:font12:7*12
 
*:font16:11*16
 
*:font20:14*20
 
*:font24:17*24
 
*Color_Foreground: color of font;
 
*Color_Background: color of background;
 
 
 
;Draw image
 
Send image data of BMP file to buffer
 
<pre>
 
void Paint_DrawBitMap(const unsigned char* image_buffer)
 
</pre>
 
Parameters:
 
*image_buffer: adrress of image data in buffer
 
 
 
;Read local bmp picture and write it to buffer
 
Linux platform like Jetson Nano and Raspberry Pi support to directly operate bmp pictures
 
Raspberry Pi & Jetson Nano:RaspberryPi&JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)
 
<pre>
 
UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
 
</pre>
 
Parameters:
 
*path:The path of BMP pictures
 
*Xstart: X coordination of left-top of picture, default 0;
 
*Ystart: Y coordination of left-top of picture, default 0;
 
 
 
==Testing Code==
 
In the above part, we describe the tree structures of Linux codes, here we talk about the testing code for user.
 
Raspberry Pi & Jetson Nano: RaspberryPi&JetsonNano\c\examples. The codes in examples are testing code, you can modify the definition in main.c file for different types of e-Paper.
 
For example, if you want to test 2.13inch e-paper, you need to delete the "//" symbol on line 32.
 
Use 5.65inch e-Paper as example, you need to change the line:
 
//EPD_5in65f_test();
 
to
 
EPD_5in65f_test();
 
 
 
Then compile it again and run
 
<pre>
 
make clean
 
make
 
sudo ./epd
 
</pre>
 
 
 
===Python===
 
For Jetson Nano\Raspberry Pi, based on python2.7 and python3<br/>
 
For python, his calls are not as complicated as C<br/>
 
Raspberry Pi and Jetson Nano: RaspberryPi_JetsonNano\python\lib\<br/>
 
[[File:epd.png]]<br/>
 
===epdconfigu.py===
 
 
 
*Initialize module and exit handle:
 
<pre>
 
def module_init()
 
def module_exit()
 
</pre>
 
Note:<br />
 
1. The functions are used to set GPIP before and after driving e-Paper<br />
 
2. If the board you have is printed with Rev2.1, module enter low-ultra mode after Module_Exit(). (as we test, the current is about 0 in this mode);<br />
 
 
 
*GPIO Read/Write:
 
<pre>
 
def  digital_write(pin, value)
 
def  digital_read(pin)
 
</pre>
 
 
 
*SPI Write data:
 
<pre>
 
def spi_writebyte(data)
 
</pre>
 
 
 
===epdxxx.py(xxx is the type of e-Paper)===
 
 
 
*Initailize e-paper: this function should be used at the begining. It can also be used to wake up e-Paper from Sleep mode.
 
<pre>
 
#For 2.13inch e-Paper、2.9inch e-Paper
 
def init(self, update) #  Choose lut_full_update or lut_partial_update
 
#Other type
 
def init(self)
 
</pre>
 
 
 
*Clear e-paper: This function is used to clear e-Paper to white;
 
<pre>
 
def Clear(self)
 
def Clear(self, color) # Some types of e-Paper should use this function to clear screen
 
</pre>
 
 
 
*Convert image to arrays
 
<pre>
 
def getbuffer(self, image)
 
</pre>
 
 
 
*Transmit one frame of image data and display
 
<pre>
 
#For two-color e-paper
 
def display(self, image)
 
 
 
#Because that controllers of 2.13inch e-paper are updated, when partial refresh, they should first use displayPartBaseImage() to display static background, then use displayPart() to dynamaticlly display.
 
def displayPartBaseImage(self, image)
 
def displayPart(self, image)
 
</pre>
 
 
 
*Enter sleep mode
 
<pre>
 
def sleep(self)
 
</pre>
 
 
 
===epd_xxx_test.py(xxx is type of e-paper)===
 
python examples are saved in directory:<br />
 
Raspberry Pi和Jetson Nano:RaspberryPi&JetsonNano\python\examples\ <br />
 
If the python installed in your OS is python2, you should run examples like below:<br />
 
sudo python epd_2in13_V2_test.py
 
If it is python3, the commands should be:
 
sudo python3 epd_2in13-V2_test.py
 
 
 
===Orientation===
 
To rotate the display, you can use transpose function like blackimage = blackimage.transpose(Image.ROTATE_270):
 
<pre>
 
blackimage = blackimage.transpose(Image.ROTATE_270)
 
redimage = redimage.transpose(Image.ROTATE_270)
 
#Support ROTATE_90, ROTATE_180, ROTATE_270
 
</pre>
 
===GUI===
 
Python has a powerful [http://effbot.org/imagingbook PIL library], which can be used directly to drawing figures. Here we use it for drawing <br />
 
 
 
*Install the library firstly
 
sudo apt-get install python3-pil
 
Import the library
 
from PIL import Image,ImageDraw,ImageFont
 
Image: library; ImageDraw: drawing function; ImageFont: fonts
 
 
 
*Set image buffer for drawing.
 
image = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame
 
The first parameter is the depth of color, 1 means 2 grayscale. The second parameter is a tuple of image size. The third parameter is color of the image, 0 is black and 255 is white.
 
 
 
*Create an image object.
 
draw = ImageDraw.Draw(image)
 
 
 
*Draw rectangle
 
draw.rectangle((0, 10, 200, 34), fill = 0)
 
The first parameter is a tuple of coordination. 0, 10 is the top-left point of rectangle, 200, 34) is the right-bottom point. fille = 0 set the filled color to black.
 
 
 
*Draw line
 
draw.line((16, 60, 56, 60), fill = 0)
 
The first parameter is a type of coordination, 16, 60 is the begin point, 200, 34 is the end point. fill=0 set the line to black
 
 
 
*Draw circle
 
<pre>
 
draw.arc((90, 60, 150, 120), 0, 360, fill = 0)
 
</pre>
 
This function is used to draw a encircle of a square. The first parameter is a tuple of coordination of the square.  the degree of the circle is 0 to 360 °, fille=0 set the circle to black.<br />
 
If the figure is not square according to the coordination, you will get an ellipse.。<br />
 
 
 
Besides the arc function, you can also use the chord function for drawing solid circle.<br />
 
<pre>
 
draw.chord((90, 130, 150, 190), 0, 360, fill = 0)
 
 
</pre>
 
</pre>
The first parameter is the coordination of the enclosing rectangle. The second and third parameters are the beginning and end degrees of the circle. The fourth parameter is the fill color of the circle.<br />
+
*Download the program: (already downloaded can be skipped):
 
 
*Character
 
You can directkt import ImageFont model for drawing characters:<br />
 
 
<pre>
 
<pre>
font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)
+
sudo apt-get install p7zip-full
 +
wget  https://files.waveshare.com/upload/3/39/E-Paper_code.7z
 +
7z x E-Paper_code.7z -O./e-Paper
 +
cd e-Paper/RaspberryPi_JetsonNano/
 
</pre>
 
</pre>
You can use the fonts of Windows or other fonts which is in ttc format.<br />
+
*Downloading the program via GitHub (alternate method, you can skip it if you've already downloaded it).<br/>
 
+
Access to GitHub is not very smooth at the moment, so we recommend downloading from our website using the method above.
To draw English character, you can directly use the fonts; for Chinese character, you need to add a symbol u:<br />
 
 
<pre>
 
<pre>
draw.text((8, 12), 'hello world', font = font, fill = 255)
+
git clone https://github.com/waveshare/e-Paper.git
draw.text((8, 36), u'电子墨水屏', font = font, fill = 0)
+
cd e-Paper/RaspberryPi_JetsonNano/
 
</pre>
 
</pre>
The first parameter is a tuple of coordination of character, the second parameter is the font and las one is set the color.<br />
+
*Run the program:
 
 
*Read local picture
 
 
<pre>
 
<pre>
image = Image.open(os.path.join(picdir, '2in13-v2.bmp'))
+
# Make sure in the e-Paper/RaspberryPi_JetsonNano/
 +
cd python/examples/
 +
python3 epd_1in02_test.py
 
</pre>
 
</pre>
The parameter is the path of picture.
 
 
*Other functions.
 
For more information about the PIL library, please refer to http://effbot.org/imagingbook.
 

Latest revision as of 06:40, 2 September 2023

Working With Raspberry Pi

Provide BCM2835, WiringPi, file IO, RPI (Python) library demos.

Hardware connection

When connecting the Raspberry Pi, if the driver board has a 40pin header, you can directly plug it into the 40PIN header of the Raspberry Pi, and pay attention to the pins. If you choose to connect with an 8PIN cable, please refer to the pin correspondence table below
For the 1.02inch e-paper Module, the pin header is used, and the wiring needs to be connected according to the following table

Correspondence between connecting pins of Raspberry Pi
e-Paper Raspberry Pi
BCM2835 encoding Board physical pin number
VCC 3.3V 3.3V
GND GND GND
DIN MOSI 19
CLK SCLK 23
CS CE0 24
DC 25 22
RST 17 11
BUSY 24 18

Take the 7.5inch HD e-Paper (B) connected to the e-paper Driver HAT as an example, just plug it directly into the Raspberry Pi:
7.5inch e-Paper(B)800-480 1.jpg

Enable SPI Interface

  • Open the Raspberry Pi terminal and enter the following command in the config interface:
sudo raspi-config
Choose Interfacing Options -> SPI -> Yes Enable SPI interface

RPI open spi.png
Then reboot your Raspberry Pi:

sudo reboot
  • Check /boot/config.txt, and you can see 'dtparam=spi=on' was written in.

Raspberry Pi Guides for 4.37 e-Paper.jpg

  • To make sure SPI is not occupied, it is recommended to close other drivers' coverage. You can use ls /dev/spi* to check whether SPI is occupied. If the terminal outputs /dev/spidev0.1 and /dev/spidev0.1, SPI is not occupied.

Raspberry Pi Guides for 4.37 e-Paper02.jpg

Install Library

Install BCM2835

#Open the Raspberry Pi terminal and run the following command
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
tar zxvf bcm2835-1.71.tar.gz
cd bcm2835-1.71/
sudo ./configure && sudo make && sudo make check && sudo make install
# For more information, please refer to the official website: http://www.airspayce.com/mikem/bcm2835/
  • Install WiringPi
#Open the Raspberry Pi terminal and run the following command:
sudo apt-get install wiringpi
#For Raspberry Pi systems after May 2019 (Earlier than the previous can not be implemented), an upgrade may be required to:
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
gpio -v
#Running gpio -v will bring up version 2.52, if it doesn't, it means there was an installation error.

#The Bullseye branch system uses the following command:
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
./build
gpio -v
# Run gpio -v and version 2.60 will appear, if it does not appear, it means there is an installation error
  • Download program (already downloaded can be skipped):
sudo apt-get install p7zip-full
wget  https://files.waveshare.com/upload/3/39/E-Paper_code.7z
7z x E-Paper_code.7z -O./e-Paper
cd e-Paper/RaspberryPi_JetsonNano/
  • Downloading the program via GitHub (alternate method, you can skip it if you've already downloaded it).

Access to GitHub is not very smooth at the moment, so we recommend downloading from our website using the method above.

git clone https://github.com/waveshare/e-Paper.git
cd e-Paper/RaspberryPi_JetsonNano/

Compile the program (Note: -j4 is compiled using 4 threads, the number can be modified; EPD=epd1in02d is to specify a macro definition, epd1in02d corresponds to the test program in the main function).

# At this point in the e-Paper/RaspberryPi_JetsonNano 
cd c
sudo make clean
sudo make -j4 EPD=epd1in02d
  • Run the demo:
sudo ./epd

Run Python Library

  • Install Python Library:
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo pip3 install RPi.GPIO
sudo pip3 install spidev
  • Install the function library (Python2)
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install spidev
  • Download the program: (already downloaded can be skipped):
sudo apt-get install p7zip-full
wget  https://files.waveshare.com/upload/3/39/E-Paper_code.7z
7z x E-Paper_code.7z -O./e-Paper
cd e-Paper/RaspberryPi_JetsonNano/
  • Downloading the program via GitHub (alternate method, you can skip it if you've already downloaded it).

Access to GitHub is not very smooth at the moment, so we recommend downloading from our website using the method above.

git clone https://github.com/waveshare/e-Paper.git
cd e-Paper/RaspberryPi_JetsonNano/
  • Run the program:
# Make sure in the e-Paper/RaspberryPi_JetsonNano/ 
cd python/examples/
python3 epd_1in02_test.py