How About A Wireless Setup??
Race against your friends! In this game, RVR's LEDs will randomly change colors. Your job is to press the button that matches the color of the robot's LEDs. The better you do, the faster RVR+/RVR will go! If you hit the wrong button or you wait too long to press a button, RVR+/RVR will slow down, so try to keep up!
This straighforward example should take you about 30 min to complete.
If you haven't already set up your micro:bit using your favorite editor, it's probably best to take care of that before jumping in here. Feel free to check out our Getting Started docs on:
Hardware Setup
Parts List
If you want to build your own Rainbow Racer, you will need the following parts (most of them are included in this nifty "inventor's" kit from SparkFun):
Breadboard
Micro B USB cable (preferably a long one!)
4 Multi-Colored Momentary Push Buttons (we used red, green, blue, and yellow)
4 10K Ω Resistors
12 Jumper Wires
Wiring Diagram
First you'll need to put together your circuit! Follow the wiring diagram below:
Software Setup
After you've got your circuit set up, you're ready to flash the code to your micro:bit. Let's explore the code a bit and then we'll walk through how to flash the code.
The Code
Let's get started with our imports. We'll need random for the RVR+/RVR to be able to choose a random color for the user to have to match. From the microbit, we'll pull in what we need to transfer information (via the needed pins) and give feedback to the user (using display and Image).
import random
from microbit import display, Image, sleep, pin8, pin12, pin13, pin16
from sphero import RVRDrive, RVRLed, RVRPower
Our check_input function will read the GPIO pins to figure out which button (if any) was pressed:
def check_input():
input_btn = 0
if pin8.read_digital():
input_btn = 1 # yellow
elif pin12.read_digital():
input_btn = 2 # green
elif pin13.read_digital():
input_btn = 3 # red
elif pin16.read_digital():
input_btn = 4 # blue
return input_btn
Our set_leds function will set RVR's LEDs depending on the randomly generated current_color:
def set_leds():
if current_color == 1:
RVRLed.set_all_leds(255, 255, 0) # yellow
elif current_color == 2:
RVRLed.set_all_leds(0, 255, 0) # green
elif current_color == 3:
RVRLed.set_all_leds(255, 0, 0) # red
elif current_color == 4:
RVRLed.set_all_leds(0, 0, 255) # blue
return
Our show_correct_feedback function will show a check mark if the input_btn matched the current_color:
def show_correct_feedback():
display.show(Image.YES)
sleep(600)
display.clear()
Our show_incorrect_feedback function will show an X if the input_btn did not match the current_color:
def show_incorrect_feedback():
display.show(Image.NO)
sleep(600)
display.clear()
Now that we've gotten through our function definitions, we can wake up our RVR+/RVR, in preparation for using these functions:
RVRPower.wake()
sleep(2000)
Next, we'll initialize our variables (and use our random import 😉):
current_color = random.randint(1, 4)
current_speed = 0
penalty_counter = 0
input_btn = 0
Now we get to the good stuff! First, we'll initialize our LED value and then we'll set that we should check the user's input when we use input_btn and initialize a counter for how many times the user hits an incorrect button.
In our first bit of logic, we'll check if the user takes too long to press a button.
In the second section, we have two pieces of logic that keep current_speed within the range [0, 60]; we'll use the current_speed we land on in a drive command to make the RVR+/RVR move forward at the current_speed.
Once we have all that information, we check user input and give proper feedback!
while True:
set_leds()
input_btn = check_input()
penalty_counter += 1
if penalty_counter > 250:
show_incorrect_feedback()
current_speed -= 6
penalty_counter = 0
current_color = random.randint(1, 4)
input_btn = 0
if current_speed > 60:
current_speed = 60
if current_speed < 0:
current_speed = 0
RVRDrive.drive(current_speed, 0)
if input_btn == 0:
pass
elif input_btn == current_color:
show_correct_feedback()
current_speed += 6
penalty_counter = 0
current_color = random.randint(1, 4)
input_btn = 0
elif input_btn != current_color:
show_incorrect_feedback()
current_speed -= 6
input_btn = 0
Now, you're ready to play!
Flashing the Code
Follow the below steps:
Download the rainbow_racer.py and sphero.py files. rainbow_racer.py is the file that will run on the micro:bit, and sphero.py contains the functions you'll need to be able to interact with RVR+/RVR using your micro:bit. You'll notice that RVRDrive and RVRLed are imported from sphero.py at the top of the rainbow_racer.py file.
Flash the program onto your micro:bit. We recommend using the micro:bit Python Editor. See our micro:bit Python Setup page for detailed instructions.
The Race
To start the race all you'll need to do is plug the micro:bit (which should be mounted in the breakout board) into the RVR+/RVR using the USB cable, and then turn on the RVR+/RVR. You'll need to walk with the RVR+/RVR as it moves since it's plugged into your micro:bit - that's why we suggested finding a long cable! If you have a friend that built their own Rainbow Racer, you can race them! Consider putting tape lanes and a finish line on the ground to have an official race track (keep in mind that the RVR+/RVR will only drive in a straight line). If you're flying solo, run multiple races and keep track of your times. See if you can beat your own high score!
Now What?
Try to improve your Rainbow Racer! Here are some ideas to get you started:
Speed things up by playing with some of the values in the rainbow_racer.py file.
Need more of a challenge? Add more buttons and colors!
Add a joystick to your circuit so you can steer your RVR+/RVR.
The breadboard circuit can be pretty clunky to race with - try designing a better controller!
If you're adding a lot to your code, you may run into some Memory Errors. That's okay - micro:bit is best for smaller projects. If you feel like you've outgrown your micro:bit, try upgrading to an Arduino or a Raspberry Pi!
Try our next activity!