Chapter 8 Solutions
Project Solution
- One quick and simple solution would be to average the driveLeft and driveRight values in the FollowingShieldBot sketch. The resulting single value can be applied both left and right speed parameters in the maneuver call.
void loop() // Main loop auto-repeats { int irLeft = irDistance(9, 10); // Measure left distance int irRight = irDistance(2, 3); // Measure right distance // Left and right proportional control calculations int driveLeft = (setpoint - irLeft) * kpl; int driveRight = (setpoint - irRight) * kpr; int drive = (driveLeft + driveRight)/2; // Average drive levels maneuver(drive, drive, 20); // Apply same drive to both delay(10); // 0.1 second delay }
- The relative sensitivity at 35 kHz is 30%. For 36 kHz, it’s 50%.
- Precede a variable declaration with the const keyword.
- A for loop that starts indexing at 38000 and increases by 1000 with each repetition.
- A summing junction is a part of a block diagram that indicates two inputs are added together (or one subtracted from another) resulting in an output.
- The error term is the measured level subtracted from the desired set point level.
- If a distance sample is taken with each repetition of the loop function, then the delays more or less determine how long it takes between each sample. That’s called the sample interval, and 1 ÷ sample interval = sampling rate.
Project Solution
- One quick and simple solution would be to average the driveLeft and driveRight values in the FollowingShieldBot sketch. The resulting single value can be applied both left and right speed parameters in the maneuver call.
void loop() // Main loop auto-repeats { int irLeft = irDistance(9, 10); // Measure left distance int irRight = irDistance(2, 3); // Measure right distance // Left and right proportional control calculations int driveLeft = (setpoint - irLeft) * kpl; int driveRight = (setpoint - irRight) * kpr; int drive = (driveLeft + driveRight)/2; // Average drive levels maneuver(drive, drive, 20); // Apply same drive to both delay(10); // 0.1 second delay }
- Just reduce the for statement’s condition from f <=42000 to f <= 41000
for(long f = 38000; f <= 42000; f += 1000) { distance += irDetect(irLedPin, irReceivePin, f); }
- Declarations
const int setpoint = 2; // Target distances const int kpl = -45; // Proportional control constants const int kpr = -55;
Project Solution
- One quick and simple solution would be to average the driveLeft and driveRight values in the FollowingShieldBot sketch. The resulting single value can be applied both left and right speed parameters in the maneuver call.
void loop() // Main loop auto-repeats { int irLeft = irDistance(9, 10); // Measure left distance int irRight = irDistance(2, 3); // Measure right distance // Left and right proportional control calculations int driveLeft = (setpoint - irLeft) * kpl; int driveRight = (setpoint - irRight) * kpr; int drive = (driveLeft + driveRight)/2; // Average drive levels maneuver(drive, drive, 20); // Apply same drive to both delay(10); // 0.1 second delay }
- One quick and simple solution would be to average the driveLeft and driveRight values in the FollowingShieldBot sketch. The resulting single value can be applied both left and right speed parameters in the maneuver call.
void loop() // Main loop auto-repeats { int irLeft = irDistance(9, 10); // Measure left distance int irRight = irDistance(2, 3); // Measure right distance // Left and right proportional control calculations int driveLeft = (setpoint - irLeft) * kpl; int driveRight = (setpoint - irRight) * kpr; int drive = (driveLeft + driveRight)/2; // Average drive levels maneuver(drive, drive, 20); // Apply same drive to both delay(10); // 0.1 second delay }