Introduction: Adaptive Field Robot

Have you ever dreamed to design a robot able to overcome obstacles? Then launch that robot in the space with a SpaceX rocket? And finally explore a new planet and collect incredible datas that will change the future of Humanity?

Then this 'Instructables' is for you.

Well, maybe you won't save humanity at the end of this project BUT you will have a two wheel drive Adapting field Robot, which is pretty sweet.

The project happened in the context of the Bruface programme. Bruface is English-taught Masters programmes in Engineering launched by the ULB and the VUB (Belgian universities). It was asked to design a robot with a functionality. Ideas were given, but we thaught designing our own concept was more fun!

Here are the brains behind the hard work :

Marin ADIL






  • DC motor JGA25-370 : 12 volt, torque 2000 g/cm X2 (link)
  • DC motor RS PRO : 12 volt, torque : 8000 g/cm X2 (link)
  • 3D printed wheel parts X4 (CAD files provided)
  • 3D printed motor support X2
  • 3D printed gears X4
  • Laser cutted Robot support in wood (mdf files provided)
  • Arduino UNO X1
  • Ultrasonic sensor HC-SR04 X1
  • Batteries : AA 1.5 Volts X16
  • Battery holder X4
  • Slip Rings : 12 mm of diameter X2
  • Step Down DSN2596 X1
  • Drivers L298N X2
  • LED X1
  • Male-Male wires

  • Female-Female wires

  • Breadboard for tets X1

  • Protoboard to solder X1
  • Wires

Please note that these choices are a result of time and budget constraints (3 months and 200€). Other choices can be made at your own discretion.

Step 1: General Idea of Wheel Transformation

The concept comes from a team of researchers of the National Taiwan University. The principle is shown schematically on the picture above.

The wheel therefore has two types of movement.

  • Firstly a rotational movement, to allow the robot to move forward. This movement will be controlled by a motor that will be called "motion motor".
  • Then the wheel has a deployment movement which will be provided by a motor that will be called "wheel motor".

The wheel opens when there is a difference in speed between the central pinion and the wheel rack. It is therefore necessary to have a zero speed difference when the wheels should not open and a non-zero speed difference when the wheel should open. This is why, as the reader will see later, the wheel motor will be fixed in the axis of the wheel and will therefore rotate on itself at the same speed as the wheel.

image source :

Step 2: Pre Study

First of all, as one can see on the above shopping list, 2 different DC motors were chosen : why ? Well, the wheel's deployment system is realized with a motor inside the wheel system, so one needs 1 motor for each wheel. This will be explained in more details further. But what about the 2 others ? These 2 are responsible of the robot motion. The main mechanical properties of motors are the rotating speed in RPM and the provided torque in Since the speed of the robot is not the point of interest here, we won't discuss about it. To know how powerful the motors have to be, some computations has to be enlighten. The following assumptions were made :

  • The mass of the robot won't exceed 2 kg
  • The wheel's radius is 7 cm

With that, one can compute the 'to-overcome' torque (see the representation with the Figure above), knowing the robot's weight is (10m/s²)*(2kg) = 20 N : T = 20N*(7cm) = 1,4N = 14,2 This value has to be the sum of the 2 motors of the robot so the torque to be produced by 1 motion motor is 7,1 That's why we looked for DC Motors, which can be easily found with those performances.

Also, if needed, here's the formula to find the rotating speed of the motor in RPM, from a desired robot's speed in m/s : RPM = (60*Desired speed)/(2*pi*Radius)

Step 3: Electronic Design

This section will explain the electronic design of the robot. The design is pretty simple since there are four DC motors and one ultrasonic sensor to control. That's it! For the DC motors, we used H-Bridges L298N Drivers and an Arduino Uno. The utrasonic sensor is supplied and controlled by the Arduino. Sixteen 1.5V AA batteries are used to supply all the components which are in series thanks to battery holders. A DSN2596 Step Down is used to convert the 12V supply to 9Vin order tpower properly the Arduino Uno. Finally, the assembly of the electronic circuit was done using a protoboard and soldering skills.

1. Arduino Uno

