CS 1020 - Lab 3 - More programming: parameters, return values,
printing
In this lab, you will gain experience with parameters and return
values, and also experiment with the brightness sensors. We will
supply each group with a pair of sensors and a flashlight. Start by
getting to know your new group members, and familiarize yourself with
the new Sciborg that you will use for this lab. (One of you should
know it already!)
Brightness Sensors
Attach the two brightness sensors to analog inputs 5 and 6 of your
Handy Board. Use port 5 for the left sensor, and port 6 for the right
one. Turn the Handy Board's user knob past option 7 and observe the
values returned by the sensors as you illuminate them with the
flashlight.
In exercise 4 below you will program the Sciborg to
follow the light source. For this to work, the sensors need to be
mounted such that they measure the light received from the front left
and front right. You may want to build a small Lego enclosure for
each sensor that blocks the light coming from the sides and from
behind the sensor. Once your sensors are installed properly, they
should record roughly equal values if the light is coming from
straight ahead; but if the light is coming from the side, the
corresponding sensor should report a much smaller value than the other
one.
More Coding!
- Now it's time for some programming. From now on, you will have
to write your programs from scratch. The easiest way to do this is to
use an existing program as a template. Here are some quick
instructions to get you started:
- Create a folder "LEGO" in your middfiles account if you
haven't done so already.
- Open one of the previous programs in a text editor, for
example your file "lab2.txt", or one of the programs in
from the code folder.
- Use "Save As" to save a copy of this file in your
middfiles LEGO folder. You can use the name "lab3.txt".
- Replace the old program text with your new code. Don't
forget to update the menu options as well.
First, write two procedures "left-brightness" and "right-brightness"
that return the values of the two brightness sensors. These will
look very similar to the procedures "left-sensor" and "right-sensor"
from the Sciborg code. (Such procedures are useful because they make
the code easier to read, but also easier to maintain: if you ever
need to plug the sensors into different ports, you'll only have to
change one line!)
Next, write a procedure "print-brightness" that
prints the current values of the two sensors to the top line of the
LCD display like this:
L: 56 R: 72
(assuming the sensors are currently returning the values 56 and 72).
Note also that your actual display will look slighly different than this since the
Handy Boards always print lowercase and the spacing may be a bit different.
Download your procedure to the Handy Board and test it. Your
procedure should continuously update the values, similar to the Handy
Board's "display analog values" mode. If the values change too fast,
try inserting a "wait 1" statement to slow it down.
- Write three procedures "min", "max", and "avg" that each take two
parameters, ":a" and ":b". The procedures should compute the minimum,
maximum, and average of :a and :b, respectively. Write two test
procedures "print-min-max" and "print-avg" that work like the
"print-brightness" procedure, but in addition show the result of the
min/max and avg procedures in the bottom line of the LCD
display, like this:
L: 122 R: 94
min 94 max 122
L: 65 R: 23
average 44
Try and see if you can exercise good code reuse when writing these function. Specifically,
you should avoid having the exact same code copied to print of the L and R values! (Come talk
to me if you don't know what I'm saying here :)
Download your code and make sure your procedures calculate the
minimum, maximum, and average of the two sensor values correctly.
- Write three procedures "follow-light1", "follow-light2", and
"follow-light3" that use the three strategies below to make
the Sciborg follow the flashlight around the room. Write
and test one procedure at a time! As you test them, you may
also need to revisit how you mounted them.
- follow-light1:
- If the left sensor sees more light (smaller value)
than the right sensor, go left;
- otherwise, go right.
- follow-light2:
Based on your experiments from
problems 1 and 2, choose a threshold to distinguish
between light and dark. Then:
- If both sensors see light, go straight
- If only the left sensor sees light, go left
- If only the right sensor sees light, go right
- If neither sensor sees light, stop.
(This strategy can be implemented with only two
ifelse-statements, one for each motor - can you see how?)
- follow-light3:
First, compute the difference between the two sensor
values (left - right) and store it in a global variable "diff. Then:
- If the difference is small (positive or negative),
go straight. (Note: to compute the negative value of
a number, subtract it from 0).
- Otherwise, if the difference is positive, but not
too big, turn slightly to the right (left motor at
full speed, right motor at half speed).
- Similarly, if the difference is negative, but (its
absolute value) is not too big, turn slightly to the
left.
- If the difference is positive and big, turn right
- If the difference is negative and (its absolute
value) is big, turn left
Of course, you'll have to find proper values for "small"
and "big".
Which strategy works the best?
Once you're done, add your names and your group number in a comment
at the top of your program(s) and make sure that the code associated
with each problem is denoted by comments in the code.
Hand in a printout of your program
as part of your homework 3 submission on Monday in class. Then, move
on to the homework assignment: the eight-ball contest!