Jump to main content

Build a Miniature Self-Driving Car

1
2
3
4
5
47 reviews

Abstract

How do self-driving cars stay on the road? How do vehicles with autonomous or driver-assist features automatically brake, steer around obstacles, or perform tasks like adaptive cruise control? Experiment with these behaviors and more in this science project as you build and program your own autonomous Arduino robot.

Summary

Areas of Science
Difficulty
 
Time Required
Short (2-5 days)
Prerequisites
Previous experience with circuits and Arduino is recommended.
Material Availability
A kit is available with the robot chassis and circuit parts. Arduino must be purchased separately. See materials list for details.
Cost
High ($100 - $150)
Safety
No issues
Credits
Ben Finio, PhD, Science Buddies
Valuable input provided by Analog Devices employees.
Build a Self-Driving Arduino Car

Objective

Build a self-driving Arduino robot that can safely navigate a model roadway.

Introduction

Autonomous, self-driving, or driverless cars have the potential to reduce traffic fatalities and traffic congestion worldwide. A fully autonomous car would be capable of driving in all situations, without any input from a human driver. While cars have not yet achieved this level of autonomy, many new cars have a variety of driver-assist and safety features, such as automatic braking, lane departure warnings, and adaptive cruise control. Some have more autonomy and are able to self-drive in specific situations, such as on highways with well-marked lanes. Tesla is an example of a car company known for making cars with some autonomous driving features (Figure 1).

White Tesla sedan parked on a gravel road.
Figure 1. A Tesla, a type of car with some autonomous driving features.

Just as humans use our senses (sight, sound, touch, etc.) to perceive the world around us when driving, autonomous cars use a variety of electronic sensors to monitor the roadway and surroundings. Cameras work with complex computer vision systems to process visual information, while radar or ultrasonic sensors measure the distance between the car and other objects.

Based on information from these sensors, the car decides how to react—without input from the driver. For example, if a sensor detects that the car in front of it is rapidly slowing down, the car may automatically apply the brakes in order to slow down and avoid a collision. Or if the sensors detect that the car is driving out of its lane and off the side of the road, the car may automatically correct its steering to stay in the lane.

In this project you will build and program your own driverless vehicle using an Arduino, a popular microcontroller board used by many hobbyists and roboticists. You will connect sensors to the Arduino and program the vehicle to react to their input.

This is an advanced project, and prior experience with an Arduino is recommended. If you need help getting started, check out the references in the Bibliography.

Since autonomous vehicles are a rapidly evolving technology, you may want to do your own background research about recent developments and the current state of the art for driverless cars.

Terms and Concepts

Questions

Bibliography

General electronics references:

References for using an Arduino:

Datasheet for the L293D H-bridge motor driver:

Datasheet for the IR sensor:

The datasheet for the PING))) ultrasonic distance sensor is available from the Downloads section on this page:

Materials and Equipment Buy Kit

Recommended Project Supplies

Get the right supplies — selected and tested to work with this project. Arduino not included.

View Kit

Notes about using an Arduino:

Supplies to build your robot:

Materials to build a road for your robot, such as:

Disclaimer: Science Buddies participates in affiliate programs with Home Science Tools, Amazon.com, Carolina Biological, and Jameco Electronics. Proceeds from the affiliate programs help support Science Buddies, a 501(c)(3) public charity, and keep our resources free for everyone. Our top priority is student learning. If you have any comments (positive or negative) related to purchases you've made for science projects from recommendations on our site, please let us know. Write to us at scibuddy@sciencebuddies.org.

Experimental Procedure

