Project description

 

A 10’’ by 10’’ cardboard has a light sensor on the top side. When the light goes from dim to bright, a blue motor on the left side pushes the Popsicle stick to the right. As the Popsicle stick gets closer to the distance sensor, the servo motor on the bottom spins faster.

 

 

Input sensor: Photoresistor detects light brightness

Middle actuator: Servo motor drives linear actuation

Middle sensor: IR proximity sensor reads linear actuation

Output actuator: Continuous servo motor

Process

Testing the accuracy of one specific type of IR sensor.

Bending the metal arm to create linear motion

Testing to see if a plastic straw help to stabilize the motion of the popsicle

 

Discussion

This project was an excellent experience for us to learn new skills and gain confidence in creating interactive computing projects. The process of ideating helped us think of creative ways to transmit energy. We were initially interested in converting the light brightness to vibration intensity, which would ultimately manifest as rotation speed. However, after our initial check-in, we realized that having linear movement as the middle step instead of the vibration intensity would produce a stronger and more foolproof signal, as we later saw on demo day. 

Throughout the project, we were fascinated by the idea of converting one form of energy into a seemingly unrelated form. When the project was introduced to us, we were very intrigued by the thought of turning light brightness to rotation speed. This fascination didn’t stop there. Something as simple as using a servo motor to produce linear movement using very simple materials from the physical computing lab was exciting. 

Overall we were proud of how our project turned out. On demo day, one of the guest critics commented on our use of two servo motors in very different ways to produce various kinds of motion. That helped to crystallize the diverse applications of the components that were available to us in the lab and the endless possibilities with them! 

Schematic

Schematic

Code

  1. <span class="com">/*
  2. Project title: lightSpin
  3. Description: The following code direct the arduino to read values from a photoresistor and an IR proximity sensor,
  4. and manipulate a servo motor and a continuous servo motor accordingly.The value given by the photoresistor is mapped
  5. to a range of degree (0-180) that the servo motor turn to. The value given by the IR proximity sensor is mapped to a
  6. range of rotation speed for the continuous servo motor. Finally, the working percentages of each input and output are
  7. displayed on a LCD screen in a range of 0-99.
  8. Pin mapping:
  9. pin | mode | description
  10. ------|--------|------------
  11. 3 output Determines the rotation speed of the continuous servo motor
  12. 7 input Turns on the flashlight
  13. 12 output Turns the servo motor to different degree (0-180)
  14. A0 input For the photoresistor to detect the light intensity
  15. A2 input For the IR proximity sensor to detect the linear distance to the popsicle
  16. A4 output Serial data; for communication to the LCD screen
  17. A5 output Serial clock; for communication to the LCD screen
  18. Credit:
  19. When wiring the circuit for the IR sensor we have refered to the tutorial on the class webpage to set up the potentiometer.
  20. In addition, the tutorial of the LCD was also used. The function 'lcd' was written under the help of Esteven.
  21. */</span><span class="pln">
  22. </span><span class="com">//include the library for LCD and servo motor</span><span class="pln">
  23. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Servo.h></span><span class="pln">
  24. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><Wire.h></span><span class="pln">
  25. </span><span class="com">#include</span><span class="pln"> </span><span class="str"><LiquidCrystal_I2C.h></span><span class="pln">
  26. </span><span class="com">//Setting up the constants for pins and the variables</span><span class="pln">
  27. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> photoPin </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
  28. </span><span class="kwd">int</span><span class="pln"> brightness</span><span class="pun">;</span><span class="pln">
  29. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> servopin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">
  30. </span><span class="kwd">int</span><span class="pln"> servoTurn</span><span class="pun">;</span><span class="pln">
  31. </span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> proxPin </span><span class="pun">=</span><span class="pln"> A2</span><span class="pun">;</span><span class="pln">
  32. </span><span class="kwd">int</span><span class="pln"> distance</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"> motorPin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
  34. </span><span class="kwd">int</span><span class="pln"> rotaSpeed</span><span class="pun">;</span><span class="pln">
  35. </span><span class="kwd">int</span><span class="pln"> rerangedBrightness</span><span class="pun">;</span><span class="pln">
  36. </span><span class="kwd">int</span><span class="pln"> rerangedServoTurn</span><span class="pun">;</span><span class="pln">
  37. </span><span class="kwd">int</span><span class="pln"> rerangedDistance</span><span class="pun">;</span><span class="pln">
  38. </span><span class="kwd">int</span><span class="pln"> rerangedRotaSpeed</span><span class="pun">;</span><span class="pln">
  39. </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="com">// variable to use for periodic updates</span><span class="pln">
  40. </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">20</span><span class="pun">;</span><span class="pln"> </span><span class="com">// number of loop()s to run before update</span><span class="pln">
  41. </span><span class="com">/* Create an LCD display object called "screen" with I2C address 0x27
  42. which is 16 columns wide and 2 rows tall. You can use any name you'd like. */</span><span class="pln">
  43. </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">
  44. </span><span class="com">/* Definition of a custom character called "frowny" which will be used later.
  45. Each digit is a pixel of the 5x7 array that forms a single character on this display.
  46. Draw your own at https://maxpromer.github.io/LCD-Character-Creator/ */</span><span class="pln">
  47. </span><span class="kwd">byte</span><span class="pln"> frowny</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  48. B00000</span><span class="pun">,</span><span class="pln">
  49. B11011</span><span class="pun">,</span><span class="pln">
  50. B11011</span><span class="pun">,</span><span class="pln">
  51. B00000</span><span class="pun">,</span><span class="pln">
  52. B00000</span><span class="pun">,</span><span class="pln">
  53. B01110</span><span class="pun">,</span><span class="pln">
  54. B10001</span><span class="pun">,</span><span class="pln">
  55. B00000
  56. </span><span class="pun">};</span><span class="pln"> </span><span class="com">// (note the extra row of zeros at the bottom)</span><span class="pln">
  57. </span><span class="com">//Nme the two servo motors</span><span class="pln">
  58. </span><span class="typ">Servo</span><span class="pln"> smallMotor</span><span class="pun">;</span><span class="pln">
  59. </span><span class="typ">Servo</span><span class="pln"> bigMotor</span><span class="pun">;</span><span class="pln">
  60. </span><span class="com">/*This function "write" the four elements onto the LCD screen. This is crucial as
  61. it sloves the porblem of incorrect numbers popping up when the values are 3 digits*/</span><span class="pln">
  62. </span><span class="kwd">void</span><span class="pln"> lcd</span><span class="pun">(</span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> input</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m1</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m2</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> output</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  63. </span><span class="com">// set cursor to home position, i.e. the upper left corner</span><span class="pln">
  64. 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">
  65. </span><span class="com">// print the input sensor value</span><span class="pln">
  66. 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"> input</span><span class="pun">);</span><span class="pln">
  67. 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">
  68. 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"> m2</span><span class="pun">);</span><span class="pln">
  69. 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">
  70. 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="pln"> m2</span><span class="pun">);</span><span class="pln">
  71. 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">
  72. 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"> output</span><span class="pun">);</span><span class="pln">
  73. </span><span class="pun">}</span><span class="pln">
  74. </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">
  75. </span><span class="com">//set up the pins</span><span class="pln">
  76. pinMode</span><span class="pun">(</span><span class="pln">photoPin</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  77. pinMode</span><span class="pun">(</span><span class="pln">proxPin</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  78. pinMode</span><span class="pun">(</span><span class="pln">motorPin</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  79. </span><span class="com">//set up the servomotor</span><span class="pln">
  80. smallMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">servopin</span><span class="pun">);</span><span class="pln">
  81. bigMotor</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">
  82. </span><span class="com">//LCD setup</span><span class="pln">
  83. screen</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">
  84. screen</span><span class="pun">.</span><span class="pln">backlight</span><span class="pun">();</span><span class="pln"> </span><span class="com">// turn on the backlight to start</span><span class="pln">
  85. </span><span class="com">//setup the serial feedback</span><span class="pln">
  86. </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">
  87. </span><span class="pun">}</span><span class="pln">
  88. </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">
  89. </span><span class="com">//Sense the brightness of the environment</span><span class="pln">
  90. brightness </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">photoPin</span><span class="pun">);</span><span class="pln">
  91. </span><span class="com">//Turn the servo motor</span><span class="pln">
  92. servoTurn </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">brightness</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">300</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">
  93. servoTurn </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">servoTurn</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">
  94. smallMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">servoTurn</span><span class="pun">);</span><span class="pln">
  95. </span><span class="com">//Sense the distance of the popsicle</span><span class="pln">
  96. distance </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">proxPin</span><span class="pun">);</span><span class="pln">
  97. </span><span class="com">//determine the rotation speed</span><span class="pln">
  98. rotaSpeed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">,</span><span class="pln"> </span><span class="lit">350</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">
  99. rotaSpeed </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rotaSpeed</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">
  100. bigMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">rotaSpeed</span><span class="pun">);</span><span class="pln">
  101. </span><span class="com">//values are reranged so that they are displayed as 0-99 on the LCD</span><span class="pln">
  102. rerangedBrightness </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">brightness</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">300</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">
  103. rerangedServoTurn </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">servoTurn</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">
  104. rerangedDistance </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">,</span><span class="pln"> </span><span class="lit">350</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">
  105. rerangedRotaSpeed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">rotaSpeed</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">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">
  106. rerangedBrightness </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedBrightness</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">
  107. rerangedServoTurn </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedServoTurn</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">
  108. rerangedDistance </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedDistance</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">
  109. rerangedRotaSpeed </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedRotaSpeed</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">
  110. </span><span class="com">//show the current vlaues of the inputs and outputs; for testing</span><span class="pln">
  111. </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">"brightness "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> brightness </span><span class="pun">+</span><span class="pln"> </span><span class="str">" servoturn "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> servoTurn </span><span class="pun">+</span><span class="pln"> </span><span class="str">" distance "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> distance </span><span class="pun">+</span><span class="pln"> </span><span class="str">" rotaspeed "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> rotaSpeed </span><span class="pun">+</span><span class="pln"> </span><span class="str">" "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> rerangedRotaSpeed </span><span class="pun">);</span><span class="pln">
  112. </span><span class="com">// running a periodic non-blocking task</span><span class="pln">
  113. </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">counter </span><span class="pun">>=</span><span class="pln"> FREQ</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if counter meets or exceeds FREQ</span><span class="pln">
  114. lcd</span><span class="pun">(</span><span class="pln">screen</span><span class="pun">,</span><span class="pln"> rerangedBrightness</span><span class="pun">,</span><span class="pln"> rerangedServoTurn</span><span class="pun">,</span><span class="pln"> rerangedDistance</span><span class="pun">,</span><span class="pln"> rerangedRotaSpeed</span><span class="pun">);</span><span class="pln">
  115. 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="com">// and reset counter</span><span class="pln">
  116. </span><span class="pun">}</span><span class="pln">
  117. counter</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// increment counter every loop cycle</span><span class="pln">
  118. </span><span class="pun">}</span>
<span class="com">/*
  Project title: lightSpin

  Description: The following code direct the arduino to read values from a photoresistor and an IR proximity sensor,
  and manipulate a servo motor and a continuous servo motor accordingly.The value given by the photoresistor is mapped
  to a range of degree (0-180) that the servo motor turn to. The value given by the IR proximity sensor is mapped to a
  range of rotation speed for the continuous servo motor. Finally, the working percentages of each input and output are
  displayed on a LCD screen in a range of 0-99.

  Pin mapping:

   pin   | mode   | description
   ------|--------|------------
   3      output    Determines the rotation speed of the continuous servo motor
   7      input     Turns on the flashlight
   12     output    Turns the servo motor to different degree (0-180)
   A0     input     For the photoresistor to detect the light intensity
   A2     input     For the IR proximity sensor to detect the linear distance  to the popsicle
   A4     output    Serial data; for communication to the LCD screen
   A5     output    Serial clock; for communication to the LCD screen

  Credit:
  When wiring the circuit for the IR sensor we have refered to the tutorial on the class webpage to set up the potentiometer.
  In addition, the tutorial of the LCD was also used. The function 'lcd' was written under the help of Esteven.

*/</span><span class="pln">

</span><span class="com">//include the library for LCD and servo motor</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">//Setting up the constants for pins and the variables</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> photoPin </span><span class="pun">=</span><span class="pln"> A0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> brightness</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"> servopin </span><span class="pun">=</span><span class="pln"> </span><span class="lit">12</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> servoTurn</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"> proxPin </span><span class="pun">=</span><span class="pln"> A2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> distance</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">int</span><span class="pln"> rotaSpeed</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> rerangedBrightness</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> rerangedServoTurn</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> rerangedDistance</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">int</span><span class="pln"> rerangedRotaSpeed</span><span class="pun">;</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="com">// variable to use for periodic updates</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">20</span><span class="pun">;</span><span class="pln"> </span><span class="com">// number of loop()s to run before update</span><span class="pln">


</span><span class="com">/* Create an LCD display object called "screen" with I2C address 0x27
   which is 16 columns wide and 2 rows tall. You can use any name you'd like. */</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">/* Definition of a custom character called "frowny" which will be used later.
   Each digit is a pixel of the 5x7 array that forms a single character on this display.
   Draw your own at https://maxpromer.github.io/LCD-Character-Creator/ */</span><span class="pln">
