Adafruit: 8x8 Yellow LED Matrix Panel

Revision as of 18:58, 15 October 2012 by Xinyu1991 (talk | contribs)
Jump to: navigation, search


The adafriut 8*8 yellow Led matrix has been used in my mini project 2. I'm using it to display some simple pattern, Chinese characters and even some simple animation.

The code of the project is modified from the sample code provided by Dr. Yoder. And my code has been commited to my github: The github repository of Xinyu Cheng.

Here is a display sample of the Led Matrix:

Display Sample.JPG

Hardware Connection

To ensure the matrix works properly, we need to connect the four pins in the device to the Beagle Bone. Here is a picture for the connection:

Hardware Connection.jpg

As we can see in the picture, the VCC and GND are connected to the VCC and GND in the Bone. And the data pin is connected Pin D18, which is I2C2_SDA. Connect the clock pin to Pin D17, which is I2C2_SCL. After the above connection, the hardware part is done.

Software Design

The mainly work of the software here is to display the correct pattern. And the pattern can be depicted through write a correct value (1 or 0) to each LED in the matrix. 1 means the LED is on and 0 means the LED is off.

For example, the pattern of ❤ can be displayed through the array:

Heart_bmp[]={0x0C, 0x1E, 0x3E, 0x7C, 0x3E, 0x1E, 0x0C, 0x00};

I have write a function to implement the display:

//The Function to Display a BMP.
int display(__u16 bmp[], int res, int daddress, int file)
    int i;     
    for(i=0; i<8; i++)      
    {	block[i] = (bmp[i]&0xfe) >>1 |  
        (bmp[i]&0x01) << 7;     

    res = i2c_smbus_write_i2c_block_data(file, daddress, 16, 	   
    (__u8 *)block);     


Here is the codes in file:

#include <errno.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include "i2c-dev.h"#include "i2cbusses.h"#include "MatrixLed.h"int main(int argc, char *argv[]){	int res, i2cbus, address, size, file;	int value, daddress;	char filename[20];	int force = 0, readback = 1;	int len;	i2cbus = lookup_i2c_bus("3");	printf("i2cbus = %d\n", i2cbus);	if (i2cbus < 0)		help();	address = parse_i2c_address("0x70");	printf("address = 0x%2x\n", address);	if (address < 0)		help();	size = I2C_SMBUS_BYTE;	daddress = 0x21;	if (daddress < 0 || daddress > 0xff) {		fprintf(stderr, "Error: Data address invalid!\n");		help();	}	file = open_i2c_dev(i2cbus, filename, sizeof(filename), 0);	printf("file = %d\n", file);	if (file < 0	 || check_funcs(file, size)	 || set_slave_addr(file, address, force))		exit(1);	switch (size) {	case I2C_SMBUS_BYTE:		daddress = 0x21;	// Start oscillator (page 10)		printf("writing: 0x%02x\n", daddress);		res = i2c_smbus_write_byte(file, daddress);		daddress = 0x81;	// Display on, blinking off (page 11)		printf("writing: 0x%02x\n", daddress);		res = i2c_smbus_write_byte(file, daddress);		daddress = 0xe7;	// Full brightness (page 15)		printf("writing: 0x%02x\n", daddress);		res = i2c_smbus_write_byte(file, daddress);		daddress = 0x00;	// Start writing to address 0 (page 13)		printf("writing: 0x%02x\n", daddress);		res = i2c_smbus_write_byte(file, daddress);		int i;                while(1)                {                     //Display the Square.                         display(Square1_bmp,res,daddress,file);                   display(Square2_bmp,res,daddress,file);                   display(Square3_bmp,res,daddress,file);                   display(Square4_bmp,res,daddress,file);                   display(Square5_bmp,res,daddress,file);                   display(Square6_bmp,res,daddress,file);                   display(Square7_bmp,res,daddress,file);                   //Display Love Heart.                   display(Love1_bmp,res,daddress,file);                   display(Love2_bmp,res,daddress,file);                   display(Love1_bmp,res,daddress,file);                   //Display I love U.                   display(I_bmp,res,daddress,file);                   display(Love1_bmp,res,daddress,file);                                     display(U_bmp,res,daddress,file);                                     //Display the Square.                   display(Square7_bmp,res,daddress,file);                   display(Square6_bmp,res,daddress,file);                   display(Square5_bmp,res,daddress,file);                   display(Square4_bmp,res,daddress,file);                   display(Square3_bmp,res,daddress,file);                   display(Square2_bmp,res,daddress,file);                   display(Square1_bmp,res,daddress,file);                                      //Display Love Heart.                   display(Love1_bmp,res,daddress,file);                   display(Love2_bmp,res,daddress,file);                   display(Love1_bmp,res,daddress,file);                          }		break;	case I2C_SMBUS_WORD_DATA:		res = i2c_smbus_write_word_data(file, daddress, value);		break;	case I2C_SMBUS_BLOCK_DATA:		res = i2c_smbus_write_block_data(file, daddress, len, (const __u8 *)block);		break;	case I2C_SMBUS_I2C_BLOCK_DATA:		res = i2c_smbus_write_i2c_block_data(file, daddress, len, (const __u8 *)block);		break;	default: /* I2C_SMBUS_BYTE_DATA */		res = i2c_smbus_write_byte_data(file, daddress, value);		break;	}	if (res < 0) {		fprintf(stderr, "Error: Write failed\n");		close(file);		exit(1);	}	if (!readback) { /* We're done */		close(file);		exit(0);	}	switch (size) {	case I2C_SMBUS_BYTE:		res = i2c_smbus_read_byte(file);		value = daddress;		break;	case I2C_SMBUS_WORD_DATA:		res = i2c_smbus_read_word_data(file, daddress);		break;	default: /* I2C_SMBUS_BYTE_DATA */		res = i2c_smbus_read_byte_data(file, daddress);	}	close(file);	if (res < 0) {		printf("Warning - readback failed\n");	} else	if (res != value) {		printf("Warning - data mismatch - wrote "		       "0x%0*x, read back 0x%0*x\n",		       size == I2C_SMBUS_WORD_DATA ? 4 : 2, value,		       size == I2C_SMBUS_WORD_DATA ? 4 : 2, res);	} else {		printf("Value 0x%0*x written, readback matched\n",		       size == I2C_SMBUS_WORD_DATA ? 4 : 2, value);	}	exit(0);}