{"id":2307,"date":"2022-02-21T22:19:28","date_gmt":"2022-02-22T03:19:28","guid":{"rendered":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/?p=2307"},"modified":"2022-04-04T16:11:43","modified_gmt":"2022-04-04T20:11:43","slug":"assignment-6-jud","status":"publish","type":"post","link":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/?p=2307","title":{"rendered":"Assignment 6 &#8211; Jud"},"content":{"rendered":"<h3>Description:<\/h3>\n<p>This circuit turns the data that the sound sensor gets into an angle based off of a moving average of the amplitude of the data received. The data from the sensor captures the raw sound waves from the air and sends them to the arduino which has a very spiky and unsmooth nature. In addition, the data transitions for increasing to decreasing very rapidly so a traditional filter or tracking the change in the data does not work well at all. Instead, I have implemented a moving average method where the code tracks a certain number of data points, calculates the max and min of the data, and then uses the difference between these values as the new data. This is then multiplied by some multiplier to increase the variance and translated into an angle for a servo to travel to. The algorithm for calculating the angle works wonders while the servo isn&#8217;t connected, however, as depicted in the video, the noise of the servo creates an uncontrollable feedback look that results in the servo moving out of control. Regardless, the system responds to noise in the way that it should translating a noise in the environment into an angle for the servo to move to.<\/p>\n<h3>Video:<\/h3>\n<div style=\"width: 840px;\" class=\"wp-video\"><!--[if lt IE 9]><script>document.createElement('video');<\/script><![endif]-->\n<video class=\"wp-video-shortcode\" id=\"video-2307-1\" width=\"840\" height=\"473\" preload=\"metadata\" controls=\"controls\"><source type=\"video\/mp4\" src=\"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/wp-content\/uploads\/2022\/02\/Assignment_5_demo.mp4?_=1\" \/><a href=\"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/wp-content\/uploads\/2022\/02\/Assignment_5_demo.mp4\">https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/wp-content\/uploads\/2022\/02\/Assignment_5_demo.mp4<\/a><\/video><\/div>\n<h3>Code:<\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"eclipse\">#include &lt;Servo.h&gt;\r\n\r\n\/\/Define Accelerometer Variables for pins\r\n#define MICROPHONE    A0\r\n#define SERVO_PIN     9\r\n\r\nServo servo;\r\n\r\ndouble servoAngle = 0;\r\n\r\ndouble alpha = 0.9;\r\ndouble multiplier = 5;\r\n\r\n\/\/Array to hold data for moving average calculation\r\ndouble speakerData[100]; \/\/ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}\r\n\r\ndouble speakerLevel = 0;\r\ndouble prevSpeakerLevel = 0;\r\ndouble maxSpeakerLevel = 200;\r\ndouble minSpeakerLevel = 50;\r\n\r\n\r\nvoid setup() {\r\n  \/\/Setup pins as inputs\r\n  pinMode(MICROPHONE, INPUT);\r\n\r\n  \/\/Create servo object\r\n  servo.attach(SERVO_PIN);\r\n  \r\n}\r\n\r\nvoid loop() {\r\n\r\n  \/\/Update moving average array\r\n  for (int i = (sizeof(speakerData)\/sizeof(speakerData[0]) - 1); i &gt;= 0; i--) {\r\n    if (i != 0) {\r\n      speakerData[i] = speakerData[i - 1];\r\n    }\r\n    else {\r\n      speakerData[i] = analogRead(MICROPHONE);\r\n    }\r\n  }\r\n\r\n  double MIN = findMin();\r\n  double MAX = findMax();\r\n\r\n  speakerLevel = MAX - MIN;\r\n  speakerLevel = multiplier*(alpha*speakerLevel + (1 - alpha)*prevSpeakerLevel);  \/\/Filter data\r\n\r\n  \/\/Put upper and lower bounds on data\r\n  if (speakerLevel &gt;= maxSpeakerLevel) {\r\n    speakerLevel = maxSpeakerLevel;\r\n  }\r\n  else if (speakerLevel &lt;= minSpeakerLevel) {\r\n    speakerLevel = minSpeakerLevel;\r\n  }\r\n\r\n  servoAngle = 180*(speakerLevel - minSpeakerLevel)\/(maxSpeakerLevel - minSpeakerLevel);\r\n  servo.write((int) servoAngle);\r\n\r\n  prevSpeakerLevel = speakerLevel;\r\n  \r\n}\r\n\r\nint findMin() {\r\n  double minimum = 0;\r\n  for (int i = 0; i &lt; sizeof(speakerData)\/sizeof(speakerData[0]); i++) {\r\n    if (speakerData[i] &lt; minimum || i == 0) {\r\n      minimum = speakerData[i];\r\n    }\r\n  }\r\n  return minimum;\r\n}\r\n\r\nint findMax() {\r\n  double maximum = 0;\r\n  for (int i = 0; i &lt; sizeof(speakerData)\/sizeof(speakerData[0]); i++) {\r\n    if (speakerData[i] &gt; maximum) {\r\n      maximum = speakerData[i];\r\n    }\r\n  }\r\n  return maximum;\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Description: This circuit turns the data that the sound sensor gets into an angle based off of a moving average of the amplitude of the data received. The data from the sensor captures the raw sound waves from the air and sends them to the arduino which has a very spiky and unsmooth nature. In &hellip; <a href=\"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/?p=2307\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Assignment 6 &#8211; Jud&#8221;<\/span><\/a><\/p>\n","protected":false},"author":30,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,1],"tags":[],"_links":{"self":[{"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=\/wp\/v2\/posts\/2307"}],"collection":[{"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=\/wp\/v2\/users\/30"}],"replies":[{"embeddable":true,"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2307"}],"version-history":[{"count":1,"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=\/wp\/v2\/posts\/2307\/revisions"}],"predecessor-version":[{"id":2310,"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=\/wp\/v2\/posts\/2307\/revisions\/2310"}],"wp:attachment":[{"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/courses.ideate.cmu.edu\/48-339\/s2022\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}