</span><span class="kwd">byte</span><span class="pln"> frowny</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  B00000</span><span class="pun">,</span><span class="pln">
  B11011</span><span class="pun">,</span><span class="pln">
  B11011</span><span class="pun">,</span><span class="pln">
  B00000</span><span class="pun">,</span><span class="pln">
  B00000</span><span class="pun">,</span><span class="pln">
  B01110</span><span class="pun">,</span><span class="pln">
  B10001</span><span class="pun">,</span><span class="pln">
  B00000
</span><span class="pun">};</span><span class="pln"> </span><span class="com">// (note the extra row of zeros at the bottom)</span><span class="pln">


</span><span class="com">//Nme the two servo motors</span><span class="pln">
</span><span class="typ">Servo</span><span class="pln"> smallMotor</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Servo</span><span class="pln"> bigMotor</span><span class="pun">;</span><span class="pln">

</span><span class="com">/*This function "write" the four elements onto the LCD screen. This is crucial as
  it sloves the porblem of incorrect numbers popping up when the values are 3 digits*/</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> lcd</span><span class="pun">(</span><span class="typ">LiquidCrystal_I2C</span><span class="pln"> screen</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> input</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m1</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> m2</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">int</span><span class="pln"> output</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// set cursor to home position, i.e. the upper left corner</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">
  </span><span class="com">// print the input sensor value</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"> input</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"> m2</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="typ">String</span><span class="pun">)</span><span class="pln"> m2</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"> output</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"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">//set up the pins</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">photoPin</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">proxPin</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">motorPin</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//set up the servomotor</span><span class="pln">
  smallMotor</span><span class="pun">.</span><span class="pln">attach</span><span class="pun">(</span><span class="pln">servopin</span><span class="pun">);</span><span class="pln">
  bigMotor</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">//LCD setup</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"> </span><span class="com">// turn on the backlight to start</span><span class="pln">

  </span><span class="com">//setup the serial feedback</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="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">//Sense the brightness of the environment</span><span class="pln">
  brightness </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">photoPin</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//Turn the servo motor</span><span class="pln">
  servoTurn </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">brightness</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">300</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">
  servoTurn </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">servoTurn</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">
  smallMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">servoTurn</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//Sense the distance of the popsicle</span><span class="pln">
  distance </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">proxPin</span><span class="pun">);</span><span class="pln">


  </span><span class="com">//determine the rotation speed</span><span class="pln">
  rotaSpeed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">,</span><span class="pln"> </span><span class="lit">350</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">
  rotaSpeed </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rotaSpeed</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">
  bigMotor</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="pln">rotaSpeed</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//values are reranged so that they are displayed as 0-99 on the LCD</span><span class="pln">
  rerangedBrightness </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">brightness</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">300</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">
  rerangedServoTurn </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">servoTurn</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">
  rerangedDistance </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">,</span><span class="pln"> </span><span class="lit">350</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">
  rerangedRotaSpeed </span><span class="pun">=</span><span class="pln"> map</span><span class="pun">(</span><span class="pln">rotaSpeed</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">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">99</span><span class="pun">);</span><span class="pln">

  rerangedBrightness </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedBrightness</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">
  rerangedServoTurn </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedServoTurn</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">
  rerangedDistance </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedDistance</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">
  rerangedRotaSpeed </span><span class="pun">=</span><span class="pln"> constrain</span><span class="pun">(</span><span class="pln">rerangedRotaSpeed</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">//show the current vlaues of the inputs and outputs; for testing</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">"brightness "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> brightness </span><span class="pun">+</span><span class="pln"> </span><span class="str">" servoturn "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> servoTurn </span><span class="pun">+</span><span class="pln"> </span><span class="str">" distance "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> distance </span><span class="pun">+</span><span class="pln"> </span><span class="str">" rotaspeed "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> rotaSpeed </span><span class="pun">+</span><span class="pln"> </span><span class="str">" "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> rerangedRotaSpeed   </span><span class="pun">);</span><span class="pln">

  </span><span class="com">// running a periodic non-blocking task</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">counter </span><span class="pun">>=</span><span class="pln"> FREQ</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// if counter meets or exceeds FREQ</span><span class="pln">

    lcd</span><span class="pun">(</span><span class="pln">screen</span><span class="pun">,</span><span class="pln"> rerangedBrightness</span><span class="pun">,</span><span class="pln"> rerangedServoTurn</span><span class="pun">,</span><span class="pln"> rerangedDistance</span><span class="pun">,</span><span class="pln"> rerangedRotaSpeed</span><span class="pun">);</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="com">// and reset counter</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  counter</span><span class="pun">++;</span><span class="pln"> </span><span class="com">// increment counter every loop cycle</span><span class="pln">

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