Note: This engineering project is best described by the engineering design process, as opposed to the scientific method. You might want to ask your teacher whether it's acceptable to follow the engineering design process for your project before you begin. You can learn more about the engineering design process in the Science Buddies Engineering Design Process Guide.
  1. Build an arena or road for your self-driving car.

    The one shown in Figure 2 is just a suggestion. You can use other materials and other shapes for the road, including different combinations of curves, intersections, etc. In general, you should make sure your road has at least one lane that is wide enough for your robot and is clearly marked by lane lines on both sides. Make sure the lines are much lighter than the road surface (e.g., white and yellow tape on a black road).

    A two-lane, oval track made of black paper with lane lines and a crosswalk. Toys represent obstacles.
    Figure 2. An example road to test your self-driving car, made from posterboard, cardstock, and tape.
  2. Assemble your Bluebot chassis.

    Follow the instructions in this video; however, instead of mounting the 4xAA battery pack on top of the robot, mount it on the lower plate. Then mount your Arduino next to the breadboard on the top plate. This will give you easier access to the circuit when connecting it to the Arduino.

    How to Assemble Your BlueBot Chassis
  3. Assemble your circuit.

    If you plan to use the example code provided by Science Buddies, assemble the circuit as shown in Figures 3 and 4. The Arduino pins used in this diagram match the ones used in our example code (see Step 4). If you try to use our example code without matching this wiring diagram exactly, the code will not work properly.

    Take your time and carefully double-check all of your wiring. This is a complicated circuit with a lot of connections. You should connect the batteries last to avoid the risk of creating short circuits while you work.

    Note: It is important to make sure all components in the circuit have a common ground, but you must be very careful not to short different positive voltages together (e.g., 5 V from the Arduino and 6 V from the 4xAA battery pack).

    Following is one suggested order in which you can build the circuit, but you do not need to do it in this order.

    Note: Connections are made with male-male jumper wires unless otherwise indicated.

    1. Connect the left and right ground buses on the breadboard. Do not connect the two power buses. You will use them for different voltages.
    2. Connect the Arduino's GND pin to the breadboard's ground bus.
    3. Connect the Arduino's 5 V pin to the breadboard's right-side power bus.
    4. Pins on the L293D H-bridge are numbered 1–16, counterclockwise from the top left. Connect them as follows:
      1. Pin 1 to Arduino pin 10
      2. Pin 2 to Arduino pin 3
      3. Pin 3 to the right motor's negative wire
      4. Pin 4 to ground
      5. Pin 5 to ground
      6. Pin 6 to the right motor's positive wire
      7. Pin 7 to Arduino pin 2
      8. Pin 8 to the left-side power bus (which will be connected to 6V later)
      9. Pin 9 to Arduino pin 9
      10. Pin 10 to Arduino pin 4
      11. Pin 11 to the left motor's positive wire
      12. Pin 12 to ground
      13. Pin 13 to ground
      14. Pin 14 to left motor's negative wire
      15. Pin 15 to Arduino pin 5
      16. Pin 16 to 5 V
    5. Connect the PING))) ultrasonic sensor using male-female jumper wires.

      Note: If you are using the HC-SR04 ultrasonic sensor, you will need to modify your circuit and code slightly, as shown in our HC-SR04 ultrasonic sensor tutorial video.

      1. GND pin to ground
      2. 5V5 V pin to 5 V
      3. SIG pin to Arduino pin 7
    6. Looking at the bottom (with the pins facing you), orient the infrared (IR) sensor so the small notch in one corner is to the lower right (see Figure 5 for recommended color coding). Connect the left sensor as follows:
      1. Pin 1 to 5 V through a 220 Ω resistor
      2. Pin 2 to ground
      3. Pin 3 to ground
      4. Pin 4 to 5 V through a 10 kΩ resistor and to Arduino analog input pin A0
    7. Connect the right IR sensor as follows:
      1. Pin 1 to 5 V through a 220 Ω resistor
      2. Pin 2 to ground
      3. Pin 3 to ground
      4. Pin 4 to 5 V through a 10 Ω resistor and to Arduino analog input pin A1
    8. Connect an LED with a 220 Ω current-limiting resistor between Arduino pin 8 and ground.
    9. Connect an LED with a 220 Ω current-limiting resistor between Arduino pin 6 and ground.
    10. Finally, connect the 4xAA battery pack to your circuit.
      1. Connect the negative wire to the breadboard's ground bus.
      2. Instead of connecting the positive wire directly to the left-side power, connect it to a switch on the breadboard first, then connect the switch to the left-side power bus (assuming you previously connected the right-side power bus to 5 V; remember not to short the two voltages together). This will allow you to easily turn the battery pack on and off.
    A diagram shows the connections among the Arduino, breadboard, battery pack, switch, and motors.
    Figure 3. A breadboard view of the circuit. Click here to download a larger version of the breadboard view.


    Circuit diagram for connecting the H bridge, ultrasonic sensor, infrared sensors, and LEDs to the Arduino to build a self-driving robot car
    Figure 4. A schematic view of the circuit. Click here to download a larger version of the schematic view.


     Male-female jumper wires connected to the IR sensor's pins
    Figure 5. Male-female jumper wires connected to the IR sensor's pins. You will see a small diagonal notch on one corner of the sensor. With the pins facing you and this notch in the lower right, the pins are numbered 1, 2, 3, 4 counter-clockwise starting from the upper left. Connect blue, black, green, and red wires to pins 1, 2, 3 and 4 respectively.

  4. Mount the infrared and ultrasonic sensors on your robot using craft sticks and tape.

    The ultrasonic sensor should be on the front of the robot, facing forward, at an appropriate height to detect obstacles.

    The infrared sensors should be on the left and right of the robot, toward the front, facing downward, a few millimeters from the ground. See Figure 6.

    A self-driving robot car built with an Arduino stops when its sensors indicate an obstacle.
    Figure 6. Sensors mounted to the front of the robot with tape and craft sticks.

  5. Download and review the starter code for your autonomous vehicle.

    Carefully read through the commented code. This code has commands to control the robot's motors and to take readings from the sensors, but it does not have an algorithm to tell the robot how to drive based on the sensor readings. Coming up with that part is your job!

  6. Calibrate your sensors.

    The infrared sensors can be affected by ambient light conditions in the room and their distance from the ground, so they must be calibrated before use.

    1. Make sure the switch for your 4xAA battery pack is off.
    2. Upload the starter code to your Arduino and leave the Arduino plugged into the USB cable.
    3. Open the serial monitor (Tools → Serial Monitor).
    4. Wave your hand back and forth in front of the ultrasonic sensor. The "ultrasonic sensor (cm)" value should change.
    5. Place your robot on the road and move it around so one of the sensors goes over one of the lines you made with tape. The reading for that IR sensor should change. Compare the reading to the value when the sensor is over the dark road. Experiment with the sensors to determine a good "threshold" value (i.e., when the reading is below that value, you know the sensor detects a line). You can set the thresholds for the left and right sensors separately in the code using the leftIRthreshold and rightIRthreshold variables. The thresholds might be different, especially if the sensors are not the same distance from the ground.
  7. Develop an algorithm for your robot.

    You can sketch this algorithm using a flowchart (Figure 7) or "pseudocode" (Figure 8)—conceptual code where you do not worry about the exact syntax or use of proper commands. Figures 7 and 8 show example code for a robot that drives in a clockwise loop (i.e., makes a continuous right turn) without driving off the left edge of the road. (This very simple code would not work for making a left turn or other more complex behaviors like stopping at intersections or avoiding obstacles.)

    Here are some ideas for other things you can try:

    1. Make your robot automatically stay in a lane (avoid driving over the line on either the left or right side).
    2. Make the robot automatically stop at a crosswalk (when both sensors detect a line).
    3. Make the robot automatically stop if there is an obstacle less than a certain distance in front of it.
    4. Make the robot stop at an intersection, make a 90 degree turn, and then keep driving.
    5. Make the robot back up and turn around when it encounters an obstacle that does not move out of the way after a certain amount of time.
    6. Advanced: implement "adaptive cruise control" by making the robot automatically try to stay a fixed distance behind an object in front of it.
    A flowchart representing an algorithm for a robot to drive in a clockwise circle while avoiding driving over a line on the left edge of the road.

    From the starting point, the chart asks 'Does the left IR sensor detect a line?' If yes, the vehicle should turn right. If no, it should drive forward. In either case, return to 'Does the left IR sensor detect a line?'


    Figure 7. A very simple flowchart representing an algorithm for a robot to drive in a clockwise circle without crossing a line.


    Start program
    Loop:
    Does the left IR sensor detect a line?
    If yes, turn right
    If not, drive forward

    Figure 8. Pseudocode for the flowchart shown in Figure 7.
  8. Test your algorithm.

    Edit the starter code to implement your algorithm. When you are ready, upload the code to your Arduino and place the robot on your road. This time you will need to disconnect the USB cable and power your Arduino with the 9 V battery instead. When you are ready, turn on the power switch to the 4xAA battery so the motors can start spinning. Watch your robot go!

  9. Troubleshoot your robot's behavior.

    Watch your robot closely and analyze its behavior. Does it match what you expect based on your algorithm? It might not work perfectly on the first try, and that is okay. Now it is time to debug!

    Common issues and troubleshooting steps include, but are not limited to, the following:

    1. The robot fails to detect a line. Double-check your IR sensor readings and adjust the threshold variables if needed. Also try to make sure your road is as flat as possible, as the distance between the sensor and the ground will affect the reading.
    2. The robot detects the line, but overshoots turns. Try adjusting the turnspeed1 and turnspeed2 variables to change how fast the robot turns. You can also adjust the straightspeed variable to change how fast the robot drives straight.
    3. The robot does not drive straight when both motor speed variables are the same. This can happen if one motor has slightly more friction than the other. You can compensate for this by changing the motor speeds so they are not both the exact same value.
  10. Make changes to your code based on your observations and try again.

    Keep iterating and improving your code until you get the performance you want out of your self-driving Arduino car.

Troubleshooting

For troubleshooting tips, please read our FAQ: Build a Miniature Self-Driving Car.

icon scientific method

Ask an Expert

Do you have specific questions about your science project? Our team of volunteer scientists can help. Our Experts won't do the work for you, but they will make suggestions, offer guidance, and help you troubleshoot.

Variations

  • Add features to your car using other sensors in your Bluebot kit, like the bump sensors or the light sensors. See this bump sensor project and this light sensor project for ideas.
  • You can use your IR sensors to prevent your robot from driving off a cliff! See this Arduino project for ideas.
  • Purchase an Arduino-compatible color sensor and use it to detect traffic lights or traffic signs on your model roadway.

Frequently Asked Questions (FAQ)

If you are having trouble with this project, please read the FAQ below. You may find the answer to your question.
Q: My robot's motors do not spin at all. What is wrong?
A: Very carefully double-check all the wiring. It may help to have someone else look at the connections. A single misplaced wire can prevent the entire circuit from working.
Q: My robot's wheels spin the wrong way (e.g., it drives backward when it should drive forward). What is wrong?
A: If a motor is spinning in the wrong direction, reverse the red and black wires for the motor.
Q: My robot does not consistently detect lines. What is wrong?
A: Make sure your roadway is as flat as possible. The IR sensors are affected by ambient light and their distance from the ground. Bumps in the road will affect the reading.

