Lesson 16 Automatically Tracking Light Source


In this lesson, we will make some interesting creations – use a servo motor, a photoresistor and a pull-down resistor to assemble an automatically tracking light source system.



Experimental Principle

The rocker arm of the servo and the bundled photoresistor sway together to scan and “look” for light source within 180 degrees and record the location of light source when finding one. Then they stop swaying just at the direction of the light source.

The schematic diagram:


Experimental Procedures

Step 1: Build the circuit



you need to bind one end of the resistor and photoresistor to the rocker arm of the servo (cross the pin through the holes of the arm).

1) Insert one pin of the photoresistor and 10 resistor through the holes on the rocker arm. Pay attention here to tightly winding them because you need to make sure they are connected in the circuit.


2) Plug in the rock arm to the servo and use 3 jumper wires to hook up the 3 pins.

pay attention to plug the pin tightly in case of disentanglement.


3) Hook up the middle pin to pin A0 of the Uno board, another pin of the 10k resistor to GND, photoresistor to 5V.


4) Connect the brown wire of servo to GND and red to 5v. Since the 5v usually used is occupied already, you need to connect the other 5v as the following picture shows.


5) Next connect the orange wire to pin 9 of the SunFounder Uno board. OK now the circuit is completed! Connect the Uno board to your computer with a USB cable.


Step 2: Open the code file

Step 3: Select the correct Board and Port

Step 4: Upload the sketch to the SunFounder Uno board

Now, shine a flashlight onto the photoresistor. Then you will see the rocker arm of the servo and the photoresistor rotate and finally stop at the direction of light source.


Code Analysis 16-1 Initialize and define variables

#include <Servo.h>

const int photocellPin = A0; //The photoresistor is connected to A0


Servo myservo;//create servo object to control a servo

int outputValue = 0; //Save the value read from A0

int angle[] = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180};
//Define the angle of servo

int maxVal = 0; //Record the maximum number

int maxPos = 0; //Record the angle of the servo when the read the maximum number of photoresistor.

Define an integer array angle[], which contains 19 elements from 0 to 18, representing 0 to 180 which indicates the degree of servo rotation. For example, angle[0] means 0 degree, angle[1] is 10 degrees, and so forth.

Code Analysis 16-2 Servo rock arm stop at the direction of light source

void loop()


    for(int i = 0; i < 19; i ++)


        //write the angle from the angle[i] array to servo.
        //When i=0, angle[0]=0, i=1, angle[1]=10, and so on.

        outputValue = analogRead(photocellPin); //read the value of A0

        Serial.println(outputValue); //print it

        if(outputValue > maxVal)
        //if the current value of A0 is greater than previous


            maxVal = outputValue; // write down the value

            maxPos =i; // write down the angle


        delay(200); // delay 200ms


    myservo.write(angle[ maxPos]);
    // write the angle to servo which A0 has greatest value

    delay(1000); //delay 1s


Set the servo to rotate from 0 to 180, and the angle is defined in the angle [] array. Since the photoresistor is wound with the servo rock arm, the resistance of the photoresistor changes with different light intensities each time the servo is rotated, so the analog value of A0 is changed at the same time.

By comparing the value of A0 with the previously recorded maximum value, record the maximum A0 value and current angle of the servo. Finally let the servo turn to this angle.