[62-362] Activating the Body | Project 2: Flow | Fall 2019 | Hugh Lee

Side view of the device

Front view of the device

Close up view of the device

Close view of device attached on arm

Both arms with device attached

Device not attached

How the device works

Project Description:

Walking backwards is a project that explores the uncomfortable feeling of walking backwards. This project was inspired by a small exercise with Slow Danger, who have taught us several physical exercises in which walking backwards was one of them. They instructed us to walk and imagine our backs as the front of our body. This resulted in a very interesting movements, and explored the uncomfortable feeling of walking without seeing. The device that I created measures the distance between the device and any surrounding objects and transduces into vibration. The vibration indicates how close one is to any obstacles behind.

Process Reflection:

In the middle of the process, I quickly realized the limitations of the project. At the final critique, I came up with two devices, which each one would be strapped on both arms individually, but it would have been more successful if I had more devices to put on different parts of the body. At the Final Critique, when I put the devices on Alex’s arms, his movement was very timid, as if he didn’t trust the devices. More devices would have led to a more accurate measurement and variation of movements.

The device would have also benefited if I had not used a breadboard and used less components. The jumper wires continued to fall out unexpectedly. Also, having the Arduino chip and bread board as two large pieces separately made the device unnecessarily large.

Flow Diagram:

 

Arduino Code:

  1. <span class="com">//Project no.2: Walking Backwards</span><span class="pln">
  2. </span><span class="com">//Hugh Lee</span><span class="pln">
  3. </span><span class="com">//The ultrasonic sensor measures the distance between the sensor and any object nearby and converts into vibration. There are three different types of vibration, indicating how close the object is to the sensor. The different types of vibration are pulled from the "Adafruit Drv2605.h" library. </span><span class="pln">
  4. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><NewPing.h></span><span class="pln">
  5. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  6. </span><span class="com">#include</span><span class="pln"> </span><span class="str">"Adafruit_DRV2605.h"</span><span class="pln">
  7. </span><span class="com">#define</span><span class="pln"> TRIGGER_PIN </span><span class="lit">12</span><span class="pln"> </span><span class="com">// Arduino pin tied to trigger pin on the ultrasonic sensor.</span><span class="pln">
  8. </span><span class="com">#define</span><span class="pln"> ECHO_PIN </span><span class="lit">11</span><span class="pln"> </span><span class="com">// Arduino pin tied to echo pin on the ultrasonic sensor.</span><span class="pln">
  9. </span><span class="com">#define</span><span class="pln"> MAX_DISTANCE </span><span class="lit">400</span><span class="pln"> </span><span class="com">// Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.</span><span class="pln">
  10. </span><span class="typ">Adafruit_DRV2605</span><span class="pln"> drv</span><span class="pun">;</span><span class="pln">
  11. </span><span class="typ">NewPing</span><span class="pln"> sonar</span><span class="pun">(</span><span class="pln">TRIGGER_PIN</span><span class="pun">,</span><span class="pln"> ECHO_PIN</span><span class="pun">,</span><span class="pln"> MAX_DISTANCE</span><span class="pun">);</span><span class="pln"> </span><span class="com">// NewPing setup of pins and maximum distance.</span><span class="pln">
  12. </span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  13. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  14. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"DRV test"</span><span class="pun">);</span><span class="pln">
  15. drv</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">
  16. drv</span><span class="pun">.</span><span class="pln">selectLibrary</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  17. </span><span class="com">// I2C trigger by sending 'go' command</span><span class="pln">
  18. </span><span class="com">// default, internal trigger when sending GO command</span><span class="pln">
  19. drv</span><span class="pun">.</span><span class="pln">setMode</span><span class="pun">(</span><span class="pln">DRV2605_MODE_INTTRIG</span><span class="pun">);</span><span class="pln">
  20. </span><span class="pun">}</span><span class="pln">
  21. </span><span class="typ">uint8_t</span><span class="pln"> effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  22. </span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  23. </span><span class="com">// Serial.print("Effect #"); Serial.println(effect);</span><span class="pln">
  24. </span><span class="kwd">int</span><span class="pln"> ping </span><span class="pun">=</span><span class="pln"> sonar</span><span class="pun">.</span><span class="pln">ping_cm</span><span class="pun">();</span><span class="pln">
  25. delay</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.</span><span class="pln">
  26. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Ping: "</span><span class="pun">);</span><span class="pln">
  27. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">ping</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Send ping, get distance in cm and print result (0 = outside set distance range)</span><span class="pln">
  28. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"cm"</span><span class="pun">);</span><span class="pln">
  29. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ping </span><span class="pun"><</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  30. effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">118</span><span class="pun">;</span><span class="pln"> </span><span class="com">//if ping is smaller than 5, it uses vibration 118 from the "Adafruit_DRV2605.h" library</span><span class="pln">
  31. drv</span><span class="pun">.</span><span class="pln">go</span><span class="pun">();</span><span class="pln">
  32. </span><span class="pun">}</span><span class="pln">
  33. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ping </span><span class="pun"><</span><span class="pln"> </span><span class="lit">25</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  34. effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">48</span><span class="pun">;</span><span class="pln"> </span><span class="com">//if ping is smaller than 25, it uses vibration 48 from the "Adafruit_DRV2605.h" library</span><span class="pln">
  35. drv</span><span class="pun">.</span><span class="pln">go</span><span class="pun">();</span><span class="pln">
  36. </span><span class="pun">}</span><span class="pln">
  37. </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ping </span><span class="pun"><</span><span class="pln"> </span><span class="lit">50</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  38. effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">44</span><span class="pun">;</span><span class="pln"> </span><span class="com">//if ping is smaller than 50, it uses vibration 44 from the "Adafruit_DRV2605.h" library</span><span class="pln">
  39. drv</span><span class="pun">.</span><span class="pln">go</span><span class="pun">();</span><span class="pln">
  40. </span><span class="pun">}</span><span class="pln">
  41. </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  42. drv</span><span class="pun">.</span><span class="pln">stop</span><span class="pun">();</span><span class="pln"> </span><span class="com">//stop vibrating for any other values</span><span class="pln">
  43. </span><span class="pun">}</span><span class="pln">
  44. drv</span><span class="pun">.</span><span class="pln">setWaveform</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> effect</span><span class="pun">);</span><span class="pln"> </span><span class="com">// play effect</span><span class="pln">
  45. drv</span><span class="pun">.</span><span class="pln">setWaveform</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">// end waveform</span><span class="pln">
  46. </span><span class="com">// play the effect!</span><span class="pln">
  47. </span><span class="pun">}</span>
<span class="com">//Project no.2: Walking Backwards</span><span class="pln">
</span><span class="com">//Hugh Lee</span><span class="pln">
</span><span class="com">//The ultrasonic sensor measures the distance between the sensor and any object nearby and converts into vibration. There are three different types of vibration, indicating how close the object is to the sensor. The different types of vibration are pulled from the "Adafruit Drv2605.h" library. </span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><NewPing.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">"Adafruit_DRV2605.h"</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> TRIGGER_PIN  </span><span class="lit">12</span><span class="pln">  </span><span class="com">// Arduino pin tied to trigger pin on the ultrasonic sensor.</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> ECHO_PIN     </span><span class="lit">11</span><span class="pln">  </span><span class="com">// Arduino pin tied to echo pin on the ultrasonic sensor.</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> MAX_DISTANCE </span><span class="lit">400</span><span class="pln"> </span><span class="com">// Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.</span><span class="pln">

</span><span class="typ">Adafruit_DRV2605</span><span class="pln"> drv</span><span class="pun">;</span><span class="pln">


</span><span class="typ">NewPing</span><span class="pln"> sonar</span><span class="pun">(</span><span class="pln">TRIGGER_PIN</span><span class="pun">,</span><span class="pln"> ECHO_PIN</span><span class="pun">,</span><span class="pln"> MAX_DISTANCE</span><span class="pun">);</span><span class="pln"> </span><span class="com">// NewPing setup of pins and maximum distance.</span><span class="pln">


</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"DRV test"</span><span class="pun">);</span><span class="pln">
  drv</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">();</span><span class="pln">

  drv</span><span class="pun">.</span><span class="pln">selectLibrary</span><span class="pun">(</span><span class="lit">1</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// I2C trigger by sending 'go' command</span><span class="pln">
  </span><span class="com">// default, internal trigger when sending GO command</span><span class="pln">
  drv</span><span class="pun">.</span><span class="pln">setMode</span><span class="pun">(</span><span class="pln">DRV2605_MODE_INTTRIG</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">uint8_t</span><span class="pln"> effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">//  Serial.print("Effect #"); Serial.println(effect);</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> ping </span><span class="pun">=</span><span class="pln"> sonar</span><span class="pun">.</span><span class="pln">ping_cm</span><span class="pun">();</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln">                     </span><span class="com">// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Ping: "</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">ping</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Send ping, get distance in cm and print result (0 = outside set distance range)</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"cm"</span><span class="pun">);</span><span class="pln">


  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ping </span><span class="pun"><</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">118</span><span class="pun">;</span><span class="pln"> </span><span class="com">//if ping is smaller than 5, it uses vibration 118 from the "Adafruit_DRV2605.h" library</span><span class="pln">
    drv</span><span class="pun">.</span><span class="pln">go</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ping </span><span class="pun"><</span><span class="pln"> </span><span class="lit">25</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">48</span><span class="pun">;</span><span class="pln"> </span><span class="com">//if ping is smaller than 25, it uses vibration 48 from the "Adafruit_DRV2605.h" library</span><span class="pln">
    drv</span><span class="pun">.</span><span class="pln">go</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ping </span><span class="pun"><</span><span class="pln"> </span><span class="lit">50</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    effect </span><span class="pun">=</span><span class="pln"> </span><span class="lit">44</span><span class="pun">;</span><span class="pln"> </span><span class="com">//if ping is smaller than 50, it uses vibration 44 from the "Adafruit_DRV2605.h" library</span><span class="pln">
    drv</span><span class="pun">.</span><span class="pln">go</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    drv</span><span class="pun">.</span><span class="pln">stop</span><span class="pun">();</span><span class="pln"> </span><span class="com">//stop vibrating for any other values</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  drv</span><span class="pun">.</span><span class="pln">setWaveform</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> effect</span><span class="pun">);</span><span class="pln">  </span><span class="com">// play effect</span><span class="pln">
  drv</span><span class="pun">.</span><span class="pln">setWaveform</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">  </span><span class="com">// end waveform</span><span class="pln">
  </span><span class="com">// play the effect!</span><span class="pln">

</span><span class="pun">}</span>