Difference between revisions of "Projets:Perso:2013:RaspEink"

From Electrolab
Jump to: navigation, search
(Introduction)
(Software Overview)
Line 21: Line 21:
 
[[File:RaspEink_diagram.jpg]]
 
[[File:RaspEink_diagram.jpg]]
  
The central piece of software is the Python program (piper.py). It processes the logfiles that are created by FHEM and extracts all required information (temperatures, valve positions, humidity and burner status). It then creates a bitmap from this information and saves it to a file. The driver, written in C, loads the BMP and sends it to the display through SPI. A cron job executes the two programs sequentially every 5-minutes.
+
The central piece of software is the Python program (piper.py). It processes the FHEM logfiles and extracts all required information (temperatures, valve positions, humidity and burner status). It then creates a bitmap from this information and saves it to a file. The driver, written in C, loads the BMP and sends it to the display through SPI. A cron job executes the two programs sequentially every 5-minutes.
  
 
== Hardware Setup and Test ==
 
== Hardware Setup and Test ==

Revision as of 20:27, 20 May 2014

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. Here we will create a status display for FHEM, a well known home automation software.

Hardware

Software Overview

  • Raspian linux from official source
  • FHEM home automation software
  • Perl, required to run FHEM
  • Python for extraction of data from logfile and generation of a bitmap
  • Modified version of the demo driver to send bitmap to display.


Software diagram:

RaspEink diagram.jpg

The central piece of software is the Python program (piper.py). It processes the FHEM logfiles and extracts all required information (temperatures, valve positions, humidity and burner status). It then creates a bitmap from this information and saves it to a file. The driver, written in C, loads the BMP and sends it to the display through SPI. A cron job executes the two programs sequentially every 5-minutes.

Hardware Setup and Test

The display is wired exactly as described in 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 document also describes how to download, compile and run the demo software and driver. The demo software simply loops between two static logos.


Driver: Modifying Demo Code to Display Custom BMP

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.

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;
}

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

piper.py: Generating BMP