{"id":370,"date":"2015-03-03T16:47:39","date_gmt":"2015-03-03T16:47:39","guid":{"rendered":"http:\/\/www.schoolsplus.co.uk\/cas\/?p=370"},"modified":"2015-03-03T16:47:39","modified_gmt":"2015-03-03T16:47:39","slug":"2-arduino-start-embedded-code","status":"publish","type":"post","link":"https:\/\/www.schoolsplus.co.uk\/cas\/2015\/03\/03\/2-arduino-start-embedded-code\/","title":{"rendered":"2 \u2013 Arduino, where to start with it and my embedded code"},"content":{"rendered":"<p><strong>2 &#8211;\u00a0Arduino, where to start with it and my embedded code.<\/strong><\/p>\n<p>Instalment two has arrived! So this naturally means that I haven&#8217;t been busted by the boss for writing about non-work related stuff&#8230;and yes, I shall stop banging on about the boss now.<\/p>\n<p>As mentioned in the previous blogg, the Human Tracking camera system consists of various different shall we say, modules.<\/p>\n<p>The control module is tasked with controlling the servos of the pan-tilt system, receiving feedback system data and receiving data via serial port from the software on the computer to then convert into servo movements. Some other functions include a manual override to control the pan-tilt system with a joystick and LEDs used as indicators for the feedback system and for the manual override. As you can probably visualise, this control platform is a hub for all the hardware in the system.<\/p>\n<p>For my control board, I have chosen to use the Arduino Nano V3.0 As mentioned in the last blogg, there is an enormous amount of support available on the internet for Arduino products.<\/p>\n<p>If you&#8217;re a beginner with regards to electronics or embedded software, please familiarise yourself with some basic concepts before going any further. The best place to get a basic understanding of most of the applied concepts in this project, is the Arduino website&#8217;s learning environment:<\/p>\n<p><a title=\"Arduino Learning\" href=\"http:\/\/arduino.cc\/en\/Guide\/HomePage\" target=\"_blank\">Arduino Learning<\/a><\/p>\n<p>or<\/p>\n<p><a title=\"Sparkfun Learning\" href=\"https:\/\/learn.sparkfun.com\/?_ga=1.132785166.1027040783.1413636651\" target=\"_blank\">Sparkfun Learning<\/a><\/p>\n<p>The Arduino link above will actually show you how to install the IDE and provides the absolute novice with a starting point and guidance to learning more about their product and thus micro controllers in a very hands-on way.<\/p>\n<p>The same can be said for Sparkfun. Both companies have based their product lines on ATmel&#8217;s ATmega controllers.<\/p>\n<p>Arduino has adapted what looks like a Processing IDE to make it very easy to write, compile and upload your code to whichever Arduino board you&#8217;re using. The IDE is packed full of well commented examples which always help. A word of caution if you want to be of any use as an embedded software engineer at some point in the future&#8230;..don&#8217;t follow the examples blindly. Try to change variables to see what happens when you have changed them. Try to understand the code as you go along. The language used in the Arduino IDE is based on C, so if you have any experience in C, you will feel like you&#8217;re mum is talking to you&#8230;..it&#8217;s that easy. If you have a little experience with C, you may be wondering what nonsense I&#8217;m talking, because the words don&#8217;t look the same? Well, if you do feel like Arduino is speaking &#8220;Greek&#8221; to you, it&#8217;s possibly because of the many libraries that have been written to somewhat change C to look like Arduino&#8217;s own language. Don&#8217;t worry, as you work through the examples, you will get used to what to tell the micro controller in order to do as you say.<\/p>\n<p>So&#8230;.I can go on about Arduino and what you need to know and what you should probably know and all that stuff, but if you are really interested in learning embedded software programming, this is by far the easiest way to start and probably the cheapest. All you need is a PC, an Arduino board and a USB cable. You probably have a PC and a USB cable, so you need only spend a tenner.<\/p>\n<p>Here is the Arduino code that I used for this project:<\/p>\n<address>\/*This version aims to incorporate a manual override and manual joystick<\/address>\n<address>control of the system to incorporate feedback.<\/address>\n<address>The manual override and manual control in this example works well with the feedback system.*\/<\/address>\n<address>\u00a0<\/address>\n<address>\/\/Include the Servo and interrupt libraries<\/address>\n<address>#include&lt;Servo\/Servo.h&gt;<\/address>\n<address>#include&lt;avr\/interrupt.h&gt;<\/address>\n<address>\u00a0<\/address>\n<address>void establishContact();<\/address>\n<address>void LimitCheck();<\/address>\n<address>void Scan();<\/address>\n<address>\u00a0<\/address>\n<address>\/\/Initialize the myservo objects<\/address>\n<address>Servoxservo,yservo;<\/address>\n<address>\u00a0<\/address>\n<address>\/*The volatile variables are used in the interrupt routine*\/<\/address>\n<address>volatile int icountX=0,icountY=0;\/\/counts every time a pin goes high or low<\/address>\n<address>volatile int data1=-1,data2=-1,a=-1,b=-1;\/\/use -1, because -1 does not appear in the data1 added combination<\/address>\n<address>volatile int data3=-1,data4=-1,k=-1,l=-1;\/\/for y interrupt<\/address>\n<address>volatile int statusX=0x0,statusY=0x0;\/\/interrupt status<\/address>\n<address>\u00a0<\/address>\n<address>int ServoIn,move_checkX=0,move_checkY=0,x=90,y=90,x1,y1,idle=0;\/\/servo input and position variables<\/address>\n<address>bool scan=false,upLimit=false,lowLimit=false;<\/address>\n<address>bool xUpLimInd=false,xLowLimInd=false,doScan=false,yUpLimInd=false,yLowLimInd=false;<\/address>\n<address>bool SendSerial=false,received=false,dataReceived=false,readyToReceive=false;<\/address>\n<address>\u00a0<\/address>\n<address>\/*Character arrays are used to store the received serial data bytes*\/<\/address>\n<address>char val[5],val1[5];\/\/data received from serial port<\/address>\n<address>int z=0,i=0;<\/address>\n<address>\u00a0<\/address>\n<address>\/*Manual control variables*\/<\/address>\n<address>const int joyH=5;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ L\/R Parallax Thumbstick<\/address>\n<address>const int joyV=4;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ U\/D Parallax Thumbstick<\/address>\n<address>const int buttonPin=7;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Push Button Parallax Thumbstick<\/address>\n<address>const int buttonLED=12;<\/address>\n<address>int state=HIGH;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ the current state of the output pin<\/address>\n<address>int NowButton;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ the current reading from the input pin<\/address>\n<address>int PrevButton=LOW;\u00a0\u00a0\u00a0 \/\/ the previous reading from the input pin<\/address>\n<address>boolbutton=false;<\/address>\n<address>\/\/ the follow variables are long&#8217;s because the time, measured in miliseconds,<\/address>\n<address>\/\/ will quickly become a bigger number than can be stored in an int.<\/address>\n<address>long time=0;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ the last time the output pin was toggled<\/address>\n<address>long debounce=200;\u00a0\u00a0 \/\/ the debounce time, increase if the output flickers<\/address>\n<address>\u00a0<\/address>\n<address>\/\/Setup the environment (this procedure only runs once)<\/address>\n<address>void setup()<\/address>\n<address>{<\/address>\n<address>\/*Attach the servos to the relevant pins and &#8220;zero&#8221; them at 90 degrees.*\/\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yservo.attach(11);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yservo.write(y);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xservo.attach(10);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xservo.write(x);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay(100);\/\/wait for the servos to move into position<\/address>\n<address>\/*Set pin 9 and 12 up as outputs, used for debugging mainly*\/\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pinMode(9,OUTPUT);\/\/x Feedback indicator<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pinMode(8,OUTPUT);\/\/y Feedback Indicator<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pinMode(buttonLED,OUTPUT);\/\/Manual Override indicator<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Serial.begin(57600);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ initialize the pushbutton pin as an input:<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pinMode(buttonPin,INPUT);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(buttonPin,HIGH);\/\/turn on the pull-up resistor for the button-pin<\/address>\n<address>\/* Configure Pin Change Interrupts*\/<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cli();\u00a0\u00a0 \/\/ disable global interrupts<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PCICR=0x04;\/\/Set Pin Change Interrupt Control Register for timer 2<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Enable D3,D4,D5, D6\u00a0 &#8211; PCINT19:22<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PCMSK2=0x78;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PCIFR|=0x00;\/\/reset the interrupt flag<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sei();\/\/enable all interrupts<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 establishContact();\u00a0 \/\/establish initial contact with the software<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountX=90;\/\/set icount to be the same as the servo &#8220;zero&#8221; position<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountY=90;<\/address>\n<address>}<\/address>\n<address>\u00a0<\/address>\n<address>\/\/The void loop runs continuously<\/address>\n<address>void loop()<\/address>\n<address>{<\/address>\n<address>\/*Local variables are only used while the loop runs, they are reset every time the loop starts again*\/\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intcount=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intfeedbackX,feedbackY;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intservoValX,servoValY;\/\/ variables to read the value from the analog pin<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NowButton=digitalRead(buttonPin);\/\/ read the state of the pushbutton value:<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(NowButton==HIGH&amp;&amp;PrevButton==LOW&amp;&amp;millis()-time&gt;debounce)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(state==HIGH)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 state=LOW;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 button=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(buttonLED,LOW);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/delay(10);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 state=HIGH;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 button=true;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(buttonLED,HIGH);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/delay(10);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 time=millis();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\/*If the push button has been pressed, the coordinates do not have<\/address>\n<address>to be received from Serial.*\/<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(button==true)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Read the horizontal joystick value\u00a0 (value between 0 and 1023)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 servoValX=analogRead(joyH);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=map(servoValX,0,1023,3,179);\/\/ scale it to use it with the servo (result\u00a0 between 0 and 180)<\/address>\n<address>\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/xservo.write(servoValX); \/\/ sets the servo position according to the scaled value<\/address>\n<address>\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Read the horizontal joystick value\u00a0 (value between 0 and 1023)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 servoValY=analogRead(joyV);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=map(servoValY,0,1023,30,140);\/\/ scale it to use it with the servo (result between 70 and 180)<\/address>\n<address>\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/yservo.write(servoValY); \/\/ sets the servo position according to the scaled value<\/address>\n<address>\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ Display Joystick values using the serial monitor<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/outputJoystick();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay(15);\u00a0\u00a0 \/\/ waits for the servo to get there<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/*Check for incoming serial data*\/\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(Serial.available()&gt;0)\/\/if the port is open<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/delay(10);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Serial.readBytesUntil(&#8216;\\n&#8217;,val,5);\/\/read the data until an LF character is detected and store in val<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(val[0]==&#8217;A&#8217;)\/\/check that the data is valid<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\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 idle=0;<\/address>\n<address>\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 doScan=false;<\/address>\n<address>\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 \/\/ read the rest of the stream that now starts with x and ends with &#8216;T&#8217;<\/address>\n<address>\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 dataReceived=true;\/\/Set the indicator that new data was received<\/address>\n<address>\/*Bytes are sent in from the software. Byte values naturally range from 0-127, but a byte can technically<\/address>\n<address>store any binary number ranging from 0 &#8211; 255. Thus the byte range becomes -127 to +127 and hence the necessity<\/address>\n<address>convert values larger than 127, because they are assumed to be in the -127 to 0 range.*\/\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\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 if(val[1]&lt;0)\/\/if the byte is negative (a char larger than 127)<\/address>\n<address>\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 {<\/address>\n<address>\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 x1=x;\/\/New value for x is available, so store old value in x1<\/address>\n<address>\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 x=127+val[1]+129;<\/address>\n<address>\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 count=1;<\/address>\n<address>\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 }<\/address>\n<address>\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 else<\/address>\n<address>\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 {<\/address>\n<address>\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 x1=x;\/\/New value for x is available, so store old value in x1<\/address>\n<address>\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 x=val[1];<\/address>\n<address>\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 count=1;<\/address>\n<address>\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 }<\/address>\n<address>\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 if(val[2]&lt;0)\/\/if the byte is negative (a char larger than 127)<\/address>\n<address>\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 {<\/address>\n<address>\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 y1=y;\/\/New value for y is available, so store old value in y1<\/address>\n<address>\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 y=127+val[2]+129;<\/address>\n<address>\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 count=2;<\/address>\n<address>\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 }<\/address>\n<address>\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 else<\/address>\n<address>\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 {<\/address>\n<address>\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 y1=y;\/\/New value for y is available, so store old value in y1<\/address>\n<address>\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 y=val[2];<\/address>\n<address>\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 count=2;<\/address>\n<address>\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 }<\/address>\n<address>\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 \/*Copy val into val1 for later comparison*\/<\/address>\n<address>\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 val1[0]=val[0];<\/address>\n<address>\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 val1[1]=val[1];<\/address>\n<address>\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 val1[2]=val[2];<\/address>\n<address>\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 \/*Reset val to contain character 32 or &#8216;space&#8217;*\/<\/address>\n<address>\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 val[0]=val[1]=val[2]=val[3]=val[4]=&#8217; &#8216;;<\/address>\n<address>\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 Serial.write(&#8216;T&#8217;);\/\/Send &#8216;T&#8217; to indicate a successful transmission<\/address>\n<address>\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 Serial.write(&#8216;\\n&#8217;);\/\/Send LF character to indicate end of stream<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/*If no serial data is at the port for reception and the port is closed<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Arduino will keep sending &#8216;T&#8217; to indicate that it is ready to receive data. If no data<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 is sent for a finite time, the Scan function will run.*\/\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else if(Serial.available()&lt;=0)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 idle++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8220;idle:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.println(idle);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(idle==100)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\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 doScan=true;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/*After the scan function has completed a full limit-to-limit scan, the<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 camera y position is reset.<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 For Y scanning, comment this if statement out.*\/<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(idle&gt;=360)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\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 y1=89;<\/address>\n<address>\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 y=90;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(doScan==true)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\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 Scan();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Serial.write(&#8216;T&#8217;);\/\/keep sending T to indicate Arduino ready to receive<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(&#8220;No data available&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Serial.write(&#8216;\\n&#8217;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.write(NULL);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 val[0]=val[1]=val[2]=val[3]=val[4]=&#8217; &#8216;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay(10);\/\/delay to allow the software to read the port<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(x!=x1)\/\/if a new x-value has been sent<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xservo.write(x);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(x);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(y!=y1)\/\/if a new y-value has been sent<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yservo.write(y);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\/*If the interrupt routine has run between the last loop and the current loop<\/address>\n<address>status1 will be larger than 1*\/\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(statusX==1)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 move_checkX+=icountX;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountX=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusX=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(statusY==1)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 move_checkY+=icountY;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountY=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusY=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\/*move_check is where the calculated position value is stored as per the feedback system.<\/address>\n<address>If this value is within +\/- 10 degrees of the x-value, then the feedback system reads successful,<\/address>\n<address>ie. no errors. When the feedback is positive, an LED is switched on at pin 9, if the feedback is negative,<\/address>\n<address>the LED is switched off*\/\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(move_checkX&lt;=(x+10)&amp;&amp;move_checkX&gt;=(x-10))<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feedbackX=1;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(9,HIGH);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8220;Xin:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(x);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8221;\u00a0 Xout:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.println(move_checkX);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feedbackX=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(9,LOW);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8220;Xin:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(x);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8221;\u00a0 Xout:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.println(move_checkX);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(move_checkY&lt;=(y+10)&amp;&amp;move_checkY&gt;=(y-10))<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feedbackY=1;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(8,HIGH);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8220;Yin:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(y);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8221;\u00a0 Yout:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.println(move_checkY);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 else<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feedbackY=0;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 digitalWrite(8,LOW);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8220;Yin:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(y);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.print(&#8221;\u00a0 Yout:&#8221;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Serial.println(move_checkY);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PrevButton=NowButton;<\/address>\n<address>}<\/address>\n<address>\u00a0<\/address>\n<address>\/*The interrupt routine currently only caters for one of the two feedback systems.<\/address>\n<address>When Pin 3 input changes either from high to low or from low to high, the interrupt will<\/address>\n<address>occur.*\/<\/address>\n<address>ISR(PCINT2_vect)<\/address>\n<address>{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PCIFR|=0x00;\/\/reset the interrupt flag<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data3=(digitalRead((5))&lt;&lt;1)+digitalRead(6);\/\/combine the data from the two y sensors<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data1=(digitalRead((3))&lt;&lt;1)+digitalRead(4);\/\/combine the data from the two x sensors<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 b=a;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 k=l;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 a=(data2&lt;&lt;4)+data1;\/\/combine data1 and data2<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 k=(data3&lt;&lt;4)+data4;\/\/combine data3 and data4<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(a!=b)\/\/if no change occurred on y int pins<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(a==0x01||a==0x13||a==0x32||a==0x20)\/\/check if moving Left or right<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\/\/if moving left, subtract count twice (1 count = 2 degrees)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountX&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountX&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 elseif(a==0x02||a==0x23||a==0x31||a==0x10)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\/\/if moving right, add count twice<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountX++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountX++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data2=data1;\/\/copy data1 into data2<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusX=1;\/\/set the interrupt status to 1 to show that interrupt has occurred<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(k!=l)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(k==0x01||k==0x13||k==0x32||k==0x20)\/\/check if moving Left or right<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\/\/if moving left, subtract count twice (1 count = 2 degrees)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountY&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountY&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 elseif(k==0x02||k==0x23||k==0x31||k==0x10)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\/\/if moving right, add count twice<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountY++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 icountY++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 data4=data3;\/\/copy data1 into data2<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 statusY=1;\/\/set the interrupt status to 1 to show that interrupt has occurred<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>}<\/address>\n<address>\u00a0<\/address>\n<address>\/*The establishContact function runs during the start procedure.<\/address>\n<address>while the serial port is closed, a &#8216;T&#8221;\\n&#8217; is sent every 300ms to indicate that Arduino is<\/address>\n<address>ready to communicate. This serves as a type of synchronisation function. If Arduino is switched off<\/address>\n<address>or for some reason not ready to receive data, the Processing software will not progress onto the Draw function.<\/address>\n<address>The same is also true the other way around, if Arduino is switched on, but the software is not running,<\/address>\n<address>the program will not progress past this function.*\/<\/address>\n<address>void establishContact()<\/address>\n<address>{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(Serial.available()&lt;=0)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Serial.write(&#8216;T&#8217;);\u00a0\u00a0 \/\/ send a capital T<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Serial.write(&#8216;\\n&#8217;);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay(300);<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 readyToReceive=true;<\/address>\n<address>}<\/address>\n<address>\u00a0<\/address>\n<address>\/*LimitCheck is used to check that the values that are sent to the servos stay within pre-defined<\/address>\n<address>limits.*\/<\/address>\n<address>void LimitCheck()<\/address>\n<address>{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intxUpLimit=179;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intxLowLimit=3;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intyUpLimit=141;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 intyLowLimit=31;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(x&gt;=xUpLimit)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=xUpLimit;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xUpLimInd=true;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xLowLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(x&lt;=xLowLimit)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x=xLowLimit;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xLowLimInd=true;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xUpLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(y&gt;=yUpLimit)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=yUpLimit;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yUpLimInd=true;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yLowLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(y&lt;=yLowLimit)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 y=yLowLimit;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yLowLimInd=true;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 yUpLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\u00a0\u00a0\u00a0\u00a0<\/address>\n<address>}<\/address>\n<address>\u00a0<\/address>\n<address>\/*The Scan function is called when no incoming data had been received<\/address>\n<address>from the control software for a set period of time. The function changes the x-value<\/address>\n<address>slowly without polling to allow for any incoming serial data to interrupt the scanning process.*\/<\/address>\n<address>void Scan()<\/address>\n<address>{<\/address>\n<address>\/\/x scanning\u00a0<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(x&gt;=x1)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x1=x;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LimitCheck();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(xUpLimInd==true)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xUpLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 elseif(x&lt;x1)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x1=x;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LimitCheck();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(xLowLimInd==true)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 xLowLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 x++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/address>\n<address>\/\/\/\/y scanning<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/if(y&gt;=y1)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y1 = y;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LimitCheck();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/if(yUpLimInd==true)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/yUpLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/}<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/}<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/else if(y&lt;y1)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y1 = y;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y&#8211;;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/LimitCheck();<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/if(yLowLimInd==true)<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/{<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/yLowLimInd=false;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/y++;<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/}<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/}<\/address>\n<address>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay(50);\/\/this delay function serves as a type of speed control for the Scan function<\/address>\n<address>}<\/address>\n<p>\u00a0The code above might seem quite complex to anyone that didn&#8217;t write it, but with a bit of determination, I&#8217;m sure you&#8217;ll figure it out. Also to note, is the fact that I didn&#8217;t actually use the Arduino IDE to write my code. I prefer <a title=\"Atmel Studio 6.0\" href=\"http:\/\/www.atmel.com\/tools\/atmelstudio.aspx\" target=\"_blank\">Atmel Studio 6<\/a>, because it is based on Visual studio and I learned to program in that. If you use the Arduino IDE, the include paths need to be changed.<\/p>\n<p>As we cover various parts of the project, I shall refer back to the relevant code snippets for the topic so that in the end, you should know what all of it means and how it fits together in the project.<\/p>\n<p>As you may have spotted, there is also a lot of commented code to help the debugging and some bits to help test the hardware.<\/p>\n<p>For now, I shall step through the main functions and what their roles are in the software:<\/p>\n<p>First off, for those of you new to embedded software, one characteristic of embedded, is that there is always a continuous loop somewhere in the program. Remember, there is normally no screen and keyboard connected to an embedded system, so whatever it does, has to happen over and over again. So the basic layout of an Arduino program, consists of a Setup function that runs only at the start of the program, say when the board is plugged in for the first time or when the reset button has been pressed, and a Loop function. This loop function is where the magic normally happens after the board has been set up.<\/p>\n<p>Apart from the two main functions, I also have:<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-style: italic\">void establishContact();\u00a0<\/span><\/p>\n<p>This function is used to help set up a successful serial communication link with the software on the PC.<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-style: italic\">void LimitCheck();<\/span><\/p>\n<p>The limit check function is used to check whether the x and y coordinates that the board had received are within the specified range for my servos. For a start, the servos can only move from 0-180 degrees. Also, the servo that controls up and down movement (y-servo) I only want to move from 30-140 degrees. We don&#8217;t want to see sky and we don&#8217;t want to see floor on the camera, remember?<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-style: italic\">void Scan();<\/span><\/p>\n<p>This function is called upon when my camera has not detected anyone in the frame to track. When there&#8217;s no-one, I want the camera to move from side to side to see if it can find someone to track. Also, if you jumped out of the camera&#8217;s view, the scan function would scan towards the side that you jumped, first.<\/p>\n<p>&nbsp;<\/p>\n<p>So for now you have enough to ponder about and a lot of background reading to do.<\/p>\n<p>Next week, I shall talk about the feedback system, which is a quadrature encoder. That part took me 3 months to figure out, be it around Christmas when my full attention was diverted to the man in the red suit, family, plenty of booze and a lot of friends.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>2 &#8211;\u00a0Arduino, where to start with it and my embedded [&hellip;]<\/p>\n","protected":false},"author":16,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-370","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-lettings","7":"entry"},"acf":[],"_links":{"self":[{"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/posts\/370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/comments?post=370"}],"version-history":[{"count":4,"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/posts\/370\/revisions"}],"predecessor-version":[{"id":374,"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/posts\/370\/revisions\/374"}],"wp:attachment":[{"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/media?parent=370"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/categories?post=370"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.schoolsplus.co.uk\/cas\/wp-json\/wp\/v2\/tags?post=370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}