Difference between revisions of "Arduino Shield"

From Geeetech Wiki
Jump to: navigation, search
(Document)
 
(5 intermediate revisions by the same user not shown)
Line 13: Line 13:
  
 
==Document==
 
==Document==
[Colorduino library http://www.geeetech.com/Documents/Colorduino%20library.zip]
+
[http://www.geeetech.com/Documents/Colorduino%20library.zip Colorduino library]
  
 
==Usage==
 
==Usage==
Line 23: Line 23:
 
==Example code==
 
==Example code==
 
  #include <Colorduino.h>
 
  #include <Colorduino.h>
 
 
  typedef struct
 
  typedef struct
 
  {
 
  {
Line 30: Line 29:
 
   unsigned char b;
 
   unsigned char b;
 
  } ColorRGB;
 
  } ColorRGB;
 
 
  //a color with 3 components: h, s and v
 
  //a color with 3 components: h, s and v
 
  typedef struct  
 
  typedef struct  
Line 38: Line 36:
 
   unsigned char v;
 
   unsigned char v;
 
  } ColorHSV;
 
  } ColorHSV;
 
 
  unsigned char plasma[ColorduinoScreenWidth][ColorduinoScreenHeight];
 
  unsigned char plasma[ColorduinoScreenWidth][ColorduinoScreenHeight];
 
  long paletteShift;
 
  long paletteShift;
 
 
  //Converts an HSV color to RGB color
 
  //Converts an HSV color to RGB color
 
  void HSVtoRGB(void *vRGB, void *vHSV)  
 
  void HSVtoRGB(void *vRGB, void *vHSV)  
