Proposal

Title: Smart Desk

An interactive experience for office workers.

DESCRIPTIVE PARAGRAPH

The goal of this project is to add interactive functionality to an adjustable standing desk. Countless times my workflow gets interrupted by my environment, whether it be the room being too dark or too stuffy. I use my room as a home office, and it is important that my housemates and friends know when I am on an important call and cannot be interrupted. In the age of social media and technology, it is also increasingly difficult for people to focus on the task at hand without getting side tracked by notifications.

I am going to resolve this with interaction design by building solutions for these individual issues and integrating it into a seamless working experience for the user. It will detect when the user approaches the desk and begins to work and activate the other functions. There will be a light system that automatically turns on when the room starts to get too dark to do work. There will be a simple visual system placed directly outside the room to determine if the user can be interrupted or not. There will be a fan that turns on if the room temperature surpasses a certain number. There will be a task organization system to help increase productivity. It will use RFID cards and a timer to alert the user when they have been working on a task too long. There will also be an alert system for when users need to get up and take a break.

A success would be creating a visually appealing and functional desk that could be used as a polished product prototype. I assume that some of these planned functions may change or be altered according to my research on best practices for productivity. Ideally, the desk would not require a computer to be connected to the system and they would all run on their own battery powered arduinos.

 

YOUR PLAN

  1. Find sensor materials needed (proximity sensor, switches, photoresistor, RFID reader and cards, adafruit LEDs, arduino(s), potentially a LED display for timer functionality)
  2. Make the proximity sensor accurate enough to distinguish between someone walking by versus someone sitting/standing at the station to work
  3. Create the light system for the desk itself
  4. Create the out-of-room light alert system for housemates
  5. Build the fan functionality
  6. Build the RFID productivity organizer
  7. Build the “stand up and take a break” alert system

MATERIALS NEEDED

Sensor materials listed above and a pre-built standing desk.

DELIVERABLES FOR SHOW

I’ll need space for the standing desk.

MEDIA FOR SHOW

I’d like to have a video showing all the functionality of the desk. It may be impossible for me to physically alter the entire room to be so hot the fan turns on etc…

 

Final Proposals

We’ll review these next Tuesday.

Here’s a suggested format, I’ll use my cello project as an example.  Include images, sketches, circuits, or “I’m not sure what to do about this bit?” footnotes.

Title: An Interactive Cello Partner

Summary (if needed): An Arduino Responds to a Cellist’s Performance with Dynamically Generated Music

Descriptive paragraph

Describe the goal of your project in a paragraph or two.  Include your purpose (“why does it exist”), how you’ll resolve this with interaction design (“how it works”), and what you consider success.

YouR PLAN

How are you going to complete this project?  It can be an outline.

  1. find accelerometer
  2. make glove mount
  3. attach to Arduino, test software
  4. use glove to perform cello music and see if this actually possible
  5. repeat as needed
  6. manufacturing: how will I make the final version for the show that will survive hours of performance?

Materials Needed

Looking at everything you’ve written so far, what parts do you need?  How much time do you need on laser cutters or 3d printers?  Do you need to order parts?   If you’re using parts from A10, do you already have working parts?  The final few weeks of class students tend to horde things they don’t need — I found a 30m spool of NeoPixels in someone’s storage container.  One of my phys comp students had their parts “borrowed” 2 weeks before the final show.

Deliverables for Show

It’s the day of the show, what do you need?  How much space?  Power?  Place for your laptop?  Speakers?  Projector?

For my cello project I’d need a chair, a music stand, space for a synthesizer, speakers, power for the speakers and synt.

MEDIA for Show

What do you need to document your  project at the show?  Space for a poster?  Fliers?

I would have a poster behind me so people could read about why/what/how my cello/synth works.

 

 

Story

It’s a legitimate story, because I wasn’t sure how we were supposed to do these:

1

