Introduction: SASSIE: the System for Awkward Silence Solution and Interaction Enhancer

SASSIE is the answer to the question all of us have asked to ourselves during an awkward silence at one point in our lives, “Do I speak next?” Well now you don’t have to worry because SASSIE is specifically designed to recognize an awkward silence, and then neutralize it by randomly deciding who should speak next. Now you can go into a conversation stress free, knowing that SASSIE has your back.

Step 1: Parts, Materials and Tools

Arduino Parts

2 X Arduino Uno R3

2 X Arduino Microphone

1 X XBee Wireless SD Shield

1 X 1/2 w 8 Volt Speaker

1 X Half Size Breadboard

1 X Arduino Stepper Motor

1X ULN 2003 Stepper Motor Drive Board

1 X Micro Servo

Base and Housing (Laser Cut Components)

All components listed below can but laser cut on a Birch Ply Fullbed (32" X 18")

1 - Base

1 X Bottom Base Plate

1 X Long length Short Height Straight Lattice Strip

1 X Top Base Plate

4 X Short Length Tall Height Straight Lattice Side Strip Base

2 - Main

1 X Stepper Motor Washer

1 X Bottom Main Plate

1 X Medium length Average Height Straight Lattice Strip

1 X Top Main Ring

1 X Short Length Tall Height Straight Lattice Side Strip

1 X Top Side Strip Plate

1 X Small Rectangular Plate (For Micro Servo)

3 - Microphone Stand

4 X Base Plate

1 X 13 cm 3/16" Dowel (with onside at 30 degrees)

1 X Small Rectangular Plate (For Microphone)

Step 2: Circuit

Step 3: Machine Making (Mechanics and Assembly)

1_Pre-Assembly

  • (Optional) Sand all birch ply components to a pristine finish
  • Wet the entire birch ply strip and then bend it to create a circular form.
  • Wrap around the birch ply strip using masking tape to hold the circular form
  • Let it sit overnight for the strip to retain the circular form

2_Housing Assembly

Base
  1. Glue the Bottom Base Plate to the Base Skin
  2. Glue the four Bottom Side Strip Plate together and then glue that part onto the edge of the Top Base Plate
  3. Tape the Stepper motor onto the centre of the Top Base Plate(REMEMBER to tap on the same side as the Side Strip Plate & align the actual rotating part of the motor to the center of the machine)
  4. insert the Stepper Motor Washer onto the Stepper Motor'
Main
  1. Glue the Bottom Main Plate to the Main Skin
  2. Glue the Main Skin Ring on top of the Main Skin
  3. insert the side strip to the top side strip slid
  4. Glue the Servo Motor Plate perpendicular to the top side strip

3_The Assembly

  1. Carefully place the breadboard and the two UNO R3 with the SD Shield inside the base bin
  2. Place the Top Base Plate onto the bin and make sure all sensors and Actuators go through the top plate openings
  3. Tape the Stepper motor onto the centre of the Top Base Plate(REMEMBER to tap on the same side as the Side Strip Plate & align the actual rotating part of the motor to the center of the machine)
  4. Insert the Stepper Motor Washer onto the Stepper Motor
  5. Place the Main Component onto the washer
  6. Attach the side strip component into the side strip base slid
  7. Tape the Servo Motor to the side of the Servo Motor Plate at the top end (should be tapped sideways) and then tap the servo wiring to the inside of the side strip
  8. Attach the top sign to the servo motor
  9. Tap the side sign on the Main Skin

4_Microphone Stand Assembly

  1. Glue the four base together
  2. Glue the flat side of the dowel to the base
  3. Glue the microphone plate to the angled side of the dowel
  4. tape the microphone onto the microphone plate

Step 4: Programming

Due to the limited size of the Arduino Uno board, two Arduino boards are used in this project. The main board is used for most of the functions, including counting silence time, processing sound data, speaking to users, and communicating with the second board.

#include <Servo.h>
#include <SPI.h>

#include <SD.h> #include <TMRpcm.h>

//SD must connect to pin 11, 12, 13. Anaditional pin 10 is // required or called with SD.begin().

const int servoPin = 3; const int micPin1 = 5; const int micPin2 = 6; const int AWKS = 4;

int volume1; int volume2; float silenceTime = 0;

Servo banner; TMRpcm plr;

void setup() { // put your setup code here, to run once: pinMode(servoPin, OUTPUT); pinMode(micPin1, INPUT); pinMode(micPin2, INPUT); Serial.begin(9600); Serial.println("Welcome to SASSIE diagnosis portal."); banner.attach(servoPin); banner.write(0); if (!SD.begin(10)) { Serial.println("SD fail"); } plr.speakerPin = 9; plr.setVolume(5); }

void loop() { volume1 = digitalRead(micPin1); volume2 = digitalRead(micPin2); banner.write(0); if (volume1 == 0 and volume2 == 0) { silenceTime += 0.05; Serial.print("Silence time: "); Serial.println(silenceTime); } else { silenceTime = 0; banner.write(0); } delay(50); if (silenceTime >= AWKS) { rescue(); silenceTime = 0; } }

void rescue() { for (int angle = 0; angle < 90; angle += 1) { banner.write(angle); delay(35); } Serial.println("Banner on"); delay(100); Serial.write(1); Serial.println("Song on"); plr.play("4.wav"); delay(10000); plr.stopPlayback(); loop(); delay(10000); delay(5000); plr.play("2.wav"); delay(5000); plr.play("3.wav"); }

The code of the second board is simple. It only drives the stepping motor when the main board sends a signal to it.

#include <Stepper.h>

const int stepPin1 = 8; const int stepPin2 = 9; const int stepPin3 = 10; const int stepPin4 = 11; const int motorSteps = 200;

bool motorState = false;

Stepper stepMotor(motorSteps, stepPin1, stepPin2, stepPin3, stepPin4);

void setup() { // put your setup code here, to run once: stepMotor.setSpeed(75); }

void loop() { // put your main code here, to run repeatedly: int incoming = Serial.read(); if (incoming == 1) { Serial.println("activated"); if (motorState == 0) { stepMotor.step(1000); delay(5000); } else { stepMotor.step(-1000); } motorState = !motorState; } delay(500); }

Step 5: Machine Operation