Enables autonomous driving of a 2 or 4 wheel car controlled by an Arduino.
Available as RobotCarBlueDisplay example of the Arduino library PWMMotorControl.
Requires the Arduino library BlueDisplay.
- Obstacles avoidance by a HC-SR04 ultrasonic sensor mounted on a SG90 Servo which continuously scans the environment.
- To overcome the drawbacks of ultrasonic sensors, an additional Sharp 430/1080/20150/100550 (GP2Y0A21YK0F) IR or VL53L1X TOF (TimeOfFlight) sensor can be mounted to the servo.
- Manual control implemented by a GUI using a Bluetooth HC-05 Module and the BlueDisplay library.
Just overwrite the function doUserCollisionAvoiding() to test your own skill. You may also overwrite the function fillAndShowForwardDistancesInfo(), if you use your own scanning method.
- Install BlueDisplay library with Tools > Manage Libraries... or Ctrl+Shift+I. Use "BlueDisplay" as filter string.
- Install PWMMotorControl library with Tools > Manage Libraries... or Ctrl+Shift+I. Use "PWMMotorControl" as filter string.
- Open the example RobotCarBlueDisplay, available at File > Examples > Examples from Custom Libraries / PWMMotorControl.
Other examples of PWMMotorControl like SmartCarFollower will also run on this robot car.
Start page | Test page |
---|---|
Sensor drive page | Sensor drive page for mecanum car |
Automatic control page with detected wall at right
- Cyan bars are distances above 1 meter.
- Green bars are distances above double distance of one ride per scan (default 40 cm).
- Red bars are distanced below the distance of one ride per scan (default 20 cm) -> collision during next "scan and ride" cycle if obstacle is ahead.
- Yellow bars are the values between the 2 thresholds (default 20 cm to 40 cm).
- The tiny white bars are the distances computed by the doWallDetection() function. They overlay the green (assumed timeout) values.
- The tiny black bar is the rotation chosen by doCollisionAvoiding() function.
Ultrasonic distance measurement has a problem with walls.
You can only detect a wall if the angle of the wall relative to sensor axis is approximately between 70 and 110 degree.
For other angels the reflected ultrasonic beam cannot reach the receiver which leads to unrealistic great distances.
The implemented wall detection function doWallDetection()
takes samples every 18 degrees and if it gets 2 adjacent short distances below DISTANCE_MAX_FOR_WALL_DETECTION_CM
, it assumes a wall determined by these 2 samples.
The (invalid) values 18 degrees right and left of these samples are then extrapolated by computeNeigbourValue()
.
To customize the software to different car configurations, there are some compile options / macros available.
Modify them by enabling / disabling them, or change the values if applicable.
Compile options for the used PWMMotorControl library like USE_ENCODER_MOTOR_CONTROL
are described here.
Name | Default value | Description |
---|---|---|
CAR_HAS_VIN_VOLTAGE_DIVIDER |
undefined | VIN/11 at A2, e.g. 1 MΩ to VIN, 100 kΩ to ground. Required to show and monitor (for undervoltage) VIN voltage. |
VIN_VOLTAGE_CORRECTION |
undefined or 0.8 for Uno | Voltage to be subtracted from VIN voltage for voltage monitoring. E.g. if there is a series diode between Li-ion and VIN as on the Uno boards, set it to 0.8. |
CAR_HAS_US_DISTANCE_SENSOR |
disabled | A HC-SR04 ultrasonic distance sensor is mounted (default for most China smart cars). |
US_SENSOR_SUPPORTS_1_PIN_MODE |
disabled | Use modified HC-SR04 modules or HY-SRF05 ones. Modify HC-SR04 by connecting 10 kΩ between echo and trigger and then use only trigger pin. |
CAR_HAS_IR_DISTANCE_SENSOR |
disabled | Use Sharp GP2Y0A21YK / 1080 IR distance sensor. |
CAR_HAS_TOF_DISTANCE_SENSOR |
disabled | Use VL53L1X TimeOfFlight distance sensor. |
CAR_HAS_DISTANCE_SERVO |
disabled | Distance sensor is mounted on a pan servo (default for most China smart cars). |
DISTANCE_SERVO_IS_MOUNTED_HEAD_DOWN |
disabled | Distance.h |
CAR_HAS_PAN_SERVO |
disabled | Enables the pan slider for the PanServo at the PAN_SERVO_PIN pin. |
CAR_HAS_TILT_SERVO |
disabled | Enables the tilt slider for the TiltServo at the TILT_SERVO_PIN pin. |
CAR_HAS_CAMERA |
disabled | Enables the Camera button for the CAMERA_SUPPLY_CONTROL_PIN pin. |
CAR_HAS_LASER |
disabled | Enables the Laser button for the LASER_OUT_PIN / LED_BUILTIN pin. |
ENABLE_RTTTL_FOR_CAR |
undefined | Plays melody after initial timeout has reached. Enables the Melody button, which plays a random melody. |
MONITOR_VIN_VOLTAGE |
disabled | Shows VIN voltage and monitors it for undervoltage. VIN/11 at A2, 1 MΩ to VIN, 100 kΩ to ground. |
ENABLE_EEPROM_STORAGE |
disabled | Activates the buttons to store compensation values. Normally they are stored after calibration. |
First, use Sketch > Show Sketch Folder (Ctrl+K).
If you have not yet saved the example as your own sketch, then you are instantly in the right library folder.
Otherwise you have to navigate to the parallel libraries
folder and select the library you want to access.
In both cases the library source and include files are located in the libraries src
directory.
The modification must be renewed for each new library version!
If you are using PlatformIO, you can define the macros in the platformio.ini file with build_flags = -D MACRO_NAME
or build_flags = -D MACRO_NAME=macroValue
.
If you are using Sloeber as your IDE, you can easily define global symbols with Properties > Arduino > CompileOptions.