Top view of the entire double transducer

Input: Adafruit TCS34725 Color Sensor

Middle Step: ADXL335 Accelerometer on a popsicle stick structure attached to a servo motor

Output: an popsicle arm that moves forward when the servo motor rotates

Description

This double transducer reads a color sensor on the left side and converts the result into corresponding rotational movements of a motor which is connected to an accelerometer with popsicle sticks structure. The movements of the accelerometer result in the linear movement of a popsicle stick. The closer the color is to red, the less linear movements the popsicle structure makes.

Discussion

The most important part of this project was in communication with other teams. To make our double transducer work transducer to transducer, we did some experiments by setting each sensor results to specific values in an Arduino. For an input color sensor specifically, we used different colors of objects to give different signals to a color sensor. While it worked internally, because we are getting input from the previous team’s output, we needed to communicate with other teams and test our model to theirs. Since we were the last team, we met up with the previous team and tested our color sensor. Throughout this process, we learned communication not only within a team but also among multiple working units is critical especially in a big project. 

One of the challenging parts was the final ‘linear’ movement. We first started off with popsicle sticks with their original length to see how it works; however, it, first, makes circular movements, and, second, moved too much which was not appropriate to the given board size. We did some experiments to find proper lengths of popsicle sticks corresponding to the board size, and found out shorter popsicle sticks make smoother and more gradual movements. However, it still did not make a perfectly linear movement, so we built cardboard houses that fasten a popsicle stick. Before building the linear movement structure, we calculated the lengths and degrees, but it unexpectedly did not turn out that way. Throughout the multiple problem-solving processes we ended up having the model we wanted, which was different from what we first designed. We realized there always can be differences between calculations and the actual executions. 

As for the middle part, we originally decided to use a joystick and popsicles to move the joystick. However, we found out that the joystick tends to latch on to the middle or the two ends, and it is very hard to make it stay in the middle. With a backup plan during our idea session, we made the motor rotates an accelerometer instead, which turned out to be successful. We learned that we should always consider alternatives in case our plan fails, and if something doesn’t work, we should not dwell on it but should look for different solutions.

Process Images

Originally we planned to use a joystick for our middle step, but we had difficulties making it stay in the middle, so we switched to an accelerometer instead.

Planning the mechanism for converting motor rotation into linear movement. We realized a popsicle stick attached to the motor is too long.

Near-finished product for our output. We decided to make cardboard “houses” to hold the popsicle stick in place.

Schematic

Code Submission

  1. <span class="com">/*
  2. * Project 1: A Double Transducer - Color to Linear Position
  3. * Alan Zhu and Yun Lee
  4. *
  5. * Description: the code here first takes the rgb input from the
  6. * color sensor and map it to a single value (hue), and uses that
  7. * value to determine the degree and turn the first servo attached
  8. * to the accelerometer. It then reads the accelerometer input and
  9. * determine the degree and turn the second servo attached to popsicle
  10. * sticks for linear movement. It also updates the LCD screen regularly
  11. * to show values for input, middle input, middle output, and output.
  12. *
  13. * Collaboration: the code to transform rgb colors into hue is
  14. * taken from the second response in
  15. * https://stackoverflow.com/questions/23090019/fastest-formula-to-get-hue-from-rgb
  16. *
  17. * Pin mapping:
  18. * pin | mode | description
  19. * ------|--------|------------
  20. * A0 input accelerometer
  21. * 5 output servo motor 1 (accelerometer)
  22. * 6 output servo motor 2 (popsicle)
  23. *
  24. *
  25. */</span><span class="pln">
  26. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><NewPing.h></span><span class="pln">
  27. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
  28. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  29. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">
  30. </span><span class="com">#include</span><span class="pln"> </span><span class="str">"Adafruit_TCS34725.h"</span><span class="pln">
  31. </span><span class="kwd">int</span><span class="pln"> counter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  32. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> FREQ </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span><span class="pln">
  33. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MOTORPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
  34. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> MOTORPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">
  35. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> ACCPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
  36. </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="com">// variable for timing</span><span class="pln">
  37. </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">250</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between updates 4 times a second</span><span class="pln">
  38. </span><span class="com">// set up servos, color sensor, and LCD</span><span class="pln">
  39. </span><span class="typ">Servo</span><span class="pln"> steeringMotor1</span><span class="pun">,</span><span class="pln"> steeringMotor2</span><span class="pun">;</span><span class="pln">
  40. </span><span class="typ">Adafruit_TCS34725</span><span class="pln"> tcs </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Adafruit_TCS34725</span><span class="pun">();</span><span class="pln">
  41. </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">
  42. </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">
  43. </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">
  44. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">tcs</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  45. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Found sensor"</span><span class="pun">);</span><span class="pln">
  46. </span><span class="pun">}</span><span class="pln">
  47. steeringMotor1</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">MOTORPIN1</span><span class="pun">);</span><span class="pln">
  48. steeringMotor2</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">MOTORPIN2</span><span class="pun">);</span><span class="pln">
  49. pinMode</span><span class="pun">(</span><span class="pln">ACCPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</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="pun">}</span><span class="pln">
  54. </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">
  55. </span><span class="com">// read rgb and map to a single value</span><span class="pln">
  56. </span><span class="kwd">float</span><span class="pln"> r</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
  57. tcs</span><span class="pun">.</span><span class="pln">getRGB</span><span class="pun">(&</span><span class="pln">r</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">g</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">b</span><span class="pun">);</span><span class="pln">
  58. </span><span class="kwd">int</span><span class="pln"> hue </span><span class="pun">=</span><span class="pln"> rgbToHue</span><span class="pun">(</span><span class="pln">r</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">);</span><span class="pln">
  59. </span><span class="com">// map color to degree and rotate popsicle stick attached to accelerometer</span><span class="pln">
  60. </span><span class="kwd">int</span><span class="pln"> degree </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">hue</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">360</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">90</span><span class="pun">);</span><span class="pln">
  61. steeringMotor1</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">degree</span><span class="pun">);</span><span class="pln">
  62. </span><span class="com">// read accelerometer and revert to original position</span><span class="pln">
  63. </span><span class="kwd">int</span><span class="pln"> acc_pos </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">ACCPIN</span><span class="pun">);</span><span class="pln">
  64. delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  65. steeringMotor1</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(-</span><span class="pln">degree</span><span class="pun">);</span><span class="pln">
  66. delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  67. </span><span class="com">// for testing purposes</span><span class="pln">
  68. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"degree:"</span><span class="pun">+</span><span class="pln">degree</span><span class="pun">);</span><span class="pln">
  69. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"X:"</span><span class="pun">+</span><span class="pln">acc_pos</span><span class="pun">);</span><span class="pln">
  70. </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"r:"</span><span class="pun">+</span><span class="pln">r</span><span class="pun">+</span><span class="str">" g:"</span><span class="pun">+</span><span class="pln">g</span><span class="pun">+</span><span class="str">" b:"</span><span class="pun">+</span><span class="pln">b</span><span class="pun">+</span><span class="str">" h:"</span><span class="pun">+</span><span class="pln">hue</span><span class="pun">);</span><span class="pln">
  71. </span><span class="com">// map accelerometer input to degree and rotate motor 2</span><span class="pln">
  72. </span><span class="kwd">int</span><span class="pln"> degree2 </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">acc_pos</span><span class="pun">,</span><span class="pln"> </span><span class="lit">420</span><span class="pun">,</span><span class="pln"> </span><span class="lit">365</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">50</span><span class="pun">);</span><span class="pln">
  73. steeringMotor2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">degree2</span><span class="pun">);</span><span class="pln">
  74. delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  75. steeringMotor2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(-</span><span class="pln">degree2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// move back to original position</span><span class="pln">
  76. delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  77. </span><span class="com">// map all values to 0-99 scale</span><span class="pln">
  78. </span><span class="kwd">int</span><span class="pln"> led_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">hue</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">360</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">
  79. </span><span class="kwd">int</span><span class="pln"> motor1_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">degree</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">90</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">
  80. </span><span class="kwd">int</span><span class="pln"> acc_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">acc_pos</span><span class="pun">,</span><span class="pln"> </span><span class="lit">420</span><span class="pun">,</span><span class="pln"> </span><span class="lit">365</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">
  81. </span><span class="kwd">int</span><span class="pln"> motor2_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">degree2</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">50</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">
  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. screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  84. </span><span class="com">// run LCD screen update procedure here</span><span class="pln">
  85. 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="com">// and update timer</span><span class="pln">
  86. screen</span><span class="pun">.</span><span class="pln">setCursor</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">
  87. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"i:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> led_lcd</span><span class="pun">);</span><span class="pln">
  88. screen</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  89. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"m:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> motor1_lcd</span><span class="pun">);</span><span class="pln">
  90. 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="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  91. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="pln">acc_lcd</span><span class="pun">);</span><span class="pln">
  92. 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="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  93. screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"o:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> motor2_lcd</span><span class="pun">);</span><span class="pln">
  94. </span><span class="pun">}</span><span class="pln">
  95. </span><span class="pun">}</span><span class="pln">
  96. </span><span class="com">// map red, blue, and green into hue</span><span class="pln">
  97. </span><span class="kwd">int</span><span class="pln"> rgbToHue</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> r</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
  98. </span><span class="kwd">int</span><span class="pln"> red </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">r</span><span class="pun">;</span><span class="pln">
  99. </span><span class="kwd">int</span><span class="pln"> green </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">g</span><span class="pun">;</span><span class="pln">
  100. </span><span class="kwd">int</span><span class="pln"> blue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">b</span><span class="pun">;</span><span class="pln">
  101. </span><span class="kwd">float</span><span class="pln"> mn </span><span class="pun">=</span><span class="pln"> min</span><span class="pun">(</span><span class="pln">min</span><span class="pun">(</span><span class="pln">red</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">),</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">
  102. </span><span class="kwd">float</span><span class="pln"> mx </span><span class="pun">=</span><span class="pln"> max</span><span class="pun">(</span><span class="pln">max</span><span class="pun">(</span><span class="pln">red</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">),</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">
  103. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mn </span><span class="pun">==</span><span class="pln"> mx</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  104. </span><span class="kwd">float</span><span class="pln"> hue </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  105. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">==</span><span class="pln"> red</span><span class="pun">)</span><span class="pln">
  106. hue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">green </span><span class="pun">-</span><span class="pln"> blue</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">-</span><span class="pln"> mn</span><span class="pun">);</span><span class="pln">
  107. </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">mx </span><span class="pun">==</span><span class="pln"> green</span><span class="pun">)</span><span class="pln">
  108. hue </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">blue </span><span class="pun">-</span><span class="pln"> red</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">-</span><span class="pln"> mn</span><span class="pun">);</span><span class="pln">
  109. </span><span class="kwd">else</span><span class="pln">
  110. hue </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">red </span><span class="pun">-</span><span class="pln"> green</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">-</span><span class="pln"> mn</span><span class="pun">);</span><span class="pln">
  111. hue </span><span class="pun">=</span><span class="pln"> hue </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</span><span class="pun">;</span><span class="pln">
  112. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">hue </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> hue </span><span class="pun">=</span><span class="pln"> hue </span><span class="pun">+</span><span class="pln"> </span><span class="lit">360</span><span class="pun">;</span><span class="pln">
  113. </span><span class="kwd">return</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">hue</span><span class="pun">);</span><span class="pln">
  114. </span><span class="pun">}</span>
<span class="com">/*
 * Project 1: A Double Transducer - Color to Linear Position
 * Alan Zhu and Yun Lee
 * 
 * Description: the code here first takes the rgb input from the 
 * color sensor and map it to a single value (hue), and uses that
 * value to determine the degree and turn the first servo attached
 * to the accelerometer. It then reads the accelerometer input and
 * determine the degree and turn the second servo attached to popsicle
 * sticks for linear movement. It also updates the LCD screen regularly
 * to show values for input, middle input, middle output, and output.
 * 
 * Collaboration: the code to transform rgb colors into hue is
 * taken from the second response in 
 * https://stackoverflow.com/questions/23090019/fastest-formula-to-get-hue-from-rgb
 * 
 * Pin mapping:
 * pin   | mode   | description
 * ------|--------|------------
 * A0     input    accelerometer
 * 5      output   servo motor 1 (accelerometer)
 * 6      output   servo motor 2 (popsicle)
 * 
 * 
 */</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"><Servo.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">"Adafruit_TCS34725.h"</span><span class="pln">


</span><span class="kwd">int</span><span class="pln"> counter </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"> FREQ </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</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"> MOTORPIN1 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</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"> MOTORPIN2 </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</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"> ACCPIN </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</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="com">// variable for timing</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">250</span><span class="pun">;</span><span class="pln"> </span><span class="com">// milliseconds between updates 4 times a second</span><span class="pln">

