Description:

This is a double transducer that converts magnetic field (first input signal) into a motor movement (first output and second input signal) generated by reading the orientation of the motor, then reads that signal to convert to vibration (second output signal). This double conversion overall allows the magnetic field strength to be converted to vibration strength.

Sequence:

  1. (input 1, magnetic field strength) The triple-axis compass magnetometer sensor provides analog magnetic field strength data. The closer the magnet, the stronger the magnetic field strength that is detected by the sensor.
  2. (output 1, input 2, movement) The numbers from the sensor make the hobby servo motor to move within the range of 0 to 90 degrees. As the motor creates a movement, the ADXL335 analog accelerometer that is attached to the motor detects the change in orientation.
  3. (output 2, vibration strength) Then, this data is sent to the pancake vibration motor, generating vibration of according strength.

Overall photo

Detail Images:

Triple-axis compass magnetometer sensor with its 5-pin header on the back side

Triple-axis compass magnetometer sensor with its x, y, z axes marking

Hobby servo motor with ADXL335 analog accelerometer fixed on

Pancake vibration motor

Video:

 

Progress Images:

Intermediate testing step to figure out the motor integration

Parts assembled except for the LCD and magnetometer; serial monitor used to debug

All parts assembled and working except for the magnetometer

Discussion:

We initially had a hall effect sensor to detect the magnetic field, but we replaced it with the triple-axis compass magnetometer sensor so that we could have analog, instead of digital, data. This was perhaps the hardest part because finding the right library took some time, and figuring out the range and calibrating were difficult because the sensor would overload when the magnet got too close to the sensor.

A physical difficulty was fixing the accelerometer well to the hobby servo body and adjusting the angles to be consistent with the angles in the code. We had to use some cardboard pieces to account for the length of the screw and the limited space to put the screw through while making the connection tight, and we had to do some trial and error for making sure that the motor along the correct range of angles. We also had to be careful with the pancake vibrator because the wires were very thin. We resolved by soldering and fixing the vibrator with tape onto the raised foam core board platform.

The challenge towards the end was mapping the magnetic field input range to appropriately to the previous group’s output. Because the magnetic field strength was weaker than anticipated, it was difficult to output the vibration strength strongly enough for the next group to have a good input range.

Some things that were straightforward were wiring and mapping the LCD display system and the movement mechanism parts because they were largely covered during class. Figuring out how to output signals with motors was also relatively easy.

We could gain soldering skills, and learn how to easily calibrate and map values across various parts. We could have done better with wire color-coding.

Schematic:

