ShiftBrite

From Noisebridge
Jump to: navigation, search

Test Code (Simplified Example)

Cycles Red/Green/Blue full on for 4 lights

int datapin  = 11; // DI
int latchpin = 12; // LI
int enablepin = 13; // EI
int clockpin = 15; // CI
unsigned long SB_CommandPacket;
int SB_CommandMode;
int SB_BlueCommand;
int SB_RedCommand;
int SB_GreenCommand;

int shiftDelay = 250;

void setup() {
   pinMode(datapin, OUTPUT);
   pinMode(latchpin, OUTPUT);
   pinMode(enablepin, OUTPUT);
   pinMode(clockpin, OUTPUT);

   digitalWrite(latchpin, LOW);
   digitalWrite(enablepin, LOW);
   
   SB_CommandMode = B01; // Write to current control registers
   SB_RedCommand = 127; // Full current == 127
   SB_GreenCommand = 127;
   SB_BlueCommand = 127;
   SB_SendPacket();

}

void SB_SendPacket() {
   SB_CommandPacket = SB_CommandMode & B11;
   SB_CommandPacket = (SB_CommandPacket << 10)  | (SB_BlueCommand & 1023);
   SB_CommandPacket = (SB_CommandPacket << 10)  | (SB_RedCommand & 1023);
   SB_CommandPacket = (SB_CommandPacket << 10)  | (SB_GreenCommand & 1023);

   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 24);
   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 16);
   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 8);
   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket);

   delay(5); // adjustment may be necessary depending on chain length
   digitalWrite(latchpin,HIGH); // latch data into registers
   delay(5); // adjustment may be necessary depending on chain length
   digitalWrite(latchpin,LOW);
}

void goRed() {
  for (int i = 0; i < 4; i++) {
   SB_CommandMode = B00; // Write to PWM control registers
   SB_RedCommand = 127;
   SB_GreenCommand = 0;
   SB_BlueCommand = 0;
   SB_SendPacket();
  }   
}

void goBlue() {
   for (int i = 0; i < 4; i++) {
     SB_CommandMode = B00; // Write to PWM control registers
     SB_RedCommand = 0;
     SB_GreenCommand = 127;
     SB_BlueCommand = 0;
     SB_SendPacket();
  }  
}

void goGreen() {
   for (int i = 0; i < 4; i++) {
     SB_CommandMode = B00; // Write to PWM control registers
     SB_RedCommand = 0;
     SB_GreenCommand = 0;
     SB_BlueCommand = 127;
     SB_SendPacket();
  }  
}

void loop() {
  goRed();
  delay(shiftDelay);
  goBlue();
  delay(shiftDelay);
  goGreen();
  delay(shiftDelay);
}

Sample Code from macetech (http://macetech.com/blog/node/54)

int datapin  = 10; // DI
int latchpin = 11; // LI
int enablepin = 12; // EI
int clockpin = 13; // CI
unsigned long SB_CommandPacket;
int SB_CommandMode;
int SB_BlueCommand;
int SB_RedCommand;
int SB_GreenCommand;

void setup() {
   pinMode(datapin, OUTPUT);
   pinMode(latchpin, OUTPUT);
   pinMode(enablepin, OUTPUT);
   pinMode(clockpin, OUTPUT);

   digitalWrite(latchpin, LOW);
   digitalWrite(enablepin, LOW);
}

void SB_SendPacket() {
   SB_CommandPacket = SB_CommandMode & B11;
   SB_CommandPacket = (SB_CommandPacket << 10)  | (SB_BlueCommand & 1023);
   SB_CommandPacket = (SB_CommandPacket << 10)  | (SB_RedCommand & 1023);
   SB_CommandPacket = (SB_CommandPacket << 10)  | (SB_GreenCommand & 1023);

   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 24);
   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 16);
   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket >> 8);
   shiftOut(datapin, clockpin, MSBFIRST, SB_CommandPacket);

   delay(1); // adjustment may be necessary depending on chain length
   digitalWrite(latchpin,HIGH); // latch data into registers
   delay(1); // adjustment may be necessary depending on chain length
   digitalWrite(latchpin,LOW);
}

void loop() {

   SB_CommandMode = B01; // Write to current control registers
   SB_RedCommand = 127; // Full current
   SB_GreenCommand = 127; // Full current
   SB_BlueCommand = 127; // Full current
   SB_SendPacket();

   SB_CommandMode = B00; // Write to PWM control registers
   SB_RedCommand = 1023; // Maximum red
   SB_GreenCommand = 0; // Minimum green
   SB_BlueCommand = 0; // Minimum blue
   SB_SendPacket();

   delay(250);

   SB_CommandMode = B00; // Write to PWM control registers
   SB_RedCommand = 0; // Minimum red
   SB_GreenCommand = 1023; // Maximum green
   SB_BlueCommand = 0; // Minimum blue
   SB_SendPacket();

   delay(250);

   SB_CommandMode = B00; // Write to PWM control registers
   SB_RedCommand = 0; // Minimum red
   SB_GreenCommand = 0; // Minimum green
   SB_BlueCommand = 1023; // Maximum blue
   SB_SendPacket();

   delay(250);
}
Personal tools