When considering what to do for the creative part of my Physical Computing lab, I initially thought of some sort of mood-proclaiming piece of clothing.
Instead of using a flex or pressure sensor to light up the LEDs on a "luv-o-meter," I wanted to prototype a display for a t-shirt that could display a short and partially encrypted message about the wearer's stress level. I remember seeing a
persistence of vision project on one of my first trips to ITP (perhaps it was the winter show?) and thought I might be able to make a single column of LEDs light up and scroll the message past.
Using only a slightly modified version of the circuit from my game of catch, I set about drafting some code to drive a vertical array of 5 LEDs.
(written during experimentation)
- First attempt unsuccessful... I tried moving my head back and forth to see the image, but didn't get to a point where I could see the image persisting. In the interest of time, though, I'm going to try a couple more speeds before I set about rewiring
- I added potentiometers to the circuit in order to vary the delay between the columns of the character as well as between each letter. When I move the board back and forth I can make out the characters, but it seems like they might be going backwards.
- Seems like the rocking back and forth I'm doing may be causing the character to be rendered backwards. On the bicycle example, the direction is constant. I wonder how the clock I've seen that uses this trick works... it swings back and forth... perhaps it has to write the characters in reverse order...
I could eventually try mounting this contraption on a motor
/* ----------------------------------------
Persistence
----------------------------------------
Michael Chladil
Physical Computing
2006-09-23
written for Arduino v1.18
----------------------------------------
*/
#include
#define DEBUG_LVL 1
// Going to try first with 5-line characters
#define CharacterPin1 3
#define CharacterPin2 4
#define CharacterPin3 5
#define CharacterPin4 6
#define CharacterPin5 7
#define CHAR_WIDTH 5
#define CHAR_HEIGHT 5
byte Letter_M[CHAR_WIDTH][CHAR_HEIGHT] = { {1, 0, 0, 0, 1},
{1, 0, 0, 0, 1},
{1, 1, 0, 1, 1},
{1, 0, 1, 0, 1},
{1, 0, 0, 0, 1} };
byte Letter_C[CHAR_WIDTH][CHAR_HEIGHT] = { {0, 1, 1, 1, 1},
{1, 0, 0, 0, 0},
{1, 0, 0, 0, 0},
{1, 0, 0, 0, 0},
{0, 1, 1, 1, 1} };
#define CharacterPin6 8
#define CharacterPin7 9
#define Switch1 10
#define Switch2 11
int delayTime = 0;
int charRow = 0;
int interCharDelay = 0;
void setup ()
{
pinMode (CharacterPin1, OUTPUT);
pinMode (CharacterPin2, OUTPUT);
pinMode (CharacterPin3, OUTPUT);
pinMode (CharacterPin4, OUTPUT);
pinMode (CharacterPin5, OUTPUT);
pinMode (Switch1, INPUT);
pinMode (Switch2, INPUT);
if (DEBUG_LVL > 0)
{
Serial.begin (9600);
}
}
void writeChar (char charToWrite)
{
byte Letter[5][5];
int charCol = 0;
int charRow = 0;
int i;
// Needed a way to copy the constants I defined above without going
// pixel by pixel. memcpy seems to do the trick. I initially wanted
// to copy the entire 2-D array at once, but it didn't seem to work
// and I wanted to move on to verifying other things
switch (charToWrite)
{
case 'M' :
{
for (int i = 0; i < CHAR_HEIGHT; i++)
memcpy (Letter[i], Letter_M[i], CHAR_WIDTH);
break;
}
case 'C' :
{
for (int i = 0; i < CHAR_HEIGHT; i++)
memcpy (Letter[i], Letter_C[i], CHAR_WIDTH);
break;
}
}
for (charCol = 0; charCol < CHAR_WIDTH; charCol++)
{
for (charRow = 0; charRow < CHAR_HEIGHT; charRow++)
{
digitalWrite(CharacterPin1 + charRow, Letter[charRow][charCol]);
}
delay (delayTime);
for (charRow = 0; charRow < CHAR_HEIGHT; charRow++)
{
digitalWrite(CharacterPin1 + charRow, LOW);
}
delay (10);
}
}
void loop()
{
delayTime = analogRead(5);
interCharDelay = analogRead(4);
writeChar('M');
delay(interCharDelay);
writeChar('C');
delay(interCharDelay);
}