User login

Powered by Drupal, an open source content management system

Theory and Practice of Tangible User Interfaces

LAB2: Making LEDs FADE

Submitted by eknight on Mon, 09/15/2008 - 17:25

Assignment: Digital I/O with Arduino Boards + Diffuser

Collaborators:

Assignment: Digital I/O with Arduino Boards + Diffuser
Collaborators: eknight

Author: Erin Knight

Description: This exercise involved several steps which I will outline here and then you can see the code and pictures (where applicable) below.

  1. Making the LED "fade" - I made one LED seem to fade by converting to analog and employing pulse width modulation (PWM).
  2. Making 3 LEDs (work and) "fade" - I stepped it up a notch and added 2 more LEDs to my breadboard and then made each of them "fade" like above.
  3. Diffusion - I used various objects/filters to diffuse the colors from the LEDs. Materials I used included a glass globe with packing peanuts in it, plastic from a Target bag, paper towel and a water bottle full of water.
  4. Controlling the LED's through Serial Input - Direct Instruction - For this one, I controlled the brightness of the LEDs by giving a direct instruction through the serial input box. So for example, entering "r127" made the red LED go to 50% brightness.
  5. Controlling LEDs through Serial Input - Parsing Key Repetition - So for this one, instead of direct instructions, I had the trusty computer parse a string input of 'r', 'g', and/or 'b' to increment the brightness by 10 for each letter typed.  So "rrbbgg" would increase each of the LEDs by 20.
  6. Increasing AND Decreasing LED Brightness - Why stop there?  I altered the code so that typing an uppercase letter ('R', 'G', or 'B') increased the brightness by 10, whereas typing a lowercase letter ('r', 'g', or 'b') would decrease the brightness by 20.  So typing "RgB" would increase both the red and blue by 10 and decrease the green by 20. As another example, starting at 50% brightness, or 127, typing "RRr" would result right back at 127 for red (+10, +10, -20) :)

My Board: (see attached pic titled "My Board")

Code for Each:

1. Making the LED "fade":

Code from sample:

// Fading LED 
// by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>

int value = 0;                            // variable to keep the actual value
int ledpin = 9;                           // light connected to digital pin 9
 
void setup()
{
  // nothing for setup
}
 
void loop()
{
  for(value = 0 ; value <= 255; value+=5) // fade in (from min to max)
  {
    analogWrite(ledpin, value);           // sets the value (range from 0 to 255)
    delay(30);                            // waits for 30 milli seconds to see the dimming effect
  }
  for(value = 255; value >=0; value-=5)   // fade out (from max to min)
  {
    analogWrite(ledpin, value);
    delay(30);
  }  
}


2. Making 3 LEDs (work and) "fade"
:

/*
* Code for cross-fading 3 LEDs, red, green and blue, or one tri-color LED, using PWM
* The program cross-fades slowly from red to green, green to blue, and blue to red
* The debugging code assumes Arduino 0004, as it uses the new Serial.begin()-style functions
* Clay Shirky <clay.shirky@nyu.edu>
*/

// Output
int redPin = 9; // Red LED, connected to digital pin 9
int greenPin = 10; // Green LED, connected to digital pin 10
int bluePin = 11; // Blue LED, connected to digital pin 11

// Program variables
int redVal = 255; // Variables to store the values to send to the pins
int greenVal = 1; // Initial values are Red full, Green and Blue off
int blueVal = 1;

int i = 0; // Loop counter
int wait = 50; // 50ms (.05 second) delay; shorten for faster fades
int DEBUG = 0; // DEBUG counter; if set to 1, will write values back via serial

void setup()
{
pinMode(redPin, OUTPUT); // sets the pins as output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
if (DEBUG) { // If we want to see the pin values for debugging...
Serial.begin(9600); // ...set up the serial ouput on 0004 style
}
}

