As computing becomes more ubiquitous in our objects, designers need to be more aware of how to design meaningful interactions into electronically enhanced objects. At the University of Washington, a class of junior Interaction Design majors is exploring this question. These pages chronicle their efforts.

Saturday, December 17, 2022

Angus the Coffee Table


Overview

We’ve designed Angus, a coffee table that can sense human touch, when it is being eaten on, and when technology is placed on it. Angus is an experiment to see how people feel when an object has personality, opinions, and reacts to humans according to its preferences.


Personality

Angus wants to be used for conventional purposes only (as a coffee table). For the first minute of Angus’ life it will sing upbeat and caffeinated poems through an LCD screen. After 1 minute Angus will crash and start reading sad songs.




Angus will shout at you in all caps through the LCD screen if it senses you are doing work, eating, or drinking beverages that are not coffee.

Angus is the strong silent type and only speaks through the screen. Angus has cowboy boots and hands instead of table legs.

Concept Video

Our video explains that Angus is a table from the 1950's that is nostalgic for this era in time. A time before remote workers used Angus as a desk, a dining table, or a place to put their smart devices and feet. The video depicts a young and joyful Angus in 1952, then fast-forwards to 2022 where Angus is used as a party table and becomes enraged.

It turns out that this bold new personality Angus has developed becomes a hit with the people Angus interacts with. Angus' distaste for modern day human behaviors becomes a hot commodity and is mass produced world wide.

Video




Code Dependencies

[1] Arduino Capacitive Sensor
https://playground.arduino.cc/Main/CapacitiveSensor/
[2] Liquid Crystal Displays (LCD) with Arduino
https://docs.arduino.cc/learn/electronics/lcd-displays

Code

/*
LiquidCrystal Library - Hello World
Demonstrates the use of a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "hello, world!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K or 100K potentiometer:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
modified 7 Nov 2016
by Arturo Guadalupi
This example code is in the public domain.
https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld
*/
// include the library code:
#include <LiquidCrystal.h>
#include <CapacitiveSensor.h>
/*
* CapitiveSense Library Demo Sketch
* Paul Badger 2008
* Uses a high value resistor e.g. 10M between send pin and receive pin
* Resistor effects sensitivity, experiment with values, 50K - 50M. Larger resistor values yield larger sensor values.
* Receive pin is the sensor pin - try different amounts of foil/metal on this pin
*/
CapacitiveSensor cs_4_2 = CapacitiveSensor(7,8); // 10M resistor between pins 4 & 2, pin 2 is sensor pin, add a wire and or foil if desired
//liquid crystal display dependencies
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the Arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const char cigarettes_and_coffee[] = "It's early in the morning About a quarter 'till three I'm sittin' here talkin' with my baby Over cigarettes and coffee.";
const char black_coffee_in_bed_by_squeeze[] = "There's a stain on my notebook Where your coffee cup was And there's ash in the pages Now I've got myself lost I was writing to tell you That my feelings tonight Are a stain on my notebook That rings your goodbye";
const char david_lynch[] = "Even bad coffee is better than no coffee at all.";
const char bach[] = "I believe humans get a lot done, not because they’re smart, but because they have thumbs so they can make coffee. Without my morning coffee Im just like a dried up piece of roast goat.";
const char johnny_cash[] = "And well I just dropped in to have a cup of coffee friend Don't you offer me none of that whiskey don't need no wine";
const char catcher_in_rye[] = "That’s something that annoys the hell out of me—I mean if somebody says the coffee’s all ready and it isn’t.";
const char jackie_chan[] = "Coffee is a language in itself.";
const char peggy_lee[] = "I'm feeling mighty lonesome Haven't slept a wink I walk the floor and watch the door And in-between I drink Black coffee Love's a hand-me-down blues I'll never know a Sunday In this weekday room";
bool firstrun = true;
void setup()
//capsense
{
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example
Serial.begin(9600);
randomSeed(analogRead(A1)); // nothing is connected to pin A1
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
}
// long sentencerandnum = random(0,4);
void loop()
{
const long start = millis();
if (firstrun == true) {
read_text_mood_dependant(start);
}
firstrun = false;
read_text_mood_dependant(start);
long total1 = cs_4_2.capacitiveSensor(30);


//Serial.print(millis() - start); // check on performance in milliseconds
//Serial.print("\t"); // tab character for debug windown spacing
// Serial.print("\t");
// Serial.print(total2); // print sensor output 2
// Serial.print("\t");
// Serial.println(total3); // print sensor output 3
switch (total1) {
case 0 ... 15:
Serial.println(total1);
// // lcd.print(start);
// Serial.println(total1);
// // read_text_mood_dependant(start);
// // print sensor output 1
// break;
// case 16 ... 80:
// lcd.clear();
// lcd.setCursor(0, 0);
// Serial.println("HUMAN, STOP TOUCHING ME");
// String human1 = "HUMAN, STOP";
// String human2 = "TOUCHING ME";
// Serial.println(total1);
// lcd.print(total1);
// lcd.print(human1);
// delay(500);
// lcd.setCursor(0, 1);
// lcd.print(human2);
// delay(500);
// lcd.clear();
break;
case 81 ... 200:
Serial.println(total1);
// lcd.clear();
// lcd.setCursor(0, 0);
// Serial.println("GOBLET, STOP TOUCHING ME");
// String goblet1 = "DO NOT WINE AND";
// String goblet2 = "DINE UPON ME";
// Serial.println(total1);
// lcd.print(total1);
// lcd.print(goblet1);
// delay(500);
// lcd.setCursor(0, 1);
// lcd.print(goblet2);
// delay(500);
// lcd.clear();
break;
case 201 ... 300:
Serial.println(total1);
// lcd.clear();
// lcd.setCursor(0, 0);
// Serial.println("choosewhatthisis");
// String choosewhatthisis1 = "choosewhatthisis";
// String choosewhatthisis2 = "choosewhatthisis";
// Serial.println(total1);
// lcd.print(total1);
// lcd.print(choosewhatthisis1);
// delay(500);
// lcd.setCursor(0, 1);
// lcd.print(choosewhatthisis2);
// delay(500);
// lcd.clear();
break;
case 301 ... 400:
Serial.println(total1);
// lcd.clear();
// lcd.setCursor(0, 0);
// Serial.println("REMOVE YOUR TECH AT ONCE");
// String keyboard1 = "REMOVE YOUR TECH";
// String keyboard2 = "AT ONCE SWINE";
// Serial.println(total1);
// lcd.print(total1);
// lcd.print(keyboard1);
// delay(500);
// lcd.setCursor(0, 1);
// lcd.print(keyboard2);
// delay(500);
// lcd.clear();
break;
case 401 ... 100000:
Serial.println(total1);
break;
}
delay(500); // arbitrary delay to limit data to serial port
//liquid crystal display
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0,0);
// print the number of seconds since reset:
// lcd.print(millis() / 1000);
lcd.clear();
}
// initialize the library by associating any needed LCD interface pin
// with the Arduino pin number it is connected to
int x = 0;
int y = 16;
long sentencerandnum;
long read_text(String text, long start) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(text.substring(x,y));
x += 16; y += 16;
lcd.setCursor(0, 1);
// Serial.println("this is X and Y for line 1");
// Serial.println(x);
// Serial.println(y);
lcd.print(text.substring(x,y));
delay(2000);
// lcd.clear();
x += 16; y += 16;
// Serial.println("this is X and Y for line 2");
// Serial.println(x);
// Serial.println(y);
if (x >= text.length())
{
// Serial.println("this is X and Y when X >= text.length");
// Serial.println(x);
// Serial.println(y);
x = 0; y =16;
// Serial.println("this is text.length");
// Serial.println(text.length());
sentencerandnum = random(0,4);
lcd.clear();
}
// Serial.println("this is the millis");
// Serial.println(start);
}
char *happy_poems[] = {cigarettes_and_coffee,black_coffee_in_bed_by_squeeze,david_lynch,bach};
char *angsty_poems[] = {johnny_cash,catcher_in_rye,jackie_chan,peggy_lee};
void read_text_mood_dependant (long start) {
if (start < 30000) {
read_text(happy_poems[sentencerandnum],start);
}
else if (start > 30000) {
read_text(angsty_poems[sentencerandnum],start);
}
}

No comments:

Post a Comment