Created
June 7, 2020 21:21
-
-
Save pknowledge/3b670515435e3dffaaef901469506a84 to your computer and use it in GitHub Desktop.
create a car is controlled from Bluetooth via Android SmartPhone
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SoftwareSerial.h> // Import Soft Uart library | |
#include <Servo.h> // Import Servo library | |
// Bluetooth communication pins | |
#define TX 2 | |
#define RX 4 | |
// L298N communication pins | |
#define IN1 3 | |
#define IN2 5 | |
#define IN3 6 | |
#define IN4 7 | |
// Servo communication pins | |
#define Servo_Pin 9 | |
// Speed value | |
#define MAX_SPEED 255 | |
#define MIN_SPEED 155 | |
// Servo angle | |
#define pos 85 | |
// Init | |
SoftwareSerial blue(RX, TX); | |
Servo servo; | |
// Init bluetooth speed | |
void Blue_Init(){ | |
blue.begin(9600); // Bluetooth use baudrate 9600 | |
} | |
// Init L298N pins | |
void Motor_Init(){ | |
pinMode(IN1, OUTPUT); | |
pinMode(IN2, OUTPUT); | |
pinMode(IN3, OUTPUT); | |
pinMode(IN4, OUTPUT); | |
} | |
// Init servo | |
void Servo_Init(){ | |
servo.attach(Servo_Pin); | |
// Set servo at "pos" angle (straight forward - default) | |
servo.write(pos); | |
} | |
// Stop function | |
void Stop(){ | |
digitalWrite(IN1, LOW); | |
digitalWrite(IN2, LOW); | |
digitalWrite(IN3, LOW); | |
digitalWrite(IN4, LOW); | |
servo.write(pos); | |
} | |
// Back function | |
void Back(int speed){ | |
// Speed | |
speed = constrain(speed, MIN_SPEED, MAX_SPEED); | |
digitalWrite(IN2, HIGH); | |
analogWrite(IN1, 255 - speed); | |
analogWrite(IN3, speed); | |
digitalWrite(IN4, LOW); | |
} | |
// Forward function | |
void Forward(int speed){ | |
speed = constrain(speed, MIN_SPEED, MAX_SPEED); | |
digitalWrite(IN2, LOW); | |
analogWrite(IN1, speed); | |
analogWrite(IN3, 255 - speed); | |
digitalWrite(IN4, HIGH); | |
} | |
// Turn servo left | |
void Turn_Left(){ | |
servo.write(pos - 35); | |
} | |
// Turn servo right | |
void Turn_Right(){ | |
servo.write(pos + 35); | |
} | |
void setup() { | |
Serial.begin(9600); | |
Blue_Init(); | |
Motor_Init(); | |
Servo_Init(); | |
} | |
void loop() { | |
char _read; | |
int speed = MIN_SPEED; | |
//Serial.println(servo.read()); | |
if (blue.available()){ // If receive signal from Bluetooth | |
_read = blue.read(); // Get the data and assign to "_read" variable | |
// Speed level from 0 -> 9, respectively | |
if (_read >= '0' && _read <= '9'){ | |
if (_read == '0') // If press '0' -> MIN SPEED | |
speed = MIN_SPEED; | |
else | |
speed += (int(_read) - 48)*10; | |
} | |
// If press 'q' -> MAX SPEED | |
if (_read == 'q') | |
speed = MAX_SPEED; | |
Serial.println(_read); | |
// If system receive one of data below | |
// System will invoke corresponding functions above | |
switch (_read){ | |
case 'S':{ | |
Stop(); | |
Serial.println("STOP"); | |
break; | |
} | |
case 'F':{ | |
Forward(speed); | |
Serial.println("Forward"); | |
break; | |
} | |
case 'B':{ | |
Back(speed); | |
Serial.println("BACK"); | |
break; | |
} | |
case 'L':{ | |
Turn_Left(); | |
Serial.println("LEFT"); | |
break; | |
} | |
case 'R':{ | |
Turn_Right(); | |
Serial.println("RIGHT"); | |
break; | |
} | |
case 'G':{ | |
Turn_Left(); | |
delay(10); | |
Forward(speed); | |
Serial.println("FL"); | |
break; | |
} | |
case 'I':{ | |
Turn_Right(); | |
delay(10); | |
Forward(speed); | |
Serial.println("FR"); | |
break; | |
} | |
case 'H':{ | |
Turn_Left(); | |
delay(10); | |
Back(speed); | |
Serial.println("BL"); | |
break; | |
} | |
case 'J':{ | |
Turn_Right(); | |
delay(10); | |
Back(speed); | |
Serial.println("BR"); | |
break; | |
} | |
} | |
} | |
delay(100); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment