Sprout: Your favorite dinner companion

Made by Praewa Suntiasvaraporn

Sprout is a simple kitchen table decoration piece, which aims to help users to become more aware of their habits during meal times.

Created: September 17th, 2015

0

INSPIRATION:

As an international student myself, I have been adjusting to new cultures and customs my whole life. One thing that I have noticed from being around other international students, talking to my American-Chinese friends about their parents, and when I go back home to Thailand is that there are some habits that are acceptable or even sometimes, welcomed, in our culture, but are looked down upon in other cultures. One of the most common habits that I have noticed is loud chewing, and just bad table manners in general, since in a lot of Asian cultures, enthusiastically eating your food (loudly) is viewed positively, and in some countries, it is rude not to slurp loudly:

"In fact, every culture has specific ways of showing appreciation of the meal. In Saudi Arabia, diners burp after eating to compliment the cook. In Hong Kong and Japan, loudly slurping your noodles demonstrates your enjoyment of the food; literally, that it is so delicious you cannot even wait until it cools off." - (https://cultureandfood.wordpress.com/2010/01/17/to-slurp-or-not-to-slurp/)

Some of these habits that are just embedded into one's culture makes it really hard for the more modern generation to get rid of. It is also uncomfortable for others to be around them or to attempt to make them aware of their bad habits, since that could be rude to mention.

From this starting point, I wanted to create some device that would send the user some kind of output reminder that would make them aware of their bad habits without it being obvious to others when dining outside of their home. 


PROBLEM:

Ever had a friend that was just too embarrassing to go to a fancy restaurant with? Or are you that friend? Or is it one of your family members? Some bad habits are just so hard to fix, especially when you have grown up in an environment where those actions were known to be normal, and not a bad thing. 

I have focused my problem space to being loud during meal times; placing your cutlery/plates down carelessly, trying to speak with food still in your mouth, arguing ... etc. This was so that I would be reaching out to a wider group of users, and not just targeting immigrants in the States or just people who are studying abroad. This problem would deal more with children with busy parents, or just anyone who is trying to grow out of their bad table manners so they are able to integrate better at more formal settings. 

0

SOLUTION: 

I decided to create a simple pot plant that on the surface would just look like a normal piece of home decoration, so that it does not embarrass the users when there are guests over at the house. What this little plant does is that whenever someone places their cutlery down too loudly, clashes plates together, shouts at each other on the dinner table, its two leaves will drop off the stalk, expressing its sadness. I chose this movement since it was subtle enough to not be a nuisance to the user and also so it does not interrupt the overall dining atmosphere, but would be noticeable enough so that the user is aware that they have done something wrong. 

0

Initial idea brainstorming and sketches

Coming up with different problems, picking the problem that I want to focus on, and coming up with different ways that the sound input can be translated into an unobtrusive output. Sketching ideas of casing, and visual representation of the data.

0

Development sketches of Sprout, and manufacturing plans

0

Figuring the best position for the microphone to be at, and how to get the servo to be at a fixed position at all times.

0

Testing out different ways to color the frosted acrylic leaves with spray paint.

0

HOW IT WAS MADE:

I created the casing by turning High Density gray foam on the lathe into a pot plant shape, and hollowed it out using several drill bits. I cut and etched the pattern on the leaves with the laser cutter, and bent it using a heat gun. I then spray painted the pot part with brown spray and colored the leaves by spraying underneath it (on the smooth, not frosted side) with green spray. The 'lid' part is made from a laser cut piece of frosted acrylic also, and the stem is a brass tube, band-sawed to length and then secured in place through cutting slits and folding them over after force-fitting it into the laser cut hole in the acrylic lid.

HOW IT WORKS:

The small microphone sensor that is connected to the arduino inside the pot plant takes in amplitude inputs, and through my code, I got it to convert the amplitude inputs into frequency. What the code then does is that it will move the servo so that it is at 180 for 10 seconds, whenever it detects high frequency noises (>2000Hz) that are over a certain amplitude (>80). The servo arm is connected to the leaves by strings, and once it moves from its original position (0) to 180, it makes the string go from taut to slack, and therefore makes the leaves drop from the stem. When that certain range of sounds is not detected anymore, it goes back to its original position (0) again.

0
#include <Servo.h>

//generalized wave freq detection with 38.5kHz sampling rate and interrupts
//by Amanda Ghassaei
//http://www.instructables.com/id/Arduino-Frequency-Detection/
//Sept 2012

/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
*/


Servo myservo;

//clipping indicator variables
boolean clipping = 0;

//data storage variables
byte newData = 0;
byte prevData = 0;
unsigned int time = 0;//keeps time and sends vales to store in timer[] occasionally
int timer[10];//storage for timing of events
int slope[10];//storage for slope of events
unsigned int totalTimer;//used to calculate period
unsigned int period;//storage for period of wave
byte index = 0;//current storage index
float frequency;//storage for frequency calculations
int maxSlope = 0;//used to calculate max slope as trigger point
int newSlope;//storage for incoming slope data

//variables for decided whether you have a match
byte noMatch = 0;//counts how many non-matches you've received to reset variables if it's been too long
byte slopeTol = 1;//slope tolerance- adjust this if you need
int timerTol = 5;//timer tolerance- adjust this if you need

//variables for amp detection
unsigned int ampTimer = 0;
byte maxAmp = 0;
byte checkMaxAmp;
byte ampThreshold = 50;//raise if you have a very noisy signal

int pos = 0;
int counter = 0;

void setup(){

  myservo.attach(9);
  
  Serial.begin(9600);

//  pinMode(5, OUTPUT);
  pinMode(13,OUTPUT);//led indicator pin
  pinMode(12,OUTPUT);//output pin
  
  cli();//diable interrupts
  
  //set up continuous sampling of analog pin 0 at 38.5kHz
 
  //clear ADCSRA and ADCSRB registers
  ADCSRA = 0;
  ADCSRB = 0;
  
  ADMUX |= (1 << REFS0); //set reference voltage
  ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
  
  ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz
  ADCSRA |= (1 << ADATE); //enable auto trigger
  ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
  ADCSRA |= (1 << ADEN); //enable ADC
  ADCSRA |= (1 << ADSC); //start ADC measurements
  
  sei();//enable interrupts
}

ISR(ADC_vect) {//when new ADC value ready
  
  PORTB &= B11101111;//set pin 12 low
  prevData = newData;//store previous value
  newData = ADCH;//get value from A0
  if (prevData < 127 && newData >=127){//if increasing and crossing midpoint
    newSlope = newData - prevData;//calculate slope
    if (abs(newSlope-maxSlope)<slopeTol){//if slopes are ==
      //record new data and reset time
      slope[index] = newSlope;
      timer[index] = time;
      time = 0;
      if (index == 0){//new max slope just reset
        PORTB |= B00010000;//set pin 12 high
        noMatch = 0;
        index++;//increment index
      }
      else if (abs(timer[0]-timer[index])<timerTol && abs(slope[0]-newSlope)<slopeTol){//if timer duration and slopes match
        //sum timer values
        totalTimer = 0;
        for (byte i=0;i<index;i++){
          totalTimer+=timer[i];
        }
        period = totalTimer;//set period
        //reset new zero index values to compare with
        timer[0] = timer[index];
        slope[0] = slope[index];
        index = 1;//set index to 1
        PORTB |= B00010000;//set pin 12 high
        noMatch = 0;
      }
      else{//crossing midpoint but not match
        index++;//increment index
        if (index > 9){
          reset();
        }
      }
    }
    else if (newSlope>maxSlope){//if new slope is much larger than max slope
      maxSlope = newSlope;
      time = 0;//reset clock
      noMatch = 0;
      index = 0;//reset index
    }
    else{//slope not steep enough
      noMatch++;//increment no match counter
      if (noMatch>9){
        reset();
      }
    }
  }
    
  if (newData == 0 || newData == 1023){//if clipping
    PORTB |= B00100000;//set pin 13 high- turn on clipping indicator led
    clipping = 1;//currently clipping
  }
  
  time++;//increment timer at rate of 38.5kHz
  
  ampTimer++;//increment amplitude timer
  if (abs(127-ADCH)>maxAmp){
    maxAmp = abs(127-ADCH);
  }
  if (ampTimer==1000){
    ampTimer = 0;
    checkMaxAmp = maxAmp;
    maxAmp = 0;
  }
  
}

void reset(){//clea out some variables
  index = 0;//reset index
  noMatch = 0;//reset match couner
  maxSlope = 0;//reset slope
}


void checkClipping(){//manage clipping indicator LED
  if (clipping){//if currently clipping
    PORTB &= B11011111;//turn off clipping indicator led
    clipping = 0;
  }
}


void loop(){
  
  checkClipping();
  
  if (checkMaxAmp>ampThreshold){
    frequency = 38462/float(period);//calculate frequency timer rate/period
  
    //print results
    Serial.print(frequency);
    Serial.println(" hz");

    Serial.print(newData);
    Serial.println(" amp ");
  }
  
  delay(100);//delete this if you want
  if (frequency > 2000 && newData > 80) { 
//setting threshold for when action should happen - so when frequency is over 2000 and amplitude is over 80, and if the position of the servo is not at 180, make it 180 for 10 seconds. 
    if (pos !=180) {
      pos = 180;
      myservo.write(pos);
    }
      counter = 10;
      Serial.println("detected");
  } else {
    if (counter > 0) {
      counter = counter - 1;
    }
    if (counter == 0 && pos != 0) {
      pos = 0;
      myservo.write(pos);
    }
  }
}
Click to Expand
0

(Servo not in the photo since it has been permanently attached to the casing)

x
Share this Project

Found In
Courses

48-739 Making Things Interactive

· 0 members

Making Things Interactive (MTI) is a studio course based on physical prototyping and computing. You will develop novel sensing, interaction and display techniques through projects and short assignm...more


About

Sprout is a simple kitchen table decoration piece, which aims to help users to become more aware of their habits during meal times.