Difference between revisions of "Projets:Perso:2013:RaspEink"
(→main.c changes explained) (Tag: visualeditor) |
(New version, separating the Driver from the FHEM project.) |
||
Line 1: | Line 1: | ||
== Introduction == | == Introduction == | ||
− | The aim of the RaspEink project is to drive a small e-Paper display with a Raspberry Pi. Such a display can be used for many purposes | + | The aim of the RaspEink project is to drive a small e-Paper display with a Raspberry Pi. Such a display can be used for many purposes, for example to display home automation data as described here: [[RaspEink FHEM]] |
== Hardware == | == Hardware == | ||
− | * Raspberry Pi Model B | + | * Raspberry Pi Model B or Raspberry Pi 2 Model B |
* [http://www.embeddedartists.com/products/displays/lcd_27_epaper.php 2.7 inch E-Paper display from Embedded Artists] | * [http://www.embeddedartists.com/products/displays/lcd_27_epaper.php 2.7 inch E-Paper display from Embedded Artists] | ||
Line 11: | Line 11: | ||
* Raspian linux from official source | * Raspian linux from official source | ||
− | |||
− | |||
− | |||
* Modified version of the demo driver to send bitmap to display. | * Modified version of the demo driver to send bitmap to display. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Step 1: Setup the Hardware and test it == | == Step 1: Setup the Hardware and test it == | ||
Line 28: | Line 18: | ||
http://www.embeddedartists.com/products/displays/lcd_27_epaper.php | http://www.embeddedartists.com/products/displays/lcd_27_epaper.php | ||
− | The document describes how to connect the display to the Raspberry, download, compile and run the demo software and driver. The demo software simply loops between two static logos. Once this works, we are ready | + | The demo driver used at the time of writing is called '''epaper_pi_130307.tar.gz''' |
+ | |||
+ | The document describes how to connect the display to the Raspberry, download, compile and run the demo software and driver. The demo software simply loops between two static logos. Once this works, we are ready to... | ||
== Step 2: Modify the driver to accept external bitmaps == | == Step 2: Modify the driver to accept external bitmaps == | ||
Line 38: | Line 30: | ||
You can download the modified source file here: [http://www.pozor.ch/raspeink/raspeink_main.c raspeink_main.c]. Rename it to main.c and replace the original file from Step 1. | You can download the modified source file here: [http://www.pozor.ch/raspeink/raspeink_main.c raspeink_main.c]. Rename it to main.c and replace the original file from Step 1. | ||
− | == Step 3: Compile the modified source code | + | == Step 3: Compile the modified source code == |
With the main.c file replaced, we have to compile again as described in the PDF guide from Step 1. Make sure you are in the same directory as main.c and type: | With the main.c file replaced, we have to compile again as described in the PDF guide from Step 1. Make sure you are in the same directory as main.c and type: | ||
Line 46: | Line 38: | ||
</pre> | </pre> | ||
+ | == Step 4: Use it == | ||
+ | |||
+ | Test the new driver by running it without any parameter: | ||
+ | |||
+ | <pre> | ||
+ | sudo ./epaper | ||
+ | </pre> | ||
+ | |||
+ | It should display lorem ipsum text on the display, with a thin black border around it. | ||
+ | |||
+ | You can now pass your own BMP as a parameter. | ||
+ | '''The BMP needs to have a width of 264 pixel, a height of 176 pixels and it needs to be monochrome (1 bit per pixel)''' | ||
+ | |||
+ | <pre> | ||
+ | sudo ./epaper yourimage.bmp | ||
+ | </pre> | ||
== main.c changes explained == | == main.c changes explained == | ||
− | Here is a quick | + | Here is a quick explanation on what the main.c does: |
First, the following variables and local function were introduced: | First, the following variables and local function were introduced: | ||
Revision as of 21:11, 26 March 2015
Contents
Introduction
The aim of the RaspEink project is to drive a small e-Paper display with a Raspberry Pi. Such a display can be used for many purposes, for example to display home automation data as described here: RaspEink FHEM
Hardware
- Raspberry Pi Model B or Raspberry Pi 2 Model B
- 2.7 inch E-Paper display from Embedded Artists
Software Overview
- Raspian linux from official source
- Modified version of the demo driver to send bitmap to display.
Step 1: Setup the Hardware and test it
Follow the excellent guide "Epaper_RaspberryPi.pdf" from Embedded Artists which can be downloaded from their website: http://www.embeddedartists.com/products/displays/lcd_27_epaper.php
The demo driver used at the time of writing is called epaper_pi_130307.tar.gz
The document describes how to connect the display to the Raspberry, download, compile and run the demo software and driver. The demo software simply loops between two static logos. Once this works, we are ready to...
Step 2: Modify the driver to accept external bitmaps
With the demo software working, it is time to modify the source code to make it load a BMP instead of the static logos. Please note that the modifications described below are only for educational purposes. Try them at your own risk. I assume no responsibility for any damage done by using these modifications nor do I guarantee that the modifications work.
The only modifications to the code were done in main.c.
You can download the modified source file here: raspeink_main.c. Rename it to main.c and replace the original file from Step 1.
Step 3: Compile the modified source code
With the main.c file replaced, we have to compile again as described in the PDF guide from Step 1. Make sure you are in the same directory as main.c and type:
make
Step 4: Use it
Test the new driver by running it without any parameter:
sudo ./epaper
It should display lorem ipsum text on the display, with a thin black border around it.
You can now pass your own BMP as a parameter. The BMP needs to have a width of 264 pixel, a height of 176 pixels and it needs to be monochrome (1 bit per pixel)
sudo ./epaper yourimage.bmp
main.c changes explained
Here is a quick explanation on what the main.c does: First, the following variables and local function were introduced:
/****************************************************************************** * Local Functions *****************************************************************************/ uint8_t filebuffer[176][36] = {}; uint8_t buffer[176][33] = {}; void readfile(FILE *f) { int x,y; fseek(f, 62, SEEK_SET); fread(filebuffer, 1, 176*36, f); fclose(f); for(x=0; x<=176; ++x) { for(y=0; y<=33; ++y) { buffer[x][y] = ~filebuffer[175-x][y]; } } }
filebuffer will hold the BMP after it is loaded. buffer will hold the final image. With fseek we go to a specific postion in the file, more precisely to the start of the actual pixel data. This postion (62 in our case) depends on the version of BMP used. There are several versions and which one is used largely depends on the image manipulation software. The Wikipedia article about the BMP file format gives a nice overview.
For the purpose of this software we are using monochrome BMP (i.e. with 1 bit per pixel). A test bitmap can be downloaded here. Such BMP can be created in GIMP for example by reducing the number of indexed colors to 2. After saving the bitmap, it is a good idea to open it in a Hex editor and verify the offset of the pixel data. This value is stored in position 0x0Ah. If it is not 62 (0x3Eh), you need to adjust this value above. If you don't, the image might show a shift.
The software currently does not check whether the BMP format is OK.
The for loops then simply flip and invert the pixel data.
The main method can then be replaced completely by this one:
/****************************************************************************** * Main method *****************************************************************************/ int main(int argc, char *argv[]) { uint8_t* pOldImg; char* path = ""; FILE *f = NULL; if(argc == 1) { path = "testimage.bmp"; printf("No file specified, loading testimage.bmp\n"); f = fopen(path, "rb"); } if(argc == 2) { path = argv[1]; printf("Loading %s\n", path); f = fopen(path, "rb"); if(f == NULL) { printf("File not found, loading testimage.bmp\n"); path = "testimage.bmp"; f = fopen(path, "rb"); } } bsp_init(); readfile(f); memset((uint8_t*)&PreloadImage[0][0], 0xff, 176*33); pOldImg = (uint8_t*)&PreloadImage[0][0]; printf("Sending Image...\n"); epd_DisplayImg(DISPLAY_IN_USE, (uint8_t*)&buffer[0][0], pOldImg); pOldImg = (uint8_t*)&buffer[0][0]; printf("Done.\n"); return 1; }
== Step 3:
The functions above simply load the file after doing some basic error checks. If no file is mentioned as a parameter or the file is not found, a test bitmap is loaded (the bitmap can be downloaded here).
If all compiles well, you can use the software now to load your own bitmap:
sudo ./epaper yourbitmap.bmp