Haptics

Nov 4, 2018 18:54 · 558 words · 3 minutes read Arduino Physical Computing Hardware

This post goes through the work I did for the Haptics weekend workshop.

Hello Vibe Motors

For this first exercise, we experimented with connecting a few haptic motors to see how they felt. We connected them all as you would a DC motor connected to an analog output pin, with the power going to the analog pin and ground cable going to ground:

A basic haptic motor
Using the Arduinoblink sketch, the motor would vibrate on an interval
We also tried other kinds of haptic motors, like this one here

Haptic Motor Driver

For this exercise, we connected a haptic motor driver to an Arduino Uno and tried out a bunch of its vibration patterns. We then connected an audio detection level sensor, and to have it mimic the state of our day, we had it use a calm pattern, and when the audio got past a certain loudness, we had it use a more intense pattern:

The connectivity in our mood activated haptic motor driver

Motor arrays

For this exercise, we connected a series of haptic motors to feathers, and activated them one by one using PWM varying their intensity:

Charting the strength of each motor
The motors in action, pulsing like a wave one by one

Haptic Matrix

For this exercise, I collaborated with Lucas K Chung, Haiyi Huang, and, Asha Veeraswamy. The contents of this section of the blog post is shared between our group.

Overview:

A wearable haptic matrix using multiple mini vibration motors that forms radio pattern to produce vibrating wave sensation on wrist.

Material Used:

  • Arduino Uno
  • 9 mini vibration motors
  • Leather as enclosure

Sketch:

Diagram:

Code:

The program pulsed waves of vibration from the center out, in a sin wave form:

const uint8_t pins [3] = {9, 10, 11};
const float maxDistance = 6;
const float distances [3] = {0, 3, 6};

void setup() {
  Serial.begin(9600);
}

float waveDuration = 3000;

void loop() {
  // oscillate between 0 and 1.
  float period = millis() / waveDuration;

  float currentDistance = maxDistance * period;

  for(uint8_t i = 0; i < 3; i++) {
    float distance = distances[i];

    float distanceFromCurrentDistance = currentDistance - distance;

    float strength = sin(distanceFromCurrentDistance / maxDistance * 3.14);

    Serial.print(strength);
    Serial.print(' ');

    uint8_t value = map(strength * 255, -255, 255, 0, 255);
    uint8_t pin = pins[i];
    analogWrite(pin, value);
  }

  Serial.println();
}

Plotting the vibration intensity of each layer of motors:

Reflection:

The motor in the center produced the strongest vibration whereas the motors in the outer circles felt weak. We couldn’t really experience the vibration like a wave. It was more like all the motors vibrating at the same time.

Bio-feedback Meditation device

For this exercise, I continued to collaborate with Lucas K Chung, Haiyi Huang, and, Asha Veeraswamy. The contents of this section of the blog post is shared between our group.

Overview:

A normal human’s resting heart rate is between 60-100 beats per minute. When heart rate is is > 80 bpm, the user will put on the meditation wristband which will pulse in sinusoidal waves to which they are supposed to match their breathing. When their heart rate lowers to a resting rate range of 60-75 bpm , the vibrations will stop. Relaxation achieved!

Materials Used:

  • Arduino UNO
  • 9 mini vibration motors
  • Pulse Sensor
  • Transistor + Diode
  • Leather as enclosure

Fabrication Process:

Diagram:

Resources: