arduino_car/car.ino

154 lines
2.9 KiB
Arduino
Raw Permalink Normal View History

2018-11-21 14:40:08 +03:00
#include <hcsr04.h>
2018-11-21 16:13:53 +03:00
/* constans */
/* ******** */
2018-11-21 14:09:32 +03:00
/* Define your pins here */
/* Wheels */
2018-11-22 11:51:20 +03:00
#define left_wheel_1 0
#define left_wheel_2 1
#define right_wheel_1 2
#define right_wheel_2 3
2018-11-21 11:53:17 +03:00
2018-11-21 14:09:32 +03:00
/* Ultrasonic sensor */
2018-11-22 11:51:20 +03:00
#define sensor_echo 9
#define sensor_trigger 10
2018-11-21 14:09:32 +03:00
2018-11-21 16:13:53 +03:00
/* Other constans */
2018-11-22 11:51:20 +03:00
#define move_delay 500
#define turn_delay 500
2018-11-21 16:13:53 +03:00
/* disconnected pin for random seed */
2018-11-22 11:51:20 +03:00
#define analog_disconnected 0
2018-11-21 16:13:53 +03:00
/* Initialize sensor class */
2018-11-21 14:40:08 +03:00
HCSR04 hcsr04(sensor_trigger, sensor_echo, 20, 4000);
2018-11-21 14:09:32 +03:00
/* Array bellow contains all the wheels */
int wheels[] = {left_wheel_1, left_wheel_2, right_wheel_1, right_wheel_2};
2018-11-21 11:53:17 +03:00
void setup() {
/* Setup pins */
2018-11-21 14:09:32 +03:00
/* wheels */
2018-11-21 16:13:53 +03:00
for (int i = 0; i < sizeof(wheels) - 1; i++) {
2018-11-21 14:09:32 +03:00
pinMode(wheels[i], OUTPUT);
2018-11-21 11:53:17 +03:00
}
2018-11-21 14:09:32 +03:00
/* Starts serial communication */
Serial.begin(9600);
2018-11-21 16:13:53 +03:00
Serial.println("Bot is ready");
2018-11-21 11:53:17 +03:00
}
/* Wheel actions */
2018-11-21 16:13:53 +03:00
/* ************* */
2018-11-21 11:53:17 +03:00
/* Forward */
void move_forward_wheel_left() {
digitalWrite(left_wheel_1, HIGH);
digitalWrite(left_wheel_2, LOW);
}
void move_forward_wheel_right() {
digitalWrite(right_wheel_1, HIGH);
digitalWrite(right_wheel_2, LOW);
}
void move_forward() {
move_forward_wheel_left();
move_forward_wheel_right();
2018-11-21 16:13:53 +03:00
delay(move_delay);
2018-11-21 11:53:17 +03:00
}
/* Backward */
void move_backward_wheel_left() {
digitalWrite(left_wheel_1, LOW);
digitalWrite(left_wheel_2, HIGH);
}
void move_backward_wheel_right() {
digitalWrite(right_wheel_1, LOW);
digitalWrite(right_wheel_2, HIGH);
}
void move_backward() {
move_backward_wheel_left();
move_backward_wheel_right();
2018-11-21 16:13:53 +03:00
delay(move_delay);
2018-11-21 11:53:17 +03:00
}
/* Stops */
void stop_all() {
2018-11-21 16:13:53 +03:00
for (int i = 0; sizeof(wheels) - 1; i++) {
2018-11-21 14:09:32 +03:00
digitalWrite(wheels[i], LOW);
2018-11-21 11:53:17 +03:00
}
}
void stop_left() {
digitalWrite(left_wheel_1, LOW);
digitalWrite(left_wheel_2, LOW);
}
void stop_right() {
digitalWrite(right_wheel_1, LOW);
digitalWrite(right_wheel_2, LOW);
}
2018-11-21 12:29:53 +03:00
/* Turns */
2018-11-21 11:53:17 +03:00
void turn_left(int delayMS) {
stop_left();
move_forward_wheel_right();
delay(delayMS);
}
void turn_right(int delayMS) {
stop_right();
move_forward_wheel_left();
delay(delayMS);
}
2018-11-21 16:13:53 +03:00
void turn_left_or_right(int delayMS) {
randomSeed(analogRead(analog_disconnected));
int rand_number = random(1, 99);
if (rand_number > 50) {
turn_right(delayMS);
} else {
turn_left(delayMS);
}
}
2018-11-21 14:09:32 +03:00
/* Ultrasonic sensor actions */
2018-11-21 16:13:53 +03:00
/* ************************* */
2018-11-21 14:09:32 +03:00
/* get_distance -- returns distance to an object in centimeters */
int get_distance() {
2018-11-21 16:13:53 +03:00
int mm = hcsr04.distanceInMillimeters();
2018-11-21 14:40:08 +03:00
if (mm > 0) {
return mm / 10;
}
return 0;
2018-11-21 14:09:32 +03:00
}
2018-11-21 11:53:17 +03:00
/* Main code */
2018-11-21 16:13:53 +03:00
/* ********* */
/* The idea:
If robot see an object in distance less than 25cm,
he must do the following actions:
* stop the wheels
2018-11-22 11:51:20 +03:00
* turn on wheels to go backward
2018-11-21 16:13:53 +03:00
* stop wheels
* turn left or right
* then go forward
*/
2018-11-21 11:53:17 +03:00
void loop() {
2018-11-21 14:09:32 +03:00
if (get_distance() > 25) {
move_forward();
} else {
2018-11-21 16:13:53 +03:00
stop_all();
2018-11-21 14:09:32 +03:00
move_backward();
2018-11-21 16:13:53 +03:00
turn_left_or_right(turn_delay);
2018-11-21 14:09:32 +03:00
}
2018-11-21 11:53:17 +03:00
}