About: Software Architect & Robotics Engineer

After building a number of indoor robots, I decided to build an outdoor robot capable of traveling through rough terrain. I call it “M1-Rover.”

M1-Robot motor is easily drive four DC motors driving with Arduino so it’s perfect for any robotics project, I thought this would make a fantastic heart for a more powerful robots, So I designed the off-road 4-wheel-drive M1 from the scratch. It’s not just a RC car, it can be programmed to be self-driving follow a set of instructions or even be controlled from a remote computer, and it can be used via game controllers and custom joysticks like a remote control car. Another method to control the robot through a windows-based applications like a rescuer-bot or spy-bot to creep up on your friends, and it can also be controlled autonomously using self-driving code. The robotic possibilities are endless! It’s extremely robust which make it great foundation for all kinds of projects, for M1-Robot I have loads of code examples and even openCV code you can download, these are great regardless of whether you are “just getting started” or you are trying to make your robot doing really cool things. It developed in a low cost material and expendable wheeled-robot. This state-of-the art robot has the potential to be used in rescue, government, and civilian purposes.

Hardware licensed CERN
Software licensed Other
Project's documentation licensed CC BY-SA

Step 1: Designing

Designing your own product or prototype is loads of fun, but it become more complicated when you decided to make it in a live size scale. So I choose Google Sketch-up 2017 as powerful and easy designing tool and it allows you export the blueprints of your model to a laser cut machine or even 3D printer.

I spent the first three weeks designing and constructing the hull of the robot.

As for materials, I was given a sheet of 3mm Wooden board.

The not-so-nice final wiring of the robot, which, because of time constraints, consisted of stuffing the entire roadkill into the hull.

I thought an apt name for my robot was M1Rover. Because I’m planning to develop a versions of it in a sequence names like M2, M3, etc. It designed in a Kit, all you have to do is to assembly it with some screws.

* Update:The model design is available to download.

Step 2: Components and Features

⦁ Up to three hours runtime!

⦁ Designed for the Arduino Uno, Mega and Nano.

⦁ 5V-9V DC Operating Voltage

⦁ A 3mm thick wooden chassis

⦁ 68mm diameter wheels L298N Dual H-Bridge Motor/Stepper

⦁ 9v batteries to power up the DC motors

⦁ 9v batteries to power up the Arduino

⦁ LED lights 7 for rear and front

⦁ HC-06 Bluetooth module

⦁ Arduino sensor shield v5.0

⦁ Ultrasonic transducer HC SR04

Step 3: The Motor Controller

H-Bridge's are typically used in controlling motors speed and direction, but can be used for other projects such as driving the brightness of certain lighting projects such as high powered LED arrays.

⦁ Make sure you have all of your grounds tied together; Arduino, Power source, and the Motor controller.

⦁ The PWM Pins are unnecessary if you do not want to control PWM features.

Step 4: Assembling Chassis

Chassis has been cut using laser cutter in a few parts, and as I mentioned before the model was created in a kit easy to assembly, so all you have to do is to follow the instructions below.

Considering the design was also important and when it comes to RC cars it should contains of front and rear lights. At the front of M1-Robot I put 4 white LEDs each one is connected to 220 ohm resistor, and in the rear I put 2 red LEDs with 220 ohm resistor for each. These LEDs can be controlled by the same application

Step 5: Circuits

Circuit was little bit tricky because when you decided to control many electronic parts at the same time you should take care about the sequence of each part.

⦁ Arduino Sensor Shield 5.0

⦁ Arduino Uno R3 L298N Dual H-Bridge Motor/Stepper

⦁ 9v battery to power up the DC motors

⦁ LED lights 7 (2 rear) and (4 front)

⦁ HC-06 Bluetooth module

⦁ Ultrasonic transducer HC SR04

⦁ Servo motor 9g

⦁ Active Buzzer

⦁ 4 DC motors with wheels

Step 6: Software

I considered amount of things while writing the code of M1-Robot, and with GUI software you are able to get more information about robot status.

Actually the codes are separated in two parts:

⦁ Arduino Code

The Arduino code is compatible with any kind of controllers because all the electronic parts are programmed to work through serial port orders, so you may use Bluetooth module sender/receiver, PC, Cell phone.

⦁ C# windows application (screenshot attached)

The Basic Code for the starter kit , can be controlled by Mobile or Laptop via Bluetooth :

