Hand2Hand is a device that lets two people in different places touch each other through a magical portal.

0

Hand2Hand is a device that lets two people in different places to touch through a magical portal. 

0

Video

0
0

Storyboard

0

PROCESS

The design team brainstormed on several ideas that has two wireless connected devices that will minimize the difficulty of long distance relationships. The team came up with the Hand2Hand concept in which a 3D printed hand can simulate the sensation of touch between two people without having the two people physically be in the same location. When one hand is touched (triggered), it will send a signal to the other box and will notify the other person that their surrogate hand is being touch. When both parties have their hands touching the surrogate hand at the same time, the light in the box will pulsate, indicating that both are touching each other's hands. 

With this concept, the team divided the device into several parts:

* 3D printed hands & gears

* Neopixels

*  White Cubic Housings with Nylon Fabric Side

* Capacitive Sensors

0
0

Bill of Materials

2 x White Cubic Housings with Nylon Fabric Side

2 x 3D printed hands with gears

2 x Neopixels

2 x Servos

2 x Particle Photons

2 x Breadboards

2 x Capacitive Sensors


0

Wiring Diagram

0
#include "captouch.h"
#include "neopixel.h"
#include <math.h>

// IMPORTANT: Set pixel COUNT, PIN and TYPE
#define PIXEL_PIN D1
#define PIXEL_COUNT 24
#define PIXEL_TYPE SK6812RGBW

CapTouch Touch(D4, D5); // A2 receving pin, A4 sending pin

int touchstatus = -1; // 0 [touched side], -1[not touched]
int touchstatus2 = -1; // 0 [touched side], -1[not touched]
int TSCheck = 0; //Varible to control publish time

//int ledpin = D0;
int pixel_position = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, PIXEL_TYPE);

int servoDelayI = 200; //Servo Delay time
int servoDelayO = 200;
int handServoStatic = 91; //Servo Neutral Position Reggie's 91,  Dan's 92
int handServoPin1 = A5; //servo pin
int ServoStatus = 0;
Servo handServo1; //Define Servo

int handSerUpLim = 110;  //Servo Speed, more than 93 counterclockwise, less than 93 clockwise  max:113  Min:67
int handSerDownLim = 70;
//int handcurrentspeed = 92;

void TheOtherSide (const char *event, const char *data){ //Gather the event name and the data of it
  // if this event contains this device ID
  // it was published by this device
  // otherwise it was published by the paired device

  String eventName = String( event );
  if(  eventName.indexOf( System.deviceID() ) > 0 ){
    return;
  } else {
    touchstatus2 = String(data).toInt();
  }
}


void setup(){
  Serial.begin(9600);
  Touch.setup();
  pinMode(D7, OUTPUT); //Reveal if touched
//  pinMode(ledpin, OUTPUT);
  Particle.subscribe("doit2017/H2H/Touchstatus", TheOtherSide); // Subscribe to this event and activate the function
  handServo1.attach(handServoPin1);
  handServo1.write(handServoStatic); //
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop(){
  checkForTouch();
  if (TSCheck != touchstatus){
    String S_Touchstatus = String(touchstatus); //String touchstatus
    String deviceId = System.deviceID();
    Particle.publish("doit2017/H2H/Touchstatus/" + deviceId, S_Touchstatus);
  }
  if ((touchstatus == 0) && (touchstatus2 == -1)){
    Serial.println("");
    Serial.println("We got attacked!!!!");
    solid();
    if (ServoStatus == 0){
      HandMoveIn();
      ServoStatus = -1;
    }
  } else if ((touchstatus == 0) && (touchstatus2 == 0)){
    Serial.println("");
    Serial.println("Don't make a move");
    breathe();
  } else if ((touchstatus == -1) && (touchstatus2 == 0)){
    Serial.println("");
    Serial.println("Save our ally");
    solid();
    if (ServoStatus == 0){
      HandMoveOut();
      ServoStatus = 1;
    }
  } else {
    Serial.println("");
    Serial.println("SAFE and SOUND!!!");
    LedOff();
    if (ServoStatus == -1){
      HandMoveOut();
      ServoStatus = 0;
    } else if (ServoStatus == 1){
      HandMoveIn();
      ServoStatus = 0;
    }

    // stop light, stop move, count how long has not been touch and return back to neutral.
  }
  TSCheck = touchstatus;
  delay (500);

}

int checkForTouch(){
  Serial.println("CheckedIfTouched");
  CapTouch::Event touchEvent = Touch.getEvent();
  if (touchEvent == CapTouch::TouchEvent) {
  digitalWrite(D7, HIGH);
  touchstatus = 0;
  } else if (touchEvent == CapTouch::ReleaseEvent){ //
  digitalWrite(D7, LOW);
  touchstatus = -1;
  }
}

void solid(){

  //Turn LEDs on solide white
  uint16_t k;
     for(k=0; k< strip.numPixels(); k++){
     strip.setPixelColor(k, 255, 255, 255 );
     strip.show();
   }
delay(1000);
}

void LedOff(){
  uint16_t j;
  for(j=0; j< strip.numPixels(); j++){
    strip.setPixelColor(j, 0, 0, 0 );
    strip.show();
  }
}

int HandMoveIn(){
  handServo1.write(handSerUpLim);
  delay(servoDelayI);
  handServo1.write(handServoStatic);
}

int HandMoveOut(){
  handServo1.write(handSerDownLim);
  delay(servoDelayO);
  handServo1.write(handServoStatic);
}

float breathe( ){
//breathing LED fading in and out

  float val = (exp(sin(millis()/3700.0*M_PI)) - 0.36787944)*108.0;
  Serial.println( val );

  uint16_t i;
  uint32_t c = strip.Color(val, val, val);

  for(i=0; i< strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
  }
  strip.show();

}
Click to Expand
x
Share this Project

Courses

49-713 Designing for the Internet of Things

· 26 members

A hands-on introductory course exploring the Internet of Things and connected product experiences.


Focused on
Skills
About

Hand2Hand is a device that lets two people in different places touch each other through a magical portal.

Created

February 12th, 2017