Pages: [1]   Go Down
Author Topic: Yet Another RGB LED N00b  (Read 425 times)
0 Members and 1 Guest are viewing this topic.
New York, NY
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yup, bought a Luxeon RGB from Sparkfun, hooked it to the PWM pins (9,10,11) via a ULN2003, and grabbed one of the many serial RGB sketches available on the web.  
Since I wanted to test it with hyperterminal, I made it a bit more human-friendly, at the cost of taking more time and space.  The platform was an ATMega88 without a bootloader (the one I made didn't work, but I think the problem was the baud rate was off due to the CLKDIV8 being set), with a Dragon and an STK500.
Here is my code for your amusement and edification:
Code:
/*Serially controlled RGB-LED (originally by Roland Grichnik)
 *17.03.2009.  Modified by Robert Diamond 7 Sep 2009
 *inspired by the Serial tutorials and some threads on Arduino-Forum
 *Thanks to mem and AlphaBeta from the Arduino Forum, which made serial communication another bit (if not a byte...) clearer for me!
 */
byte r_pin = 9;
byte g_pin = 10;
byte b_pin = 11;

// number being constructed
byte n = 0;
// 1 = r, 2 = g, 3 = b
byte m = 0;
byte last_n = 0;
enum colorMode {
  MODE_NONE = 128, MODE_R, MODE_G, MODE_B };

void setColor();

void setup() {
  Serial.begin(19200);
  analogWrite(r_pin, 0);
  analogWrite(g_pin, 0);
  analogWrite(b_pin, 0);
  Serial.write("Ready\n");
}

void loop() {  
  if (Serial.available()) {
    byte s = Serial.read();
    
    switch(s) {
      case 'R':
    case 'r':
      if (m) setColor();
      m = MODE_R;
      break;
    case 'G':
    case 'g':
      if (m) setColor();
      m = MODE_G;
      break;
    case 'B':
    case 'b':
      if (m) setColor();
      m = MODE_B;
      break;
    case '6':
    case '7':
    case '8':
    case '9':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
      m &= 0x7f;
      last_n = n;
      if (n >= (26 - (s > '5'))) n = n % 100;
      n = n * 10 + (s - '0');
      break;
    case 8:
      n = last_n;
      last_n = n / 10;
      break;
    case 10:
    case ' ':
    case ';':
    s = 10;
      setColor();
      break;
    default:
      break;
    }
    Serial.write(s);
  }
}

void setColor() {
  const char *c = NULL;
  switch(m) {
  case MODE_R-128:  
  c="red";
    analogWrite(r_pin, n);
    break;
  case MODE_G-128:
  c="green";
    analogWrite(g_pin, n);
    break;
  case MODE_B-128:
  c="blue";
    analogWrite(b_pin, n);
    break;
  }
  if (c) {
    Serial.write("\nSetting ");
    Serial.write(c);
    Serial.write(" to 0x");
    Serial.println(n, HEX);
  }
  m = MODE_NONE;
  last_n = 0;
  n = 0;
}
Logged

New York, NY
Offline Offline
Newbie
*
Karma: 0
Posts: 8
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Now that I've posted, I can tell you that Sparkfun's part page is http://www.sparkfun.com/commerce/product_info.php?products_id=8718.

Also, when I do this 'for real' I'll probably use a NSS40601 (Vce(sat) = .2V) or one of the newer FETs with low Rdson, since the ULN drops about 1.2v, so it's eating up to 1.2W, almost half what the LED uses!
Logged

Pages: [1]   Go Up
Jump to: