{"id":360,"date":"2015-03-07T13:53:12","date_gmt":"2015-03-07T18:53:12","guid":{"rendered":"http:\/\/pages.vassar.edu\/darwinsdevices\/?page_id=360"},"modified":"2015-03-07T14:38:10","modified_gmt":"2015-03-07T19:38:10","slug":"code","status":"publish","type":"page","link":"https:\/\/pages.vassar.edu\/darwinsdevices\/code\/","title":{"rendered":"Code"},"content":{"rendered":"<p>Let&#8217;s get moving!\u00a0 You can use the code here to animate the robots Tadro and Sparki.<\/p>\n<p><strong>Cycloptic Tadro<\/strong><br \/>\nGet started building your own Tadro!\u00a0 Nick Livingston and I wrote this code for our light-seeking cycloptic (one-eyed) Tadro.\u00a0 The program runs on an Arduino Uno.\u00a0 You can learn how to build the Tadro if you tune into my educational program, &#8220;Robotics,&#8221; through <a title=\"The Great Courses\" href=\"http:\/\/www.thegreatcourses.com\/\" target=\"_blank\">The Great Courses<\/a> (tentative release date:\u00a0 June, 2015).\u00a0 Just copy and paste this <span style=\"color: #0000ff\">program (<span style=\"color: #333333\">below, in<\/span> blue)<\/span> into an open sketch in the Arduino IDE (integrated development environment, which you can <a title=\"Arduino software\" href=\"http:\/\/arduino.cc\/en\/main\/software\" target=\"_blank\">download<\/a> for free).<\/p>\n<p>&nbsp;<\/p>\n<pre><span style=\"color: #0000ff\">\/****************\r\nLight-seeking Cycloptic (one-eyed) Tadro.\r\nThis program is a HACK, combining two sample programs that you can find Ardunio.com \u2014<\/span>\r\n\r\n<span style=\"color: #0000ff\">Program 1:\u00a0 Sweep<\/span>\r\n<span style=\"color: #0000ff\">by BARRAGAN &lt;http:\/\/barraganstudio.com&gt; <\/span>\r\n<span style=\"color: #0000ff\">This example code is in the public domain.<\/span>\r\n\r\n<span style=\"color: #0000ff\">Program 2:\u00a0 Knob<\/span>\r\n<span style=\"color: #0000ff\">Controlling a servo position using a potentiometer (variable resistor) <\/span>\r\n<span style=\"color: #0000ff\">by Michal Rinott &lt;http:\/\/people.interaction-ivrea.it\/m.rinott&gt; <\/span>\r\n\r\n<span style=\"color: #0000ff\">On 23 Dec 2014, John Long and Nick Livingston combined and modified these two<\/span>\r\n<span style=\"color: #0000ff\">programs in order create this program to run a ONE-EYED TADRO. Changing light<\/span>\r\n<span style=\"color: #0000ff\">intensities at the light-dependent photoresistor changes beta, the turning angle<\/span>\r\n<span style=\"color: #0000ff\">of the flapping tail.\u00a0 Phototaxis results from embodiment.<\/span>\r\n\r\n<span style=\"color: #0000ff\">This code was created for \"Robotics,\" a program produced by The Great Courses.\r\n******************\/<\/span>\r\n\r\n<span style=\"color: #0000ff\">#include &lt;Servo.h&gt; \/\/ loading library code to drive servo motor <\/span>\r\n<span style=\"color: #0000ff\">Servo myservo;\u00a0 \/\/ create servo object to control a servo <\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ a maximum of eight servo objects can be created <\/span>\r\n<span style=\"color: #0000ff\">\u00a0<\/span>\r\n<span style=\"color: #0000ff\">int pos = 0;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ variable to store the servo position <\/span>\r\n<span style=\"color: #0000ff\">int alpha = 30;\u00a0\u00a0 \/\/ amplitude (not double amplitude)<\/span>\r\n<span style=\"color: #0000ff\">int beta = 0;\u00a0\u00a0\u00a0\u00a0 \/\/ variable to store turning<\/span>\r\n<span style=\"color: #0000ff\">int shift = 90;\u00a0\u00a0 \/\/ makes zero degrees at 12 o'clock<\/span>\r\n<span style=\"color: #0000ff\">int LDRpin = 0;\u00a0\u00a0 \/\/ variable to read the light-dependent photoresistor<\/span>\r\n<span style=\"color: #0000ff\">int eye1;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ variable to hold the light intensity of the first eye<\/span>\r\n\r\n<span style=\"color: #0000ff\">void setup() <\/span>\r\n<span style=\"color: #0000ff\">{ <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 myservo.attach(9);\u00a0 \/\/ attaches the servo on pin 9 to the servo object <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 pos = shift;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ assigns the shift value to the servo position for set-up before swim<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 myservo.write(pos); \/\/ moves the servo to the \"zero\" position to allow tail alignment<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 delay(5000);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ pause of 5 sec to allow adjustments<\/span>\r\n<span style=\"color: #0000ff\">} <\/span>\r\n<span style=\"color: #0000ff\">\u00a0<\/span>\r\n<span style=\"color: #0000ff\">void loop() <\/span>\r\n<span style=\"color: #0000ff\">{ <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 int minpos;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ local variable to set limit on servo motion to one side<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 int maxpos;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ local variable to set limit on servo motion to other side<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 eye1 = analogRead(LDRpin);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ reading light intensity<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 beta = map(eye1, 0, 1023, -90+alpha, 90-alpha);\u00a0\u00a0 \/\/ scale light value &amp; calculate tail offset beta<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 minpos = shift+beta-alpha;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set limit to servo (part of amplitude)<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 maxpos = shift+beta+alpha;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ set limit to servo (part of amplitude)<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 for(pos = minpos; pos &lt; maxpos; pos += 1)\u00a0 \/\/ steps through FOR loop from minpos to maxpos<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ in steps of 1 degree; to increase frequency change degree <\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 myservo.write(pos);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ tell servo to go to position in variable 'pos' <\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay(15);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ waits 15ms for the servo to reach the position <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 } <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 for(pos = maxpos; pos&gt;=minpos+1; pos-=1)\u00a0\u00a0 \/\/ steps through FOR loop from maxpos to minpos <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 {\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 myservo.write(pos);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ tell servo to go to position in variable 'pos' <\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 delay(15);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ waits 15ms for the servo to reach the position <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 }<\/span>\r\n<span style=\"color: #0000ff\">}\r\n\r\n<\/span><\/pre>\n<p><!--more--><\/p>\n<p><strong>Safe-driving Sparki<br \/>\n<\/strong>Own a <a title=\"Sparki robot\" href=\"http:\/\/arcbotics.com\/products\/sparki\/\" target=\"_blank\">Sparki <\/a>robot?\u00a0 Then try out the safe-driver program, a partial-autonomy program inspired by the great idea of Peter Staten.\u00a0 You can learn more about Sparki and this code if you tune into my educational program, &#8220;Robotics,&#8221; through <a title=\"The Great Courses\" href=\"http:\/\/www.thegreatcourses.com\/\" target=\"_blank\">The Great Courses<\/a> (tentative release date:\u00a0 June, 2015).\u00a0 Just copy and paste this <span style=\"color: #0000ff\">program (<span style=\"color: #333333\">below, in<\/span> blue)<\/span> into an open sketch in the SparkiDuino IDE (integrated development environment, which you can <a title=\"SparkiDuino IDE\" href=\"http:\/\/arcbotics.com\/lessons\/basic-sparkiduino-lessons\/\" target=\"_blank\">download<\/a> for free).<\/p>\n<pre><span style=\"color: #0000ff\">\/*******************************************<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 IR Remote + Edge_Avoidance<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 Peter Staten's idea was the Safe Driver Program: have Sparki let you,<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 the human, have control until you, the human, do something <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 stupid, like try to drive it off the table.\u00a0 Then Sparki takes over, stops<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 the forward motion, and turns.<\/span>  <span style=\"color: #0000ff\">Peter and I combined the following programs\r\n  available as sample code from Arcbotics.com:  remote control and edge avoidance.<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 7 March 2015.<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 <\/span>\r\n<span style=\"color: #0000ff\">********************************************\/<\/span>\r\n<span style=\"color: #0000ff\">#include &lt;Sparki.h&gt; \/\/ include the sparki library<\/span>\r\n\r\n<span style=\"color: #0000ff\">void setup() <\/span>\r\n<span style=\"color: #0000ff\">{ <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 sparki.clearLCD();<\/span>\r\n<span style=\"color: #0000ff\">}<\/span>\r\n\r\n<span style=\"color: #0000ff\">void loop() <\/span>\r\n<span style=\"color: #0000ff\">{ \u00a0<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 int threshold = 100; \/\/ If sensor reading is below this value, then no surface underneath --&gt; edge!<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 int code = sparki.readIR();<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 int edgeLeft\u00a0\u00a0 = sparki.edgeLeft();\u00a0\u00a0 \/\/ Read the left edge IR sensor.<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 int edgeRight\u00a0 = sparki.edgeRight();\u00a0 \/\/ Read the right edge IR sensor.<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 if (edgeLeft &lt; threshold) \/\/ If no surface underneath left sensor...<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 sparki.moveRight(20); \/\/ ... then turn right.<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0\u00a0 if (edgeRight &lt; threshold) \/\/ If no surface underneath right sensor...<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 {<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 sparki.moveLeft(20); \/\/ ... then turn left\/<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 }<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0\/\/If no edge is detected then you, the driver, have remote control for 0.5 seconds.<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 if(code != -1){<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 sparki.print(\"Received code: \");<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 sparki.println(code);<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 }<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0 switch(code){<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0 \u00a0<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 \/\/ Movement buttons (these are clear when you have the remote control in hand)<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 70: sparki.moveForward(); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 21: sparki.moveBackward(); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 67: <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 71: sparki.moveRight(); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 68:<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 69: sparki.moveLeft(); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 64: sparki.moveStop(); <\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sparki.gripperStop();<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0 \/\/ Gripper Buttons<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 9:\u00a0 sparki.gripperOpen(); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 7:\u00a0 sparki.gripperClose(); break;<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0 \/\/ buzzer<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 74: sparki.beep(); break;<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0 \/\/ Servo<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 90: sparki.servo(SERVO_LEFT); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 28: sparki.servo(SERVO_CENTER); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 8: sparki.servo(SERVO_RIGHT); break;<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0 \/\/ RGB LED<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 25: sparki.RGB(RGB_OFF); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 12: sparki.RGB(RGB_RED); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 24: sparki.RGB(RGB_GREEN); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 case 94: sparki.RGB(RGB_BLUE); break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 <\/span>\r\n<span style=\"color: #0000ff\">\u00a0 default:<\/span>\r\n<span style=\"color: #0000ff\">\u00a0\u00a0\u00a0 break;<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 }<\/span>\r\n\r\n<span style=\"color: #0000ff\">\u00a0 sparki.updateLCD();<\/span>\r\n<span style=\"color: #0000ff\">\u00a0 delay(200); \/\/ wait 0.5 seconds<\/span>\r\n<span style=\"color: #0000ff\">}<\/span><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s get moving!\u00a0 You can use the code here to animate the robots Tadro and Sparki. Cycloptic Tadro Get started building your own Tadro!\u00a0 Nick Livingston and I wrote this code for our light-seeking cycloptic (one-eyed) Tadro.\u00a0 The program runs on an Arduino Uno.\u00a0 You can learn how to build the Tadro if you tune [&hellip;]<\/p>\n","protected":false},"author":1345,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-360","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/pages\/360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/users\/1345"}],"replies":[{"embeddable":true,"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/comments?post=360"}],"version-history":[{"count":11,"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/pages\/360\/revisions"}],"predecessor-version":[{"id":371,"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/pages\/360\/revisions\/371"}],"wp:attachment":[{"href":"https:\/\/pages.vassar.edu\/darwinsdevices\/wp-json\/wp\/v2\/media?parent=360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}