int frontled = 3; //led int rearled = 4; int outPin1 = 5; //motor1 int outPin2 = 6; //motor1 int outPin4 = 11; //motor2 int outPin3 = 12; //motor2 char bt = 0; //BT int buzzerPin = 2;

const int pingPin = 9; // Trigger Pin of Ultrasonic Sensor const int echoPin = 8; // Echo Pin of Ultrasonic Sensor /*------------------------------------------------------------------------------*/ void setup() { Serial.begin(9600); pinMode(outPin1,OUTPUT); pinMode(outPin2,OUTPUT); pinMode(outPin3,OUTPUT); pinMode(outPin4,OUTPUT); pinMode(frontled,OUTPUT); pinMode (buzzerPin, OUTPUT); } void loop() { if (Serial.available() > 0) { bt =; digitalWrite(frontled, 1);

long duration, inches, cm; pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(10); digitalWrite(pingPin, LOW); pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); inches = microsecondsToInches(duration); cm = microsecondsToCentimeters(duration);

if (cm > 10 ){ // distance to stop

/*________________________________________________________________________*/ if(bt == 'F') //move forwards { digitalWrite(outPin1,HIGH); digitalWrite(outPin2,LOW); digitalWrite(outPin3,HIGH); digitalWrite(outPin4,LOW); } else if (bt == 'B') //move backwards { digitalWrite(outPin1,LOW); digitalWrite(outPin2,HIGH); digitalWrite(outPin3,LOW); digitalWrite(outPin4,HIGH); } else if (bt == 'S') //stop!! { digitalWrite(outPin1,LOW); digitalWrite(outPin2,LOW); digitalWrite(outPin3,LOW); digitalWrite(outPin4,LOW); } else if (bt == 'R') //right { digitalWrite(outPin1,HIGH); digitalWrite(outPin2,LOW); digitalWrite(outPin3,LOW); digitalWrite(outPin4,LOW); } else if (bt == 'L') //left { digitalWrite(outPin1,LOW); digitalWrite(outPin2,LOW); digitalWrite(outPin3,HIGH); digitalWrite(outPin4,LOW); } else if (bt == 'I') //forward right { digitalWrite(outPin1,HIGH); digitalWrite(outPin2,LOW); digitalWrite(outPin3,LOW); digitalWrite(outPin4,HIGH); } else if (bt == 'G') //forward left { digitalWrite(outPin1,LOW); digitalWrite(outPin2,HIGH); digitalWrite(outPin3,HIGH); digitalWrite(outPin4,LOW); } } else { digitalWrite (buzzerPin, HIGH); delay (500); digitalWrite (buzzerPin, LOW); delay (500); } } }

long microsecondsToInches(long microseconds) { return microseconds / 74 / 2; }

long microsecondsToCentimeters(long microseconds) { return microseconds / 29 / 2; }



This M1rover package entails basic components while the top plate allows for easy mounting of any sensing, manipulation or computer hardware. Simply attach sensors to the onboard and Rover power supplies to get started.


The Explorer package enables basic indoor and outdoor autonomous functionality, and instate of IP camera I used a mobile phone cam connected to the internet via IP address.


The Explorer package enables basic GPS tracking of course while the vehicle is outdoor, it’s very cool when you watching the coordinates paths in the real-time.


Interacting with the world with a robot arm and a 2 finger 50mm Gripper

Important Tip:

Not all servos have a full 180 degrees of rotation. Many do not.
You can write a test to determine where the mechanical limits are. Use servo.writeMicroseconds instead of servo.write I like this better because it lets you use 1000-2000 as the base range. And many servos will support outside that range, from 600 to 2400.

So, try different values and see where you get the buzz that tells you you have reached the limit. Then only stay within those limits when you write. You can set those limits when you use servo.attach(pin, min, max)

edit: I should say that if you want, you can set the min and max microseconds in the attach, then simply use servo.write. It uses map() to change the 0-180 degrees value you pass into a microseconds value.

It soon will be if you keep it at the end stop - it is pulling high current and heating up rapidly - its all too easy to "cook" a servo by loading it this way for any length of time.

Find the true range of movement and make sure the code doesn't try to push it past the end stops, the constrain() Arduino function is useful for this:

servo.write (constrain (angle, 10, 160)) ; // constrain the angle in the range 10..160