The Arduino Uno is an open-source microcontroller board based on the Microchip ATmega328P microcontroller and developed by The board is equipped with sets of digital and analog input/output (I/O) pins. Here it is used to control the DC motors and the utrasonic sensor. The step down DSN2596 converts the 12V from the power supply to 9V in order to properly supply the Arduino. The choice of an Arduino Uno as a microcontroller is simple : it's cheap, it has enough pins and Arduino has a very large community which make it easy to debug problems.

2. DC motors

In our robot, we use 2 DC motors for the displacement and 2 others for the deployment of the wheels. Each motor is controlled using a H-Bridge L298N Driver and the Arduino. Each Driver can control two DC motors. That's why need two of them. As explained earlier, the H-Bridge Driver allows to control speed and rotation direction of the motors.

The Drivers communicate 5V logical signals with the microcontroller (Arduino) via digital pins 'IN1' to 'IN4' (see Figure of detailed design of the L298N).Those digital pins control the direction of rotation of the motor : IN1 and IN2 are for one motor 1, IN3 and IN4 for motor 2. Setting them to HIGH or LOW will change change the direction of rotation.

Pins ENA and ENB are PWM pins (Pulse Width Modulation). They are connected to PWM pins of the Arduino. Those pins are coded on 16 bits which means that their value will vary between 0-255. Setting ENA/ENB to 0 will stop the motors and setting them to 255 will run them at their full speed.

The Drivers accept +5 to +35V for the motors supply. 12V are required in our situation. Logical communication is done using +5 to +7V signals. 5V will be used.

3. Ultrasonic sensor

The ultrasonic sensor has 4 pins. Vcc, GND, Trig and Echo (see Figure of the ultrasonic sensor). Here's how it works. The emitter of an ultrasonic sensor triggers a set of ultrasonic waves in a straight line. Those waves are reflected by the obstacle. Echos are captured by the receiver of the sensor. By computing the time taken for the wave to get back to the receiver and knowing the speed of the sound, it is possible to compute the distance to the obstacle.

Vcc and GND are connected respectively to the +5V and GND of the protoboard.

Pins 'Trig' and 'Echo' are connected to digital pins of the Arduino since they have to be HIGH or LOW. The time taken for the wave to get back to the receiver is given by the duration of pin 'Echo' being in the HIGH sate.

4. Batteries

As explained earlier, the group chose a power supply consisting of sixteen 1.5V AA batteries which are easy to work with. They have the advantage to be easily replaceable. A battery holder connects 4 AA batteries in series. Two holders produce 12V together. We add an extra 12V supply to ensure the good supply for every components. Indeed, it has been observed that 5V logical signals were not well fed with only one set of 12V. In other words, the intensity of the current was not high enough. That's the reason two sets of 12V connected in parallel are used.

To connect two holders in series, the negative wire of one of them is connected to the positive wire of the other. The two remaining wires are connected to the protoboard from which components will connect their inputs/outputs. One wire is connected to the ground and the other to a switch in order to power the robot ON or OFF.

5. Step Down

The LM2596 step down converts DC-DC voltage. In this project, it is used to convert 12V to 9V. The step down comes with a high-precision potentiometer, capable of driving a load up to 3A. The input of the step down is the 12V on the protoboard. The 9V output (calibrated with the potentiometer) will be connected to the protoboard. From there, a wire will go to the 'Vin' pin of the Arduino wich accepts voltages between 7-12V.

6. Protoboard

The protoboard basically connects everything together. The majority of the connections made on the protoboard have been explained. Some rows of the protoboard are set to the same potential. It has been chosen to use them for the GND. GND pins of the components will be connected to those rows.

Connections between components are made via the protobaord. For example, the logical pin 'IN1' from 'Displacement Motor 1' has to be connected to the digital pin '2' from the Arduino. The two wires related to those pins will be soldered together on the protoboard.

In the same way, if a component requires a 5V power supply, it will get it from the protoboard.

7. PCB

In order to have a clear idea of the electric circuit, designing a Printed Circuit Board (PCB) can be very helpful. In this project, we designed the circuit to have a better understanding of the electrical connections. No printing were requiered since the circuit is simple. As said before, a protoboard and soldering skills did the work. The PCB layout can be found in the images.

Step 4: Programming