Line 50: Line 46:
 
   ColorRGB *colorRGB=(ColorRGB *)vRGB;
 
   ColorRGB *colorRGB=(ColorRGB *)vRGB;
 
   ColorHSV *colorHSV=(ColorHSV *)vHSV;
 
   ColorHSV *colorHSV=(ColorHSV *)vHSV;
 
 
   h = (float)(colorHSV->h / 256.0);
 
   h = (float)(colorHSV->h / 256.0);
 
   s = (float)(colorHSV->s / 256.0);
 
   s = (float)(colorHSV->s / 256.0);
 
   v = (float)(colorHSV->v / 256.0);
 
   v = (float)(colorHSV->v / 256.0);
 
 
   //if saturation is 0, the color is a shade of grey
 
   //if saturation is 0, the color is a shade of grey
 
   if(s == 0.0) {
 
   if(s == 0.0) {
Line 67: Line 61:
 
     i = (int)(floor(h)); //e.g. 2.7 becomes 2 and 3.01 becomes 3 or 4.9999 becomes 4
 
     i = (int)(floor(h)); //e.g. 2.7 becomes 2 and 3.01 becomes 3 or 4.9999 becomes 4
 
     f = h - i;//the fractional part of h
 
     f = h - i;//the fractional part of h
 
 
     p = (float)(v * (1.0 - s));
 
     p = (float)(v * (1.0 - s));
 
     q = (float)(v * (1.0 - (s * f)));
 
     q = (float)(v * (1.0 - (s * f)));
 
     t = (float)(v * (1.0 - (s * (1.0 - f))));
 
     t = (float)(v * (1.0 - (s * (1.0 - f))));
 
 
     switch(i)
 
     switch(i)
 
     {
 
     {
Line 87: Line 79:
 
   colorRGB->b = (int)(b * 255.0);
 
   colorRGB->b = (int)(b * 255.0);
 
  }
 
  }
 
+
  float dist(float a, float b, float c, float d)  
  float
 
dist(float a, float b, float c, float d)  
 
 
  {
 
  {
 
   return sqrt((c-a)*(c-a)+(d-b)*(d-b));
 
   return sqrt((c-a)*(c-a)+(d-b)*(d-b));
 
  }
 
  }
 
 
 
  void
 
  void
 
  plasma_morph()
 
  plasma_morph()
Line 102: Line 90:
 
   ColorRGB colorRGB;
 
   ColorRGB colorRGB;
 
   ColorHSV colorHSV;
 
   ColorHSV colorHSV;
 
 
   for(y = 0; y < ColorduinoScreenHeight; y++)
 
   for(y = 0; y < ColorduinoScreenHeight; y++)
 
     for(x = 0; x < ColorduinoScreenWidth; x++) {
 
     for(x = 0; x < ColorduinoScreenWidth; x++) {
 
       {
 
       {
value = sin(dist(x + paletteShift, y, 128.0, 128.0) / 8.0)
+
      value = sin(dist(x + paletteShift, y, 128.0, 128.0) / 8.0)
  + sin(dist(x, y, 64.0, 64.0) / 8.0)
+
          + sin(dist(x, y, 64.0, 64.0) / 8.0)
  + sin(dist(x, y + paletteShift / 7, 192.0, 64) / 7.0)
+
          + sin(dist(x, y + paletteShift / 7, 192.0, 64) / 7.0)
  + sin(dist(x, y, 192.0, 100.0) / 8.0);
+
          + sin(dist(x, y, 192.0, 100.0) / 8.0);
colorHSV.h=(unsigned char)((value) * 128)&0xff;
+
        colorHSV.h=(unsigned char)((value) * 128)&0xff;
colorHSV.s=255;  
+
        colorHSV.s=255;  
colorHSV.v=255;
+
        colorHSV.v=255;
HSVtoRGB(&colorRGB, &colorHSV);
+
        HSVtoRGB(&colorRGB, &colorHSV);
+
        Colorduino.SetPixel(x, y, colorRGB.r, colorRGB.g, colorRGB.b);
Colorduino.SetPixel(x, y, colorRGB.r, colorRGB.g, colorRGB.b);
 
 
       }
 
       }
 
   }
 
   }
 
   paletteShift++;
 
   paletteShift++;
 
 
   Colorduino.FlipPage(); // swap screen buffers to show it
 
   Colorduino.FlipPage(); // swap screen buffers to show it
 
  }
 
  }
 
 
  /********************************************************
 
  /********************************************************
 
  Name: ColorFill
 
  Name: ColorFill
Line 141: Line 125:
 
     }
 
     }
 
   }
 
   }
 
+
    Colorduino.FlipPage();
  Colorduino.FlipPage();
 
 
  }
 
  }
 
 
  void setup()
 
  void setup()
 
  {
 
  {
Line 156: Line 138:
 
   unsigned char whiteBalVal[3] = {36,63,63}; // for LEDSEE 6x6cm round matrix
 
   unsigned char whiteBalVal[3] = {36,63,63}; // for LEDSEE 6x6cm round matrix
 
   Colorduino.SetWhiteBal(whiteBalVal);
 
   Colorduino.SetWhiteBal(whiteBalVal);
 
 
 
 
 
   // start with morphing plasma, but allow going to color cycling if desired.
 
   // start with morphing plasma, but allow going to color cycling if desired.
 
   paletteShift=128000;
 
   paletteShift=128000;
 
   unsigned char bcolor;
 
   unsigned char bcolor;
 
 
   //generate the plasma once
 
   //generate the plasma once
 
   for(unsigned char y = 0; y < ColorduinoScreenHeight; y++)
 
   for(unsigned char y = 0; y < ColorduinoScreenHeight; y++)
Line 174: Line 153:
 
       plasma[x][y] = bcolor;
 
       plasma[x][y] = bcolor;
 
     }
 
     }
   
 
 
  // to adjust white balance you can uncomment this line
 
  // to adjust white balance you can uncomment this line
 
  // and comment out the plasma_morph() in loop()
 
  // and comment out the plasma_morph() in loop()
Line 180: Line 158:
 
  // ColorFill(255,255,255);
 
  // ColorFill(255,255,255);
 
  }
 
  }
 
 
  void loop()
 
  void loop()
 
  {
 
  {
 
   plasma_morph();
 
   plasma_morph();
 
  }
 
  }

Latest revision as of 02:54, 29 May 2012

Introductin

The Colorduino is a RGB LED matrix driver platform basis on ATMega 328P. This design is to make user easily modify or write the firmware of Colorduino by Arduino IDE. Colorsduino pairs the M54564 with a single DM163 constant current driver. By using the DM163, the Colors shield gains three 8+6-bit channels of hardware PWM control of the LED’s freeing up the MCU from having to implement it in software. This gives the ATmega more CPU bandwidth for performing other tasks. Colorduino is easy to cascade by IIC and Power interface.

Features

  • 8 bits colors support with 6 bits correction for each color in every dots
  • Hardware 16MHz PWM support
  • Without any external circuits, play and shine
  • Dedicated GPIO and ADC interface
  • Hardware UART and IIC communication with easy cascading
  • 24 constant current channels of 100mA each
  • 8 super source driver channels of 500mA each

Document

Colorduino library

Usage

Power to the board is either via pin headers or a set of mini screw terminals. A slide switch selects between the two. Various Pins are brought out the edge of the board including RX, TX and DTS, which can be connected to FT232 USB adapter to reprogram the onboard ATmega chip, and SCA and SCL for I2C communication. A green LED on the front of the board indicates power


Example code

#include <Colorduino.h>
typedef struct
{
 unsigned char r;
 unsigned char g;
 unsigned char b;
} ColorRGB;
//a color with 3 components: h, s and v
typedef struct 
{
 unsigned char h;
 unsigned char s;
 unsigned char v;
} ColorHSV;
unsigned char plasma[ColorduinoScreenWidth][ColorduinoScreenHeight];
long paletteShift;
//Converts an HSV color to RGB color
void HSVtoRGB(void *vRGB, void *vHSV) 
{
 float r, g, b, h, s, v; //this function works with floats between 0 and 1
 float f, p, q, t;
 int i;
 ColorRGB *colorRGB=(ColorRGB *)vRGB;
 ColorHSV *colorHSV=(ColorHSV *)vHSV;
 h = (float)(colorHSV->h / 256.0);
 s = (float)(colorHSV->s / 256.0);
 v = (float)(colorHSV->v / 256.0);
 //if saturation is 0, the color is a shade of grey
 if(s == 0.0) {
   b = v;
   g = b;
   r = g;
 }
 //if saturation > 0, more complex calculations are needed
 else
 {
   h *= 6.0; //to bring hue to a number between 0 and 6, better for the calculations
   i = (int)(floor(h)); //e.g. 2.7 becomes 2 and 3.01 becomes 3 or 4.9999 becomes 4
   f = h - i;//the fractional part of h
   p = (float)(v * (1.0 - s));
   q = (float)(v * (1.0 - (s * f)));
   t = (float)(v * (1.0 - (s * (1.0 - f))));
   switch(i)
   {
     case 0: r=v; g=t; b=p; break;
     case 1: r=q; g=v; b=p; break;
     case 2: r=p; g=v; b=t; break;
     case 3: r=p; g=q; b=v; break;
     case 4: r=t; g=p; b=v; break;
     case 5: r=v; g=p; b=q; break;
     default: r = g = b = 0; break;
   }
 }
 colorRGB->r = (int)(r * 255.0);
 colorRGB->g = (int)(g * 255.0);
 colorRGB->b = (int)(b * 255.0);
}
float dist(float a, float b, float c, float d) 
{
 return sqrt((c-a)*(c-a)+(d-b)*(d-b));
}
void
plasma_morph()
{
 unsigned char x,y;
 float value;
 ColorRGB colorRGB;
 ColorHSV colorHSV;
 for(y = 0; y < ColorduinoScreenHeight; y++)
   for(x = 0; x < ColorduinoScreenWidth; x++) {
     {
      value = sin(dist(x + paletteShift, y, 128.0, 128.0) / 8.0)
         + sin(dist(x, y, 64.0, 64.0) / 8.0)
         + sin(dist(x, y + paletteShift / 7, 192.0, 64) / 7.0)
         + sin(dist(x, y, 192.0, 100.0) / 8.0);
       colorHSV.h=(unsigned char)((value) * 128)&0xff;
       colorHSV.s=255; 
       colorHSV.v=255;
       HSVtoRGB(&colorRGB, &colorHSV);
       Colorduino.SetPixel(x, y, colorRGB.r, colorRGB.g, colorRGB.b);
     }
 }
 paletteShift++;
 Colorduino.FlipPage(); // swap screen buffers to show it
}
/********************************************************
Name: ColorFill
Function: Fill the frame with a color
Parameter:R: the value of RED.   Range:RED 0~255
         G: the value of GREEN. Range:RED 0~255
         B: the value of BLUE.  Range:RED 0~255
********************************************************/
void ColorFill(unsigned char R,unsigned char G,unsigned char B)
{
 PixelRGB *p = Colorduino.GetPixel(0,0);
 for (unsigned char y=0;y<ColorduinoScreenWidth;y++) {
   for(unsigned char x=0;x<ColorduinoScreenHeight;x++) {
     p->r = R;
     p->g = G;
     p->b = B;
     p++;
   }
 }
   Colorduino.FlipPage();
}
void setup()
{
 Colorduino.Init(); // initialize the board
 
 // compensate for relative intensity differences in R/G/B brightness
 // array of 6-bit base values for RGB (0~63)
 // whiteBalVal[0]=red
 // whiteBalVal[1]=green
 // whiteBalVal[2]=blue
 unsigned char whiteBalVal[3] = {36,63,63}; // for LEDSEE 6x6cm round matrix
 Colorduino.SetWhiteBal(whiteBalVal);
 // start with morphing plasma, but allow going to color cycling if desired.
 paletteShift=128000;
 unsigned char bcolor;
 //generate the plasma once
 for(unsigned char y = 0; y < ColorduinoScreenHeight; y++)
   for(unsigned char x = 0; x < ColorduinoScreenWidth; x++)
   {
     //the plasma buffer is a sum of sines
     bcolor = (unsigned char)
     (
           128.0 + (128.0 * sin(x*8.0 / 16.0))
         + 128.0 + (128.0 * sin(y*8.0 / 16.0))
     ) / 2;
     plasma[x][y] = bcolor;
   }
// to adjust white balance you can uncomment this line
// and comment out the plasma_morph() in loop()
// and then experiment with whiteBalVal above
// ColorFill(255,255,255);
}
void loop()
{
 plasma_morph();
}