It was 00:07. That’s when I usually go for my run, because I don’t really like it when all of my neighbors can watch me try to exercise. That, and I never run into anyone cars or anything, which is always a bonus. I heard a huge screech at exactly 00:07.23, and I turned around really sharply, like how my karate instructor taught me. That’s when I saw you. You saw me, and you started laughing maniacally before sprinting past me. Your were all sweaty and your hair was a stringy mess, and I remember asking myself what you were doing, and then asking you. “Hey, you, what are  you doing?” You looked harmless enough, but just in case, I took my fighting stance, one fist to guard, one ready to punch, knees apart. You pulled your earbuds out. “I’m running with Marie Antoinette.” Your voice sounded sweet. But then you put your earbuds back in and started screaming again. At 00:09 I lost sight of you. You had just ducked into the bushes off of the Main Street, nervously looking back over your shoulder a few times before doing that.

3

You don’t have to explain yourself. I saw your watch-gadget. My friend Marc has one of them, he says it’s the best thing that’s ever happened to him, which is saying something. He definitely put on some more muscle since he got it, he says it’s better than playing a video game. He’s totally obsessed. He tried to suck me in, too, he thinks I’d be a natural, because I like history and stuff. I don’t know, the whole ghost thing sort of freaks me out. I’d rather just learn history from books. And I don’t really want the ghost of Benjamin Franklin telling me I need to be going at a faster pace. Plus, I don’t know, I feel like you’d get less checkpoints in the country. There are more creepy things, but they’re sort of spread out, you know? It would be good for sprinters, but not for people who actually want to run long distance. If you’re in the city, and you just walk by a skyscraper you could get, like, five different ghosts right there. They’d all be some plain old minor building celebrity or whatever, not very interesting, but at least it’d be something. And they’d just talk to you instead of chasing you. City folk are lazier than you might think. Marc was saying he wanted to add one. Apparently there was this guy, Keith, who lived in his building who loved birds, like 50 years ago. Local legend says he would squawk at the other residents in the halls, and I think Marc thinks it would be a funny joke for other runners. Like, if they run past his building, they run into Keith who squawks at them if they’re not running fast enough. But he’s too lazy to actually go ahead and get all the community votes to add him in.

2

You stopped right in front of my house and screamed before running diagonally across the road, really fast. I think you said something like “I’ve got to escape the Leatherman ghost.” I almost called the police, when I saw you suddenly stop and look at your wrist. It looked like you were dialing a watch, which sounds a little weird but I don’t think much could’ve been weirder than that screaming bit you just did I saw. You kind of stopped making noise after you’d played around on your wrist. Anyways, you seemed to enjoy it, because you smiled before leaving my neighbor’s yard, like you were content about something. And you were talking to yourself in low tones. I don’t know, I felt kind of bad. I figured so what if you’re a little crazy, no reason to put you in jail or anything. I don’t know, I haven’t seen many crazy people in my life, maybe you weren’t actually crazy. Everyone has weird days, right? And some people do believe in ghosts. I don’t know, they’re pretty scary, I’d scream if I thought one was following me.

Patch UI – Story

The year, is now. The default interface is screen. But let’s disrupt that. Patches have made a resurgence in fashion, from iconic branding elements to pineapples and pizzas, patches provide great flexibility in the statement you want to make. Using safety pins, conductive ink/fabric, and fabric, Patch UIs allow users to interact with others by interacting with the patches on their cloths.

Each patch can be reprogrammed or updated through the web portal, this is the only screen time you’ll need. Different patterns and levels of complexity are available. Different modes offer different options. You can use the patch as human to human interaction or human to computer interaction. Perhaps you want to send a gentle notification, or get someone’s attention at a loud event, or send emojis to a friend without even touching a screen? Record music or create an animations based on the patterns of touch.

Project Storytelling – Immersive Contextual Table for a Living Room

The living room tables have rich stories behind it – conversation with family, studying for a homework, eating dinner, kids playing with LEGO, and so on. What if these tables in a living room could provide us interactive and engaging contents such as weather forecasting and entertainment for kids? What would it be like to feel realistic vibrations and temperature changes about digital information from these tables? This project allows the user to engage with the AR information and artifacts that are coupled to a physical desk through a haptic interface that consists of an array of small vibrators and a heat pad. The goal is to design text-less and immersive AR interaction techniques that enrich everyday living room table experience.

The first stage of experience is the selection of a content. This experience uniquely occurs on a living room table, so it triggers when the table is recognized through a mobile device. There are 2 categories of content – a weather forecasting and an interactive animation for kids. In weather forecasting mode, imagine the animated 3D sun and cloud appearing on the table and the user feels the vibration of rain or the warmness through the haptic device. This allows text-less and intuitive form of transmitting information. The second scenario is an interactive animation for kids which the user can interact with a simulated dinosaur or a character on the table and being able to interact with it. As the user approaches the device closer to the character, it makes larger vibrations of a walking dinosaur, and when it is very close, the character starts acting toward the device. This would be a perfect interaction to play Pokemon on a table.

Asssignment 8–Arduino Timer

#include

#ifdef __AVR__
#include
#endif

static const int PIN = 3;
static const int NUMPIXELS = 2;
int incomingByte;
char incomingLetter;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
unsigned long interval = 10000;
unsigned long previousMillis = 0;

void setup() {
pixels.begin();
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, 0, 0));
pixels.show();

}

void loop() {

unsigned long currentMillis = millis();

if (Serial.available() > 0) {
incomingByte = Serial.read();
incomingLetter = (char) incomingByte;
if (incomingLetter == ‘S’) {
while(currentMillis – previousMillis < interval) {
currentMillis = millis();
}

previousMillis = currentMillis;
pixels.setPixelColor(0, pixels.Color(255, 0, 0));
pixels.show();
}

else if (incomingLetter == ‘B’) {
while(currentMillis – previousMillis < interval){
pixels.setPixelColor(1, pixels.Color(0, 255, 0));
pixels.show();
currentMillis = millis();
}
previousMillis = currentMillis;
pixels.setPixelColor(1, pixels.Color(0, 0, 0));
pixels.show();
}

else {
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.setPixelColor(1, pixels.Color(0, 0, 0));
pixels.show();
}
}
}

Assignment8 – Tabletop Haptic Interaction for AR

I challenged to work with an array of mini vibration motors and wireless local networking. The goal of this project is to create an immersive AR interactivity by generating haptic feedback of the virtual objects interacting with a physical desk. The user feels the vibration of the AR ball bouncing on a table through the haptic device. Every time it bounces, a signal is sent wirelessly to the main PC, which is sent serially to Arduino to activate motors. The future step is to more precisely activate the array of motors by computing the level of vibration based on the locations of the AR objects and the device.

Exercise 8

For this assignment, I wanted to go back to object programming, because that confuses me more than most things, and I tend to be a generally confused person.

I also decided I was going to use Processing, because I’ve been watching a ton of coding train videos and I got tired of seeing suggestions come up on the side of my screen that look super cool but use Processing and had me thinking “that’s probably going to take me a while, I can’t learn how to use that right now.”

WHAT I MADE:

I used a blob detection code that allowed me to track a colour using my computer camera. I then decided I wanted to detect someone’s facial expression by using the shape of their lips. I could then use my millenial/gen X social media skills to create emojis that reflect typical facial expressions, and flash the related emoji at the user. Using my stellar illustrator skills and some photo bits and pieces off of the internet, I collaged a couple of emojis. I then used my a-ma-zing object programming skills to decode the code I was using and integrate an analysis of blob sizes and numbers. This took an insane amount time, because there are just so many objects, but I have it working! It’s super jittery though, especially between the “shock” face and “happy” face, and you have to be at just the right distance from the camera.

(I also started thinking: hey, if I can detect colors, maybe I’ll be able to detect light colors my arduino gives off and have an elementary replacement to my malfunctioning serial control.)

——————————————————–

If anyone wants to test this code out, your skin and lip color will be too similar, and if you mess with the code’s colour threshold you will definitely make it worse, so here’s the easiest fix: Put on some bright lipstick. If you’re reluctant to do so you’re going to have to figure out a way to make your lips change colour. Once you’ve defied the laws of nature (or used someone’s makeup kit) hit the ‘i’ key and click on your lips, then hit the ‘i’ key again.

It’s preset to a bright red, so if you already have a bright red lipstick on, you’re all set.

———————————————————

I sincerely apologize for the weird faces.

code and image files:

use_your_lipstick

Touchy: A Game for Toddlers

Abstract: Touchy a game for toddlers.

Method: Ethnographic study,  Participatory Design with Parents

I spent a few months getting to know the participant, babysitting the kid. This helped me learn the interactions that the user was familiar with. I used the design elements that player was familiar with for e.g. Hey Dugee.

Playtesting: A demo of a player using the interface.

Parent Feedback:

Next steps: Add sound, use the yellow car a toy that

Demo: http://kmarkiv.com/a5/A5js/

[update] 

After seeking feedback from parents, I added a button to support to direct the child’s attention to the screen.

Assignment Seven

Patch UI

I wanted to create a simple wearable patch that could act as an integrated user interface. This first step was about understanding out this type of interface may work to send notifications. Using conductive fabric and capacitive touch, a user can simply touch the patch and send a light or vibration notification to someone. As I mentioned, this is just the first step, I plan to work further on this project to incorporate gestures such as swiping, investigate the form more by researching existing patch styles and alternative materials such as conductive ink that can be screen printed.

The patch itself is paired with a web program that can set the geometric pattern to hold different values. This way the user is able to program and reprogram the patch to suit their needs. This portion of the project needs a great deal of work, particularly in sending the data to the Arduino. This will be updated.

Password: MakingThingsInteractive

Arduino Code:
/***************************************************
This is a library for the CAP1188 I2C/SPI 8-chan Capacitive Sensor

Designed specifically to work with the CAP1188 sensor from Adafruit
----&gt; https://www.adafruit.com/products/1602

These sensors use I2C/SPI to communicate, 2+ pins are required to
interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!

Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
****************************************************/
//--------CAP1188 SETUP --------
#include &lt;Wire.h&gt;
#include &lt;SPI.h&gt;
#include &lt;Adafruit_CAP1188.h&gt;
#define CAP1188_SENSITIVITY 0x1F // Setting the sensitivity....lower the number the more sensitive!!
static const int CAP1188_RESET = 12; // Reset Pin is used for I2C or SPI
Adafruit_CAP1188 cap = Adafruit_CAP1188();
//------------------------------

//--------NEOPIXEL SETUP --------
#include &lt;Adafruit_NeoPixel.h&gt;
#ifdef __AVR__
#include &lt;avr/power.h&gt;
#endif
static const int PIN = 4;
static const int NUMPIXELS = 2;
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//------------------------------

//------- TIMING --------
unsigned long lastSampleTime = 0;
unsigned long sampleInterval = 500; // in ms

//------------------------------

//-----INCOMING VALUES-----
String incomingString; // setting string from p5.js

//-----VIBE PINS-----
static const int vibePinOne = 6;
static const int vibePinTwo = 9;

int vibeOne;
int vibeTwo;

int wait = 10;
int touchedNUM;

int lightCount = 0;
int personOneCount = 0;
int personTwoCount = 0;
int vibeCount = 0;

bool personOne = false;
bool personTwo = false;
bool light = false;
bool vibe = false;

void setup() {
Serial.begin(9600);
Serial.println("CAP1188 test!");
if (!cap.begin()) { // Initialize the sensor, if using i2c you can pass in the i2c address // if (!cap.begin(0x28)) {
Serial.println("CAP1188 not found");
while (1);
}
Serial.println("CAP1188 found!");
cap.writeRegister(CAP1188_SENSITIVITY, 0x6F); // 2x sensitivity THIS SEEMS TO WORK THE BEST FOR 3.5" plate sensors

pinMode(vibePinOne, OUTPUT);
pinMode(vibePinTwo, OUTPUT);
pixels.begin();
pixels.show();
}

void loop() {
unsigned long now = millis();
uint8_t touched = cap.touched();

if (touched == 0) {
// No touch detected
return;
}

if (lastSampleTime + sampleInterval &lt; now) {

lastSampleTime = now;

for (uint8_t i = 0; i &lt; 8; i++) {
if (touched &amp; (1 &lt;&lt; i)) {
int currentTouch = i + 1;

if (currentTouch == 1) { // RIGHT Light
touchedNUM = 1;
lightCount++;
light = true;
vibe = false;
} else if (currentTouch == 2) { // TOP Person One
touchedNUM = 2;
personOneCount++;
personOne = true;
personTwo = false;
light = false;
vibe = false;
// Serial.print("PersonOne: "); Serial.println(personOne);
// Serial.print("PersonTwo: "); Serial.println(personTwo);
} else if (currentTouch == 3) { // BOTTOM Person Two
touchedNUM = 3;
personTwoCount++;
personOne = false;
personTwo = true;
light = false;
vibe = false;
// Serial.print("PersonOne: "); Serial.println(personOne);
// Serial.print("PersonTwo: "); Serial.println(personTwo);
} else if (currentTouch == 4) { // LEFT Vibe
touchedNUM = 4;
vibeCount++;
light = false;
vibe = true;
}

if (personOne == true){
Serial.println("Active: PERSON ONE");
} else if (personTwo == true) {
Serial.println("Active: PERSON TWO");
}

}
}
}
personOneFun();
personTwoFun();
}

void personOneFun() {
if (personOne == true &amp;&amp; personTwo == false &amp;&amp; light == true) {
lightBLINK(0);
//lightON(0); // person ONE light on
lightOFF(1); // person two light off
vibeOFF(0); // vibes off
vibeOFF(1);
} else if (personOne == true &amp;&amp; personTwo == false &amp;&amp; vibe == true) {
lightOFF(0); // lights off
lightOFF(1);
vibeON(0); // person ONE vibe on
vibeOFF(1); // person two vibe off
} else {
lightOFF(0); // lights off
lightOFF(1);
vibeOFF(0); // vibes off
vibeOFF(1);
}
// Serial.print("Light Count: "); Serial.println(lightCount);
// Serial.print("Vibe Count: "); Serial.println(vibeCount);
}

void personTwoFun() {
if (personOne == false &amp;&amp; personTwo == true &amp;&amp; light == true) {
lightBLINK(1);
// lightON(1); // person TWO light on
lightOFF(0); // person one light off
vibeOFF(0); // vibes off
vibeOFF(1);
} else if (personOne == false &amp;&amp; personTwo == true &amp;&amp; vibe == true) {
lightOFF(0); // lights off
lightOFF(1);
vibeON(1); // person TWO vibe on
vibeOFF(0); // person one vibe off
} else {
lightOFF(0); // lights off
lightOFF(1);
vibeOFF(0); // vibes off
vibeOFF(1);
}
// Serial.print("Light Count: "); Serial.println(lightCount);
// Serial.print("Vibe Count: "); Serial.println(vibeCount);
}

void vibeON(int m) {
if (m == 0) {
digitalWrite(vibePinOne, HIGH);
delay(500);
digitalWrite(vibePinOne, LOW);
delay(250);
} else if (m == 1) {
digitalWrite(vibePinTwo, HIGH);
delay(500);
digitalWrite(vibePinTwo, LOW);
delay(250);
}

}

void vibeOFF(int m) {
if (m == 0) {
digitalWrite(vibePinOne, LOW);
} else if (m == 1) {
digitalWrite(vibePinTwo, LOW);
}
}

void lightON (int m) {
pixels.setPixelColor(m, pixels.Color(255, 255, 255));
pixels.show();
}

void lightOFF (int m) {
pixels.setPixelColor(m, pixels.Color(0, 0, 0));
pixels.show();
}

