Now that one micro:bit can radio-transmit tilt info to another, let’s start reducing sleep times and adding statements to make the cyber:bot move based on the tilt data it receives.
To make the tilt controlled robot responsive, it’s important to speed up the while True loop’s repeat rate. The changes are simple, just remove print statements and reduce sleep(500) to sleep(50). This will help prevent delays between tilting the controller and the cyber:bot’s response. Without the print statements, plan to use the LED displays to verify radio communication between the tilt controller and the cyber:bot.
# radio_tilt_transmit_rapid from microbit import * import math import radio radio.on() radio.config(channel=7, queue=1, length=64) sleep(1000) while True: x = accelerometer.get_x() y = accelerometer.get_y() angle = round( math.degrees( math.atan2(y, x) ) ) needle = ( angle + 90 + 15 ) // 30 display.show(Image.ALL_CLOCKS[needle]) dictionary = { } dictionary['x'] = x dictionary['y'] = y dictionary['needle'] = needle packet = str(dictionary) radio.send(packet) sleep(50)
The radio_tilt_transmit_rapid script is almost identical to radio_tilt_transmit_test from the previous activity. The only differences are that the print statements were removed and the sleep(500) at the end of the loop was changed to sleep(50) to make it more responsive.
Why not just completely remove the sleep call? Probably the most important reason is to not flood the airwaves with unnecessary radio activity. The sleep(50) call reduces the radio transmissions to around 20 times per second. The difference between letting the micro:bit transmit as fast as it can and repeating with a 50 ms pause will not be noticeable as you tilt the micro:bit to make the cyber:bot move.
The radio_tilt_bot_fb_only receiver script has statements added that will make the cyber:bot roll forward and backward based on the y-axis tilt measurement from the transmitter.
For best results, the receiver script should repeat at top speed, so all print and sleep statements have been removed.
# radio_tilt_bot_fb_only from cyberbot import * import radio radio.on() radio.config(channel=7, queue=1, length=64) sleep(1000) while True: packet = radio.receive() if packet: dictionary = eval(packet) x = dictionary.get('x') y = dictionary.get('y') needle = dictionary.get('needle') display.show(Image.ALL_CLOCKS[needle]) fb = y / 10 vL = fb vR = -fb bot(18).servo_speed(vL) bot(19).servo_speed(vR)
The radio_tilt_bot_fb_only script is also almost identical to radio_tilt_receive_test from the previous activity. One difference is that the sleep(500) was not reduced to 50; it was completely removed. Without the sleep, the receiver script will recheck for radio data at top speed. The only thing limiting the responsiveness is that the transmitter has 50 ms sleep calls, so it’s only transmitting every 20 ms or so.
Some statements were also added to the if… block after the x, y, and needle variables are unpacked.
First fb = y / 10 takes the y tilt value that could hold a value in the -1024 to 1024 range and scales it down to -102 to 102, which is a perfect range for servo control. The fb variable name is shorthand for forward/backward.
fb = y / 10
Next variables for velocity-left (vL) and velocity-right (vR) are set with the value stored in fb. Let’s say you tilt the micro:bit away from you and that the fb value might be around 50. To make the cyber:bot roll forward, vL can be 50, but vR has to be -50 to make the right wheel turn the opposite direction. That’s why vR = -fb.
vL = fb vR = -fb
Now that the vL and vR variables store equal and opposite values based on your y-axis tilt, they can be used to set the left (P18) and right (P19) servo speeds.
bot(18).servo_speed(vL) bot(19).servo_speed(vR)