To turn the assembly of all these electronic and mechanical parts to a robot able to adapt its wheels to the type of ground, a little programming is required.

But before any line code, let’s understand how the robot works exactly. For that purpose, a flow chart is an excellent first step. Please keep an eyes on it while reading the following. So the robot starts to move as soon as it is turned on. The sensor works all the time while the robot move to detect the type of ground. In fact little explanation on how we use the sensor to detect the type on ground is needed. A ultrasonic sensor is able to detect any obstacle in front of it, so in front of the robot. But in the idea that the robot move on, the sensor will be hit in the face by the obstacle, which is not wished. It’s is a horizontal detection of what happen in front. So what about a vertical detection of the ground by implement a lantern. In this case, an obstacle is detected when there is a change of height.

Thanks to the sensor the robot know if Yes or No the ground are plate. After that, the robots have to compare this data with the one containing the state of the wheels to evaluate if it have the corresponding one (deployed or close). We use the memory EEPROM. It’s an arduino memory space that programmers can use to store long-term information that is non-volatile (the information persists after the power is turned off). So Yes or No, the wheels correspond to the ground type. If Yes the robot return to move and reverify the type of ground. To create loop between the checks of the ground and wheels type, in stable situation. If not the wheels configuration need to be changed. So the robot stop and close or deploy the wheels, once more to return to move, without forget to update the data of the wheels state in memory.

The diagram state is anoter way to see all the same information. It just highlight the turn on-off botum. Note the same loop ( around C ) as above-mentioned when nothing special occurs.

Now we know a little more about the way of working of the robot. We can begin to code. Or maybe not yet. Let’s first thinks about all the particular situation that can be met to not forget to take into account any dimension of the code. In fact the purpose to use a data containing the configuration of the wheels (let’s call this variable memory) is to be able to know how the wheels are when turn on the robot after turning it off regardless the wheels configuration. More practically, for exemple, we want the robot to be able to turn on with wheels deployed on plate ground and know that it have to close them.

In fact this particular case reveals a big issue. Indeed, when the wheels are deployed and the robot is on a flat ground, the sensor will lifted up and lifted down periodically because of the shape of the wheels. That means that the sensor will still measure a difference of height even though the robot is on a flat field. Finally it was not a big issue to solve. The group observed the periodic movement of the sensor and simply imposes that the difference of height must be higher than the periodic one to conclude that we are on gravel ground. So the gravel will must present quiet big difference of height. ( let see figure ).
In the code it is impleted using the couple ( Interval, Tolerance ). Interval contain the interval of time to discret the problem so synomym of precision. Tolerance contain the maximun difference of height that the sensor can see when on plate ground the wheels are deployed. This need to be determine by test.

To do all that we need to use a timer (unsigned long currentMillis = millis(); ) and determine a interval while the sensor harvest data to do average over this interval. After that this average is use to chek the type of groupe with respect of the tolerance. Chek the type of ground, the wheels one ect; need to be done one time at each time interval. To allows to do that, all the inscrution of the flow chart is done in a big loop if :

