Arduino UNO R3 X1
Texas Instruments Dual H-Bridge motor drivers L293D X1
DV Motor, 3V~6V X4
Wheel X4
Ultrasonic Sensor HC-SR04 X1
SG90 Micro-servo motor X1
Battery Holder, 18650 x2 X1
Battery, 18650 X2
Switch X1
Wire Red X4, Black X4
//----------------------------SMART_CAR_Project---------------------------------------//
//©hashan_sudeera
#include <Servo.h>
#include <AFMotor.h>
//-----------------------B------------------------------//
char value;
int speedCar = 255;
boolean lightFront = false;
boolean lightBack = false;
boolean S_light = false;
//------------------------O-----------------------------//
int distance;
int Left;
int Right;
int L = 0;
int R = 0;
int L1 = 0;
int R1 = 0;
//----------Defines----------------//
#define Echo A0
#define Trig A1
#define S_motor 10
#define F_LED A4
#define B_LED A5
#define SL_LED A2
#define SR_LED A3
#define spoint 90
//-----------Motors-----------------//
Servo servo;
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
void setup() {
Serial.begin(9600);
pinMode(Trig, OUTPUT); //Trig A1
pinMode(Echo, INPUT); //Echo A0
pinMode(F_LED, OUTPUT); //F_LED A4 pin
pinMode(B_LED, OUTPUT); //B_LED A5 pin
pinMode(SL_LED, OUTPUT); //SL_LED A2 pin
pinMode(SR_LED, OUTPUT); //SR_LED A3 pin
servo.attach(S_motor);
}
void loop() {
//-----------------Change_Mode----------------//
//blutooth_mode();
obstacle_mode();
//voice_control();
}
//---------------------------Blutooth_Mode---------------------------//
void blutooth_mode() {
if (Serial.available() > 0) {
value = Serial.read();
Stop(); //Initialize with motors stopped.
if (lightFront) {
digitalWrite(F_LED, HIGH);
}
if (!lightFront) {
digitalWrite(F_LED, LOW);
}
if (lightBack) {
digitalWrite(B_LED, HIGH);
}
if (!lightBack) {
digitalWrite(B_LED, LOW);
}
if (S_light) {
digitalWrite(SL_LED, HIGH);
digitalWrite(SR_LED, HIGH);
}
if (!S_light) {
digitalWrite(SL_LED, LOW);
digitalWrite(SR_LED, LOW);
}
switch (value) {
case 'F': forward(); break;
case 'B': backward(); break;
case 'L': left(); break;
case 'R': right(); break;
case 'I': forwardRight(); break;
case 'G': forwardLeft(); break;
case 'J': backwardRight(); break;
case 'H': backwardLeft(); break;
case 'S': Stop(); break;
case '0': speedCar = 75; break;
case '1': speedCar = 100; break;
case '2': speedCar = 125; break;
case '3': speedCar = 150; break;
case '4': speedCar = 175; break;
case '5': speedCar = 200; break;
case '6': speedCar = 220; break;
case '7': speedCar = 230; break;
case '8': speedCar = 240; break;
case '9': speedCar = 250; break;
case 'q': speedCar = 255; break;
case 'W': lightFront = true; break;
case 'w': lightFront = false; break;
case 'U': lightBack = true; break;
case 'u': lightBack = false; break;
case 'X': S_light = true; break;
case 'x': S_light = false; break;
}
}
}
//------------------------Obstacle_Mode------------------------------//
void obstacle_mode() {
distance = ultrasonic();
if (distance <= 12) {
Stop();
backward();
delay(100);
Stop();
L = leftsee();
servo.write(spoint);
delay(200);
R = rightsee();
servo.write(spoint);
if (L < R) {
O_right();
delay(200);
Stop();
delay(200);
} else if (L > R) {
O_left();
delay(500);
Stop();
delay(200);
}
} else {
forward();
}
}
//-------------------------Voice_Control-----------------------------//
void voice_control() {
if (Serial.available() > 0) {
value = Serial.read();
Serial.println(value);
if (value == '^') {
forward();
digitalWrite(SL_LED, HIGH);
digitalWrite(SR_LED, HIGH);
} else if (value == '-') {
backward();
} else if (value == '<') {
L = leftsee();
servo.write(spoint);
if (L >= 10) {
O_left();
delay(500);
Stop();
} else if (L < 10) {
Stop();
}
} else if (value == '>') {
R = rightsee();
servo.write(spoint);
if (R >= 10) {
O_right();
delay(500);
Stop();
} else if (R < 10) {
Stop();
}
} else if (value == '*') {
Stop();
}
} else if (value == '!') {
{
digitalWrite(F_LED, HIGH);
}
} else if (value == '@') {
{
digitalWrite(F_LED, LOW);
}
} else if (value == '+') {
{
digitalWrite(B_LED, HIGH);
}
} else if (value == '_') {
{
digitalWrite(B_LED, LOW);
}
}
}
//-------------------------Ultrasonic----------------------------------//
int ultrasonic() {
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(5);
digitalWrite(Trig, LOW);
long t = pulseIn(Echo, HIGH);
long cm = t / 29 / 2;
delay(50);
Serial.println(cm);
return cm;
}
void forward() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
forwardview();
}
void backward() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
digitalWrite(B_LED, HIGH);
}
void left() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
digitalWrite(SL_LED, HIGH);
leftview();
}
void O_left() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
digitalWrite(SL_LED, HIGH);
}
void right() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
digitalWrite(SR_LED, HIGH);
rightview();
}
void O_right() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
digitalWrite(SR_LED, HIGH);
}
void forwardRight() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(RELEASE);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
}
void forwardLeft() {
motor1.run(RELEASE);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor4.setSpeed(speedCar);
}
void backwardRight() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(RELEASE);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor4.setSpeed(speedCar);
digitalWrite(B_LED, HIGH);
}
void backwardLeft() {
motor1.run(BACKWARD);
motor2.run(RELEASE);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
digitalWrite(B_LED, HIGH);
}
void Stop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
}
int rightsee() {
servo.write(20);
delay(500);
Left = ultrasonic();
return Left;
}
int leftsee() {
servo.write(180);
delay(500);
Right = ultrasonic();
return Right;
}
int leftview() {
servo.write(180);
}
int rightview() {
servo.write(20);
}
int forwardview() {
servo.write(spoint);
}
//----------------SMART_CAR_Project-------------------//
#include <Servo.h>
#include <AFMotor.h>
//-----------------------B------------------------------//
char value;
int speedCar = 255;
//------------------------O-----------------------------//
int distance;
int Left;
int Right;
int L = 0;
int R = 0;
int L1 = 0;
int R1 = 0;
//----------Defines----------------//
#define Echo A0
#define Trig A1
#define S_motor 10
#define spoint 90
//-----------Motors-----------------//
Servo servo;
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
void setup() {
Serial.begin(9600);
pinMode(Trig, OUTPUT); //Trig A1
pinMode(Echo, INPUT); //Echo A0
servo.attach(S_motor);
}
void loop() {
//-----------------Change_Mode----------------//
//blutooth_mode();
obstacle_mode();
//voice_control();
}
//---------------------------Blutooth_Mode---------------------------//
void blutooth_mode() {
if (Serial.available() > 0) {
value = Serial.read();
Stop(); //Initialize with motors stopped.
switch (value) {
case 'F': forward(); break;
case 'B': backward(); break;
case 'L': left(); break;
case 'R': right(); break;
case 'I': forwardRight(); break;
case 'G': forwardLeft(); break;
case 'J': backwardRight(); break;
case 'H': backwardLeft(); break;
case 'S': Stop(); break;
case '0': speedCar = 75; break;
case '1': speedCar = 100; break;
case '2': speedCar = 125; break;
case '3': speedCar = 150; break;
case '4': speedCar = 175; break;
case '5': speedCar = 200; break;
case '6': speedCar = 220; break;
case '7': speedCar = 230; break;
case '8': speedCar = 240; break;
case '9': speedCar = 250; break;
case 'q': speedCar = 255; break;
case 'W': lightFront = true; break;
case 'w': lightFront = false; break;
case 'U': lightBack = true; break;
case 'u': lightBack = false; break;
case 'X': S_light = true; break;
case 'x': S_light = false; break;
}
}
}
//------------------------Obstacle_Mode------------------------------//
void obstacle_mode() {
distance = ultrasonic();
if (distance <= 12) {
Stop();
backward();
delay(100);
Stop();
L = leftsee();
servo.write(spoint);
delay(200);
R = rightsee();
servo.write(spoint);
if (L < R) {
O_right();
delay(200);
Stop();
delay(200);
} else if (L > R) {
O_left();
delay(500);
Stop();
delay(200);
}
} else {
forward();
}
}
//-------------------------Voice_Control-----------------------------//
void voice_control() {
if (Serial.available() > 0) {
value = Serial.read();
Serial.println(value);
if (value == '^') {
forward();
} else if (value == '-') {
backward();
} else if (value == '<') {
L = leftsee();
servo.write(spoint);
if (L >= 10) {
O_left();
delay(500);
Stop();
} else if (L < 10) {
Stop();
}
} else if (value == '>') {
R = rightsee();
servo.write(spoint);
if (R >= 10) {
O_right();
delay(500);
Stop();
} else if (R < 10) {
Stop();
}
} else if (value == '*') {
Stop();
}
} else if (value == '!') {
{
digitalWrite(F_LED, HIGH);
}
} else if (value == '@') {
{
digitalWrite(F_LED, LOW);
}
} else if (value == '+') {
{
digitalWrite(B_LED, HIGH);
}
} else if (value == '_') {
{
digitalWrite(B_LED, LOW);
}
}
}
//-------------------------Ultrasonic----------------------------------//
int ultrasonic() {
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(5);
digitalWrite(Trig, LOW);
long t = pulseIn(Echo, HIGH);
long cm = t / 29 / 2;
delay(50);
Serial.println(cm);
return cm;
}
void forward() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
forwardview();
}
void backward() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
}
void left() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
leftview();
}
void O_left() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
}
void right() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
rightview();
}
void O_right() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
motor4.setSpeed(speedCar);
}
void forwardRight() {
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(RELEASE);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
}
void forwardLeft() {
motor1.run(RELEASE);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor4.setSpeed(speedCar);
}
void backwardRight() {
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(RELEASE);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor4.setSpeed(speedCar);
}
void backwardLeft() {
motor1.run(BACKWARD);
motor2.run(RELEASE);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
motor1.setSpeed(speedCar);
motor2.setSpeed(speedCar);
motor3.setSpeed(speedCar);
}
void Stop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
}
int rightsee() {
servo.write(20);
delay(500);
Left = ultrasonic();
return Left;
}
int leftsee() {
servo.write(180);
delay(500);
Right = ultrasonic();
return Right;
}
int leftview() {
servo.write(180);
}
int rightview() {
servo.write(20);
}
int forwardview() {
servo.write(spoint);
}
int leftMotor1 = 5; // 馬達1引腳1
int leftMotor2 = 6; // 馬達1引腳2
int rightMotor1 = 9; // 馬達2引腳1
int rightMotor2 = 10; // 馬達2引腳2
int leftIR = 2; // 左邊紅外線感測器引腳
int middleIR = 3; // 中間紅外線感測器引腳
int rightIR = 4; // 右邊紅外線感測器引腳
void setup() {
pinMode(leftMotor1, OUTPUT);
pinMode(leftMotor2, OUTPUT);
pinMode(rightMotor1, OUTPUT);
pinMode(rightMotor2, OUTPUT);
pinMode(leftIR, INPUT);
pinMode(middleIR, INPUT);
pinMode(rightIR, INPUT);
}
void loop() {
int leftVal = digitalRead(leftIR); // 讀取左邊紅外線感測器的值
int middleVal = digitalRead(middleIR); // 讀取中間紅外線感測器的值
int rightVal = digitalRead(rightIR); // 讀取右邊紅外線感測器的值
if (middleVal == HIGH) // 如果中間探測到黑線
{
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
} else if (leftVal == HIGH && rightVal == LOW) // 如果左邊探測到黑線,右邊沒有探測到 ==>車子偏右
{
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, HIGH);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
} else if (leftVal == LOW && rightVal == HIGH) // 如果右邊探測到黑線,左邊沒有探測到 ==>車子偏左
{
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, HIGH);
} else if (leftVal == HIGH && rightVal == HIGH) // 如果左右邊都探測到黑線
{
digitalWrite(leftMotor1, LOW);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, LOW);
digitalWrite(rightMotor2, LOW);
} else // 如果左右邊都沒有探測到黑線
{
digitalWrite(leftMotor1, HIGH);
digitalWrite(leftMotor2, LOW);
digitalWrite(rightMotor1, HIGH);
digitalWrite(rightMotor2, LOW);
}
}