Code:

  1. <span class="com">/* Title: Double Transducer: Magnetic Strength to Vibration Strength
  2. * Authors: Ivan Zhang and Youie Cho
  3. * Libraries: LiquidCrystal by Arduino, Adafruit, QMC5883LCompass by
  4. * MRPrograms
  5. *
  6. *
  7. */</span><span class="pln">
  8. </span><span class="com">//all the libraries</span><span class="pln">
  9. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
  10. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><math.h></span><span class="pln">
  11. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  12. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">
  13. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><QMC5883LCompass.h></span><span class="pln">
  14. </span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">(</span><span class="lit">0x27</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">//create screen called screen</span><span class="pln">
  15. QMC5883LCompass compass</span><span class="pun">;</span><span class="pln"> </span><span class="com">//create compass named compass</span><span class="pln">
  16. </span><span class="typ">Servo</span><span class="pln"> steeringMotor</span><span class="pun">;</span><span class="pln"> </span><span class="com">//create a motor object called steeringMotor</span><span class="pln">
  17. </span><span class="com">//naming all used pins</span><span class="pln">
  18. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> XPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
  19. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> YPIN </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln">
  20. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ZPIN </span><span class="pun">=</span><span class="pln"> A2</span><span class="pun">;</span><span class="pln">
  21. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MOTORPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  22. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> BUZZPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln">
  23. </span><span class="com">//setup timing</span><span class="pln">
  24. </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> timer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  25. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> INTERVAL </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span><span class="pln">
  26. </span><span class="com">//naming the intensity of the axis and buzzer</span><span class="pln">
  27. </span><span class="kwd">int</span><span class="pln"> xAxis</span><span class="pun">;</span><span class="pln">
  28. </span><span class="kwd">int</span><span class="pln"> buzzInt</span><span class="pun">;</span><span class="pln">
  29. </span><span class="kwd">int</span><span class="pln"> motorAngle</span><span class="pun">;</span><span class="pln">
  30. </span><span class="kwd">int</span><span class="pln"> magStr</span><span class="pun">;</span><span class="pln">
  31. </span><span class="com">//naming the output to LCD</span><span class="pln">
  32. </span><span class="kwd">int</span><span class="pln"> magPrint</span><span class="pun">;</span><span class="pln">
  33. </span><span class="kwd">int</span><span class="pln"> buzzPrint</span><span class="pun">;</span><span class="pln">
  34. </span><span class="kwd">int</span><span class="pln"> motorPrint</span><span class="pun">;</span><span class="pln">
  35. </span><span class="kwd">int</span><span class="pln"> accPrint</span><span class="pun">;</span><span class="pln">
  36. </span><span class="com">//defining the range of the input</span><span class="pln">
  37. </span><span class="kwd">int</span><span class="pln"> magMin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6000</span><span class="pun">;</span><span class="pln">
  38. </span><span class="kwd">int</span><span class="pln"> magMax </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8100</span><span class="pun">;</span><span class="pln">
  39. </span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">(){</span><span class="pln">
  40. </span><span class="com">//set up motor</span><span class="pln">
  41. steeringMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">MOTORPIN</span><span class="pun">);</span><span class="pln">
  42. </span><span class="com">//set up accelerometer</span><span class="pln">
  43. pinMode</span><span class="pun">(</span><span class="pln">XPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  44. pinMode</span><span class="pun">(</span><span class="pln">YPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  45. pinMode</span><span class="pun">(</span><span class="pln">ZPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  46. </span><span class="com">//set up buzzer</span><span class="pln">
  47. pinMode</span><span class="pun">(</span><span class="pln">BUZZPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  48. </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">
  49. </span><span class="com">//set up screen</span><span class="pln">
  50. screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  51. screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  52. screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">
  53. </span><span class="com">//set up compass</span><span class="pln">
  54. compass</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  55. </span><span class="pun">}</span><span class="pln">
  56. </span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">(){</span><span class="pln">
  57. </span><span class="com">//get compass data</span><span class="pln">
  58. compass</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">
  59. magStr </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">compass</span><span class="pun">.</span><span class="pln">getY</span><span class="pun">());</span><span class="pln">
  60. </span><span class="com">//TRANSDUCER 1</span><span class="pln">
  61. </span><span class="com">//map mag strength to motor angle</span><span class="pln">
  62. motorAngle </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">magStr</span><span class="pun">,</span><span class="pln">magMin</span><span class="pun">,</span><span class="pln">magMax</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">180</span><span class="pun">));</span><span class="pln">
  63. </span><span class="com">//set motor angle</span><span class="pln">
  64. steeringMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">motorAngle</span><span class="pun">);</span><span class="pln">
  65. </span><span class="com">//TRANSDUCER 2</span><span class="pln">
  66. </span><span class="com">//map the XPIN to the angle from the rotation</span><span class="pln">
  67. xAxis </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">XPIN</span><span class="pun">),</span><span class="pln"> </span><span class="lit">400</span><span class="pun">,</span><span class="pln"> </span><span class="lit">280</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">));</span><span class="pln">
  68. </span><span class="com">//map the buzzer intensity from the xAxis</span><span class="pln">
  69. buzzInt </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">xAxis</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  70. </span><span class="com">//set buzz intensity</span><span class="pln">
  71. analogWrite</span><span class="pun">(</span><span class="pln">BUZZPIN</span><span class="pun">,</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">buzzInt</span><span class="pun">));</span><span class="pln">
  72. </span><span class="com">//debugging serial</span><span class="pln">
  73. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magStr</span><span class="pun">);</span><span class="pln">
  74. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">','</span><span class="pun">);</span><span class="pln">
  75. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">motorAngle</span><span class="pun">);</span><span class="pln">
  76. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">','</span><span class="pun">);</span><span class="pln">
  77. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">XPIN</span><span class="pun">));</span><span class="pln">
  78. </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">','</span><span class="pun">);</span><span class="pln">
  79. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">buzzInt</span><span class="pun">);</span><span class="pln">
  80. delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  81. </span><span class="com">//timer for LCD</span><span class="pln">
  82. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> timer</span><span class="pun">){</span><span class="pln">
  83. </span><span class="com">//reset screen</span><span class="pln">
  84. screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  85. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  86. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"i: m:"</span><span class="pun">);</span><span class="pln">
  87. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">12</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  88. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"o:"</span><span class="pun">);</span><span class="pln">
  89. </span><span class="com">//map each value to 0-99 for printing</span><span class="pln">
  90. magPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">magStr</span><span class="pun">,</span><span class="pln"> magMin</span><span class="pun">,</span><span class="pln"> magMax</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
  91. motorPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">motorAngle</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
  92. accPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">xAxis</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
  93. buzzPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">buzzInt</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
  94. </span><span class="com">//print numbers</span><span class="pln">
  95. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  96. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magPrint</span><span class="pun">);</span><span class="pln">
  97. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  98. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">motorPrint</span><span class="pun">);</span><span class="pln">
  99. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  100. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">accPrint</span><span class="pun">);</span><span class="pln">
  101. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  102. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">buzzPrint</span><span class="pun">);</span><span class="pln">
  103. timer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> INTERVAL</span><span class="pun">;</span><span class="pln">
  104. </span><span class="pun">}</span><span class="pln">
  105. </span><span class="pun">}</span>
