Project

papirus

0.0
No release in over 3 years
Low commit activity in last 3 years
This gem can be used to talk to the PaPiRus e-paper display
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.0
~> 2.1.0
>= 0
~> 3.12
 Project Readme

papirus

Ruby gem to talk to the PaPiRus display from a Raspberry PI

Before you start playing make sure you got the display driver installed (gratis/edp-fuse) on your PI

ssh yourpi
sudo apt-get install libfuse-dev -y

git clone https://github.com/repaper/gratis.git
cd gratis
make rpi EPD_IO=epd_io.h PANEL_VERSION='V231_G2'
make rpi-install EPD_IO=epd_io.h PANEL_VERSION='V231_G2'
systemctl enable epd-fuse.service
systemctl start epd-fuse

You can find more detailed instructions and updates at the gratis repo

gem installation (add sudo if your not using RVM)

$ gem install papirus

Using with RMagic

First install rmagick

$ # Install native Image Magick library
$ (OSX) brew install imagemagick@6 && brew link imagemagick@6 --force
$ (debian/ubuntu) sudo apt-get install imagemagick
$ (Windows) no idea (did not use windows for 20 years, and would like to add some more)
$ # Install the gem that talks to the native Image Magick library
$ gem install rmagick

Using an irb session to play around:

$ irb
require 'papirus'
require 'papirus/rmagick'
display = PaPiRus::Display.new()
image = Magick::Image::read('/path/to/img/file.[png|jpg|etc]').first
display.show(data: image.to_bit_stream(display.width, display.height))

Using with ChunkyPNG

# install on
$ (OSX) brew install chunky_png
$ (debian/ubuntu) sudo apt-get install chunky_png
$ (Windows) no idea (did not use windows for 20 years, and would like to add some more)
$ gem install chunky_png

Load an image from a png file

$ irb
require 'papirus'
require 'papirus/chunky'
display = PaPiRus::Display.new()
image = ChunkyPNG::Image.from_file('out.png')
display.show(data: image.to_bit_stream(display.width, display.height))

The only problem here is the aspect ration of the image is not ok anymore. is a todo But for now you could also use Image magick's convert tool to rescale the image and place it in the middle

First, let's use Image Magick's convert tool to convert any image into an scaled, centered png

convert in.jpg -resize '264x176' -gravity center -extent '264x176' out.png

now, load it like explaned above and the image should be in the right aspect ration

Drawing circles with ChunkyPNG

irb
require 'papirus'
require 'papirus/chunky' # add's to_bit_stream function to chucky

#lets get a clean png of the size of the display to play with using chunky_png
image = ChunkyPNG::Image.new(display.width, display.height, ChunkyPNG::Color::WHITE)
#and we draw a circle on it which is about the size of the screen
image.circle(display.width/2, display.height/2, display.height/2-2)

have a look at chunkypng for more examples

#and last we dump the image as bitsteam to the display
display.show(data: image.to_bit_stream)

# now we could also change the circle and fast update the screen
image.replace!(ChunkyPNG::Image.new(display.width, display.height, ChunkyPNG::Color::WHITE))
image.circle(display.width/2, display.height/2, display.height/4)
display.show(data: image.to_bit_stream, 'F')

# or update the screen for multiple circles
display.clear
2.step(image.height/2-2, 5).each do |radius|
    image.replace!(ChunkyPNG::Image.new(display.width, display.height, ChunkyPNG::Color::WHITE))
    image.circle(display.width/2, display.height/2, radius)
    display.show(data: image.to_bit_stream, command: 'F')
end

there are multiple screen commands ['F', 'P', 'U', 'C']

Full update (with screen cleaning):

display.show(data: image.to_bit_stream(display.width, display.height))

Fast update:

display.show(data: image.to_bit_stream(display.width, display.height)), command: 'F')

Partial update:

display.show(data: image.to_bit_stream(display.width, display.height), command: 'P')

Testing without a PaPiRus display

If you want to test the gem, but don't have your PaPiRus available, you can do the following

clone this repo

$ bundle exec irb -r ./lib/papirus
# The gem will create the epd_path test folder (the folder needs to be somwhere in /tmp/) and will set it by default to the 2.0 panel
display = PaPiRus::Display.new(options:{epd_path: '/tmp/epd'})
# When you want to add the 2.7 display panel, you would do
display = PaPiRus::Display.new(options:{epd_path: '/tmp/epd', width: 264, height: 176, panel: 'EPD 2.7'})

Now play with the examples above

  • when you run display.show the fake display /tmp/epd/LE/display is filled with your image
  • now you can use a bin editor like xxd to have a look at the result: xxd -b /tmp/epd/LE/display
  • or, use image.inspect_bitstream(display.width, display.height) to dump the image as 1's and 0's to the terminal
  • make sure you have your terminal font small enought so the image fits the terminal :)

handy convert command

This Image Magick convert command creates a 1-bit 2-color png

convert in.jpg -resize '264x176' -gravity center -extent '264x176' -colorspace gray  -colors 2 -type bilevel out.png

Where

  • the -resize scales the image to fit the display
  • The -gravity and -extent combination (order is important!) makes sure the image stays at the size of the display and in the centre
  • The -colorspace -colors -type combi makes the image a 1-bit grayscale b/w image

TODO

  • add support for reading the temperature of the display
  • add support for changing the update rate
  • make load png image with chunky_png scale keeping aspect ratio in mind
  • create an issue to add your own requests :)

Other resources

Development

  • Install bundler with gem install bundler
  • Run bundle install to get all the gems
  • Create the documentation with: bundle exec yard
  • Run the tests with: bundle exec rake yard:doctest

Contributing to papirus

  • Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
  • Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
  • Fork the project.
  • Start a feature/bugfix branch.
  • Commit and push until you are happy with your contribution.
  • Make sure to add unit tests for it. This is important so I don't break it in a future version unintentionally.
  • Create a PR

Copyright

Copyright (c) 2017 Mischa Molhoek. See LICENSE.txt for further details.