Gneumatic design | technology | artroygbiv [at] gmail [dot] com

Physical Computing Assignment – Analog Input

My first assignment in Physical Computing was to create something along the lines of a “love-o-meter,” aka, one of those games that “measures” your sexiness (from ‘Cold Fish’ to ‘Hot Stuff!’, or something similar) using analog input from variable resistors. Riffing on this idea, I came up with the concept of a “massage feedback shirt.” I placed two force-sensitive resistors in the shoulders, and a row of LEDs in the front of the t-shirt. The number of LEDs that light up provide feedback on the pressure being applied by the masseuse.

Back

Obviously it’s a pretty simple premise. One thing I will definitely do differently in future when working with this many LEDs is to use a common ground (i.e. – single lead attached to the ground side of each LED), which will mean fewer wires running from the LEDs to the breadboard (this got really cumbersome – see below).

The value of the resistors that I used to get a good range of numbers (0 – high 900s) out of the FSRs was something weird (4.7 Kohms, I think – thanks to Alex Kauffmann for pointing this out). Other that, the code was super basic:

int fsrLpin = 0;  //Input pin for left FSR
int fsrLvalue = 0; //Value of left FSR
int fsrRpin = 1;  //Input pin for right FSR
int fsrRvalue = 0;  //Value of right FSR
int fsrTotal = 0;  //Value f left and right FSRs combined
int green1 = 2; //Output pins for green LEDS
int green2 = 3;
int green3 = 4;
int green4 = 5;
int yellow1 = 6; // Output pins for yellow LEDS
int yellow2 = 7;
int yellow3 = 8;
int red1 = 9;  // Output pins for red LEDS
int red2 = 10;
int red3 = 11;


void setup() {
     //Initialize serial communications at 9600 bits/second
     Serial.begin(9600);
     //Set LED pins as outputs
     pinMode(green1, OUTPUT);
     pinMode(green2, OUTPUT);
     pinMode(green3, OUTPUT);
     pinMode(green4, OUTPUT); 
     pinMode(yellow1, OUTPUT);
     pinMode(yellow2, OUTPUT);
     pinMode(yellow3, OUTPUT);
     pinMode(red1, OUTPUT);
     pinMode(red2, OUTPUT);
     pinMode(red3, OUTPUT);
}


void loop () {
     fsrLvalue = analogRead(fsrLpin);//Read values from the pins to which the fsrs are connected
     fsrRvalue = analogRead(fsrRpin);
     fsrTotal = fsrLvalue + fsrRvalue;  // Sum left and right values
     Serial.println(fsrTotal); //Print fsr values
     delay(100);
     // Check fsrValue range and print corresponding threshold values
     if (fsrTotal <= 9) {  // Light none
          digitalWrite(green1, LOW);
          digitalWrite(green2, LOW);
          digitalWrite(green3, LOW);
          digitalWrite(green4, LOW);
          digitalWrite(yellow1, LOW);
          digitalWrite(yellow2, LOW);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
          Serial.println("Not touched");
     }
     if (fsrTotal >= 10 && fsrTotal <= 199) { // Light green1
          digitalWrite(green1, HIGH);
          digitalWrite(green2, LOW);
          digitalWrite(green3, LOW);
          digitalWrite(green4, LOW);
          digitalWrite(yellow1, LOW);
          digitalWrite(yellow2, LOW);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
         Serial.println("green1");
     }
     if (fsrTotal >= 200 && fsrTotal <= 399) { // Light green2
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, LOW);
          digitalWrite(green4, LOW);
          digitalWrite(yellow1, LOW);
          digitalWrite(yellow2, LOW);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
     }
     if (fsrTotal >= 400 && fsrTotal <= 599) { // Light green3
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, LOW);
          digitalWrite(yellow1, LOW);
          digitalWrite(yellow2, LOW);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
     }
     if (fsrTotal >= 600 && fsrTotal <= 799) { // Light green4
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, LOW);
          digitalWrite(yellow2, LOW);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
          }
     if (fsrTotal >= 800 && fsrTotal <= 999) { // Light yellow1
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, HIGH);
          digitalWrite(yellow2, LOW);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
          }
     if (fsrTotal >= 1000 && fsrTotal <= 1199) { // Light yellow2
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, HIGH);
          digitalWrite(yellow2, HIGH);
          digitalWrite(yellow3, LOW);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
          }
     if (fsrTotal >= 1200 && fsrTotal <= 1399) { // Light yellow3
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, HIGH);
          digitalWrite(yellow2, HIGH);
          digitalWrite(yellow3, HIGH);
          digitalWrite(red1, LOW);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
     }
     if (fsrTotal >= 1400 && fsrTotal <= 1599) {  // Light red1
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, HIGH);
          digitalWrite(yellow2, HIGH);
          digitalWrite(yellow3, HIGH);
          digitalWrite(red1, HIGH);
          digitalWrite(red2, LOW);
          digitalWrite(red3, LOW);
     }
     if (fsrTotal >= 1600 && fsrTotal <= 1799) {  // Light red2
          digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, HIGH);
          digitalWrite(yellow2, HIGH);
          digitalWrite(yellow3, HIGH);
          digitalWrite(red1, HIGH);
          digitalWrite(red2, HIGH);
          digitalWrite(red3, LOW);
     }
     if (fsrTotal >= 1800 && fsrTotal <= 1999) {  // Light red3
             digitalWrite(green1, HIGH);
          digitalWrite(green2, HIGH);
          digitalWrite(green3, HIGH);
          digitalWrite(green4, HIGH);
          digitalWrite(yellow1, HIGH);
          digitalWrite(yellow2, HIGH);
          digitalWrite(yellow3, HIGH);
          digitalWrite(red1, HIGH);
          digitalWrite(red2, HIGH);
          digitalWrite(red3, HIGH);
     }
}
It’s rather long and should probably be re-factored using a for loop and/or switch statements, but for my first pass at writing Arduino code, it will do.

Reply