<span class="com">/* Title: Double Transducer: Magnetic Strength to Vibration Strength
 * Authors: Ivan Zhang and Youie Cho
 * Libraries: LiquidCrystal by Arduino, Adafruit, QMC5883LCompass by
 * MRPrograms
 *
 * 
 */</span><span class="pln">

</span><span class="com">//all the libraries</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><math.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"><LiquidCrystal_I2C.h></span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str"><QMC5883LCompass.h></span><span class="pln">
</span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">(</span><span class="lit">0x27</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln"> </span><span class="com">//create screen called screen</span><span class="pln">
QMC5883LCompass compass</span><span class="pun">;</span><span class="pln"> </span><span class="com">//create compass named compass</span><span class="pln">
</span><span class="typ">Servo</span><span class="pln"> steeringMotor</span><span class="pun">;</span><span class="pln"> </span><span class="com">//create a motor object called steeringMotor</span><span class="pln">

</span><span class="com">//naming all used pins</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> XPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> YPIN </span><span class="pun">=</span><span class="pln"> A1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ZPIN </span><span class="pun">=</span><span class="pln"> A2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MOTORPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> BUZZPIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln">

</span><span class="com">//setup timing</span><span class="pln">
</span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">long</span><span class="pln"> timer </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> INTERVAL </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span><span class="pln">

</span><span class="com">//naming the intensity of the axis and buzzer</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> xAxis</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> buzzInt</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> motorAngle</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> magStr</span><span class="pun">;</span><span class="pln">

</span><span class="com">//naming the output to LCD</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> magPrint</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> buzzPrint</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> motorPrint</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> accPrint</span><span class="pun">;</span><span class="pln">

</span><span class="com">//defining the range of the input</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> magMin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6000</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> magMax </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8100</span><span class="pun">;</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="com">//set up motor</span><span class="pln">
  steeringMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">MOTORPIN</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//set up accelerometer</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">XPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">YPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">ZPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//set up buzzer</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BUZZPIN</span><span class="pun">,</span><span class="pln"> OUTPUT</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="com">//set up screen</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln">
  screen</span><span class="pun">.</span><span class="pln">home</span><span class="pun">();</span><span class="pln">

  </span><span class="com">//set up compass</span><span class="pln">
  compass</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
</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="com">//get compass data</span><span class="pln">
  compass</span><span class="pun">.</span><span class="pln">read</span><span class="pun">();</span><span class="pln">
  magStr </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">compass</span><span class="pun">.</span><span class="pln">getY</span><span class="pun">());</span><span class="pln">

  </span><span class="com">//TRANSDUCER 1</span><span class="pln">
  </span><span class="com">//map mag strength to motor angle</span><span class="pln">
  motorAngle </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">magStr</span><span class="pun">,</span><span class="pln">magMin</span><span class="pun">,</span><span class="pln">magMax</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">180</span><span class="pun">));</span><span class="pln">
  </span><span class="com">//set motor angle</span><span class="pln">
  steeringMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">motorAngle</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//TRANSDUCER 2</span><span class="pln">
  </span><span class="com">//map the XPIN to the angle from the rotation</span><span class="pln">
  xAxis </span><span class="pun">=</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">map</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">XPIN</span><span class="pun">),</span><span class="pln"> </span><span class="lit">400</span><span class="pun">,</span><span class="pln"> </span><span class="lit">280</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">));</span><span class="pln">
  </span><span class="com">//map the buzzer intensity from the xAxis</span><span class="pln">
  buzzInt </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">xAxis</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//set buzz intensity</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">BUZZPIN</span><span class="pun">,</span><span class="pln"> abs</span><span class="pun">(</span><span class="pln">buzzInt</span><span class="pun">));</span><span class="pln">

  </span><span class="com">//debugging serial</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">magStr</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="str">','</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">motorAngle</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="str">','</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">analogRead</span><span class="pun">(</span><span class="pln">XPIN</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="str">','</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="pln">buzzInt</span><span class="pun">);</span><span class="pln">

  delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">

    
  </span><span class="com">//timer for LCD</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">>=</span><span class="pln"> timer</span><span class="pun">){</span><span class="pln">
      </span><span class="com">//reset screen</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"i:    m:"</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">12</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"o:"</span><span class="pun">);</span><span class="pln">
        
      </span><span class="com">//map each value to 0-99 for printing</span><span class="pln">
      magPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">magStr</span><span class="pun">,</span><span class="pln"> magMin</span><span class="pun">,</span><span class="pln"> magMax</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
      motorPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">motorAngle</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
      accPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">xAxis</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">180</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
      buzzPrint </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">buzzInt</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">

      </span><span class="com">//print numbers</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">magPrint</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="lit">0</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">motorPrint</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">8</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">accPrint</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">14</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">buzzPrint</span><span class="pun">);</span><span class="pln">
      timer </span><span class="pun">=</span><span class="pln"> millis</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> INTERVAL</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span>

 

Double Transducer in Context: