Hello.
I've been fiddling around with this project for a couple of years, never having actually gotten it to work. I am so close now, I can almost taste it.
The idea is to be able to dim any number of LEDs in a 60-lamp matrix. Maybe I'll just dim up and down A7 or maybe I'll want to bring up B4, B5, B6, C3, D8 and F0. It depends upon the arrangement of where the LEDs sit on a prop and the colors of the individual lamps.
I finally decided that I don't have the software chops to do this on a PIC or a vanilla AVR and moved it over to Arduino Duem/328 a few weeks ago. It is just the Arduino, resistors on the rows and a UNL2803 on the columns. I've attached a wiring diagram.
I chose B. Hagman's SoftPWM library (Google Code Archive - Long-term storage for Google Code Project Hosting.) to handle the PWM; I'm not wedded to this library, but it looks pretty good, and I've been able to dim up and down on specific colors (because of the way the LEDs are laid out).
But I don't have a clue how to bring up and down specific lamps perceived to be all at the same time. I want to do patterns, which may mean I'll need to build tables that have the patterns pre-built.
For example, in the code below, I can't make the blue lamp at position A7 (or the first column, eighth lamp) ramp up and down with the other blue lamps.
Here is the code I've cobbled together; I found that if I tried to do the digitalWrites in loops, everything flickered, but by just writing the lines one by one, I got smooth dims:
#include <SoftPWM.h>
byte col = 0;
byte leds[8][8];
// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
int pins[17]= {-1, 5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
// col[xx] of leds
int cols[9] = {pins[0], pins[13], pins[3], pins[4], pins[10], pins[6], pins[11], pins[15], pins[16]};
// row[xx] of leds
int rows[9] = {pins[0], pins[9], pins[14], pins[8], pins[12], pins[1], pins[7], pins[2], pins[5]};
void setup()
{
//Sets the cols pins as output
for (int i = 1; i <= 8; i++)
{
pinMode(cols[i], OUTPUT);
}
//Set up cols
for (int i = 1; i <= 8; i++)
{
digitalWrite(cols[i], LOW);
}
//Initialize SoftPWM
SoftPWMBegin();
// Create and sets row pins
for (int i = 1; i <= 8; i++)
{
SoftPWMSet(rows[i], 0);
}
}
void loop()
{
//alt blue2
for (int b = 1; b <=200; b++)
{
SoftPWMSet(rows[5], b);
SoftPWMSet(rows[6], b);
SoftPWMSet(rows[7], b);
digitalWrite(cols[1], HIGH);
digitalWrite(cols[2], HIGH);
digitalWrite(cols[3], HIGH);
digitalWrite(cols[4], HIGH);
digitalWrite(cols[5], HIGH);
digitalWrite(cols[6], HIGH);
digitalWrite(cols[7], HIGH);
digitalWrite(cols[8], HIGH);
delay(10);
digitalWrite(cols[1], LOW);
digitalWrite(cols[2], LOW);
digitalWrite(cols[3], LOW);
digitalWrite(cols[4], LOW);
digitalWrite(cols[5], LOW);
digitalWrite(cols[6], LOW);
digitalWrite(cols[7], LOW);
digitalWrite(cols[8], LOW);
}
for (int b = 200; b >= 1; b--)
{
SoftPWMSet(rows[5], b);
SoftPWMSet(rows[6], b);
SoftPWMSet(rows[7], b);
digitalWrite(cols[1], HIGH);
digitalWrite(cols[2], HIGH);
digitalWrite(cols[3], HIGH);
digitalWrite(cols[4], HIGH);
digitalWrite(cols[5], HIGH);
digitalWrite(cols[6], HIGH);
digitalWrite(cols[7], HIGH);
digitalWrite(cols[8], HIGH);
delay(10);
digitalWrite(cols[1], LOW);
digitalWrite(cols[2], LOW);
digitalWrite(cols[3], LOW);
digitalWrite(cols[4], LOW);
digitalWrite(cols[5], LOW);
digitalWrite(cols[6], LOW);
digitalWrite(cols[7], LOW);
digitalWrite(cols[8], LOW);
}
SoftPWMSet(rows[5], 0);
SoftPWMSet(rows[6], 0);
SoftPWMSet(rows[7], 0);
//alt green2
for (int g = 1; g <=200; g++)
{
SoftPWMSet(rows[3], g);
SoftPWMSet(rows[4], g);
digitalWrite(cols[1], HIGH);
digitalWrite(cols[2], HIGH);
digitalWrite(cols[3], HIGH);
digitalWrite(cols[4], HIGH);
digitalWrite(cols[5], HIGH);
digitalWrite(cols[6], HIGH);
digitalWrite(cols[7], HIGH);
digitalWrite(cols[8], HIGH);
delay(10);
digitalWrite(cols[1], LOW);
digitalWrite(cols[2], LOW);
digitalWrite(cols[3], LOW);
digitalWrite(cols[4], LOW);
digitalWrite(cols[5], LOW);
digitalWrite(cols[6], LOW);
digitalWrite(cols[7], LOW);
digitalWrite(cols[8], LOW);
}
for (int g = 200; g >= 1; g--)
{
SoftPWMSet(rows[3], g);
SoftPWMSet(rows[4], g);
digitalWrite(cols[1], HIGH);
digitalWrite(cols[2], HIGH);
digitalWrite(cols[3], HIGH);
digitalWrite(cols[4], HIGH);
digitalWrite(cols[5], HIGH);
digitalWrite(cols[6], HIGH);
digitalWrite(cols[7], HIGH);
digitalWrite(cols[8], HIGH);
delay(10);
digitalWrite(cols[1], LOW);
digitalWrite(cols[2], LOW);
digitalWrite(cols[3], LOW);
digitalWrite(cols[4], LOW);
digitalWrite(cols[5], LOW);
digitalWrite(cols[6], LOW);
digitalWrite(cols[7], LOW);
digitalWrite(cols[8], LOW);
}
SoftPWMSet(rows[3], 0);
SoftPWMSet(rows[4], 0);
//alt red
for (int r= 1; r<=200; r++)
{
SoftPWMSet(rows[1], r);
SoftPWMSet(rows[2], r);
SoftPWMSet(rows[8], r);
digitalWrite(cols[1], HIGH);
digitalWrite(cols[2], HIGH);
digitalWrite(cols[3], HIGH);
digitalWrite(cols[4], HIGH);
digitalWrite(cols[5], HIGH);
digitalWrite(cols[6], HIGH);
digitalWrite(cols[7], HIGH);
digitalWrite(cols[8], HIGH);
delay(10);
digitalWrite(cols[1], LOW);
digitalWrite(cols[2], LOW);
digitalWrite(cols[3], LOW);
digitalWrite(cols[4], LOW);
digitalWrite(cols[5], LOW);
digitalWrite(cols[6], LOW);
digitalWrite(cols[7], LOW);
digitalWrite(cols[8], LOW);
}
for (int r= 200; r>= 1; r--)
{
SoftPWMSet(rows[1], r);
SoftPWMSet(rows[2], r);
SoftPWMSet(rows[8], r);
digitalWrite(cols[1], HIGH);
digitalWrite(cols[2], HIGH);
digitalWrite(cols[3], HIGH);
digitalWrite(cols[4], HIGH);
digitalWrite(cols[5], HIGH);
digitalWrite(cols[6], HIGH);
digitalWrite(cols[7], HIGH);
digitalWrite(cols[8], HIGH);
delay(10);
digitalWrite(cols[1], LOW);
digitalWrite(cols[2], LOW);
digitalWrite(cols[3], LOW);
digitalWrite(cols[4], LOW);
digitalWrite(cols[5], LOW);
digitalWrite(cols[6], LOW);
digitalWrite(cols[7], LOW);
digitalWrite(cols[8], LOW);
}
SoftPWMSet(rows[1], 0);
SoftPWMSet(rows[2], 0);
SoftPWMSet(rows[8], 0);
}
}
I'd be interested in hearing theories on how to do what I want with this library or with any other techniques.
Thanks so much.
\dmc