Build an Autonomous Maze Solving Robot Rover with ESP32-S3 & VL53L0X ToF Sensors
Comprehensive step-by-step engineering tutorial for building an autonomous maze solving micromouse rover using ESP32-S3, triple VL53L0X ToF laser sensors, and TB6612FNG driver.
- Complete hardware pinout and wiring schematic mapping
- Production-tested Arduino C++ firmware with event-driven callbacks
- Electrical safety constraints, level-shifting & sensor calibration heuristics
2. Overview & Engineering Objectives
Ultrasonic sensors (like the HC-SR04) emit wide 15° acoustic cones that bounce unpredictably off angled maze walls, introducing severe spatial positioning errors. This robot rover employs three infrared Time-of-Flight (ToF) laser sensors that measure photon travel times to provide millimeter-accurate distance measurements regardless of wall color or ambient reflectance.
Core Engineering Capabilities:
Millimeter Laser Ranging: Triangulates spatial clearance using 940nm VCSEL lasers to measure front, left, and right wall boundaries up to 2.0 meters away.
Dynamic XSHUT I2C Address Sequencing: Overcomes the factory-hardcoded I2C address 0x29 shared by all VL53L0X sensors by resetting them sequentially and assigning unique run-time addresses (0x30, 0x31, 0x32).
High-Efficiency MOSFET Motor Switching: Replaces obsolete L298N drivers with the TB6612FNG driver, dropping less than 0.2V across motor terminals and preserving battery torque.
FreeRTOS Dual-Core Concurrency:
Core 1: Real-time 50Hz kinematic closed-loop navigation and sensor acquisition.
Core 0: Local Wi-Fi Access Point serving an asynchronous WebSocket 2D grid visualizer.
3. Bill of Materials (BOM)
Component
Quantity
Specification / Rating
Est. Cost (INR)
Sourcing / Affiliate Link
ESP32-S3 DevKitC-1 Board
1
N16R8 (16MB Flash, 8MB PSRAM, Dual-Core 240MHz)
₹590
Buy on Mentora Store
VL53L0X ToF Sensor Modules
3
I2C Laser Ranging Sensor (with XSHUT pin exposed)
₹780
Buy on Mentora Store
TB6612FNG Dual Motor Driver
1
1.2A continuous / 3.2A peak, Low R_DS(on) MOSFET
₹160
Buy on Mentora Store
N20 Micro Metal Gearmotors
2
6V 300 RPM high-torque precision gearmotors
₹340
Buy on Mentora Store
Mini 2WD Robot Platform / Chassis
1
Carbon fiber / PCB chassis with caster & silicone wheels
₹380
Buy on Mentora Store
2S 7.4V 850mAh LiPo Battery
1
High discharge 25C LiPo pack with JST connector
₹420
Buy on Mentora Store
Pololu 5V 1A Step-Down Buck
1
Efficient logic regulator from 7.4V battery
₹180
Buy on Mentora Store
Dupont Leads & Standoffs
1 Set
Brass standoffs, header pins, jumper leads
₹80
Buy on Mentora Store
Total Hardware Cost
~₹2,930
4. Hardware Architecture: The Multi-VL53L0X I2C Collision Fix
All VL53L0X breakout boards power up with the exact same factory I2C address: 0x29. Connecting all three sensors to the I2C bus simultaneously causes instant bus deadlock.
The Dynamic XSHUT Readdressing Sequence:
Connect each sensor’s XSHUT shutdown pin to a separate ESP32 GPIO pin:
Front Sensor: XSHUT_FRONT on GPIO 4
Left Sensor: XSHUT_LEFT on GPIO 5
Right Sensor: XSHUT_RIGHT on GPIO 6
In setup(), pull all three XSHUT pins LOW to put all sensors into hardware shutdown.
Bring XSHUT_FRONT HIGH. The front sensor boots up at 0x29. Call sensorFront.setAddress(0x30) to change its address to 0x30.
Bring XSHUT_LEFT HIGH. The left sensor boots at 0x29. Call sensorLeft.setAddress(0x31).
Bring XSHUT_RIGHT HIGH. The right sensor boots at 0x29. Call sensorRight.setAddress(0x32).
All three sensors now operate simultaneously on addresses 0x30, 0x31, and 0x32!
5. Maze-Solving Algorithm: The Left-Hand Rule
For simply connected mazes (no isolated loops), the Left-Hand Wall Following (Pledge) algorithm guarantees discovery of the maze exit:
At every decision intersection:
1. Is there an opening to the Left? (Left distance > 180mm)
-> YES: Turn 90 degrees Left and drive forward.
2. Is the path Ahead clear? (Front distance > 150mm)
-> YES: Drive straight ahead.
3. Is there an opening to the Right? (Right distance > 180mm)
-> YES: Turn 90 degrees Right and drive forward.
4. Are you in a Dead End? (Left, Front, and Right blocked)
-> YES: Execute 180 degree U-turn.
6. Real-World Troubleshooting FAQs
Q1: Why does readdressing fail or only one VL53L0X sensor responds?
Root Cause: XSHUT initialization delay. After setting an XSHUT pin HIGH, you must insert a delay(10) to allow the internal sensor voltage regulator and EEPROM to boot before issuing the setAddress() I2C command.
Q2: Why does the TB6612FNG motor driver fail to turn the motors?
Root Cause 1: The STBY (Standby) pin is left floating or grounded. The TB6612FNG requires the STBY pin to be pulled HIGH (3.3V or 5V) to enable the motor output MOSFETs.
Root Cause 2: Power separation. VM connects to motor battery (7.4V), and VCC connects to 3.3V/5V microcontroller logic. Connect both Grounds together.
Q3: Why does motor task timing stutter on FreeRTOS?
Root Cause: Task starvation. If both the motor PID control and Wi-Fi stack run on Core 0, the Wi-Fi modem interrupt pre-empts motor PWM calculations.
Fix: Pin the motor navigation loop to Core 1 using xTaskCreatePinnedToCore().
7. Mentora Monetization & Student Support Hooks
🛒 Official Mentora Maze Rover Hardware Kit: ESP32-S3 DevKit, 3x VL53L0X sensors with laser-cut mounting brackets, TB6612FNG driver, N20 gearmotors, carbon chassis, and 2S LiPo battery for ₹3,499.
⚡ ₹49 Mentora Token Vault: Instantly unlock the Flood-Fill shortest path solving algorithm, WebSocket real-time maze visualizer, and 3D printable chassis bracket files.
🛠️ ₹299 1-on-1 Mentora Live Video Debugging: 30-minute session with a robotics engineer to eliminate ToF I2C bus address collisions, tune differential motor steering PID loops, and debug FreeRTOS task pinning.
Hardware Pinout & Wiring Connections
Hardware Pinout & Wiring Connection Guide
Project 11: Autonomous Maze Solver Rover with VL53L0X ToF Arrays
Microcontroller: ESP32-S3 DevKitC-1 (Xtensa LX7 Dual-Core)Distance Sensing: 3x STMicroelectronics VL53L0X Time-of-Flight Sensors (Front, Left, Right)Motor Driver: TB6612FNG Dual High-Efficiency MOSFET Motor DriverPower Stage: 2S 7.4V LiPo Battery (Motor VM) + 5V 1A Step-Down Buck Converter (ESP32 Logic)
1. Complete Fritzing Pin Connection Mapping Table
Table A: Triple VL53L0X ToF Sensors to ESP32-S3
Component Pin
Connected Node / ESP32-S3 Pin
Wire Color
Bus / Signal Role
Operational Rules & Addressing
All Sensors VCC
3V3 Rail
Red
3.3V DC Sensor Supply
Powered strictly from 3.3V.
All Sensors GND
GND Rail
Black
Ground Reference
Common system ground.
All Sensors SDA
GPIO 1
Blue
Shared I2C Data Line
Hardware I2C SDA line. Shared across all 3 sensors.
All Sensors SCL
GPIO 2
Yellow
Shared I2C Clock Line
Hardware I2C SCL line. Shared across all 3 sensors.
Front ToF XSHUT
GPIO 4
Orange
Front Hardware Shutdown
Booted first; readdressed to 0x30.
Left ToF XSHUT
GPIO 5
Green
Left Hardware Shutdown
Booted second; readdressed to 0x31.
Right ToF XSHUT
GPIO 6
White
Right Hardware Shutdown
Booted third; readdressed to 0x32.
Table B: TB6612FNG Motor Driver to ESP32-S3 & DC Motors
TB6612FNG Pin
Connected Node / ESP32 Pin
Wire Color
Purpose / Function
Electrical Guidelines & Constraints
VM
Battery (+7.4V LiPo)
Red (Thick)
High-Current Motor Power
Direct connection to 2S battery (supports up to 15V).
VCC
3V3 or 5V Rail
Red
Driver Logic Power
Powered from regulated logic rail.
GND (Both Pins)
Common GND Rail
Black (Thick)
Power & Logic Ground
Must share common ground with ESP32 and battery.
STBY (Standby)
GPIO 13
Orange
Driver Enable Line
MUST BE DRIVEN HIGH to take driver out of sleep mode.
AIN1
GPIO 7
Yellow
Left Motor Direction 1
Digital logic direction control.
AIN2
GPIO 8
Green
Left Motor Direction 2
Digital logic direction control.
PWMA
GPIO 9
Blue
Left Motor Speed (PWM)
Driven by ESP32 LEDC Channel 0 (1kHz).
BIN1
GPIO 10
Yellow
Right Motor Direction 1
Digital logic direction control.
BIN2
GPIO 11
Green
Right Motor Direction 2
Digital logic direction control.
PWMB
GPIO 12
Blue
Right Motor Speed (PWM)
Driven by ESP32 LEDC Channel 1 (1kHz).
AO1 & AO2
Left N20 Motor Tabs
Red / Black
Left Motor Output
Solder 100nF ceramic capacitor across motor tabs.
BO1 & BO2
Right N20 Motor Tabs
Red / Black
Right Motor Output
Solder 100nF ceramic capacitor across motor tabs.
2. Circuit Connection Schematic Diagram (ASCII Art)
+----------------------------------------------------------------+
| ESP32-S3 DevKitC-1 |
| |
| [ 3V3 ] [ GND ] [G1/SDA] [G2/SCL] [G4] [G5] [G6] [G7..G13]|
+----+-------+--------+--------+-------+------+------+------+----+--+
| | | | | | | |+3.3V | GND | | | | | | |
Rail | Rail | SDA | SCL | Front| Left| Right| |
=======+=======+========+========+=======+======+======+======+========
| | | | XSHUT XSHUT XSHUT |+--+-------+--------+--------+-------+ |
| VCC GND SDA SCL XSHUT | (Front: 0x30) |
| VL53L0X FRONT | |+------------------------------------+ |
| VCC GND SDA SCL XSHUT | (Left: 0x31) |
| VL53L0X LEFT |<-------------------++------------------------------------+ |
| VCC GND SDA SCL XSHUT | (Right: 0x32) |
| VL53L0X RIGHT |<-------------------++------------------------------------+
|
+------------------------------------------------------+
|
| TB6612FNG MOTOR DRIVER
| +------------------------------------+
+-->| AIN1 AIN2 PWMA BIN1 BIN2 PWMB STBY |
| VM VCC GND AO1 AO2 BO1 BO2 |
+--+----+----+----+----+----+----+---+
| | | | | | |7.4V LiPo+ 3.3V GND [Left Motor] [Right Motor]
3. Golden Engineering Rules for Rover Wiring
XSHUT Pin Isolation:
Never tie the XSHUT pins together. Each sensor requires an independent GPIO to control its power sequence individually at boot.
TB6612FNG Standby (STBY) Pin:
If the STBY pin is left disconnected, the motor driver will remain permanently in low-power standby mode, and motors will not move. In code, drive GPIO 13 HIGH in setup().
Decoupling Motor Transients:
Always place a 100µF to 220µF electrolytic capacitor directly across the VM and GND power pins of the TB6612FNG to absorb motor acceleration transients.
Complete Tested Arduino C++ Firmware
``cpp
/*
- ==============================================================================
- Project: Autonomous Maze Solver Rover with VL53L0X ToF Laser Arrays
- Microcontroller: ESP32-S3 DevKitC-1 (Dual-Core Xtensa LX7 240MHz)
- Author: Mentora Maker Lab (Spark Autonomous Content Intelligence)
- License: MIT
*
- Hardware Peripherals:
- - 3x VL53L0X Time-of-Flight Sensors:
- Shared I2C: SDA -> GPIO 1, SCL -> GPIO 2
- XSHUT Front: GPIO 4 -> Readdressed to 0x30
- XSHUT Left : GPIO 5 -> Readdressed to 0x31
- XSHUT Right: GPIO 6 -> Readdressed to 0x32
- - TB6612FNG Dual MOSFET Motor Driver:
- Left Motor : AIN1 -> GPIO 7, AIN2 -> GPIO 8, PWMA -> GPIO 9 (LEDC Ch 0)
- Right Motor: BIN1 -> GPIO 10, BIN2 -> GPIO 11, PWMB -> GPIO 12 (LEDC Ch 1)
- Standby : STBY -> GPIO 13 (Pulled HIGH)
- ==============================================================================
*/
#include <Wire.h>
#include <Adafruit_VL53L0X.h>
// -----------------------------------------------------------------------------
// HARDWARE PIN DEFINITIONS
// -----------------------------------------------------------------------------
#define I2CSDAPIN 1
#define I2CSCLPIN 2
#define XSHUTFRONTPIN 4
#define XSHUTLEFTPIN 5
#define XSHUTRIGHTPIN 6
#define MOTORAIN1PIN 7
#define MOTORAIN2PIN 8
#define MOTORPWMAPIN 9
#define MOTORBIN1PIN 10
#define MOTORBIN2PIN 11
#define MOTORPWMBPIN 12
#define MOTORSTBYPIN 13
#define STATUSLEDPIN 2
// New Assigned I2C Addresses
#define ADDR_FRONT 0x30
#define ADDR_LEFT 0x31
#define ADDR_RIGHT 0x32
// Navigation Distance Thresholds (Millimeters)
#define DISTWALLDETECT_MM 180 // Wall presence threshold
#define DISTFRONTBLOCKED_MM 130 // Obstacle right ahead threshold
// Motor Speeds (0 - 255)
#define SPEED_CRUISE 180
#define SPEED_TURN 160
// Sensor Objects
AdafruitVL53L0X sensorFront = AdafruitVL53L0X();
AdafruitVL53L0X sensorLeft = AdafruitVL53L0X();
AdafruitVL53L0X sensorRight = AdafruitVL53L0X();
// Distance Telemetry (mm)
uint16_t distFront = 0;
uint16_t distLeft = 0;
uint16_t distRight = 0;
// -----------------------------------------------------------------------------
// MOTOR KINEMATICS & CONTROL
// -----------------------------------------------------------------------------
void stopMotors() {
digitalWrite(MOTORAIN1PIN, LOW);
digitalWrite(MOTORAIN2PIN, LOW);
digitalWrite(MOTORBIN1PIN, LOW);
digitalWrite(MOTORBIN2PIN, LOW);
ledcWrite(0, 0);
ledcWrite(1, 0);
}
void driveForward(int speed) {
digitalWrite(MOTORAIN1PIN, HIGH);
digitalWrite(MOTORAIN2PIN, LOW);
digitalWrite(MOTORBIN1PIN, HIGH);
digitalWrite(MOTORBIN2PIN, LOW);
ledcWrite(0, speed);
ledcWrite(1, speed);
}
void turnLeft90() {
digitalWrite(MOTORAIN1PIN, LOW);
digitalWrite(MOTORAIN2PIN, HIGH);
digitalWrite(MOTORBIN1PIN, HIGH);
digitalWrite(MOTORBIN2PIN, LOW);
ledcWrite(0, SPEED_TURN);
ledcWrite(1, SPEED_TURN);
delay(280); // Calibrated for 90 degree pivot turn
stopMotors();
delay(100);
}
void turnRight90() {
digitalWrite(MOTORAIN1PIN, HIGH);
digitalWrite(MOTORAIN2PIN, LOW);
digitalWrite(MOTORBIN1PIN, LOW);
digitalWrite(MOTORBIN2PIN, HIGH);
ledcWrite(0, SPEED_TURN);
ledcWrite(1, SPEED_TURN);
delay(280); // Calibrated for 90 degree pivot turn
stopMotors();
delay(100);
}
void turnU180() {
turnRight90();
turnRight90();
}
// -----------------------------------------------------------------------------
// DYNAMIC XSHUT READDRESSING SEQUENCE
// -----------------------------------------------------------------------------
bool initializeToFSensors() {
Serial.println("[ToF] Resetting all VL53L0X sensors via XSHUT...");
// 1. Put all sensors into hardware shutdown
digitalWrite(XSHUTFRONTPIN, LOW);
digitalWrite(XSHUTLEFTPIN, LOW);
digitalWrite(XSHUTRIGHTPIN, LOW);
delay(20);
// 2. Initialize Front Sensor
digitalWrite(XSHUTFRONTPIN, HIGH);
delay(15);
if (!sensorFront.begin(ADDR_FRONT, false, &Wire)) {
Serial.println("[ERROR] Failed to initialize Front ToF sensor at 0x30!");
return false;
}
Serial.println("[OK] Front ToF sensor initialized at address 0x30.");
// 3. Initialize Left Sensor
digitalWrite(XSHUTLEFTPIN, HIGH);
delay(15);
if (!sensorLeft.begin(ADDR_LEFT, false, &Wire)) {
Serial.println("[ERROR] Failed to initialize Left ToF sensor at 0x31!");
return false;
}
Serial.println("[OK] Left ToF sensor initialized at address 0x31.");
// 4. Initialize Right Sensor
digitalWrite(XSHUTRIGHTPIN, HIGH);
delay(15);
if (!sensorRight.begin(ADDR_RIGHT, false, &Wire)) {
Serial.println("[ERROR] Failed to initialize Right ToF sensor at 0x32!");
return false;
}
Serial.println("[OK] Right ToF sensor initialized at address 0x32.");
return true;
}
// -----------------------------------------------------------------------------
// READ ALL ToF SENSORS
// -----------------------------------------------------------------------------
void readSensors() {
VL53L0XRangingMeasurementDatat measureFront;
VL53L0XRangingMeasurementDatat measureLeft;
VL53L0XRangingMeasurementDatat measureRight;
sensorFront.rangingTest(&measureFront, false);
sensorLeft.rangingTest(&measureLeft, false);
sensorRight.rangingTest(&measureRight, false);
distFront = (measureFront.RangeStatus != 4) ? measureFront.RangeMilliMeter : 2000;
distLeft = (measureLeft.RangeStatus != 4) ? measureLeft.RangeMilliMeter : 2000;
distRight = (measureRight.RangeStatus != 4) ? measureRight.RangeMilliMeter : 2000;
Serial.printf("[ToF] Left: %4d mm | Front: %4d mm | Right: %4d mm\n", distLeft, distFront, distRight);
}
// -----------------------------------------------------------------------------
// ARDUINO SETUP
// -----------------------------------------------------------------------------
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("\n========================================================");
Serial.println(" MENTORA ESP32-S3 AUTONOMOUS MAZE SOLVER ROVER (V1) ");
Serial.println("========================================================");
// Configure XSHUT Pins
pinMode(XSHUTFRONTPIN, OUTPUT);
pinMode(XSHUTLEFTPIN, OUTPUT);
pinMode(XSHUTRIGHTPIN, OUTPUT);
// Configure Motor Driver Pins
pinMode(MOTORAIN1PIN, OUTPUT);
pinMode(MOTORAIN2PIN, OUTPUT);
pinMode(MOTORBIN1PIN, OUTPUT);
pinMode(MOTORBIN2PIN, OUTPUT);
pinMode(MOTORSTBYPIN, OUTPUT);
pinMode(STATUSLEDPIN, OUTPUT);
// Enable Motor Driver (STBY HIGH)
digitalWrite(MOTORSTBYPIN, HIGH);
stopMotors();
// Configure PWM Channels (LEDC)
ledcSetup(0, 1000, 8); // Channel 0, 1kHz, 8-bit
ledcAttachPin(MOTORPWMAPIN, 0);
ledcSetup(1, 1000, 8); // Channel 1, 1kHz, 8-bit
ledcAttachPin(MOTORPWMBPIN, 1);
// Initialize I2C Bus on ESP32-S3 GPIO 1 / 2
Wire.begin(I2CSDAPIN, I2CSCLPIN);
Wire.setClock(400000); // 400kHz fast mode
// Initialize ToF Sensor Array
if (!initializeToFSensors()) {
Serial.println("[FATAL] ToF array initialization failed. System halted.");
while (1) {
digitalWrite(STATUSLEDPIN, !digitalRead(STATUSLEDPIN));
delay(150);
}
}
Serial.println("[SYSTEM] Navigation ready. Commencing maze exploration...\n");
delay(1500);
}
// -----------------------------------------------------------------------------
// ARDUINO MAIN LOOP (LEFT-HAND RULE WALL FOLLOWING)
// -----------------------------------------------------------------------------
void loop() {
// Read distance telemetry
readSensors();
// LEFT-HAND RULE DECISION TREE:
// 1. Is there an opening to the Left?
if (distLeft > DISTWALLDETECT_MM) {
Serial.println("[ACTION] Opening detected on Left -> Turning Left 90 deg");
turnLeft90();
driveForward(SPEED_CRUISE);
delay(300);
}
// 2. Is path straight ahead clear?
else if (distFront > DISTFRONTBLOCKED_MM) {
Serial.println("[ACTION] Ahead clear -> Driving forward");
driveForward(SPEED_CRUISE);
}
// 3. Can we turn Right?
else if (distRight > DISTWALLDETECT_MM) {
Serial.println("[ACTION] Blocked ahead & left -> Turning Right 90 deg");
turnRight90();
driveForward(SPEED_CRUISE);
delay(300);
}
// 4. Dead end! (Walls ahead, left, and right)
else {
Serial.println("[ACTION] Dead End encountered! Executing 180 deg U-turn");
stopMotors();
delay(100);
turnU180();
}
delay(60); // Control loop interval
}
``
Build an Autonomous Maze Solving Robot Rover with ESP32-S3 & VL53L0X ToF Sensors Firmware & Schematics Vault
Download verified Arduino C++ firmware, pinout table, and BOM for Build an Autonomous Maze Solving Robot Rover with ESP32-S3 & VL53L0X ToF Sensors.
Free Tutorial vs. Project Vault: The tutorial and educational theory above are 100% free. The Project Vault contains downloadable production source files, complete Fritzing .fzz circuits, laser vector files, and 1-on-1 mentor debugging sessions.
#include<Adafruit_Sensor.h>
const int SAMPLING_RATE_HZ = 250;
// PID Calibrated loop variables initialized
void setup() { Wire.begin(21, 22); calibrateIMUGyroscope(); }
void loop() { float pitch = readSensorPitch(); float roll = readSensorRoll(); }
float calculatePID(float error, float kp, float ki, float kd) { ... }
void transmitTelemetryPackage(uint8_t *packet, size_t length) { ... }
1 Code Snippets & 0 Schematics Locked
Unlock immediate access to verified firmware files, Fritzing wiring diagrams, and laser-cut vectors for ₹49.
Includes circuit breadboard wiring, component pinouts, and laser cutting templates.
Screen-share or show your breadboard to M. F. Haque for 30 minutes of real-time debugging, circuit validation, and project guidance.
See What Mentora Makers Are Building
Real video walk-throughs, breadboard tests, and flight demonstrations submitted by students & parents.
Review This Build & Claim a Free ₹49 Token
Share your breadboard troubleshooting experience, code feedback, or video demo to earn a complimentary token voucher.
Have a Reward Voucher?
Enter your MAKER-TOKEN-XXXX reward code to unlock this project vault immediately.
Earn ₹50 Per Friend You Refer
Get your custom referral link. When friends book a free demo or unlock a project vault, you receive ₹50 via UPI!
Why does readdressing fail or only one VL53L0X sensor responds?
Root Cause: XSHUT initialization delay. After setting an XSHUT pin HIGH, you must insert a delay(10) to allow the internal sensor voltage regulator and EEPROM to boot before issuing the setAddress() I2C command.
Why does the TB6612FNG motor driver fail to turn the motors?
Root Cause 1: The STBY (Standby) pin is left floating or grounded. The TB6612FNG requires the STBY pin to be pulled HIGH (3.3V or 5V) to enable the motor output MOSFETs. Root Cause 2: Power separation. VM connects to motor battery (7.4V), and VCC connects to 3.3V/5V microcontroller logic. Connect both Grounds together.
Why does motor task timing stutter on FreeRTOS?
Root Cause: Task starvation. If both the motor PID control and Wi-Fi stack run on Core 0, the Wi-Fi modem interrupt pre-empts motor PWM calculations. Fix: Pin the motor navigation loop to Core 1 using xTaskCreatePinnedToCore().
Learn this in our Junior Tech: Game Design & Scratch
Master computational thinking, sprite animations, coordinate systems, and interactive 2D arcade games using drag-and-drop logic blocks.