Jukebox Lights: Serial Comms Prototype

I’ve just finished a working prototype for the Jukebox lighting control, doesn’t look like much at the minute but with the right RGB LED driver in place (I’m thinking three logic level MOSFETs may do the job) then this project is only a wiring job and a glue gun away from installation!  The C# code sends RGB as a percentage along with a value for brightness, also a percentage.  So, to get the brightest red colour send redByte and brightness as 100 and the rest as 0.  Mix, match and repeat.

I played with the colour picker control, some conversion is required though I gave up on the idea as PC RGB and LED RGB don’t match up quite the same.  My method works and is good enough for me.  The Arduino code uses a switch case for the incoming command, colour changing is “101” and I’m planning on adding others along the road.  Maybe a default dimmer for when video is playing and so on…  Time will tell.

image IMAG0155

This is a combo of two programs, the code on the Arduino and a C# program sending control signals from the PC via serial.  Code snippets for both are below;

Arduino

//      Pin Assignments
int rPin = 9;
int gPin = 10;
int bPin = 11;
int potPin = 0;

//      Global Variables
float red = 0;
float green = 0;
float blue = 0;
float brightness = 0;
int command;

void setup()
{
pinMode(rPin, OUTPUT);
pinMode(gPin, OUTPUT);
pinMode(bPin, OUTPUT);
Serial.begin(9600);
}

void loop()
{
while (Serial.available() > 0)
{
command = Serial.read();
switch (command)      //  Planning ahead for multiple commands to be sent, add another case for others
{
case 101:
red = Serial.read();
green = Serial.read();
blue = Serial.read();
brightness = Serial.read();
//  Code for debugging Serial
Serial.print(“Colour – “);
Serial.print(“Red: “); Serial.print(red); Serial.println();
Serial.print(“Green: “); Serial.print(green); Serial.println();
Serial.print(“Blue: “); Serial.print(blue); Serial.println();
Serial.print(“Brightness: “); Serial.print(brightness); Serial.println();
Serial.println(red / 100);
red = (255 * (red / 100)) * (brightness / 100);
Serial.println(brightness / 100);
green = (255 * (green / 100)) * (brightness / 100);
blue = (255 * (blue / 100)) * (brightness / 100);
break;
}
}
analogWrite(rPin, red);
analogWrite(gPin, green);
analogWrite(bPin, blue);
delay(75);
}

 

C# Code (SendData and Print only)

private void SendData()
{
byte cmdByte, redByte, blueByte, greenByte, brightByte = 0;
byte[] command = new byte[5];

cmdByte = Convert.ToByte(101);
redByte = Convert.ToByte(nudRed.Value);
greenByte = Convert.ToByte(nudGreen.Value);
blueByte = Convert.ToByte(nudBlue.Value);
brightByte = Convert.ToByte(nudBrightness.Value);

command[0] = cmdByte;
command[1] = redByte;
command[2] = greenByte;
command[3] = blueByte;
command[4] = brightByte;

try
{
prtSerial.Write(command, 0, 5);
}
catch
{
MessageBox.Show(“He no work!”);
}
}

private void btnPrint_Click(object sender, EventArgs e)
{
lbInc.Items.Clear();
try
{
if (prtSerial.BytesToRead == 0)
lbInc.Items.Add(“No Data”);

while (prtSerial.BytesToRead > 0)
{
lbInc.Items.Add(prtSerial.ReadLine());
}
}
catch
{
// do nothing
}
}

I’m hoping to have the driver built next week and hopefully the lights installed this coming weekend.  With the weather as it is it all depends on when I get get the parts delivered.  Next up is the Media Centre add-in to control the lights.  Should be a matter of UI code though as C# is a supported language for MC SDK.

Keegan

Leave a Reply