2014年7月5日土曜日

Adafruit 8×8 LEDをRaspberry Piで使ってみた

今回は完全に電子工作マニアブログと化しています。

Adafruitの8×8のLED Matrixを購入。I2Cでコントロールするデバイスです。
商品はこちら

この部品のI2Cのコマンドを叩くためのマニュアルを探したのですが、Arduino用のサンプルコードしか見つかりません。
そこで、そのコードを見ながら、自分のRaspberry Pi環境にかなり強引に移植してみました。内容は全然保証しません。もし変なところを見つけたら教えて下さい。

このコードで、LEDを使ってひらがなの「ま」という文字を出してみたのが以下の写真。



ということで、サンプルコードを以下に示します。
mainのプログラムから、initAda88() を呼んだ後、writeMark() を呼べばいろいろなパターンを書けます。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sched.h>
#include <errno.h>
#include <getopt.h>
#include <fcntl.h>

#include <linux/i2c-dev.h>

#include <sys/ioctl.h>
#include <unistd.h>
#include <math.h>

 #define  I2CSLAVE_ I2C_SLAVE

//-------------------------------------------------------------------------
//   Variables
//-------------------------------------------------------------------------
static int i2cDscript;       // file discripter

//-------------------------------------------------------------------------
//   Constants
//-------------------------------------------------------------------------
static unsigned char LED_ADA88_ADDRESS = 0x70;

//-------------------------------------------------------------------------
//   I2c Device Access Functions
//-------------------------------------------------------------------------
void initI2c( void )
{
    const char *fileName = "/dev/i2c-1"; // I2C Drive File name
 
 // Pressure Sensor
    printf("***** start i2c *****\n");
 
    // Open I2C port with Read/Write Attribute
    if ((i2cDscript = open(fileName, O_RDWR)) < 0){
        printf("Faild to open i2c port\n");
        exit(1);
    }
}

//-------------------------------------------------------------------------
//   Adafruit LED 8*8 matrix (I2c Device)
//-------------------------------------------------------------------------
#define HT16K33_BLINK_CMD 0x80
#define HT16K33_BLINK_DISPLAYON 0x01
#define HT16K33_BLINK_OFF 0
#define HT16K33_BLINK_2HZ  1
#define HT16K33_BLINK_1HZ  2
#define HT16K33_BLINK_HALFHZ  3
#define HT16K33_CMD_BRIGHTNESS 0xE0
#define MATRIX_MAX 8

//-------------------------------------------------------------------------
void accessAda88( void )
{
 int  address = LED_ADA88_ADDRESS;  // I2C
 
 // Set Address
 if (ioctl(i2cDscript, I2CSLAVE_, address) < 0){
  printf("Unable to get bus access to talk to slave(LED Matrix)\n");
  exit(1);
 }
}
//-------------------------------------------------------------------------
void writeAda88( unsigned char* bitPtn )
{
 unsigned char buf[MATRIX_MAX*2+1];
 int  i;
 
 buf[0] = 0;         // Commands for performing a ranging
 for ( i=0; i<MATRIX_MAX; i++ ){
  buf[i*2+1] = *(bitPtn+i);
  buf[i*2+2] = 0;
 }
 
 if ((write(i2cDscript, buf, MATRIX_MAX*2+1)) != MATRIX_MAX*2+1) { // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }
}
//-------------------------------------------------------------------------
void initAda88( void )
{
 unsigned char bitPtnClr[MATRIX_MAX] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 unsigned char cmd;
 
 accessAda88();
 cmd = 0x21;
 if ((write(i2cDscript, &cmd, 1)) != 1) {   // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }

 cmd = HT16K33_BLINK_CMD|HT16K33_BLINK_DISPLAYON|(HT16K33_BLINK_OFF<<1);
 if ((write(i2cDscript, &cmd, 1)) != 1) {   // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }

 cmd = HT16K33_CMD_BRIGHTNESS | 0x0f;
 if ((write(i2cDscript, &cmd, 1)) != 1) {   // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }

 writeAda88(bitPtnClr);  // Clear All LEDs
}
//-------------------------------------------------------------------------
void writePattern( unsigned char* bitPtn )
{
 accessAda88();
 writeAda88(bitPtn);
}
//-------------------------------------------------------------------------
void writeMark( int type )
{
 unsigned char bitPtn[2][MATRIX_MAX] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // nothing
  {0x04,0x1f,0x04,0x1f,0x04,0x0f,0x15,0x22} // MA
 };
 writePattern(bitPtn[type]);
}

0 件のコメント:

コメントを投稿