Careers

If you like this project, you might enjoy exploring these related careers:

Career Profile
Cars are an important part of our daily lives. We depend on them to perform everyday tasks—getting to and from school and work, sports practice, grocery shopping, and various errands—and also to keep us safe while doing so. Our cars can keep us cool or warm while we drive them, and they even help us find our way. The automobile is made up of complicated braking, steering, and electrical systems, in addition to the engine and drive train. All of these systems require a tremendous… Read more
Career Profile
Have you watched "The Transformers" cartoon series or seen the "Transformers" movies? Both shows are about how good and evil robots fight each other and the humans who get in the middle. Many TV shows and movies show robots and humans interacting with each other. While this is, at present, fantasy, in real life robots play a helpful role. Robots do jobs that can be dangerous for humans. For example, some robots defuse landmines in war-stricken countries; others work in harsh environments like… Read more
Career Profile
Just as a potter forms clay, or a steel worker molds molten steel, electrical and electronics engineers gather and shape electricity and use it to make products that transmit power or transmit information. Electrical and electronics engineers may specialize in one of the millions of products that make or use electricity, like cell phones, electric motors, microwaves, medical instruments, airline navigation system, or handheld games. Read more
Career Profile
Are you interested in developing cool video game software for computers? Would you like to learn how to make software run faster and more reliably on different kinds of computers and operating systems? Do you like to apply your computer science skills to solve problems? If so, then you might be interested in the career of a computer software engineer. Read more

Contact Us

If you have purchased a kit for this project from Science Buddies, we are pleased to answer any question not addressed by the FAQ above.

In your email, please follow these instructions:
  1. What is your Science Buddies kit order number?
  2. Please describe how you need help as thoroughly as possible:

    Examples

    Good Question I'm trying to do Experimental Procedure step #5, "Scrape the insulation from the wire. . ." How do I know when I've scraped enough?
    Good Question I'm at Experimental Procedure step #7, "Move the magnet back and forth . . ." and the LED is not lighting up.
    Bad Question I don't understand the instructions. Help!
    Good Question I am purchasing my materials. Can I substitute a 1N34 diode for the 1N25 diode called for in the material list?
    Bad Question Can I use a different part?

Contact Us

News Feed on This Topic

 
, ,

Cite This Page

General citation information is provided here. Be sure to check the formatting, including capitalization, for the method you are using and update your citation, as needed.

MLA Style

Finio, Ben. "Build a Miniature Self-Driving Car." Science Buddies, 10 Dec. 2022, https://www.sciencebuddies.org/science-fair-projects/project-ideas/Robotics_p042/robotics/arduino-self-driving-car?from=Blog. Accessed 28 May 2023.

APA Style

Finio, B. (2022, December 10). Build a Miniature Self-Driving Car. Retrieved from https://www.sciencebuddies.org/science-fair-projects/project-ideas/Robotics_p042/robotics/arduino-self-driving-car?from=Blog


Last edit date: 2022-12-10
Top
Free science fair projects.