Now that you are sure your line follower is working well, try experimenting with arrays as another approach to building your BlocklyProp program. Think of an array as a numbered list of data elements. Your code can refer to a particular data element by its list number. Now, imagine your list numbering uses binary numbers instead of decimal numbers.
Remember the table of wheel speeds from the previous page? The binary numbers created by the QTI sensors can be used as array list numbers, and the left and right wheel speed values can be used as array elements.
binary | left = | right = | behavior |
---|---|---|---|
1000 | 16 | 32 | pivot left |
1100 | 32 | 48 | sharp left |
1110 | 48 | 64 | left |
0100 | 56 | 64 | slight left |
0110 | 64 | 64 | forward |
0010 | 64 | 56 | slight right |
0111 | 64 | 48 | right |
0011 | 48 | 32 | sharp right |
0001 | 32 | 16 | pivot right |
The binary numbers in the column above represent the output of the four QTI sensors - but binary is also a way to represent an integer. The next table shows each of the binary numbers and their decimal equivalents:
binary | decimal | left = | right = | behavior |
---|---|---|---|---|
1000 | 8 | 16 | 32 | pivot left |
1100 | 12 | 32 | 48 | sharp left |
1110 | 14 | 48 | 64 | left |
0100 | 4 | 56 | 64 | slight left |
0110 | 6 | 64 | 64 | forward |
0010 | 2 | 64 | 56 | slight right |
0111 | 7 | 64 | 48 | right |
0011 | 3 | 48 | 32 | sharp right |
0001 | 1 | 32 | 16 | pivot right |
Next, we will sort the table by the decimal representation of the QTI sensors’ output, and leave blanks for the in-between numbers:
binary | decimal | left = | right = | behavior |
---|---|---|---|---|
0 | 0 | 0 | ||
0001 | 1 | 32 | 16 | pivot right |
0010 | 2 | 64 | 56 | slight right |
0011 | 3 | 48 | 32 | sharp right |
0100 | 4 | 56 | 64 | slight left |
5 | 0 | 0 | ||
0110 | 6 | 64 | 64 | forward |
0111 | 7 | 64 | 48 | right |
1000 | 8 | 16 | 32 | pivot left |
9 | 0 | 0 | ||
10 | 0 | 0 | ||
11 | 0 | 0 | ||
1100 | 12 | 32 | 48 | sharp left |
13 | 0 | 0 | ||
1110 | 14 | 48 | 64 | left |
15 | 0 | 0 |
Then, let’s turn these into lists, filling in the blanks with zeros:
- Left = 0,32,64,48,56,0,64,64,16,0,0,0,32,0,48,0
- Right = 0,16,56,32,64,0,64,48,32,0,0,0,48,0,64,0
These values can then be used to fill an array for each side, left and right:
Now, instead of the large switch...case block - you can use the array values. You will add an if...do block to handle the cases that have been filled with zeros by using the leftPrev and rightPrev variables:
Try this
With shorter code, it’s easier to customize the behavior of the robot. For example, you can add an else if that looks for all four of the QTI sensors to read 1 (binary 1111, or decimal 15), and when they do, have the robot stop or turncompletely around:
- Create a shape like this at the end of your line:
- Have your robot stop, beep, and then turn completely around when it encounters the “end of the line” by adding an else if to the if...do block in your code: