Introduction: TfCD - Self-driving Breadboard
In this Instructable, we will demonstrate one of the technologies that are often used in autonomous vehicles: ultrasonic obstacle detection.
Within self-driving cars, this technology is used for recognizing obstacles over a short-distance (<4m), for instance during parking and lane-switching.
For this exploration, we aim to build a breadboard that (1) drives, (2) recognizes obstacles and (3) makes decisions for its route accordingly.
Specifically, we will build a two wheeled breadboard, with an ultrasonic sensor up front, that drives forward when no obstacle is detected, turns when almost hitting an object, and reverses when a collision seems unavoidable.
Step 1: Getting the Components
The following components were used for this instruction:
- (A) 830 pin breadboard (1pc)
A smaller one may suffice, but make sure to get a good quality one because the pins on the ultrasonic sensor are a bit fragile.
- (B) Arduino UNO (1pc)
Works great with the Motor Shield, does not need to be an original version.
(C) Adafruit Motor Shield v2.3 (1pc)
The motor shield simplifies the process of connecting motors to an Arduino. Compared to tinkering with resistances and transistors, it is much safer for the Arduino board, especially if you are a beginner. The Adafruit Motor Shield comes with separate pins, that need to be soldered onto the chip.
(D) HC-SR04 Ultrasonic Sensor (1pc)
This is a four pin sensor. It works by sending out a short ultrasonic pulse through the left 'speaker' unit and listening (while measuring the time) when it comes back through the right 'receiver' unit.
(E) DAGU DG01D Mini DC motor with 48:1 gearbox (2pc)
When using a Motor Shield, any 5V DC motor will work, however, the gearbox in this version is beneficial, as it makes the wheels turn nice and slow.
(F) Plastic wheels (2pc)
Ideally, try to buy wheels that are directly compatible with the motor of your choice.
Also needed: a computer with the latest Arduino software, a soldering iron, soldering tin, a small power bank, some wires.
Step 2: Setting Up the Circuit
Connecting the ultrasonic sensor
The ultrasonic sensor consists of four pins, called: Vcc, Trig, Echo and Gnd (Ground).
Trig and Echo are connected to the Motor Shield in respectively Digital Pin number 10 and 9. (Other digital pins are suitable as well, as long as the appropriate coding is applied.)
Vcc and Gnd are connected to 5V and Gnd on the shield.
Connecting the DC motors
The DC motors have a black and a red wire each. These wires should be connected to the motor ports, in this example M1 and M2.
Step 3: Writing the Code
Loading the library
First, it is necessary to download the right library in order to use the Adafruit Motor Shield v2.3.
In this ZIP-file, there is a folder, which can be placed in the Arduino installation folder, in our case:
C:\Program files (x86)\Arduino\Libraries
And make sure to name it Adafruit_MotorShield (restart your Arduino software afterwards).
Downloading the code example
Our code example 'Selfdriving_Breadboard.ino' is available for download.
There are several variables to tweak, most importantly there are the distances (in centimeters) when something happens. In the current code, the breadboard was programmed to reverse when an object is closer than 10 centimeters, to rotate when distance is between 10 and 20 centimeters, and to drive straight when no object is detected in 20 centimeters.
Step 4: Soldering the Pins
The soldering process consists of four steps.
- (A) Alignment of the pins
Make sure to put all the pins that come with the Motor Shield in place. This can be easily done by placing the shield on top of the Arduino board.
- (B) Soldering the pins
Do not rush this step, it is very important that pins do not connect to each other after soldering. Solder the outside pins first, to make sure the pins are not skewed.
- (C) Positioning the wires
When using the Motor Shield, the wires have to be soldered to their appropriate pins as well. It works best to stick the wires in the Motor Shield from the top, and solder them at the bottom of the Motor Shield. As a recap: for this tutorial we solder wires to digital pins 9 and 10, and to 5V and Gnd pins.
- (D) Soldering the wires
Now it is time to solder the wires, one by one. Make sure they are well positioned, maybe ask a friend to hold them while you solder it.
Step 5: Assembly of the Self-driving Breadboard
After soldering the components and testing the circuit, it is time for final assembly.
In this tutorial, the breadboard is not only used for its main functionality, but also as the backbone of the whole device. The final assembly instructions consist of four steps.
- (A) Connecting the wires
Make sure the cables are in the correct place (check Step 3 for the right way to connect everything), do not forget the two DC motors. Keep in mind where you wish to attach the components.
- (B) Connecting the sensor
Plug the sensor into the breadboard and make sure it is connected properly.
- (C) Placing the shield
Place the Motor Shield onto the Arduino UNO board. Now would be a great time to test the system before final assembly.
- (D) Fixing the components
In this step, take some double-sided tape, and fix the DC motors, the Arduino and a powerbank in place. In this case, the Arduino is placed upside down below the breadboard.
Step 6: You Did It!
By now you will probably be as excited as we were to take your creation for a test-run.
Have fun, try to tweak some parameters so that it works best for you.
Thank you for following our instruction, and let us know in case of any question!
Validation of the technology
The ultrasonic sensor that is used in this case, was supposed to have a range of 4 meters. However, the sensor loses accuracy with a larger distance than 1.5 meters.
Also, the sensor appears to experience some noise. By using the serial monitor in order to validate the distance accuracy, peaks of around 3000(mm) were visible while the object in front was only centimeters away. This is likely due to the fact that the input of the sensor is having a delay in its information, so the output is distorted once in a while.