Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
This project is a small Arduino rover controlled by Bluetooth commands from a phone, with an optional second phone acting as a network camera. Bluetooth carries the driving commands; it does not carry the video. The original project calls it a “spy robot,” but the described build is a hobby rover—not an autonomous or professional surveillance system.
How the robot works
The controller phone sends a command to a Bluetooth module. The module passes it to the Arduino Uno, which sets the direction inputs on an L298N motor driver. The driver switches power to the motors. For video, a separate phone mounted on the rover runs an IP-camera app and streams over a reachable network to the controller phone.
Controller phone ── Bluetooth commands ── HC-05 ── Arduino Uno ── L298N ── motors
Camera phone ─────── Wi-Fi/network video stream ───────────────────► controller phone
The original Techatronic project, published August 14, 2021, describes four geared motors and wheels. A later Hackster adaptation describes two driven wheels and a caster, with different wiring and code. These are different implementations: do not combine one version’s pin map with the other version’s sketch. Techatronic’s original project and the Hackster adaptation document the respective variants.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Choose one build layout
Recommended for a first build: two-wheel differential drive
Use an Arduino Uno, HC-05 or compatible HC-06, L298N module, two geared DC motors and wheels, a caster wheel, chassis, motor battery pack, jumper wires, and a phone for control. Each driven wheel is controlled as one side; turning is done by running the two sides in different directions or stopping one side. This is a simplified recommendation, not the exact four-motor layout in the original Techatronic article.
#1 Best Overall
- Mars Exploration Made Easy: GalaxyRVR, compatible with Arduino Uno R3, recreates the experience of real Mars rovers. Inspired by NASA’s rocker-bogie suspension system, it easily travels over rocks, sand, and grass—delivering true off-road capability beyond ordinary robot cars. Powered by solar charging and equipped with real-time FPV, smart obstacle avoidance, and remote control, it brings an immersive Martian adventure right to you. Start with easy controls, then advance to Arduino programming or Scratch block coding. Perfect for students, educators, and DIY enthusiasts
- Tough and Terrain-Ready: GalaxyRVR, crafted from sturdy aluminum alloy and featuring a rocker-bogie system like real Mars rovers, is designed for outdoor exploration and effortlessly tackles diverse terrains such as sand, rocks, grass, and mud pits for seamless adventure
- Solar-Powered and FPV: GalaxyRVR comes equipped with a solar panel, enabling solar charging. Its ESP32 CAM, paired with an app, offers remote control and a real-time FPV experience, bringing exploration to your fingertips
- Intelligent Obstacle Avoidance and Enhanced Lighting: GalaxyRVR is fitted with ultrasonic and infrared sensors, ensuring effective obstacle avoidance. Enhanced by RGB light strips and ESP32 LED lighting, it not only brings vibrancy but also confidently illuminates its path, making exploration in the dark possible
- Beginner-Friendly with Comprehensive Support: The GalaxyRVR kit is designed for easy assembly, allowing users to get started quickly without frustration. It comes with detailed online tutorials and step-by-step video lessons, ensuring a smooth learning curve. Coupled with an active community forum and responsive technical support, even novices can confidently bring this project to life
Original four-motor layout
The original parts list calls for an Uno, HC-05, L298N, four geared motors and wheels, jumper wires, battery, USB cable, power switch, chassis or platform, and two phones. Four motors can add traction, but the motors on each side need to be paired consistently and the chassis must be mechanically aligned.
Before selecting a battery or driver, check the motor voltage and stall current against the motor driver and battery ratings. The source pages mention a 9 V battery in one list and a 7.4 V two-cell 18650 arrangement in the other; these are not interchangeable recommendations. Do not power drive motors from the Arduino 5 V pin. Use a suitable motor supply, connect Arduino ground to the driver ground, observe polarity, and verify the L298N board’s enable-pin and jumper arrangement. Use protected cells and a suitable holder or pack.
Rank #2
- Powerful ESP-32 Board: Unlock the world of Internet of Things (IoT) and advanced electronics with the heart of this kit: the ESP-32 board. It features a powerful dual-core processor, integrated Wi-Fi and Bluetooth 4.2, making it perfect for building connected, smart devices that communicate with your phone or the cloud. It's fully compatible with the Arduino IDE for easy programming.
- Super Starter Kit: This kit contains over 35 different modules and electronic components, including sensors, displays, motors, and input devices. From LEDs and buttons to an OLED screen, servo motor, and keypad, you have everything needed to explore a vast range of projects in one box.
- Step by Step Online Tutorial: Jump right in with our detailed, beginner-friendly tutorial. Access 30+ projects with complete code, clear circuit diagrams, and step-by-step instructions. Learn the fundamentals of electronics, coding, and how to utilize the ESP-32's unique capabilities without any prior experience.
- Hands-on Learning for All Skill Levels: Perfect for students, makers, engineers, and hobbyists. Start with basic circuits and coding, then progress to intermediate and advanced IoT applications. Build practical projects like weather stations, smart home controllers, remote-controlled devices, and interactive gadgets. The skills you learn are the foundation for real-world innovation.
- Quality & Great Support: Elegoo is committed to quality. We provide a clear, detailed tutorial guide, refined code, and a well-organized component kit. All modules are carefully selected for reliability and ease of use. Our dedicated technical support team and active online community are ready to help you succeed in your learning journey.
Use a single, consistent wiring and command plan
The wiring and example below use the Hackster-style two-wheel pin assignment and character commands, but move Bluetooth to SoftwareSerial pins so the Uno’s USB serial connection remains available for uploading and debugging. The Hackster page itself depicts Bluetooth on hardware serial pins 0 and 1; the alternate serial wiring here is an implementation adjustment, not that page’s exact wiring.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minute| Arduino Uno | Connect to |
|---|---|
| D5 | L298N ENA |
| D4 | L298N IN1 |
| D3 | L298N IN2 |
| D8 | L298N IN3 |
| D7 | L298N IN4 |
| D6 | L298N ENB |
| D10 (SoftwareSerial RX) | HC-05 TX |
| D11 (SoftwareSerial TX) | HC-05 RX, through level reduction if required by the specific breakout |
| GND | HC-05 GND and L298N GND; common ground |
| Appropriate supply | HC-05 VCC and Arduino logic power according to the particular breakout and board documentation |
| Motor battery | L298N motor-supply input, observing board and motor ratings |
Connect the left-side motor or paired motors to one L298N output channel and the right-side motor or paired motors to the other. The exact output terminal labels depend on the L298N board; use its markings and documentation, rather than inferring connections from ambiguous prose in the original article. Verify the voltage requirements of your HC-05 breakout. Some boards accept a higher supply at VCC because they include regulation, but the module’s RX logic input may still need a reduced Arduino TX signal.
Rank #3
- 35+ Guided Electronics Projects: Progress from LEDs and buttons to RFID access, real-time clocks, motion and distance sensing, environmental monitoring, motor control and interactive displays for STEM learning, coding clubs and maker projects
- More I/O and Memory for Larger Builds: The MEGA 2560 R3 provides 54 digital I/O pins, including 15 PWM outputs, 16 analog inputs, 4 hardware serial ports and 256 KB flash for projects that combine more sensors, controls and displays
- 200+ Components for Prototyping: Includes LCD1602, RC522 RFID, RTC, DHT11, HC-SR501 PIR, ultrasonic and water-level sensors, GY-521, MAX7219, keypad, joystick, rotary encoder, relay, SG90 servo, stepper motor, DC motor, breadboard and more
- Learn, Modify and Create: Follow 35+ guided lessons with example code, then adjust sensor thresholds, timing, display text, motor behavior and control logic to turn structured exercises into access systems, monitors, alarms and interactive projects
- Organized for Repeatable Learning: Pre-soldered modules, a solderless breadboard, storage case and small-parts box reduce setup time and keep sensors, LEDs, ICs, wires and other components easy to find between projects
The two project versions use different command contracts. The original Techatronic sketch reads numeric values 1–5 over SoftwareSerial at 9,600 baud: 1 forward, 2 backward, 3 left, 4 right, 5 stop. The Hackster sketch reads the characters F, B, L, R, and S using Serial.begin(9600). A controller app must send the exact kind of value the sketch expects; an ASCII digit character is not automatically the same as a raw numeric byte.
Upload a safer character-command sketch
This example implements the two-wheel wiring above. It starts stopped, ignores line-ending characters, sets a fixed PWM duty command, and stops if no recognized command arrives for one second. That timeout is an added failsafe, not behavior demonstrated by the source sketches. PWM is open-loop: it does not measure wheel speed or guarantee that both motors turn equally.
Rank #4
- SMART IOT & MULTI-MODE CONTROL: Experience the future of robotics with the OSOYOO V2.1. This advanced IoT Robot Car supports WiFi, Bluetooth, and IR remote control. Use our custom Android/iOS App for "Imitation Driving" or gravity-sensing control. It’s not just a toy; it’s a gateway to the Internet of Things (IoT) for aspiring engineers .
- COMPLETE SETS OF MODULES – Bundle Includes basic board for Arduino, OSOYOO Uart WIFI shiled V1.3 for UNO, HC Bluetooth, line tracking module, ultrasonic sensor, OSOYOO Model X motor drive board (an improved L298N module) , micro servo motor, IR receiver, IR Remote, IR obstacle sensor, Battery and charger are also included, almost everything needed to run the car in the package .
- COMPLETE STEM LEARNING PLATFORM: Perfect for STEM projects for teens, this kit covers electronics, programming, and robotics. Fully compatible with UNO R3 ecosystem, it’s an ideal resource for Homeschool STEM Curriculum or Science Fair Projects for Middle School. Learn to code while building something real !
- EASY ASSEMBLY WITH MODEL X DRIVER: Say goodbye to messy wiring! Our exclusive Model X Motor Driver Module simplifies connections, making it the best robotics kit for beginners. The package includes a step-by-step DIY robotics kit with tutorial (online videos and PDF), ensuring a smooth building experience for ages over 14 and adults .
- VERSATILE MODES & BATTLE BOTS READY: Unleash creativity with multiple pre-programmed modes: Auto-go, Line Tracking, Obstacle Avoidance, and Object Following. Want more excitement? Purchase two kits to create "Battle Bots" for interactive play. It’s the ultimate smart robot car kit for classroom collaboration or home fun .
#include <SoftwareSerial.h>
// Arduino RX, TX: HC-05 TX to D10; HC-05 RX from D11.
SoftwareSerial bluetooth(10, 11);
const byte enA = 5;
const byte in1 = 4;
const byte in2 = 3;
const byte in3 = 8;
const byte in4 = 7;
const byte enB = 6;
const byte motorSpeed = 200; // PWM command, 0–255; tune for your motors
const unsigned long commandTimeout = 1000;
unsigned long lastCommandAt = 0;
void stopMotors() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enA, 0);
analogWrite(enB, 0);
}
void setDrive(byte left1, byte left2, byte right1, byte right2) {
digitalWrite(in1, left1);
digitalWrite(in2, left2);
digitalWrite(in3, right1);
digitalWrite(in4, right2);
analogWrite(enA, motorSpeed);
analogWrite(enB, motorSpeed);
}
void setup() {
pinMode(enA, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(enB, OUTPUT);
stopMotors();
bluetooth.begin(9600);
lastCommandAt = millis();
}
void loop() {
while (bluetooth.available() > 0) {
char command = bluetooth.read();
if (command == '\r' || command == '\n') continue;
lastCommandAt = millis();
switch (command) {
case 'F': setDrive(HIGH, LOW, HIGH, LOW); break;
case 'B': setDrive(LOW, HIGH, LOW, HIGH); break;
case 'L': setDrive(LOW, HIGH, HIGH, LOW); break;
case 'R': setDrive(HIGH, LOW, LOW, HIGH); break;
case 'S': stopMotors(); break;
default: stopMotors(); break;
}
}
if (millis() - lastCommandAt > commandTimeout) {
stopMotors();
}
}
In the Arduino IDE, select the Uno-compatible board and the correct port, then upload with the HC-05 connected to D10 and D11 as shown. With Bluetooth on pins 0 and 1 instead, disconnect the module during USB upload and reconnect it afterward; those pins share the Uno’s hardware serial connection used by USB. The timeout stops the robot after commands cease, so an app that sends only one command per button press will cause it to stop after the timeout unless it repeats commands while the button is held.
Pair the phone and test movement
- Power the rover and enable Bluetooth on the controller phone.
- Pair the phone with the module in the phone’s Bluetooth settings. Module behavior and pairing details vary by breakout and firmware.
- Open a Bluetooth serial-control app that can connect to the paired module and send individual characters.
- Set the app’s controls to send uppercase
F,B,L,R, andS, matching the sketch. The original article names a custom “SPY Control Robot” app; the Hackster version mentions general Bluetooth controller apps. App availability and interfaces can change, so verify the app sends the required bytes. - Raise the wheels off the ground and test each direction. Send stop, then test on the floor only after the wheel directions are correct.
The original pin map uses ENA 10, IN1 9, IN2 8, IN3 7, IN4 6, ENB 5, with HC-05 TX/RX on D2/D3 via SoftwareSerial. Its control app sends numeric values 1–5. Do not use that map with the character sketch above without changing the code and Bluetooth wiring to match.
Best Value
- Learn Arduino & Robotics from Scratch - Perfect for STEM beginners and adults who want to explore robotics, electronics, and coding. This hands-on kit provides an integrated learning experience with Arduino programming and robot assembly.
- Multi-Functional Smart Car - Equipped with OSOYOO WiFi Shield, Bluetooth module, infrared remote, and line tracking sensors — enabling multiple control modes such as auto-driving, infrared control, Bluetooth control, and WiFi app control.
- Easy & Reliable Assembly - The upgraded OSOYOO Model-X Motor Driver includes improved wiring sockets for easy connections, reducing setup errors and ensuring stable operation — ideal for both beginners and educators.
- Control via Mobile App - Operate your robot through the OSOYOO app for Android and iOS. Enjoy advanced features like imitation driving and real-time WiFi control for an engaging learning experience.
- Step-by-Step Learning Guide Included - Comes with detailed online tutorials, circuit diagrams, sample codes, and assembly videos — helping you progress from a simple car to a fully functional smart robot, even with no prior programming experience.
Add the phone camera
Mount a second smartphone on the rover, open IP Webcam on that phone, and start its server. The app displays a network address for that session; the original article gives 192.168.0.105 as an example, not a permanent address. Enter the currently displayed address in the compatible viewing/control app on the controller phone.
- The camera phone and controller phone generally need to be on the same reachable network. A router may block communication between wireless clients.
- Check the address each session because it can change. A local-network address does not by itself make the stream reachable from outside that network.
- Video delay and reliability depend on the phones, stream settings, network quality, and congestion.
- Movement commands and video use separate links. A failed video stream does not necessarily stop Bluetooth driving, and working controls do not prove the camera stream is reachable.
Calibrate the rover before driving
- Lift the chassis so the wheels can rotate freely, then test forward, reverse, left, right, and stop.
- If one wheel spins opposite to the intended direction, swap that motor’s two wires at its output channel or invert its direction states in the sketch.
- If forward makes the rover spin, check which side is reversed and correct that side before changing other settings.
- If left and right are reversed, swap the corresponding command behavior in code or correct the app’s button mapping.
- Adjust
motorSpeedto a value that starts both motors reliably. Different motors, friction, and battery condition can make the rover veer even with equal PWM commands. - Check that the battery voltage does not collapse when both motors start, and secure the camera phone only after drive tests succeed.
Troubleshoot by symptom
| Symptom | Checks |
|---|---|
| Bluetooth pairs, but no movement | Confirm the app sends the expected uppercase character; baud rate is 9,600; the sketch uses the same serial pins as the wiring; HC-05 TX goes to Arduino RX and vice versa; grounds are common; motor battery reaches the driver; enable pins are active; motors use the correct output pairs. |
| Sketch will not upload | If Bluetooth is connected on Uno pins 0/1, remove those connections during upload. With SoftwareSerial on D10/D11, check board, port, cable, and pin wiring. |
| Arduino resets or motors stutter | Check battery condition and voltage under load, motor supply connections, loose wiring, and whether logic and motor power have been confused. Do not route motor current through the Arduino 5 V pin. |
| Forward command spins or veers | Test each side with the wheels raised. Reverse one motor’s polarity or direction logic as needed; inspect alignment, friction, and unequal motor response. |
| Camera image does not appear | Start the camera server, use its current displayed address, verify both phones can reach each other over the network, check camera permissions and the viewer’s expected stream format, and check for wireless-client isolation. |
A particularly common source of confusion is mixing the original numeric-byte protocol and pin map with the Hackster character protocol and a different pin map. Match the controller app, sketch, serial connection, and motor wiring as one complete version.
What the “spy robot” name does—and does not—mean
The build is useful for learning serial communication and motor control, looking under furniture, or experimenting with a mobile camera. The project descriptions do not establish obstacle avoidance, autonomous navigation, encrypted video, night vision, long-range operation, or dependable outdoor use. Treat the camera as a camera: operate it only where you have permission, and avoid recording people or private spaces without consent.
For a later redesign, an ultrasonic sensor could add basic obstacle detection, a pan-tilt mount could aim the camera, and a better matched motor driver could improve electrical efficiency. An ESP32 can replace the Uno-and-Bluetooth arrangement in a new design, but it requires different wiring, code, and power planning; it is not a plug-in substitute.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