</span><span class="com">// set up servos, color sensor, and LCD</span><span class="pln">
</span><span class="typ">Servo</span><span class="pln"> steeringMotor1</span><span class="pun">,</span><span class="pln"> steeringMotor2</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Adafruit_TCS34725</span><span class="pln"> tcs </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Adafruit_TCS34725</span><span class="pun">();</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="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="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">tcs</span><span class="pun">.</span><span class="kwd">begin</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="pln">println</span><span class="pun">(</span><span class="str">"Found sensor"</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  steeringMotor1</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">MOTORPIN1</span><span class="pun">);</span><span class="pln">
  steeringMotor2</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">MOTORPIN2</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">ACCPIN</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</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="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">// read rgb and map to a single value</span><span class="pln">
  </span><span class="kwd">float</span><span class="pln"> r</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
  tcs</span><span class="pun">.</span><span class="pln">getRGB</span><span class="pun">(&</span><span class="pln">r</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">g</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&</span><span class="pln">b</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> hue </span><span class="pun">=</span><span class="pln"> rgbToHue</span><span class="pun">(</span><span class="pln">r</span><span class="pun">,</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">);</span><span class="pln"> 

  </span><span class="com">// map color to degree and rotate popsicle stick attached to accelerometer</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> degree </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">hue</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">360</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">90</span><span class="pun">);</span><span class="pln"> 
  steeringMotor1</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">degree</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// read accelerometer and revert to original position</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> acc_pos </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">ACCPIN</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">
  steeringMotor1</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(-</span><span class="pln">degree</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">// for testing purposes</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="typ">String</span><span class="pun">)</span><span class="str">"degree:"</span><span class="pun">+</span><span class="pln">degree</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="typ">String</span><span class="pun">)</span><span class="str">"X:"</span><span class="pun">+</span><span class="pln">acc_pos</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="typ">String</span><span class="pun">)</span><span class="str">"r:"</span><span class="pun">+</span><span class="pln">r</span><span class="pun">+</span><span class="str">" g:"</span><span class="pun">+</span><span class="pln">g</span><span class="pun">+</span><span class="str">" b:"</span><span class="pun">+</span><span class="pln">b</span><span class="pun">+</span><span class="str">" h:"</span><span class="pun">+</span><span class="pln">hue</span><span class="pun">);</span><span class="pln">
  
  </span><span class="com">// map accelerometer input to degree and rotate motor 2</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> degree2 </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">acc_pos</span><span class="pun">,</span><span class="pln"> </span><span class="lit">420</span><span class="pun">,</span><span class="pln"> </span><span class="lit">365</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">50</span><span class="pun">);</span><span class="pln">
  steeringMotor2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">degree2</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">
  steeringMotor2</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(-</span><span class="pln">degree2</span><span class="pun">);</span><span class="pln"> </span><span class="com">// move back to original position</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">// map all values to 0-99 scale</span><span class="pln">
  </span><span class="kwd">int</span><span class="pln"> led_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">hue</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">360</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="kwd">int</span><span class="pln"> motor1_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">degree</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">90</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="kwd">int</span><span class="pln"> acc_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">acc_pos</span><span class="pun">,</span><span class="pln"> </span><span class="lit">420</span><span class="pun">,</span><span class="pln"> </span><span class="lit">365</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="kwd">int</span><span class="pln"> motor2_lcd </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">degree2</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">50</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="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">
      screen</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
      </span><span class="com">// run LCD screen update procedure here</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="com">// and update timer</span><span class="pln">
      screen</span><span class="pun">.</span><span class="pln">setCursor</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">
      screen</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">((</span><span class="typ">String</span><span class="pun">)</span><span class="str">"i:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> led_lcd</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">6</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="typ">String</span><span class="pun">)</span><span class="str">"m:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> motor1_lcd</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="pln"> </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">acc_lcd</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="pln"> </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="typ">String</span><span class="pun">)</span><span class="str">"o:"</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> motor2_lcd</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// map red, blue, and green into hue</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> rgbToHue</span><span class="pun">(</span><span class="kwd">float</span><span class="pln"> r</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> g</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">float</span><span class="pln"> b</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> red </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">r</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> green </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">g</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">int</span><span class="pln"> blue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">int</span><span class="pun">)</span><span class="pln">b</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">float</span><span class="pln"> mn </span><span class="pun">=</span><span class="pln"> min</span><span class="pun">(</span><span class="pln">min</span><span class="pun">(</span><span class="pln">red</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">),</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">float</span><span class="pln"> mx </span><span class="pun">=</span><span class="pln"> max</span><span class="pun">(</span><span class="pln">max</span><span class="pun">(</span><span class="pln">red</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">),</span><span class="pln"> blue</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">mn </span><span class="pun">==</span><span class="pln"> mx</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">float</span><span class="pln"> hue </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">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">==</span><span class="pln"> red</span><span class="pun">)</span><span class="pln"> 
      hue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">green </span><span class="pun">-</span><span class="pln"> blue</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">-</span><span class="pln"> mn</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">mx </span><span class="pun">==</span><span class="pln"> green</span><span class="pun">)</span><span class="pln">
        hue </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">blue </span><span class="pun">-</span><span class="pln"> red</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">-</span><span class="pln"> mn</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln"> 
        hue </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">red </span><span class="pun">-</span><span class="pln"> green</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mx </span><span class="pun">-</span><span class="pln"> mn</span><span class="pun">);</span><span class="pln">
    hue </span><span class="pun">=</span><span class="pln"> hue </span><span class="pun">*</span><span class="pln"> </span><span class="lit">60</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">hue </span><span class="pun"><</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> hue </span><span class="pun">=</span><span class="pln"> hue </span><span class="pun">+</span><span class="pln"> </span><span class="lit">360</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> round</span><span class="pun">(</span><span class="pln">hue</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span>