Since I don’t get enough gigs, or any at all, I though I’d make a sound-system so I could go wherever and play a little show. So I decided to build a sound system that was moderately movable and would work of the grid.
Features:
So a featureset that I though was the least I could work with was this: It should be able to work without being connected to an outlet. It should have lights and it shouldn’t be to heavy to move around. Ateast not by a small wagon. And it should be loud. Not Mötorhead loud but loud enough. It should also be cheap enough so that I would not cry if it got trashed or stolen after a few gigs/parties.
Materials:
So what do I need to get this together? some sort of battery, and a way to charge it. Luckily there are these car-starters charger thingys that you should use as help of your car battery dies. I bought one of those. Then a car-stereo I found. One that takes memory cards and USB-sticks and has a line in on the front. To control the lights I needed an Arduino, a few LED’s for the lights (I bought 200) and some sort of measuring the beat so that the lights could be synced to the tempo of the songs. I thought I could use a piezo and do the Arduino knock example, but later experimentation showed that I had to settle for a button-based solution.
The build:
A box takes time to build, and woodworking is not my passion. So I went and gotten a box. It used to house a philips radio, way back when you did not have any TV’s. There was mirrors and everything in that box. but the back was just paper so I had to reinforce it. I mounted the speakers there and also the LED’s. I arranged the LED’s in groups to enhance the amount of light. Half of them are blue and half are white. The LED obscuring part did not work as I thought it should, But the results was OK anyways. As for the tentacle-painting. I don’t know. I like tentacles, not in a Hentai/Manga way, but just the cartoonish style of them.
The Arduino code:
The code is pretty basic. It multiplexes the led’s so that I did not have to add a shift registers. It also reads a button so that I can sync the lights by tapping. the code is pretty self-explanatory.
//tempo variables
byte tempo=120; /* bmp of our sequence */
long rememberMillis=0;
long timeChange=250; /*a variable for calculating how long we are going to wait*/
//The light's stuff
int ledColWhteAndBlueRing[8] = {
6,9,3,5,2,4,10,8 }; //these are the blue led's in order. Why no pin7? why not in order? Lazy at the wrong time I guess
int ledColSmall[8] = {
3,2,9,6,4,8,10,5 };
// tap button
#define tapButton 14
byte tapButtonState;
byte lastTapButtonState = LOW;
long tapOldTime =0;
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
boolean justPressed = false;
byte currentLamp=0;
#define lampChange 100
int lampCounter=0;
float ix=0.0;
float ib=0.0;
float is=0.0;
float ixSpeed=1.0/4.0;
float ibSpeed=1.0/4.0;
float iySpeed=1.0/4.0;
int lampFrame[3][8]=
{
{ 1,0,1,0,1,0,1,0 }
,
{ 0,1,0,1,0,1,0,1 }
,
{ 0,0,0,0,0,0,0,0 }
};
void setup()
{
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
pinMode(tapButton,INPUT);
/*starting the builtin pullup-resistor!*/
digitalWrite(tapButton,HIGH);
for (int i=0; i<8;i++)
pinMode(ledColWhteAndBlueRing[i], OUTPUT);
/*calculating the timeChange variable. milliseconds divided by
tempo and 16th note, or something like that. I dont remember*/
timeChange=((60000/tempo)/8);
rememberMillis = millis();
}
void workSmall()
{
digitalWrite(11,LOW);
for (int i=0; i<8;i++)
if(lampFrame[2][i]==1)
digitalWrite(ledColSmall[i], HIGH); // set the LED on
else
digitalWrite(ledColSmall[i], LOW); // set the LED on
delay(1);
digitalWrite(11,HIGH);
}
void workWhite()
{
digitalWrite(13,LOW); //White
for (int i=0; i<8;i++)
if(lampFrame[1][i]==1)
digitalWrite(ledColWhteAndBlueRing[i], HIGH); // set the LED on
else
digitalWrite(ledColWhteAndBlueRing[i], LOW); // set the LED on
delay(1);
digitalWrite(13,HIGH); //White
}
void workBlue()
{
digitalWrite(12,LOW); //Blue
for (int i=0; i<8;i++)
if(lampFrame[0][i]==1)
digitalWrite(ledColWhteAndBlueRing[i], HIGH); // set the LED on
else
digitalWrite(ledColWhteAndBlueRing[i], LOW); // set the LED on
delay(1);
digitalWrite(12,HIGH); //Blue
}
void moveLamps1()
{
for (int i=0; i<8;i++)
{
lampFrame[0][i]=0;
lampFrame[1][i]=0;
lampFrame[2][i]=0;
}
lampFrame[0][int(ix)]=1;
lampFrame[1][int(ib)]=1;
lampFrame[2][int(is)]=1;
ix+=(ixSpeed);
if (ix>8)
ix=0;
ib+=(ibSpeed);
if (ib>8)
ib=0;
is+=(iySpeed);
if (is>8)
is=0;
}
void moveLamps2()
{
for (int i=0; i<8;i++)
{
if (int(ix)==1)
lampFrame[0][i]=0;
else
lampFrame[0][i]=1;
if (int(is)==1)
lampFrame[1][i]=0;
else
lampFrame[1][i]=1;
if (int(ib)==1)
lampFrame[2][i]=0;
else
lampFrame[2][i]=1;
}
ix+=(ixSpeed);
if (ix>2)
ix=0;
is+=(iySpeed);
if (is>2)
is=0;
ib+=(ibSpeed);
if (ib>2)
ib=0;
}
void moveLamps3()
{
for (int i=0; i<8;i++)
{
lampFrame[0][i]=0;
lampFrame[1][i]=0;
lampFrame[2][i]=0;
}
lampFrame[0][int(ix)]=1;
lampFrame[1][int(ib)]=1;
lampFrame[2][int(is)]=1;
ix-=(ixSpeed);
if ((int)(ix)<0)
ix=7;
ib-=(ibSpeed);
if ((int)(ib)<0)
ib=7;
is-=(iySpeed);
if ((int)(is)<0)
is=7;
}
void checkButtons()
{
int reading = digitalRead(tapButton);
if (reading != lastTapButtonState)
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay)
{
tapButtonState = reading;
if(tapButtonState==true && justPressed==false)
{
//this is the most basic tempo calculation I could think of
justPressed=true;
timeChange= (millis()-tapOldTime)/8;
tapOldTime=millis();
}
else if (tapButtonState == false)
{
justPressed=false;
}
}
lastTapButtonState = reading;
}
void randomizelampSpeed()
{
ix=(rand()%4)+2;
is=(rand()%4)+2;
ib=(rand()%4)+2;
ixSpeed=1.0/((rand()%6)+2);
ibSpeed=1.0/((rand()%6)+2);
iySpeed=1.0/((rand()%6)+2);
}
/*our main baby */
void loop()
{
workSmall();
workWhite();
workBlue();
if( (millis()-rememberMillis) > (timeChange)) //this is one
{
rememberMillis=millis();
switch(currentLamp)
{
case 0:
moveLamps2();
break;
case 1:
moveLamps1();
break;
case 2:
moveLamps3();
break;
default:
break;
}
lampCounter++;
if (lampCounter >= lampChange)
{
currentLamp = rand()%3;
lampCounter =0;
randomizelampSpeed();
}
}
checkButtons();
}