aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 44303796db533ac5217b726517cb74d6a713860f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# go-epd7in3e

A small Go driver for the Waveshare 7.3" e-Paper (E) "Spectra 6" panel
(`epd7in3e`, 800x480, 6 colours) over SPI on a Raspberry Pi.

This was written by referencing the original c driver provided by waveshare at https://github.com/waveshareteam/e-Paper

## Wiring

Default Waveshare HAT wiring, BCM numbers:

| Signal | BCM pin | Direction | Notes |
|--------|---------|-----------|-------|
| RST    | GPIO17  | out       | active low |
| DC     | GPIO25  | out       | low = command, high = data |
| CS     | GPIO8 (CE0) | - | driven by the kernel spidev driver |
| BUSY   | GPIO24  | in        | LOW = busy, HIGH = idle |
| PWR    | GPIO27  | out       | driven HIGH before anything else |
| MOSI   | GPIO10  | -         | SPI0 |
| SCLK   | GPIO11  | -         | SPI0, 4 MHz, mode 0, 8 bits |

## Enabling SPI

On a Raspberry Pi with the HAT fitted:

1. `sudo raspi-config` -> *Interface Options* -> *SPI* -> *Yes*.
2. `sudo reboot`, then confirm `/dev/spidev0.0` exists.
3. Build with the Makefile, on the Pi or cross-compiled on a PC/server:

```
make build      # on the Pi, produces ./epdctl
make arm64      # Pi 4/5 64-bit, produces ./epdctl-arm64
make arm        # 32-bit, produces ./epdctl-arm
make clean      # remove the built binaries
```

## CLI usage

`epdctl` always initialises the panel, draws, then puts it to deep
sleep. `-dry-run out.png` writes the quantised 800x480 frame to a PNG
instead of touching the hardware. `-v` logs every command, data write
and busy-wait duration to stderr for bring-up diagnostics.

```
epdctl clear                 # fill the panel white
epdctl clear blue            # any of black|white|yellow|red|blue|green
epdctl bars                  # six vertical colour bars
epdctl show photo.jpg        # letterbox, dither, display
epdctl show photo.png -dry-run /tmp/preview.png
```

## Library Usage

```go
d, err := epd7in3e.NewHAT(nil)   // SPI0.0 + default HAT pins, defaults
// or &epd7in3e.Opts{Verbose: true} to log every command to stderr
if err != nil { log.Fatal(err) }
ctx := context.Background()
if err := d.Init(ctx); err != nil { log.Fatal(err) }
img, _, err := image.Decode(file) // 800x480 or 480x800 (rotated)
if err != nil { log.Fatal(err) }
if err := d.Display(ctx, img); err != nil { log.Fatal(err) }
if err := d.Sleep(ctx); err != nil { log.Fatal(err) }
d.Halt()                          // power the board rail off
```