« Lab 2 - Analog Inputs (part 1) | Main | Towards Tuesday »

Lab 2 - Analog Inputs (part 2)

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);
}

TrackBack

TrackBack URL for this entry:
http://itp.nyu.edu/~mjc497/cgi-bin/mt/mt-tb.cgi/14

Post a comment

(If you haven't left a comment here before, you may need to be approved by the site owner before your comment will appear. Until then, it won't appear on the entry. Thanks for waiting.)