if ((unsigned long)(currentMillis - previousMillis) >= interval) {

The inner code of this loop respect exactly the flow chart logic process by using some loop if. So we need to define function : move_(), stop_(), deployment() and reployment().

These for function is called to ensur the workflow. They all govern the motor meaning by using the instruction : analogWrite(pin, value).

To be clearer overall,

Before de loop(), the parameter are initialised ( interval, tolerance, Speed_Deploy, time_deployement....), all the connexion between the motor and sensor are declared. The state of the pin are set in setup() ( high or low).
After that in the infinite loop of the arduino, the timer is launch, the move_() function is called for the first time and some line of code to harvest the data from the sensor is done. Then come the mean big loop which begin by doing a average of the harvested sensor data.

Step 5: Technical Drawing for 3D Printing

We have printed 5 different types of pieces whose technical drawings are shown above (in millimeter). The pressure angle for all gears is always 14.5° and the module is always 1.5. When necessary, the number of teeth is indicated in parentheses.

Boxe : This part will be used as a support for the different movements of the wheel. As well its deployment as its rotation. It is important that the internal diameter of the "boxe" (in our case 27 mm diameter) allows the insertion of the wheel motors ( the one in charge of the deployment pinion). When printing one of the two "boxe", it is necessary to apply a mirror effect on the piece.

Pinion: This piece will allow the opening and closing of the wheel. An important element to take into account is the dimensions of the central hole, it must be adapted to the shaft of the wheel motors. ( teeth: 12 )

Halfwheel : These are simply the front and adaptable wheels of the robot.

Back: these are the gears that are used to transmit torque from the motion motor to "boxe". They are screwed to the back of the "boxe". ( teeth : 28 )

Motor gear: This is the gear linked to the motion motor. It connects the motor to "Back" and thus finally to the "boxe". ( teeth : 23 )

The assembly of the different pieces is quite simple. As shown in the figure above, "back" is screwed to the back of "boxe". "Back" is in contact with "Motor gear" which is fixed to the shaft of the motion motor. The pinion is fixed to the shaft of the wheel motors, at the front of "boxe" in the space provided for this purpose.

Step 6: Design and Assembly

All those functionalities have to be mounted on a structure, which is solid, resistant to the types of field and light (reminder : mass < 2kg (see step 2.)). The final design can be seen above. The structure has been made with laser-cut MDF planks, previously designed in Solidworks. One big advantage of the laser cutting machine is to draw on the .dxf files, the path for the screws and nuts (M3). This allows to produce a fixation system that is reliable, solid and robust. Different planks were designed : 2 side ones in MDF 4mm to welcome the box-wheels, 2 inside ones in MDF 3mm to fix the motion motor and to ensure the box wheels to be actuated by them and a top one, to seal the vertical vibrations and to fix the lantern for the HCSR04 sensor. The CAD and dxf files are given.

The electronic parts come and sit in between the spaces made by the side planks. To fix the arduino and the drivers, we used M3 screws and nuts, as everywhere in the design (expect the motor screws which are M2.5 and the back wheel screw which is M6). To fix the "PCB" , we used a velcro tape, which allows us to move it wherever we want, and thus to reconfigure the other components' position if wanted. The position sensor is fixed in the lantern by cutting the transmitter and receiver's heads diameter in the lantern while laser-cutting it. One just needs to push it through the holes and it's done. Velcro tape has also been added on the sensor to ensure its stability.

The back wheels are un-actuated. Their special shape is to avoid the slipping on the flat ground and stuttering motion on the gravels. To reduce other slipping problems, we add a layer of rubber on each wheel (the 3D printed ones also). One could use a heat pistol to allow a good fixation by melting the rubber on the 3D printed wheels if needed.

Step 7: Experiments

The first tests were to ensure that our detecting method was working. Further improvements were made after those tests .

Then we tried to make the robot go forward : as mentioned in the step 5 : Design and assembly, the 3D wheels were slipping so we glued rubber bands on the external surfaces.

Step 8: Final Test

After calibrating the power that each motor has to receive, the team reached it's final goal : a Robot that adapts it's wheels in function of the field it is on. Indeed, the video shows that the Robot moves at a constant speed, detects a change in field, develops its wheels, moves again with the adapted wheels deployed, understands that it is again on a flat ground, so it re-adapt its wheels to normal wheels.

We are happy !

Step 9: Further Improvements and Learning Assessment

Further improvements can be made :

  • A mechanical part can be implemented in the 3D printed wheel to avoid the fall of the halfwheel. This can be done in the box design or in the halfwheel itself.
  • Other motors lighter than those we used are available and well suited for our design. This would really lower the robot's mass because those motors weigh 800g each, which is higher than the mass of the the whole MDF structure.
  • The detection system is good but one can use a more accurate way of differentiating the 2 types of fields. The "plot" of the sensors outputs shows that there's a lot of information that can to be used.
  • The robot could avoid obstacles with additional sensors and a good algorithm. This means that a regulation should be implemented allowing the robot to adjust its wheels speed to move properly.

As a team we learned about :

  • Developing a design from scratch, with only a video as path. This helps us to train our problem-solving and creative skills.
  • The fact that creating a "simple" robot is not simple at all. It required to make use of all our previously learned knowledge.
  • Time management : the quicker the test, the better. So many problems popped out close to the deadline, we should try to anticipate them for the next time