// Main program
void loop()
{
i += 1; // Increment counter
if (i < 255) // First phase of fades
{
redVal -= 1; // Red down
greenVal += 1; // Green up
blueVal = 1; // Blue low
}
else if (i < 509) // Second phase of fades
{
redVal = 1; // Red low
greenVal -= 1; // Green down
blueVal += 1; // Blue up
}
else if (i < 763) // Third phase of fades
{
redVal += 1; // Red up
greenVal = 1; // Green low
blueVal -= 1; // Blue down
}
else // Re-set the counter, and start the fades again
{
i = 1;
}

analogWrite(redPin, redVal); // Write current values to LED pins
analogWrite(greenPin, greenVal);
analogWrite(bluePin, blueVal);

if (DEBUG) { // If we want to read the output
DEBUG += 1; // Increment the DEBUG counter
if (DEBUG > 10) // Print every 10 loops
{
DEBUG = 1; // Reset the counter

Serial.print(i); // Serial commands in 0004 style
Serial.print("\t"); // Print a tab
Serial.print("R:"); // Indicate that output is red value
Serial.print(redVal); // Print red value
Serial.print("\t"); // Print a tab
Serial.print("G:"); // Repeat for green and blue...
Serial.print(greenVal);
Serial.print("\t");
Serial.print("B:");
Serial.println(blueVal); // println, to end with a carriage return
}
}
delay(wait); // Pause for 'wait' milliseconds before resuming the loop
}

3. Diffusion:

Same code as above.  See attached pics...

4. Controlling the LED's through Serial Input:

/* 
* Serial RGB LED
* ---------------
* Serial commands control the brightness of R,G,B LEDs
*
* Command structure is "<colorCode><colorVal>", where "colorCode" is
* one of "r","g",or "b" and "colorVal" is a number 0 to 255.
* E.g. "r0" turns the red LED off.
* "g127" turns the green LED to half brightness
* "b64" turns the blue LED to 1/4 brightness
*
* Created 18 October 2006
* copyleft 2006 Tod E. Kurt <tod@todbot.com
* http://todbot.com/
*/

char serInString[100]; // array that will hold the different bytes of the string. 100=100characters;
// -> you must state how long the array will be else it won't work properly
char colorCode;
int colorVal;

int redPin = 9; // Red LED, connected to digital pin 9
int greenPin = 10; // Green LED, connected to digital pin 10
int bluePin = 11; // Blue LED, connected to digital pin 11

void setup() {
pinMode(redPin, OUTPUT); // sets the pins as output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
analogWrite(redPin, 127); // set them all to mid brightness
analogWrite(greenPin, 127); // set them all to mid brightness
analogWrite(bluePin, 127); // set them all to mid brightness
Serial.println("enter color command (e.g. 'r43') :");
}

void loop () {
//read the serial port and create a string out of what you read
readSerialString(serInString);

colorCode = serInString[0];
if( colorCode == 'r' || colorCode == 'g' || colorCode == 'b' ) {
colorVal = atoi(serInString+1);
Serial.print("setting color ");
Serial.print(colorCode);
Serial.print(" to ");
Serial.print(colorVal);
Serial.println();
serInString[0] = 0; // indicates we've used this string
if(colorCode == 'r')
analogWrite(redPin, colorVal);
else if(colorCode == 'g')
analogWrite(greenPin, colorVal);
else if(colorCode == 'b')
analogWrite(bluePin, colorVal);
}

delay(100); // wait a bit, for serial data
}

//read a string from the serial and store it in an array
//you must supply the array variable
void readSerialString (char *strArray) {
int i = 0;
if(!Serial.available()) {
return;
}
while (Serial.available()) {
strArray[i] = Serial.read();
i++;
}
}

5. Controlling LEDs through Serial Input - Parsing Key Repetition:

/* 
* Serial RGB LED
* ---------------
* Serial commands control the brightness of R,G,B LEDs
*
* Command structure is "<colorCode><colorVal>", where "colorCode" is
* one of "r","g",or "b" and "colorVal" is a number 0 to 255.
* E.g. "r0" turns the red LED off.
* "g127" turns the green LED to half brightness
* "b64" turns the blue LED to 1/4 brightness
*
* Alternate command structure is "<colorCode>*", where "colorCode" is
* one of "r","g", or "b".
* E.g. "r" increases the red LED brightness by 10
* "rrr" increases the red LED brightness by 30
* "ggb" increases the green LED brightness by 20 and the blue by 10
*
* Created 18 October 2006
* copyleft 2006 Tod E. Kurt <tod@todbot.com
* http://todbot.com/
*
* Adapted 5 September 2007
* copylefter 2007 Ryan Aipperspach <ryanaip@alumni.rice.edu>
*
* Further Adapted 13 September 2008
* copylefter 2008 Erin Knight <eknight@ischool.berkeley.edu>
*/

