Arduino-s RGB LED-es esti játék

Ma esti kis szösszenet:

http://www.youtube.com/watch?v=C2XjJ230LeM

Kallódott a dobozomban egy RGB LED, rákötöttem hát az Arduino három PWM kimenetére egy-egy soros ellenállással. A próbapanelen lévő többi alkatrész csak a kóbor turisták megtévesztésére van!

A main loopban egy végtelen ciklusban állítom a színt, HSL formában. A wikipedia http://en.wikipedia.org/wiki/HSL_and_HSV#From_HSV szócikke alapján írtam egy kis függvényt, ami átalakítja a HSL-t RGB-be. Főleg ezt az ábrát használtam:

HSV-RGB conversion (source: wikipedia)

HSV-RGB átalakítás

A végleges kód pedig így néz ki:

void setup() {
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 Serial.begin(9600);
}

struct Color {
 byte r;
 byte g;
 byte b;
} color;

struct HSL {
 byte h;
 byte s;
 byte l;
} hslcolor;

void applyColor(struct Color color) {
 analogWrite(2, color.r);
 analogWrite(3, color.g);
 analogWrite(4, color.b);
}

struct Color hslToRgb(struct HSL hsl) {
 Color rgb;
 int temp;
 byte top = hsl.l;
 temp = (hsl.l * (255 - hsl.s));
 byte bottom = (byte) (temp / 255);

 byte cont = top - bottom;

 byte mod = hsl.h % 43;
 byte segment = hsl.h / 43;
 temp = mod * cont;
 byte x = (byte) (temp / 43);

 switch (segment) {
 case 0:
 rgb.r = top;
 rgb.g = bottom + x;
 rgb.b = bottom;
 break;
 case 1:
 rgb.r = top - x;
 rgb.g = top;
 rgb.b = bottom;
 break;
 case 2:
 rgb.r = bottom;
 rgb.g = top;
 rgb.b = bottom + x;
 break;
 case 3:
 rgb.r = bottom;
 rgb.g = top - x;
 rgb.b = top;
 break;
 case 4:
 rgb.r = bottom + x;
 rgb.g = bottom;
 rgb.b = top;
 break;
 case 5:
 rgb.r = top;
 rgb.g = bottom;
 rgb.b = top - x;
 break;
 default:
 rgb.r = 0;
 rgb.g = 0;
 rgb.b = 0;
 }

 return rgb;
}

boolean dc = false; // dc for downcount
byte j = 0;
byte i = 0;

void loop() {
 hslcolor.h = i;
 hslcolor.s = 213;
 hslcolor.l = 255-j;

 color = hslToRgb(hslcolor);
 applyColor(color);

#ifdef DEBUG
 Serial.print("\t H: ");
 Serial.print(hslcolor.h, DEC);
 Serial.print("\t S: ");
 Serial.print(hslcolor.s, DEC);
 Serial.print("\t L: ");
 Serial.print(hslcolor.l, DEC);

 Serial.print("\t R: ");
 Serial.print(color.r, DEC);
 Serial.print("\t G: ");
 Serial.print(color.g, DEC);
 Serial.print("\t B: ");
 Serial.println(color.b, DEC);
#endif

 i++;
 if (i == 255) {
 if (j == 255) {
 dc = true;
 }

 if (j == 0) {
 dc = false;
 }

 if (dc) {
 j--;
 } else {
 j++;
 }
 }
 delay(32);
}

A soros kommunikációs rész csak debug célokat szolgált. A float-os megoldás nem igazán akart működni, meg nem is nagyon szeretjük ezen a procikon a float-ot, mert nincs bennük FPU. Persze alapvetően osztani sem szeretünk nem-kettő-hatvánnyal, úgyhogy még lehet reszelni a kódon, de így működik szépen.

Nagyon tetszik ez az Arduino.

This entry was posted in experiments and tagged , , . Bookmark the permalink.

2 Responses to Arduino-s RGB LED-es esti játék

  1. Pingback: Some useless RGB LED experiment w/ Arduino | AStech blog

  2. Arduino Shop says:

    A témához kapcsolódóan: szeretnénk egy kisebb Arduino-s közösséget kialakítani, illetve indítottunk egy blogot, ahol Arduino-val kapcsolatos leírásokat tervezünk írni: http://arduino.blog.hu. Illete készítettünk egy webáruházat is, Arduino-k egyszerűbb beszerzése végett: http://ardusop.hu.

Leave a Reply

Your email address will not be published. Required fields are marked *