void lightBLINK (int m) {
pixels.setPixelColor(m, pixels.Color(255, 255, 255));
pixels.show();
delay(750);
pixels.setPixelColor(m, pixels.Color(0, 0, 0));
pixels.show();
delay(500);
pixels.setPixelColor(m, pixels.Color(255, 255, 255));
pixels.show();
delay(750);
pixels.setPixelColor(m, pixels.Color(0, 0, 0));
pixels.show();
delay(500);
}
p5js Code:
//-----SERIAL VARIABLES-----
var serial;
var portName = '/dev/cu.usbmodem1411';

//-----WINDOW DIMENSIONS-----
var windW = 900;
var windH = 600;

//-----Color Values-----
var colorLeft = 255;
var colorTop = 255;
var colorRight = 255;
var colorBottom = 255;

var personOneColor = 255;
var personTwoColor = 255;
var lightColor = 255;
var vibeColor = 255;

//-----button counts-----
var countLeft = 0;
var countTop = 0;
var countRight = 0;
var countBottom = 0;

var personOneClick = 0;
var personTwoClick = 0;
var lightClick = 0;
var vibeClick = 0;

//-----button selected-----
var buttonLeft = false;
var buttonTop = false;
var buttonRight = false;
var buttonBottom = false;

var personOne = false;
var personTwo = false;
var light = false;
var vibe = false;

//-----Icons &amp; Images -----
var personOneImg , personTwoImg, lightImg, vibeImg;
var personOneImgW , personTwoImgW, lightImgW, vibeImgW;

var squares = [];
//------------------------

var latestData

var serialPortThree;

function preload() {
// preload() runs once
personOneImg = loadImage('assets/person.png');
personTwoImg = loadImage('assets/person.png');
lightImg = loadImage('assets/light.png');
vibeImg = loadImage('assets/vibe.png');
personOneImgW = loadImage('assets/person-w.png');
personTwoImgW = loadImage('assets/person-w.png');
lightImgW = loadImage('assets/light-w.png');
vibeImgW = loadImage('assets/vibe-w.png');
}

function setup() {
//-----Serial Setup-----
serial = new p5.SerialPort();
serial.on('list', printList);
serial.on('connected', serverConnected);
serial.on('open', portOpen);
serial.on('data', gotData);
serial.on('error', serialError);
serial.on('close', portClose);

serial.list();
serial.open(portName);

console.log("Port Name: " + portName);
//----------------------

createCanvas(windW, windH);
smooth();
background(240);

// initial text at the top (where your color's RGB will be)
push();
textSize(25);
textAlign(CENTER);
noStroke();
text("PATCH UI", windW / 2, 50);
pop();

// for (var i = 0; i 220 &amp;&amp; mouseX 195 &amp;&amp; mouseY 330 &amp;&amp; mouseX 151 &amp;&amp; mouseY 544 &amp;&amp; mouseX 195 &amp;&amp; mouseY 330 &amp;&amp; mouseX 239 &amp;&amp; mouseY 140 &amp;&amp; mouseX 400 &amp;&amp; mouseY 315 &amp;&amp; mouseX 400 &amp;&amp; mouseY 480 &amp;&amp; mouseX 400 &amp;&amp; mouseY 645 &amp;&amp; mouseX 400 &amp;&amp; mouseY &lt; 500) {
vibeClick++;
if (vibeClick % 2 == 1 ){ //&amp;&amp; personTwo == false &amp;&amp; personOne == false &amp;&amp; light == false
vibeColor = 100;
vibe = true;
} else if (vibeClick % 2 == 0){
vibeColor = 255;
vibe = false;
personOneClick = 0;
personTwoClick = 0;
lightClick = 0;
}
console.log("Vibe clicked: " + vibeClick);
}
}

//-----SERIAL FUNCTIONS-----

function printList(portList) {
for (var i = 0; i 5)
// {
// aNum = aString[1];
// aOff = aString[3];
// aSize = aString[5];
// }
// console.log("aNum: " + aNum + "aOff: " + aOff + "aSize: " + aSize);
}

function serialError(err) {
// print('serialError ' + err);
}

function portClose() {
// print('portClose');
}

Arduino + p5js + Fritzing files