diff --git a/BluetoothControlTank.ino b/BluetoothControlTank.ino index f6369f0..372296e 100644 --- a/BluetoothControlTank.ino +++ b/BluetoothControlTank.ino @@ -1,13 +1,15 @@ /* - L=Left, R=Right, F=Forward, B=Back + 0=spot, + 2=Left, 3=Right, 1=Forward, 4=Back + 5=move forward left, 6=move forward right + 7=move backward left, 8=move backward right */ +#include +enum { pinLB = 12, pinLF = 3, pinRB = 13, pinRF = 11 }; +int delay_time = 300; +int direct = 0; -int pinLB = 12; // define pin 12 -int pinLF = 3; // define pin 3 -int pinRB = 13; // define pin 13 -int pinRF = 11; // define pin 11 -int val; - +Servo myservo; void setup() { @@ -16,65 +18,107 @@ void setup() pinMode(pinLF, OUTPUT); // pin 3 (PWM) pinMode(pinRB, OUTPUT); // pin 13 pinMode(pinRF, OUTPUT); // pin 11 (PWM) + myservo.attach(9); // Define servo motor output pin to D9 (PWM) + handshake(); +} + +void loop() +{ + if (Serial.available()) + { + char val = Serial.read(); + + switch (val) + { + case '0': stopp(); break; + case '1': forward(); break; + case '4': backward(); break; + case '3': turn_right(); break; + case '2': turn_left(); break; + case '5': forward_left(); break; + case '6': forward_right(); break; + case '7': backward_left(); break; + case '8': backward_right(); break; + } + } } -void advance() // move forward +void set(bool LB, bool RB, int LF, int RF) { - digitalWrite(pinLB, LOW); // right wheel moves forward - digitalWrite(pinRB, LOW); // left wheel moves forward - analogWrite(pinLF, 255); - analogWrite(pinRF, 255); + digitalWrite(pinLB, LB); + digitalWrite(pinRB, RB); + analogWrite(pinLF, LF); + analogWrite(pinRF, RF); } void stopp() // stop { - digitalWrite(pinLB, HIGH); - digitalWrite(pinRB, HIGH); - analogWrite(pinLF, 0); - analogWrite(pinRF, 0); + direct = 0; + set(HIGH, HIGH, 0, 0); } -void right() // turn right (single wheel) +void forward() { - digitalWrite(pinLB, LOW); // left wheel moves forward - digitalWrite(pinRB, HIGH); // right wheel moves backward - analogWrite(pinLF, 255); - analogWrite(pinRF, 255); + direct = 1; + set(LOW, LOW, 255, 255); } -void left() // turn left (single wheel) +void backward() { - digitalWrite(pinLB, HIGH); // left wheel moves forward - digitalWrite(pinRB, LOW); // right wheel moves backward - analogWrite(pinLF, 255); - analogWrite(pinRF, 255); + direct = -1; + set(HIGH, HIGH, 255, 255); } -void back() // move backward +void turn_right() { - digitalWrite(pinLB, HIGH); // motor moves to left rear - digitalWrite(pinRB, HIGH); // motor moves to right rear - analogWrite(pinLF, 255); - analogWrite(pinRF, 255); + set(LOW, HIGH, 255, 255); + delay(delay_time); + stopp(); } -void loop() +void turn_left() { - val = Serial.read(); - if (val == 'f') { - advance(); - } - if (val == 'b') { - back(); - } - if (val == 'l') { - left(); - delay(600); - stopp(); - } - if (val == 'r') { - right(); - delay(600); + set(HIGH, LOW, 255, 255); + delay(delay_time); + stopp(); +} +void backward_left() +{ + set(HIGH, LOW, 255, 0); + delay(delay_time); + stopp(); +} +void backward_right() +{ + set(LOW, HIGH, 0, 255); + delay(delay_time); + stopp(); +} +void forward_left() +{ + set(LOW, HIGH, 255, 0); + myservo.write(45); + delay(delay_time); + if (direct == 1) + forward(); + else stopp(); - } - if ( val == 's') { + myservo.write(90); +} +void forward_right() +{ + set(HIGH, LOW, 0, 255); + myservo.write(180-45); + delay(delay_time); + if (direct == 1) + forward(); + else stopp(); - } + myservo.write(90); } +void handshake() +{ + myservo.write(45); + delay(delay_time); + myservo.write(135); + delay(delay_time); + myservo.write(90); +} + diff --git a/BluetoothControlTank2.ino b/BluetoothControlTank2.ino new file mode 100644 index 0000000..0b1fde5 --- /dev/null +++ b/BluetoothControlTank2.ino @@ -0,0 +1,145 @@ +/* + 0=spot, + 2=Left, 3=Right, 1=Forward, 4=Back + 5=move forward left, 6=move forward right + 7=move backward left, 8=move backward right +*/ +#include +enum { pinLB = 12, pinLF = 3, pinRB = 13, pinRF = 11 }; +int inputPin = 4; // define pin for sensor echo +int outputPin = 5; // define pin for sensor trig +int delay_time_ = 300; +int direct_ = 0; // forward=1 backward=-1 stop=0 +int distance_ = 0; // forward speed + +Servo myservo; + +void setup() +{ + Serial.begin(9600); // define pin for motor output + pinMode(pinLB, OUTPUT); // pin 12 + pinMode(pinLF, OUTPUT); // pin 3 (PWM) + pinMode(pinRB, OUTPUT); // pin 13 + pinMode(pinRF, OUTPUT); // pin 11 (PWM) + pinMode(inputPin, INPUT); // define input pin for sensor + pinMode(outputPin, OUTPUT); // define output pin for sensor + myservo.attach(9); // Define servo motor output pin to D9 (PWM) + handshake(); +} + +void loop() +{ + if (Serial.available()) + { + char val = Serial.read(); + + switch (val) + { + case '0': stopp(); break; + case '1': forward(); break; + case '4': backward(); break; + case '3': turn_right(); break; + case '2': turn_left(); break; + case '5': forward_left(); break; + case '6': forward_right(); break; + case '7': backward_left(); break; + case '8': backward_right(); break; + } + } + ask_pin_F(); // read the distance ahead + if (distance_ < 15 && direct_ == 1) // if distance ahead is <10cm and moving forvard + { + stopp(); // stop + } +} + +void set(bool LB, bool RB, int LF, int RF) +{ + digitalWrite(pinLB, LB); + digitalWrite(pinRB, RB); + analogWrite(pinLF, LF); + analogWrite(pinRF, RF); +} + +void stopp() // stop +{ + direct_ = 0; + set(HIGH, HIGH, 0, 0); +} +void forward() +{ + direct_ = 1; + set(LOW, LOW, 255, 255); +} +void backward() +{ + direct_ = -1; + set(HIGH, HIGH, 255, 255); +} +void turn_right() +{ + set(LOW, HIGH, 255, 255); + delay(delay_time_); + stopp(); +} + +void turn_left() +{ + set(HIGH, LOW, 255, 255); + delay(delay_time_); + stopp(); +} +void backward_left() +{ + set(HIGH, LOW, 255, 0); + delay(delay_time_); + stopp(); +} +void backward_right() +{ + set(LOW, HIGH, 0, 255); + delay(delay_time_); + stopp(); +} +void forward_left() +{ + set(LOW, HIGH, 255, 0); + myservo.write(45); + delay(delay_time_); + if (direct_ == 1) + forward(); + else + stopp(); + myservo.write(90); +} +void forward_right() +{ + set(HIGH, LOW, 0, 255); + myservo.write(180 - 45); + delay(delay_time_); + if (direct_ == 1) + forward(); + else + stopp(); + myservo.write(90); +} +void handshake() +{ + myservo.write(45); + delay(delay_time_); + myservo.write(180 - 45); + delay(delay_time_); + myservo.write(90); +} +void ask_pin_F() // measure the distance ahead +{ + myservo.write(90); + digitalWrite(outputPin, LOW); // ultrasonic sensor transmit low level signal 2μs + delayMicroseconds(2); + digitalWrite(outputPin, HIGH); // ultrasonic sensor transmit high level signal10μs, at least 10μs + delayMicroseconds(10); + digitalWrite(outputPin, LOW); // keep transmitting low level signal + float f_distance = pulseIn(inputPin, HIGH); // read the time in between + distance_ = f_distance / 5.8 / 10; // convert time into distance (unit: cm) +} + diff --git a/Bluetooth_Arduino_Tank.png b/Bluetooth_Arduino_Tank.png new file mode 100644 index 0000000..6e7a7fe Binary files /dev/null and b/Bluetooth_Arduino_Tank.png differ diff --git a/README.md b/README.md index 6d5bedd..135e163 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,13 @@ # BluetoothControlTank -Arduino Mini Tank Bluetooth Control + +The scatch has been adopted for Android application named Bluetooth Arduino Tank + +Keyestudio mini tank | Android application +------------ | ------------- +![Keyestudio mini tank](mini_tank.jpg) | ![Android app](Bluetooth_Arduino_Tank.png) + +The android application UI provides 9 buttons for control + +![](http://cdn.instructables.com/FWS/XCDZ/INS19WM6/FWSXCDZINS19WM6.MEDIUM.jpg) +![](http://cdn.instructables.com/FHL/SD21/INS1A4OE/FHLSD21INS1A4OE.MEDIUM.jpg) + diff --git a/mini_tank.jpg b/mini_tank.jpg new file mode 100644 index 0000000..c3cbd30 Binary files /dev/null and b/mini_tank.jpg differ