//include support for manipulating strings.
//for a useful string comparison function, see the bottom of this file... stringsEqual()
#include <stdio.h>
#include <string.h>

char serInString[100]; // array that will hold the different bytes of the string. 100=100characters;
// -> you must state how long the array will be else it won't work properly
char colorCode;
int colorVal;

int redPin = 9; // Red LED, connected to digital pin 9
int greenPin = 10; // Green LED, connected to digital pin 10
int bluePin = 11; // Blue LED, connected to digital pin 11

int redValue = 0;
int greenValue = 0;
int blueValue = 0;

void setup() {
pinMode(redPin, OUTPUT); // sets the pins as output
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(9600);
analogWrite(redPin, redValue); // set them all to mid brightness
analogWrite(greenPin, greenValue); // set them all to mid brightness
analogWrite(bluePin, blueValue); // set them all to mid brightness
Serial.println("enter color command (e.g. 'r43 or rrrrrrrrbbbb') :");
}

void loop () {
//read the serial port and create a string out of what you read
readSerialString(serInString, 100);


//read commands of the form 'rrrb'
processRepeatKeyCommands(serInString, 100);

//Erase anything left in the serial string, preparing it for the
//next loop
resetSerialString(serInString, 100);

delay(100); // wait a bit, for serial data
}

void resetSerialString (char *strArray, int length) {
for (int i = 0; i < length; i++) {
strArray[i] = '\0';
}
}

//read a string from the serial and store it in an array
//you must supply the array variable
void readSerialString (char *strArray, int maxLength) {
int i = 0;

if(!Serial.available()) {
return;
}
while (Serial.available() && i < maxLength) {
strArray[i] = Serial.read();
i++;
}
}

//go through the string, and increase the red value for each 'r',
//the green value for each 'g', and the blue value for each 'b'.
//For example "rrrg" increases red by 30 and green by 10.
void processRepeatKeyCommands(char *strArray, int maxLength) {
int i = 0;

//loop through the string (strArray)
//i = the current position in the string
//Stop when either (a) i reaches the end of the string or
// (b) there is an empty character '\0' in the string
while (i < maxLength && strArray[i] != '\0') {
//Read in the character at position i in the string
colorCode = serInString[i];

//If the character is r (red)...
if (colorCode == 'r') {
//Increase the current red value by 10, and if you reach 255 go back to 0
redValue = (redValue + 10) % 255;
analogWrite(redPin, redValue);
Serial.print("setting color r to ");
Serial.println(redValue);

//If the character is g (green)...
} else if (colorCode == 'g') {
greenValue = (greenValue + 10) % 255;
analogWrite(greenPin, greenValue);
Serial.print("setting color g to ");
Serial.println(greenValue);

//If the character is b (blue)...
} else if (colorCode == 'b') {
blueValue = (blueValue + 10) % 255;
analogWrite(bluePin, blueValue);
Serial.print("setting color b to ");
Serial.println(blueValue);
}

//Move on to the next character in the string
//From here, the code continues executing from the "while" line above...
i++;
}
}

6. Increasing AND Decreasing LED Brightness:

 

/* 
* Serial RGB LED
* ---------------
* Serial commands control the brightness of R,G,B LEDs
*
* Command structure is "<colorCode><colorVal>", where "colorCode" is
* one of "r","g",or "b" and "colorVal" is a number 0 to 255.
* E.g. "r0"   turns the red LED off. 
*      "g127" turns the green LED to half brightness
*      "b64"  turns the blue LED to 1/4 brightness
*
* Alternate command structure is "<colorCode>*", where "colorCode" is
* one of "r","g", or "b".
* E.g. "r"    increases the red LED brightness by 10
*      "rrr"  increases the red LED brightness by 30
*      "ggb"  increases the green LED brightness by 20 and the blue by 10
*
* Created 18 October 2006
* copyleft 2006 Tod E. Kurt <tod@todbot.com
* http://todbot.com/
*
* Adapted 5 September 2007
* copylefter 2007 Ryan Aipperspach <ryanaip@alumni.rice.edu>
* Further Adapted 13 September 2008
 * copylefter 2008 Erin Knight <eknight@ischool.berkeley.edu>
 *
 */

 


