I just could NOT get the second modification working using the Project 5 (and sometimes Project 6) code... no matter how I modified it, I could not seem to find a way to tweak the code just a little bit to "bounce the ball." My best guess was that it would involve some sort of counter that would limit the value that CurrentLED would count up to each time (reducing it from 9... to 8... to 7...) but again... no luck with that.
So... I decided to simply hard code it to do what I wanted. I kept the array (see screenshot of my code) but got rid of much of the variables, including the CurrentLED variable, and went straight to a set of embedded FOR loops that would first loop 9 times (for nine LEDs - the ball bouncing up)... then 1... then 2... I created a variable called bounce that would simply decrement in the code every time the second loop (the ball dropping) finished. Probably not the most elegant solution, but it worked. You can download my code modification here.
I welcome my readers to share their code if they managed to perform the 2nd modification on page 58 using a different method... I'd love to see a few other programming techniques if anyone wants to share.
Sunday, January 30, 2011
Subscribe to:
Post Comments (Atom)
What if you had a second array that contained [10, 9, 8, 7, etc...]? And that's all I'm gonna say.
ReplyDeleteI actually tried something like that (going on the idea that my mod #1 program also consisted of two arrays)... but even with two arrays, I couldn't figure out how to reduce the maximum size of an array using a loop or other technique.
ReplyDeleteHow about using a Sine Wave to get a more realistic bounce? ;)
ReplyDeleteThat's a good idea... if anyone tries it and cares to shoot some video, let me know and I'll be happy to share the results here.
ReplyDeleteI used another variable to keep track of the height that it should bounce to, decrementing it each time it reached that height and eventually setting it back to the max:
ReplyDeletebyte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ledDelay;
int direction = 1;
int currentLed = 0;
int maxHeight = 9;
unsigned long changeTime;
int potPin = 2;
void changeLED() {
for (int i = 0; i < 10; i++) {
digitalWrite(ledPin[i], LOW);
}
digitalWrite(ledPin[currentLed], HIGH);
currentLed += direction;
if (currentLed >= maxHeight && direction > 0) {
maxHeight--;
direction = -1;
if (maxHeight == 0) {
maxHeight = 9;
}
}
if (currentLed == 0) {
direction = 1;
}
}
void setup() {
for (int i = 0; i < 10; i++) {
pinMode(ledPin[i], OUTPUT);
}
changeTime = millis();
}
void loop() {
ledDelay = analogRead(potPin);
if ((millis() - changeTime) > ledDelay) {
changeLED();
changeTime = millis();
}
}
Hi,
ReplyDeleteI did it this way. It was hard to figure out, took the hole evening, but I think I got a quite good looking code:
// Project 5 - LED Chase Effect
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay(65); // delay between changes
int direction = 1;
int currentLED = 0;
int bounce = 9; // first place to change direction
unsigned long changeTime;
void setup() {
for (int x=0; x<10; x++) { // set all pins to output
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
void loop() {
if ((millis() - changeTime) > ledDelay) { // if it has been ledDelay ms since last change
changeLED();
changeTime = millis();
} //end of if-case
} // end of void loop
void changeLED() {
for (int x=0; x<10; x++) { // turn off all LED's
digitalWrite(ledPin[x], LOW);}
digitalWrite(ledPin[currentLED], HIGH); // turn on the current LED
currentLED += direction; // increment by the direction value
// change direction if we reach the end
if (currentLED == bounce)
{direction = -1;}
if (currentLED == 0)
{direction = 1;
bounce -=1;}
if (bounce == 0)
{bounce = 9;}
} //end of void changeLED
we've got another option:
ReplyDelete// Beginning Arduino
// Arduino Básico
// Project 6 - exercise 2
// Projeto 6 - exercício 2
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // Create array for LED pins
int ledDelay(300); // delay between changes
int currentLED = 0;
int bounce = 9; // first place to change direction
unsigned long changeTime;
void setup() {
for (int x=0; x<10; x++) { // set all pins to output
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
void loop() {
if ((millis() - changeTime) > ledDelay) { // if it has been ledDelay ms since last change
changeLED();
changeTime = millis();
} //end of if-case
} // end of void loop
void changeLED() {
for (int x=0; x<10; x++) { // turn off all LED's
digitalWrite(ledPin[x], LOW);}
digitalWrite(ledPin[currentLED], HIGH); // turn on the current LED. In the first loop the currentLED = 0
if (currentLED == 0) // if the current led is 0
{currentLED = bounce; bounce -=1;} // change current led to bounce and than sets bouce as bounce - 1
else
{currentLED = 0;}// if the current led is any number except 0, change the current led to 0
if (bounce == 0) // if bounce is 0
{bounce = 9;} // change bounce to 9 to close the cycle...
}
This is the way I solved it:
ReplyDeletebyte ledPin[] = { 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int ledDelay(65);
int direction = 1;
int currentLED = 0;
int bounce = 9;
unsigned long changeTime;
void setup()
{
for (int x=0; x<10; x++) {
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
void loop()
{
if ((millis() - changeTime) > ledDelay) {
changeLED();
changeTime = millis();
}
}
void changeLED() {
for (int x=0; x<10; x++) {
digitalWrite(ledPin[x], LOW);
}
if (currentLED <= bounce)
{ digitalWrite(ledPin[currentLED], HIGH);
}
// if at bottom, set direction up i.e. +1
if ( currentLED == 0 ) {direction = 1;}
// if at top, set direction down i.e. -1
if (currentLED == bounce) {direction = -1;}
// inc direction
currentLED += direction;
// if at bottom, reduce bounce height
if ( currentLED == 0 ) {bounce-=1;}
if (bounce==0) bounce=9;
}
First, this blog is awesome.. I was stumped on both the project 6 exercises, having no previous programming at all..
ReplyDeleteSecond, I wanted to take this a step further by adding an increasing bounce once it hits the bottom. I have tried doing it with a 2nd array and function, but it seems like it just skips the function call and resets the bounce to 9..
Any ideas? This is what I tried...
// Project 6b - LED Chase Effect (Larson Scanner)
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; //Create array for LED pins
byte ledPin2[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; //Create array for bounce increase
int ledDelay; // delay between changes
int direction = 1;
int currentLED = 0;
int bounce = 9; //max height
int potPin = 2; //select the input pin for the potentiometer
int bounce2 = 0; // max increase
unsigned long changeTime;
void setup() {
for (int x=0; x<10; x++) { //set all pints to output
pinMode(ledPin[x], OUTPUT); }
changeTime = millis();
}
void loop() {
ledDelay = analogRead(potPin); // read the value from the pot
if ((millis() - changeTime) > ledDelay) { //if it has been ledDelay ms since last change
changeLED();
changeTime = millis();
}
}
void changeLED() {
for (int x=0; x<10; x++) { // turn off all LED's
digitalWrite(ledPin[x], LOW);
}
digitalWrite(ledPin[currentLED], HIGH); // turn on the current LED
currentLED += direction; // increment by the direction value
//change direction when we reach the ends
if (currentLED == bounce) {direction = -1;}
if (currentLED == 0) {direction = 1;}
// bounce parameters
if (currentLED == 0) {bounce -= 1;} // reduce bounce when at bottom
if (bounce == 0) {
bounce = 9; // bounce effect reset
bounceUp; // function call to increase bounce
}
}
void bounceUp() {
for (int x=0; x<10; x++) { // turn off all LED's
digitalWrite(ledPin2[x], LOW);
}
digitalWrite(ledPin2[currentLED], HIGH); // turn on the current LED
currentLED += direction; // increment by the direction value
//change direction when we reach the ends
if (currentLED == bounce2) {direction = -1;}
if (currentLED == 0) {direction = 1;}
// bounce parameters
if (currentLED == 0) {bounce2 += 1;} // reduce bounce when at bottom
if (bounce2 == 9) {
bounce2 = 0; // bounce up 0
changeLED();
}
}
\\this code worked for me
ReplyDelete\\NOTICE: I have used 7 LED's
byte ledPin[] = {4,5,6,7,8,9,10}; \\array called ledPin of type byte
int ledDelay=100, currentLed=6, direction_=1, mHeight=6; \\mHeight for max height
unsigned long changeTime;
void setup() {
for (int x=0;x<7;x++) {
pinMode(ledPin[x],OUTPUT);
}
changeTime= millis();
}
void loop() {
if ((millis()-changeTime)>ledDelay) {
ledBallBounce();
changeTime=millis();
}
}
void ledBallBounce() {
for (int x=0;x<7;x++) {
digitalWrite(ledPin[x],LOW); } \\set all pins to low mode when starting this function
digitalWrite(ledPin[currentLed],HIGH);
currentLed-=direction_; \\decrementing the value of currentLed by 1
if(currentLed==0) { direction_=-1;
if(mHeight != 0) { mHeight--; } } \\if max Height is not zero when currentLed is zero decrement its value by 1
if( (mHeight==0) && (currentLed==0 ) ) { currentLed=6; mHeight=6; }
\\However, if both maxHeight and currentLed are zero set currentLed to 6
if(currentLed==mHeight) {direction_=1;}
}