Building on the Motor and BitBot classes, I decided to build a remote control for the bitbot so I can drive it using the radio rather than using hard-coded commands.
I decided on single command characters for each direction and to record the last action so that we don’t spam the receiver with a stream of too many commands when nothing has really changed.
Tilting the remote control forwards and backwards will send ‘forward’ and ‘back’ commands and tilting left and right will move as you would expect. With the microbit held in two hands, game controller style, and the usb port facing away from you, x tilt is left and right and y tilt is forwards and back.
I applied a threshold to the tilt because it’s difficult to maintain the remote at exactly zero x and y tilt due to natural wobble in your hands. Because the bitbot will continue in one direction until given another command, I made pressing a button or flattening the controller the command for ‘stop’.
# Bitbot remote control from microbit import * import radio tilt_threshold = 250 forward_command = 'F' stop_command = 'S' left_command = 'L' right_command = 'R' reverse_command = 'B' fast_command = 'Z' slow_command = 'W' radio.on() last_action = '' while True: action = '' if button_a.was_pressed(): action = fast_command elif button_b.was_pressed(): action = slow_command else: side_to_side = accelerometer.get_x() forward_back = accelerometer.get_y() if forward_back < -tilt_threshold: display.show(Image.ARROW_N) action = forward_command elif forward_back > tilt_threshold: display.show(Image.ARROW_S) action = reverse_command elif side_to_side > tilt_threshold: display.show(Image.ARROW_E) action = right_command elif side_to_side < -tilt_threshold: display.show(Image.ARROW_W) action = left_command else: display.show(Image.SQUARE_SMALL) action = stop_command if action != last_action: radio.send(action) last_action = action sleep(500)
The hard work is mostly done by the remote and the motor control classes from last time. In the bitbot, we just check for a new command and react to it with directions.
# Bitbot RC from microbit import * import radio # bitbot classes go here... forward_command = 'F' stop_command = 'S' left_command = 'L' right_command = 'R' reverse_command = 'B' fast_command = 'Z' slow_command = 'W' motor_speed_percent = 50 bitbot = BitBot() sleep(move_duration) radio.on() while True: received = radio.receive() if received: if received == stop_command: bitbot.stop() elif received == forward_command: bitbot.forward(motor_speed_percent) elif received == reverse_command: bitbot.reverse(motor_speed_percent) elif received == left_command: bitbot.circle_left(motor_speed_percent) elif received == right_command: bitbot.circle_right(motor_speed_percent) elif received == slow_command: motor_speed_percent = max(motor_speed_percent - 25, 0) elif received == fast_command: motor_speed_percent = min(motor_speed_percent + 25, 100) sleep(100)
Helpful in debugging the tilting directions and thresholds, and in checking that the remote control and the bitbot were both in sync, I made sure that both units displayed icons corresponding to the command they were sending or receiving. Arrows for each direction and a square for stop and as long as both units are displaying the same icon we know everything is good.
The last feature we added more recently. Instead of driving at a constant speed forward and reverse, we designated two other commands - Z and W - to select between faZt and sloW speeds. Pressing one of the remote buttons speeds up the driving, pressing the other slows it down.