5. Light Sensitive Robot

    

This is the final tutorial using the light sensors to either avoid or follow light. We will use all of the previous code that we’ve developed, add two methods lightMove() and setReference(). It will be possible at select each mode by pressing button A or button B.

First off I would like you to copy and paste the code from the previous example into Mu as a new project. Then delete the program loop,  delete leftLineSenorrightLineSensor variables and the lineDetector() method.

Now we need to create our method lightMove(), this method will have an argument called direction that can be a 1 or a 0. 1 for avoid and 0 for follow. The method is shown below;

[pastacode lang=”python” manual=”def%20lightMove(direction)%3A%0A%20%20%20%20if%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(0)%20%20%23%20select%20left%20sensor%0A%20%20%20%20%20%20%20%20brightnessLeft%20%3D%20lightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(1)%20%20%23%20select%20right%20sensor%0A%20%20%20%20%20%20%20%20brightnessRight%20%3D%20lightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20else%3A%20%20%23%20Bit%3ABot%20XL%0A%20%20%20%20%20%20%20%20brightnessLeft%20%3D%20leftLightSensor.read_analog()%0A%20%20%20%20%20%20%20%20brightnessRight%20%3D%20rightLightSensor.read_analog()%0A%0A%20%20%20%20avgBrightness%20%3D%20int((brightnessLeft%20%2B%20brightnessRight)%20%2F%202)%0A%0A%20%20%20%20if%20(avgBrightness%20%3C%3D%20refLevel%20%2B%2010)%3A%0A%20%20%20%20%20%20%20%20stop()%20%20%23%20stop%20Moving%0A%20%20%20%20%20%20%20%20if%20(refLevel%20%3E%3D%20900)%3A%20%20%23%20LEDs%20are%20blue%20to%20indicate%20very%20bright%20room%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(0%2C%20setBrightness(1)%2C%20setBrightness(1))%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(0%2C%20setBrightness(1)%2C%20setBrightness(1))%0A%20%20%20%20%20%20%20%20else%3A%20%20%23%20LEDs%20are%20pinkish%20to%20indicate%20a%20dim%20room%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(setBrightness(1)%2C%200%2C%20setBrightness(1))%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(setBrightness(1)%2C%200%2C%20setBrightness(1))%0A%0A%20%20%20%20elif(brightnessLeft%20%3E%20brightnessRight%20-%2025)%20and%20(brightnessLeft%20%3C%20brightnessRight%20%2B%2025)%3A%0A%20%20%20%20%20%20%20%20if%20(direction%20%3D%3D%201)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20drive(-512)%20%20%23%20drive%20backwards%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20drive(512)%20%20%23%20drive%20forwards%0A%20%20%20%20%20%20%20%20leftLights(setBrightness(1)%2C%20setBrightness(1)%2C%200)%0A%20%20%20%20%20%20%20%20rightLights(setBrightness(1)%2C%20setBrightness(1)%2C%200)%0A%0A%20%20%20%20else%3A%20%20%23%20turn%20the%20robot%0A%20%20%20%20%20%20%20%20if%20(direction%20%3D%3D%201)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20move(brightnessLeft%2C%20brightnessRight%2C%20direction%2C%20direction)%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(setBrightness(1)%2C%200%2C%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(setBrightness(1)%2C%200%2C%200)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20move(brightnessRight%2C%20brightnessLeft%2C%20direction%2C%20direction)%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(0%2C%20setBrightness(1)%2C%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(0%2C%20setBrightness(1)%2C%200)” message=”The LightMove Function” highlight=”” provider=”manual”/]

I also added the following method called setReference();

[pastacode lang=”python” manual=”def%20setReference()%3A%0A%20%20%20%20if%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(0)%20%20%23%20select%20left%20sensor%0A%20%20%20%20%20%20%20%20val1%20%3D%20lightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(1)%20%20%23%20select%20right%20sensor%0A%20%20%20%20%20%20%20%20val2%20%3D%20lightSensor.read_analog()%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20val1%20%3D%20leftLightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20%20%20%20%20val2%20%3D%20rightLightSensor.read_analog()%0A%20%20%20%20return%20int((val1%20%2B%20val2)%20%2F%202)” message=”Setting a Reference Light Level” highlight=”” provider=”manual”/]

and finally I added the following variable declaration under sensorSelect = pin16

[pastacode lang=”python” manual=”refLevel%20%3D%200″ message=”Create a Variable to Store the Reference Level” highlight=”” provider=”manual”/]

So what does it do. I will describe the setReference() method first; this method will be invoked when Bit:Bot is started. It takes readings from both the left and right sensors adds them together and divides by 2. This calculates an ambient light level that we will use as the reference level.

Now to the lightMove() method; this method will create an average value from the amount of light coming into the sensors, if the amount of light is less than the reference level + 10 then the robot will not move and the following if statement will be evaluated, if the light is bright it will light up the LEDs a cyan colour to indicate that the light levels are too bright and the room needs to be darker for the robot to perform properly. If the room is dark enough the lights on the robot will light a pinkish colour and the robot will wait for a light to be shone on it before it starts to move.

NOTE: elif means else if. You use this instead of the else statement if you have another condition to be evaluated.

If the ambient light is greater than the reference level then the robot will need to do something. Firstly the robot needs to decide if the light is coming from its front or its side. It uses the following if statement to evaluate this;

[pastacode lang=”python” manual=”elif(brightnessLeft%20%3E%20brightnessRight%20-%2025)%20and%20%0A(brightnessLeft%20%3C%20brightnessRight%20%2B%2025)%3A” message=”Checking Where the Light is Coming From” highlight=”” provider=”manual”/]

This looks at the light coming into each sensor and if the values are within 50 of each other the robot decides that the light is coming directly from its front and either moves forwards in follower mode or backwards in avoid mode and lights the LEDs a yellowish colour.

Otherwise  the robot will turn towards the light in follower mode and away from the light in avoid mode. The LEDs will be red for avoid and green for follow.

The LEDs can be one of five colours these are shown below;

  • Cyan – Room too bright robot will not respond the different light levels
  • Pink – Robot will respond to different light levels
  • Yellow – robot moving forward or backwards because light is originating in front of the robot
  • Green – robot is moving left or right towards the light source
  • Red – robot is moving left or right away from the light source

Now we need a way to choose which mode to put the robot in. For this we will use the A and B buttons. Please note that the A and B buttons share the same pins as the IR sensors. When using Bit:Bot in this mode make sure that its on a dark or evenly coloured surface so the buttons aren’t activated by the IR sensors.

The  below code is added to allow for this;

[pastacode lang=”python” manual=”sleep(1000)%0ArefLevel%20%3D%20setReference()%0Awhile%20True%3A%0A%20%20%20%20buttonA%20%3D%20button_a.get_presses()%20%20%23%20Get%20how%20many%20times%20bA%20was%20pressed%0A%20%20%20%20buttonB%20%3D%20button_b.get_presses()%20%20%23%20Get%20how%20many%20times%20bB%20was%20pressed%0A%20%20%20%20if%20(buttonA%20%3E%20buttonB)%3A%20%20%23%20If%20bA%20was%20pressed%20more%20than%20bB%20then%20mode%201%0A%20%20%20%20%20%20%20%20mode%20%3D%201%0A%20%20%20%20elif(buttonB%20%3E%20buttonA)%3A%20%20%23%20If%20bB%20was%20pressed%20more%20go%20into%20mode%202%0A%20%20%20%20%20%20%20%20mode%20%3D%202%0A%20%20%20%20%23%20If%20no%20buttons%20were%20pressed%20stay%20in%20whatever%20mode%20it%20was%20in%20before%0A%20%20%20%20if(mode%20%3D%3D%201)%3A%0A%20%20%20%20%20%20%20%20lightMove(0)%20%20%23%20If%20in%20mode%201%20call%20lightFollower%20method%0A%20%20%20%20%20%20%20%20display.show(%22F%22)%0A%20%20%20%20elif(mode%20%3D%3D%202)%3A%0A%20%20%20%20%20%20%20%20lightMove(1)%0A%20%20%20%20%20%20%20%20display.show(%22A%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20display.show(%22N%22)” message=”Selecting the Mode” highlight=”” provider=”manual”/]

The above code will set the ambient light levels by calling the setReference() method and assigning the returned value to refLevel. The program loop is entered where the button presses are retrieved and the button with the most presses will dictate which  mode to put the robot in. mode 1 is for light follower and mode 2 is for light avoider. If no buttons are pressed then the robot will stay in its current mode. The Micro:Bits LEDs will display A for avoider, F for follower and N for no mode selected. lightMove() method will be called with either a 1 or 0 in the argument field to decide if its in follow or avoid mode.

The mode variable is declared under the refLevel variable near the start of the program.

The complete program listing is shown below;

[pastacode lang=”python” manual=”%23%20Light%20avoider%2Ffollower%20for%20the%204tronix%20Bit%3ABot%20and%20BBC%20Micro%3ABit%0A%23%20Author%20David%20Bradshaw%202017%0A%0A%23%20Will%20either%20avoid%20or%20follow%20light%0A%0Afrom%20microbit%20import%20*%0Aimport%20neopixel%20%20%23%20Neopixel%20Library%20so%20we%20can%20control%20the%20NeoPixels%20lights%0A%0Anp%20%3D%20neopixel.NeoPixel(pin13%2C%2012)%0A%0ArobotType%20%3D%20%22%22%0A%0Adef%20detectModel()%3A%20%20%23%20Detects%20which%20model%20were%20using%20XL%20or%20classic%0A%20%20%20%20global%20robotType%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20value%20%3D%20i2c.read(28%2C%201%2C%20repeat%3DFalse)%20%20%23%20Read%20i2c%20bus%0A%20%20%20%20%20%20%20%20robotType%20%3D%20%22XL%22%20%20%23%20If%20we%20can%20read%20it%20then%20it%20must%20be%20XL%0A%20%20%20%20%20%20%20%20display.show(%22X%22)%0A%20%20%20%20except%3A%0A%20%20%20%20%20%20%20%20robotType%20%3D%20%22classic%22%20%20%23%20If%20we%20can’t%20read%20it%20it%20must%20be%20classic%0A%20%20%20%20%20%20%20%20display.show(%22C%22)%20%20%20%20%20%20%23%20or%20Micro%3Abit%20is%20unplugged%0A%20%20%20%20sleep(1000)%20%20%23%20Do%20this%20so%20the%20user%20can%20see%20if%20the%20correct%20model%20is%20found%0A%0AdetectModel()%20%20%23%20Call%20the%20above%20function%0A%0A%23%20Motor%20pins%3B%20these%20tell%20the%20motor%20to%20go%0A%23%20forward%2C%20backwards%20or%20turn%0Aif%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20leftSpeed%20%3D%20pin0%0A%20%20%20%20leftDirection%20%3D%20pin8%0A%20%20%20%20rightSpeed%20%3D%20pin1%0A%20%20%20%20rightDirection%20%3D%20pin12%0A%0Aelse%3A%20%20%23%20Bit%3ABot%20XL%0A%20%20%20%20leftSpeed%20%3D%20pin16%0A%20%20%20%20leftDirection%20%3D%20pin8%0A%20%20%20%20rightSpeed%20%3D%20pin14%0A%20%20%20%20rightDirection%20%3D%20pin12%0A%0A%0A%23%20Both%20light%20sensors%20are%20on%20the%20same%20pin%20so%20we%20also%20use%20a%20select%20pin%0Aif%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20lightSensor%20%3D%20pin2%0A%20%20%20%20sensorSelect%20%3D%20pin16%0A%0Aelse%3A%20%20%23%20Bit%3ABot%20XL%0A%20%20%20%20leftLightSensor%20%3D%20pin2%0A%20%20%20%20rightLightSensor%20%3D%20pin1%0A%0A%0A%0ArefLevel%20%3D%200%20%20%23%20Reference%20light%20level%0Amode%20%3D%200%0A%0A%0Adef%20leftLights(Red%2C%20Green%2C%20Blue)%3A%0A%20%20%20%20for%20pixel_id%20in%20range(0%2C%201)%3A%20%20%23%20Start%20of%20for%20loop%0A%20%20%20%20%20%20%20%20np%5Bpixel_id%5D%20%3D%20(Red%2C%20Green%2C%20Blue)%20%20%23%20Code%20to%20be%20executed%20in%20the%20loop%0A%20%20%20%20np.show()%20%20%23%20Change%20the%20NeoPixels%20colour%0A%0A%0Adef%20rightLights(Red%2C%20Green%2C%20Blue)%3A%0A%20%20%20%20for%20pixel_id%20in%20range(6%2C%207)%3A%0A%20%20%20%20%20%20%20%20np%5Bpixel_id%5D%20%3D%20(Red%2C%20Green%2C%20Blue)%0A%20%20%20%20np.show()%0A%0A%0Adef%20setBrightness(minValue)%3A%0A%20%20%20%20global%20robotType%0A%20%20%20%20if%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(0)%0A%20%20%20%20%20%20%20%20brightnessLeft%20%3D%20lightSensor.read_analog()%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(1)%0A%20%20%20%20%20%20%20%20brightnessRight%20%3D%20lightSensor.read_analog()%0A%20%20%20%20else%3A%20%20%23%20Bit%3ABot%20XL%0A%20%20%20%20%20%20%20%20brightnessLeft%20%3D%20leftLightSensor.read_analog()%0A%20%20%20%20%20%20%20%20brightnessRight%20%3D%20rightLightSensor.read_analog()%0A%0A%20%20%20%20brightness%20%3D%20int((brightnessLeft%20%2B%20brightnessRight)%20%2F%202)%0A%20%20%20%20brightness%20%3D%20int(brightness%20%2F%2025)%0A%20%20%20%20if(brightness%20%3C%20minValue)%3A%0A%20%20%20%20%20%20%20%20brightness%20%3D%20minValue%0A%20%20%20%20return%20brightness%0A%0A%0A%23%20Motor%20control%20to%20tell%20the%20motor%20what%20direction%20and%20speed%20to%20move%0Adef%20move(_leftSpeed%2C%20_rightSpeed%2C%20_leftDirection%2C%20_rightDirection)%3A%0A%20%20%20%20%23%20speed%20values%20between%201%20-%201023%0A%20%20%20%20%23%20smaller%20values%20%3D%3D%20faster%20speed%20moving%20backwards%0A%20%20%20%20%23%20Smaller%20values%20%3D%3D%20lower%20speeds%20when%20moving%20forwards%0A%20%20%20%20%23%20direction%200%20%3D%3D%20forwards%2C%201%20%3D%3D%20backwards%0A%20%20%20%20leftSpeed.write_analog(_leftSpeed)%20%20%23%20Set%20the%20speed%20of%20left%20motor%0A%20%20%20%20rightSpeed.write_analog(_rightSpeed)%20%20%23%20Set%20the%20speed%20of%20right%20motor%0A%20%20%20%20if%20(_leftDirection%20!%3D%202)%3A%0A%20%20%20%20%20%20%20%20leftDirection.write_digital(_leftDirection)%20%20%23%20left%20motor%0A%20%20%20%20%20%20%20%20rightDirection.write_digital(_rightDirection)%20%20%23%20right%20motor%0A%0A%0Adef%20drive(speed)%3A%0A%20%20%20%20if%20(speed%20%3E%200)%3A%0A%20%20%20%20%20%20%20%20move(speed%2C%20speed%2C%200%2C%200)%20%20%23%20move%20the%20motors%20forwards%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20speed%20%3D%201023%20%2B%20speed%0A%20%20%20%20%20%20%20%20move(speed%2C%20speed%2C%201%2C%201)%20%20%23%20move%20the%20motors%20backwards%0A%0A%0Adef%20sharpRight()%3A%0A%20%20%20%20move(100%2C%201023%20%2B%20-200%2C%200%2C%201)%0A%0A%0Adef%20sharpLeft()%3A%0A%20%20%20%20move(1023%20%2B%20-200%2C%20100%2C%201%2C%200)%0A%0A%0Adef%20gentleRight()%3A%0A%20%20%20%20move(200%2C%200%2C%200%2C%200)%0A%0A%0Adef%20gentleLeft()%3A%0A%20%20%20%20move(0%2C%20200%2C%200%2C%200)%0A%0A%0Adef%20coast()%3A%0A%20%20%20%20move(0%2C%200%2C%202%2C%202)%0A%0A%0Adef%20stop()%3A%0A%20%20%20%20move(0%2C%200%2C%200%2C%200)%0A%0A%0Adef%20lightMove(direction)%3A%0A%20%20%20%20global%20robotType%0A%20%20%20%20if%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(0)%20%20%23%20select%20left%20sensor%0A%20%20%20%20%20%20%20%20brightnessLeft%20%3D%20lightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(1)%20%20%23%20select%20right%20sensor%0A%20%20%20%20%20%20%20%20brightnessRight%20%3D%20lightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20else%3A%20%20%23%20Bit%3ABot%20XL%0A%20%20%20%20%20%20%20%20brightnessLeft%20%3D%20leftLightSensor.read_analog()%0A%20%20%20%20%20%20%20%20brightnessRight%20%3D%20rightLightSensor.read_analog()%0A%0A%20%20%20%20avgBrightness%20%3D%20int((brightnessLeft%20%2B%20brightnessRight)%20%2F%202)%0A%0A%20%20%20%20if%20(avgBrightness%20%3C%3D%20refLevel%20%2B%2010)%3A%0A%20%20%20%20%20%20%20%20stop()%20%20%23%20stop%20Moving%0A%20%20%20%20%20%20%20%20if%20(refLevel%20%3E%3D%20900)%3A%20%20%23%20LEDs%20are%20blue%20to%20indicate%20very%20bright%20room%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(0%2C%20setBrightness(1)%2C%20setBrightness(1))%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(0%2C%20setBrightness(1)%2C%20setBrightness(1))%0A%20%20%20%20%20%20%20%20else%3A%20%20%23%20LEDs%20are%20pinkish%20to%20indicate%20a%20dim%20room%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(setBrightness(1)%2C%200%2C%20setBrightness(1))%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(setBrightness(1)%2C%200%2C%20setBrightness(1))%0A%0A%20%20%20%20elif(brightnessLeft%20%3E%20brightnessRight%20-%2025)%20and%20(brightnessLeft%20%3C%20brightnessRight%20%2B%2025)%3A%0A%20%20%20%20%20%20%20%20if%20(direction%20%3D%3D%201)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20drive(-512)%20%20%23%20drive%20backwards%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20drive(512)%20%20%23%20drive%20forwards%0A%20%20%20%20%20%20%20%20leftLights(setBrightness(1)%2C%20setBrightness(1)%2C%200)%0A%20%20%20%20%20%20%20%20rightLights(setBrightness(1)%2C%20setBrightness(1)%2C%200)%0A%0A%20%20%20%20else%3A%20%20%23%20turn%20the%20robot%0A%20%20%20%20%20%20%20%20if%20(direction%20%3D%3D%201)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20move(brightnessLeft%2C%20brightnessRight%2C%20direction%2C%20direction)%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(setBrightness(1)%2C%200%2C%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(setBrightness(1)%2C%200%2C%200)%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20move(brightnessRight%2C%20brightnessLeft%2C%20direction%2C%20direction)%0A%20%20%20%20%20%20%20%20%20%20%20%20leftLights(0%2C%20setBrightness(1)%2C%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20rightLights(0%2C%20setBrightness(1)%2C%200)%0A%0A%0Adef%20setReference()%3A%0A%20%20%20%20global%20robotType%0A%20%20%20%20if%20robotType%20%3D%3D%20%22classic%22%3A%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(0)%20%20%23%20select%20left%20sensor%0A%20%20%20%20%20%20%20%20val1%20%3D%20lightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20%20%20%20%20sensorSelect.write_digital(1)%20%20%23%20select%20right%20sensor%0A%20%20%20%20%20%20%20%20val2%20%3D%20lightSensor.read_analog()%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20val1%20%3D%20leftLightSensor.read_analog()%20%20%23%20read%20value%0A%20%20%20%20%20%20%20%20val2%20%3D%20rightLightSensor.read_analog()%0A%20%20%20%20return%20int((val1%20%2B%20val2)%20%2F%202)%0A%0A%0Asleep(1000)%0ArefLevel%20%3D%20setReference()%0A%0Awhile%20True%3A%0A%20%20%20%20buttonA%20%3D%20button_a.get_presses()%20%20%23%20Get%20how%20many%20times%20bA%20was%20pressed%0A%20%20%20%20buttonB%20%3D%20button_b.get_presses()%20%20%23%20Get%20how%20many%20times%20bB%20was%20pressed%0A%20%20%20%20if%20(buttonA%20%3E%20buttonB)%3A%20%20%23%20If%20bA%20was%20pressed%20more%20than%20bB%20then%20mode%201%0A%20%20%20%20%20%20%20%20mode%20%3D%201%0A%20%20%20%20elif(buttonB%20%3E%20buttonA)%3A%20%20%23%20If%20bB%20was%20pressed%20more%20go%20into%20mode%202%0A%20%20%20%20%20%20%20%20mode%20%3D%202%0A%20%20%20%20%20%20%20%20%23%20If%20no%20buttons%20were%20pressed%20stay%20in%20whatever%20mode%20it%20was%20in%20before%0A%20%20%20%20if(mode%20%3D%3D%201)%3A%0A%20%20%20%20%20%20%20%20lightMove(0)%20%20%23%20If%20in%20mode%201%20call%20lightFollower%20method%0A%20%20%20%20%20%20%20%20display.show(%22F%22)%0A%20%20%20%20elif(mode%20%3D%3D%202)%3A%0A%20%20%20%20%20%20%20%20lightMove(1)%0A%20%20%20%20%20%20%20%20display.show(%22A%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20display.show(%22N%22)%0A” message=”Complete Code Listing” highlight=”” provider=”manual”/]

The above solution isn’t the most elegant however it works and it gave us an opportunity to cover elif statements, button presses, displaying letters on the Micro:Bit and to use the code developed from the previous examples.

Now upload the code to your robot, put it in a room that’s not too bright and use a torch to make the robot follow or avoid the light. Play with the code and see how Bit:Bot behaves.

You’ve done really well and should understand how to program the Bit:Bot to do stuff. All of these examples can be improved and expanded to give Bit:Bot more functionality. You can purchase an ultrasonic sensor for Bit:Bot from the 4Tronix website that will allow you to develop an obstacle sensing robot. Use the experience you’ve gained from these examples and expand on by coming up with your own ideas and coding them. Micro:Bits are good bits of hardware to cut your teeth with coding, when you get more experience maybe you could have a look at the Arduino family of products. This will let you do much more with many different types of micro-controllers from simple 8-bit AVR type controllers to more complex 32-bit ARM Cortex and even the Atheros AR9331 (Arduino Yun) that can run a small distro of the Linux operating system.

I have put the code files below, if you have any comments, questions or code it can be posted in the comments section below.

Code Files

The below zip archive contains the code file from this example.

LightAvoidFollowerAUTO.zip