//include support for manipulating strings.
//for a useful string comparison function, see the bottom of this file... stringsEqual()
//#include <stdio.h>
#include <string.h>

char serInString[100];  // array that will hold the different bytes of the string. 100=100characters;
 // -> you must state how long the array will be else it won't work properly
char colorCode;
int colorVal;

int redPin   = 9;   // Red LED,   connected to digital pin 9
int greenPin = 10;  // Green LED, connected to digital pin 10
int bluePin  = 11;  // Blue LED,  connected to digital pin 11

int redValue = 120;
int greenValue = 120;
int blueValue = 120;

void setup() {
 pinMode(redPin,   OUTPUT);   // sets the pins as output
 pinMode(greenPin, OUTPUT);   
 pinMode(bluePin,  OUTPUT);
 Serial.begin(9600);
 analogWrite(redPin,   redValue);   // set them all to mid brightness
 analogWrite(greenPin, greenValue);   // set them all to mid brightness
 analogWrite(bluePin,  blueValue);   // set them all to mid brightness
 Serial.println("enter color command (NOTE: capital letter = increase, lowercase = decrease e.g. 'RgBrGGG') :");  
}

void loop () {
 //read the serial port and create a string out of what you read
 readSerialString(serInString, 100);

 


processRepeatKeyCommands(serInString, 100);

//Erase anything left in the serial string, preparing it for the
 //next loop
 resetSerialString(serInString, 100);  

delay(100);  // wait a bit, for serial data
}

void resetSerialString (char *strArray, int length) {
 for (int i = 0; i < length; i++) {
 strArray[i] = '\0';
 }
}

//read a string from the serial and store it in an array
//you must supply the array variable
void readSerialString (char *strArray, int maxLength) {
 int i = 0;

if(!Serial.available()) {
 return;
 }
 while (Serial.available() && i < maxLength) {
 strArray[i] = Serial.read();
 i++;
 }
}

//go through the string, and increase the red value for each 'r',
//the green value for each 'g', and the blue value for each 'b'.
//For example "rrrg" increases red by 30 and green by 10.
void processRepeatKeyCommands(char *strArray, int maxLength) {
 int i = 0;

 


//loop through the string (strArray)
 //i = the current position in the string
 //Stop when either (a) i reaches the end of the string or
 //                 (b) there is an empty character '\0' in the string
 while (i < maxLength && strArray[i] != '\0') {
 //Read in the character at position i in the string
 colorCode = serInString[i];

 


//If the character is R (increase red)...
 if (colorCode == 'R') {
 //Increase the current red value by 10, and if you reach 255 go back to 0
 redValue = (redValue + 10) % 255;
 analogWrite(redPin, redValue);
 Serial.print("setting color red to ");
 Serial.println(redValue);

 


//If the character is r (decrease red)
 } else if (colorCode == 'r') {
 redValue = (redValue - 20) % 255;
 analogWrite(redPin, redValue);
 Serial.print("setting color red to ");
 Serial.println(redValue);

 


//If the character is G (increase green)...
 } else if (colorCode == 'G') {
 greenValue = (greenValue + 10) % 255;
 analogWrite(greenPin, greenValue);
 Serial.print("setting color green to ");
 Serial.println(greenValue);

 


//If the character is g (decrease green)
 } else if (colorCode == 'g') {
 greenValue = (greenValue - 20) % 255;
 analogWrite(greenPin, greenValue);
 Serial.print("setting color green to ");
 Serial.println(greenValue);

 


//If the character is B (increase blue)...
 } else if (colorCode == 'B') {
 blueValue = (blueValue + 10) % 255;
 analogWrite(bluePin, blueValue);
 Serial.print("setting color blue to ");
 Serial.println(blueValue);

 


//If the character is r (decrease blue)
 } else if (colorCode == 'b') {
 blueValue = (blueValue - 20) % 255;
 analogWrite(bluePin, blueValue);
 Serial.print("setting color blue to ");
 Serial.println(blueValue);
 }

 


//Move on to the next character in the string
 //From here, the code continues executing from the "while" line above...
 i++;
 }
}