The new DIY Robot category can only be participated in using robots that have been assembled from basic parts like Arduino or ESP-32 microcontrollers, DC motors and motor driver boards. Platform based robots such as those from the Vex or Lego platforms cannot be used in this category.
(Clarification 14 April 2026: The use of non-electronic parts from platforms such as Vex or Lego to build the robot body is allowed, whereas the use of electronic parts such as the CPU/microcontroller, motors, remote controllers, receivers and sensors from these platforms is not allowed.)
This new category therefore serves to encourage students to learn robotics at a more fundamental level while keeping the costs affordable. Please clarify with the organiser if you are not sure of the robot design or construction, so as to avoid misunderstandings or disqualifications.
This guide serves to teach students how to build a simple wheeled robot that can be controlled using a remote controller via radio signals. (Clarification 5 Apr 2026: This DIY robot must be used to take part in the Robotics Challenge game as described in Annex B.)
(The specific types shown in brackets are the ones we used for the robot in this guide. Feel free to switch to other types if you are knowledgeable in how to incorporate them into your robot design.)
2 x ESP32 microcontrollers (ESP32-WROOM-32)
Motor driver board (ZK-5AD)
Joystick (KY-023)
Battery holder for 4 x AA batteries
2 x DC motors and wheels (Note that if you choose to purchase a robot car chassis (see below), it will come with 2 DC motors already)
Jumper wires (buy a mix of male-male and male-female types)
2 x small breadboards and 1 x normal sized breadboard
A basic robot chassis to mount the microcontroller(receiver)on breadboard, battery holder, motor driver and DC motors. This chassis can also be self-built using raw materials or even Lego bricks.
(Total cost ~$30)
Fig. 1: Overview of setup of Transmitter (remote controller) and Receiver circuits
One ESP-32 microcontroller is used in the remote controller to transmit the commands from a attached joystick wirelessly to another ESP-32 which controls the two DC motors. (see Fig. 1)
The main steps in the building process are:
Use a PC to read the unique MAC address of the ESP-32 designated as the receiver. This MAC address is needed by the transmitting ESP-32 microcontroller so that the wireless commands are sent to the correct receiver.
Program the same receiver ESP-32 used in step 1 to receive joystick commands from the remote controller and control the DC motors.
Build the receiving circuit which will be mounted onto the robot chassis.
Build and program the remote controller comprising the transmitting ESP-32 microcontroller and an attached joystick.
Fig. 2: Setup to read the MAC address of the ESP-32 to be used as the receiver
For the transmitting ESP-32 to send the joystick commands to the receiving ESP-32, it must send them to the correct address of the latter, called a MAC address. Each ESP-32 microcontroller ever manufactured has a unique MAC address that identifies it like an ID. You will therefore first need to find out the MAC address of the ESP-32 that you have chosen to use as the receiver (this will eventually be mounted on the robot).
Download and install the Arduino IDE (Integrated Development Environment) on a PC. This program can be used to write programs for and upload them to the ESP-32 microcontroller. You will need to configure the IDE to work with the specific type of ESP-32 you are using (e.g., ESP-WROOM-32)
Connect the ESP-32 chosen as the receiver to the PC via a USB cable. (see Fig. 2) This powers up the ESP-32 causing it start running any program that might have been uploaded into its memory previously, but this is not a concern as you will be uploading your own program and over-writing any old programs inside the ESP-32.
Copy the following program for reading the MAC address to the receiver ESP-32 using the IDE:
Note that the above code is provided by the Random Nerd Tutorial webpage on using the ESP-NOW wireless protocol.
Paste the copied program into the IDE and upload it into the ESP-32 chosen as the receiver by clicking on "Sketch > Upload" in the IDE menu. Once successfully uploaded, the program will re-start the ESP-32 and begin running. This program serves to send out the MAC address of the ESP-32 to the PC via the USB cable. This output can be viewed using the Serial Monitor tool in the IDE.
Open the Serial monitor of the IDE to show the output sent out by the ESP-32 now running the program that you have just uploaded into it. This is done by clicking on "Tools > Serial Monitor" in the IDE menu.
Read the MAC address of the ESP-32 connected to the PC using the Serial Monitor of the IDE. It is found at the last line of the program's output in the Serial Monitor and comprises a sequence of six hexadecimal numbers separated by colons and looks something like "70:b8:f6:5b:f6:54". Note again that this MAC address is unique to your ESP-32 and will not match what is shown by the above example program.
Record the MAC address of your ESP-32. You will need to enter this MAC address of your receiver ESP-32 into the program for your transmitter ESP-32 in the next section.
With the receiver ESP-32 still connected to the PC, as shown in Fig. 2, start the Arduino IDE program.
Start a new Sketch (program) in the IDE, and give it an appropriate name like "receiver ESP32 code".
Copy and paste the following program into the IDE:
Upload the program into the ESP-32 by clicking on "Sketch > Upload" command in the IDE menu.
Once uploading is completed, the ESP-32 will restart and begin running the program which will listen for and receive joystick commands sent wirelessly by the other ESP-32 microcontroller. It will then use these commands to control two DC motors, which will be explained below in Step 3.
Disconnect the ESP-32 from the PC for the time being while we proceed to build the rest of the receiver circuit in Step 3 below.
Fig. 3: Receiver and motor driver circuit. The ESP-32 microcontroller receives wireless signals transmitted by the other ESP-32 (see Fig. 4) and uses them to drive the two connected DC motors.
With the receiver ESP-32 microcontroller programmed in Step 2 above, it is now time to build the circuit for it to drive the motors of the robot car.
Disconnect the ESP-32 from the PC so that it powers off.
Refer to Fig. 3.
Use a jumper wire to connect the Ground (GND) pin of the ZK-5AD motor driver to the GND pin of ESP-32. By convention, black wires are used for GND.
Use a jumper wire to connect the D0 pin of the ZK-5AD motor driver to pin 18 of ESP-32.
Use a jumper wire to connect the D1 pin of the ZK-5AD motor driver to pin 19 of ESP-32.
Use a jumper wire to connect the D2 pin of the ZK-5AD motor driver to pin 22 of ESP-32.
Use a jumper wire to connect the D3 pin of the ZK-5AD motor driver to pin 23 of ESP-32. (For steps 5 to 8, if you use different pins of the ESP-32 other than 18, 19, 22 and 23, you will need to adjust the receiver code in Step 2 accordingly. )
Connect the red and black wires from the battery holder to the positive and negative power input terminals of the motor driver (see Fig. 3). The voltage of the power supply should be between 6 V and 14 V.
Use a red wire to connect the positive (+) terminal of the motor driver to the Vin pin of the ESP-32. This will supply power to the ESP-32. (see Fig. 3)
Use a black wire to connect the negative (-) terminal of the motor driver to the GND pin of the ESP-32. This will ensure that both the ZK-5AD motor driver and ESP-32 share a common ground reference voltage. (see Fig. 3)
Connect one DC motor to one output terminal of the motor driver.
Connect the other DC motor to the other output terminal of the motor driver.
Mount the entire circuit onto the robot chassis.
Fig. 4: Remote controller circuit. The transmitting ESP-32 reads the output of the joystick and the ESP-32 broadcasts them wirelessly, but only the receiving ESP-32 (see Fig. 3) has the correct MAC address to receive the signals.
Mount the transmitting ESP-32 microcontroller onto a breadboard. (see Fig. 3)
Use a black jumper wire to connect the ground (GND) pin of the KY-023 joystick to ground (GND) pin of the ESP-32. Black colour is chosen for the ground or negative voltage pins conventionally.
Use a red jumper wire to connect the +5V pin of the KY-023 joystick to the Vin pin of the ESP-32. Red colour is chosen for the positive voltage pins conventionally.
Use a jumper wire to connect the VRx pin of the KY-023 joystick to the D32 pin of the ESP-32.
Use a jumper wire to connect the VRy pin of the KY-023 joystick to the D34 pin of the ESP-32.
Next you will upload the program into the ESP-32 using a PC:
Connect the ESP-32 to a PC using a USB cable.
Start the Arduino IDE program on the PC.
Copy the following program and paste it into the IDE.
https://docs.google.com/document/d/1EEhB-hPuf-R7OY3gZJgOu2FumI_QCzzi1tOShAdmEPo/edit?usp=sharing
Take note that you must replace the MAC address in the following line of the code with the MAC address of your receiving ESP-32, which you read in Step 1 above. For example, if the MAC address of your receiver ESP-32 is 70:b8:f6:5b:f6:54, then the line in your code should be as follows:
uint8_t broadcastAddress[] = {0x70, 0xb8, 0xf6, 0x5b, 0xf6, 0x54};
Upload the program into the ESP-32 by clicking on "Sketch > Upload" command in the IDE menu.
The transmitting ESP-32 should then start to read the output from the joystick and broadcast it wirelessly. The receiving ESP-32 will be able to receive this broadcast once it is properly programmed in Step 3 below.
Teams taking part in the DIY Robot Category qualify for the following Additional Awards:
Technical Proficiency Award (Pri. and Sec.)
Best Mechanical Construction Award (Pri. and Sec.)
Refer to the Additional Awards page for more details.