User login

Powered by Drupal, an open source content management system

Theory and Practice of Tangible User Interfaces

Lab 3: Potentiometer

Submitted by katalene on Tue, 12/02/2008 - 23:32

Description

In this lab, I learned how to use a potentiometer. After soldering (first time!) the wires to the pot, I hooked it up to the Arduino board, and played around with the provided code.

The first part involved controlling a single LED with one pot – one program allowed me to control the brightness of the LED and another program allowed me to control the speed in which it blinked.

The second part involved multiple pots and LEDs. The first program used two pots – one to control the brightness of an LED, and the other to control the blinky speed. The second program used three pots to control the brightness of three LEDs.

For the final part of the project, I decided to do something that recombined these programs. I modified the Coffee-Cup Color Mixer program so that one pot would control three LEDs, instead of three pots controlling three separate LEDs. This isn’t very complicated, I know, but I’m very excited that I could modify the programming and make it work! My changes have been indicated in the programming below.

Components Used

* (3) LEDs: red, green, blue
* (4) 220 ohm resitors
* (1) potentiometer
* (1) Arduino board
* (1) breadboard
* (1) pink rubberband
* solder
* miscellaneous wires

Code

/*
* "Coffee-cup" Color Mixer:
* Code for mixing and reporting PWM-mediated color
* Assumes Arduino 0004 or higher, as it uses Serial.begin()-style communication
*
* Control 3 LEDs with 3 potentiometers
* If the LEDs are different colors, and are directed at diffusing surface (stuck in a
*   a Ping-Pong ball, or placed in a paper coffee cup with a cut-out bottom and
*   a white plastic lid), the colors will mix together.
*
* When you mix a color you like, stop adjusting the pots.
* The mix values that create that color will be reported via serial out.
*
* Standard colors for light mixing are Red, Green, and Blue, though you can mix
*   with any three colors; Red + Blue + White would let you mix shades of red,
*   blue, and purple (though no yellow, orange, green, or blue-green.)
*
* Put 220 Ohm resistors in line with pots, to prevent circuit from
*   grounding out when the pots are at zero
*/

/*

*modifed by KS (12/1/08) - modifications detailed below

*/

 

// Analog pin settings
//int aIn = 0;    // Potentiometers connected to analog pins 0, 1, and 2. **KS took out
int bIn = 1;    //   (Connect power to 5V and ground to analog ground)
//int cIn = 2;  //**KS took out

// Digital pin settings
int aOut = 9;   // LEDs connected to digital pins 9, 10 and 11
int bOut = 10;  //   (Connect cathodes to digital ground)
int cOut = 11;  

// Values
int aVal = 0;   // Variables to store the input from the potentiometers
int bVal = 0;  
int cVal = 0;  

// Variables for comparing values between loops
int i = 0;            // Loop counter
int wait = (1000);    // Delay between most recent pot adjustment and output

int checkSum     = 0; // Aggregate pot values
int prevCheckSum = 0;
int sens         = 3; // Sensitivity theshold, to prevent small changes in
// pot values from triggering false reporting
// FLAGS
int PRINT = 1; // Set to 1 to output values
int DEBUG = 1; // Set to 1 to turn on debugging output

void setup()
{
pinMode(aOut, OUTPUT);   // sets the digital pins as output
pinMode(bOut, OUTPUT);   
pinMode(cOut, OUTPUT);
Serial.begin(9600);     // Open serial communication for reporting
}

void loop()
{
i += 1; // Count loop

aVal = analogRead(bIn) / 4;  // read input pins, convert to 0-255 scale //**KS changed from (aIn)
bVal = analogRead(bIn) / 4;
cVal = analogRead(bIn) / 4; //**KS changed from (cIn)

analogWrite(aOut, aVal);    // Send new values to LEDs
analogWrite(bOut, bVal);
analogWrite(cOut, cVal);

if (i % wait == 0)                // If enough time has passed...
{    
checkSum = aVal+bVal+cVal;      // ...add up the 3 values.
if ( abs(checkSum - prevCheckSum) > sens )   // If old and new values differ
// above sensitivity threshold
{
if (PRINT)                    // ...and if the PRINT flag is set...
{
Serial.print("A: ");        // ...then print the values.
Serial.print(aVal);         
Serial.print("\t");
Serial.print("B: ");        
Serial.print(bVal);
Serial.print("\t");
Serial.print("C: ");                
Serial.println(cVal);
PRINT = 0;
}
}  
else
{
PRINT = 1;  // Re-set the flag   
}
prevCheckSum = checkSum;  // Update the values

if (DEBUG)   // If we want debugging output as well...
{
Serial.print(checkSum);
Serial.print("<=>");
Serial.print(prevCheckSum);
Serial.print("\tPrint: ");
Serial.println(PRINT);
}
}
}