> # 自走車(2)
> # 目錄
> [TOC]
# 腳位
## 超音波
| | echopin | trigpin |
| -------- | -------- | -------- |
| 左邊 | A2 | 13 |
| 右邊 | A3 | 12 |
| 前面 | A4 | 11 |
## 馬達
| |正轉 |反轉 |轉速(pwm) |
|----------|----------|-----------|----------|
|右邊 | 4 | 5 | 3 |
|左邊 | 8 | 7 | 9 |
## 紅外線接收器
| |腳位|
|----------|---|
|左邊 |10 |
|右邊 |2 |
# 程式
> ## 108/07/25
```cpp
//108/07/25
//馬達轉速(常數)
const int m_pwm_a = 3;//右邊
const int m_pwm_b = 9;//左邊
//馬達轉速(變數)
int pwm_a = 0;//右邊
int pwm_b = 0;//左邊
//右邊馬達正反轉
const int ain1 = 5;//反轉
const int ain2 = 4;//正轉
//左邊馬達正反轉
const int bin1 = 8;//正轉
const int bin2 = 7;//反轉
//超音波_前
#define echopinf A4
#define trigpinf 11
long distance_f;
long distance_f_2;
//超音波_右
#define echopinr A3
#define trigpinr 12
long distance_r;
//超音波_左
#define echopinl A2
#define trigpinl 13
long distance_l;
//紅外線_右
#define ur_r A3
int ur_R;
//紅外線_左
#define ur_l A4
int ur_L;
#define m1 A6
#define m2 A7
#define Start_Button A0
#define Mode_SW A1
boolean Time_Status = false;
int Previous_Time = 0;
int Current_Time = 0;
int Timmer = 0;
long Timer_Start_Time= 0;
boolean Car_Cal = false;
boolean Car_RR = false;
boolean Car_RL = false;
boolean Car_F = false;
boolean Timer_Status = false;
boolean Car_Start_Flag = false;
boolean OP_Mode = false;
boolean Button_Click = false;
boolean Button_Previous_Status = 1;
boolean Button_Current_Status = 1;
boolean ReadButton;
boolean Car_SP = false;
boolean start_flag = false;
int val = 0;// variable for reading the pin status
int val2 =0;
int counter = 0;
int counter2 = 0;
int sum = 0;
int sum2 = 0;
int currentState = 0;
int currentState2 = 0;
int previousState = 0;
int previousState2 = 0;
long previousTime = 0;
long currentTime =0;
int Timer = 0;
int run_time;
int timer_1, timer_2;
/*-----------------------------------------------------------------------------------------------------------*/
void setup() {
//馬達(輸出)
pinMode(m_pwm_a, OUTPUT);//右邊
pinMode(m_pwm_b, OUTPUT);//左邊
//右邊馬達(輸出)
pinMode(ain1, OUTPUT);//反轉
pinMode(ain2, OUTPUT);//正轉
//左邊馬達(輸出)
pinMode(bin1, OUTPUT);//反轉
pinMode(bin2, OUTPUT);//正轉
pinMode(6, OUTPUT);
//設定超音波_前
pinMode(echopinf, INPUT);//輸出
pinMode(trigpinf, OUTPUT);//輸入
//設定超音波_右
pinMode(echopinr, INPUT);//輸出
pinMode(trigpinr, OUTPUT);//輸入
//設定超音波_左
pinMode(echopinl, INPUT);//輸出
pinMode(trigpinl, OUTPUT);//輸入
pinMode(Start_Button,INPUT);
pinMode(Mode_SW,INPUT);
Serial.begin(9600);
Serial.println("begin");
pinMode(m1, INPUT);
pinMode(m2, INPUT);
previousTime=millis();
Serial.println("Starting...");
Serial.println(digitalRead(Start_Button));
// delay(5000);
}
/*-----------------------------------------------------------------------------------------------------------*/
void loop() {
while (Car_Start_Flag == false){
CheckButton();
if (Button_Click == 1){
OP_Mode = digitalRead(Mode_SW);
Car_Start_Flag = true;
Button_Click = 0;
delay(500);
}
}
while (start_flag == false){
distance_f = scan_f();
distance_f_2 = scan_f();
delay(500);
Serial.println(distance_f);
forward();
delay(1200)
Car_F = false;
distance_r = scan_r();
if (distance_r >= 30) {
turn_right();
delay(300);
forward();
delay(1200);
}
Car_F = false;
Car_RR = false;
start_flag = true;
}
distance_r = scan_r();
distance_l = scan_l();
distance_f = scan_f();
delay(500);
if (distance_r >= 20){
turn_right();
delay(300);
forward();
delay(500);
}else if (distance_f >= 20){
forward();
delay(500);
}else if (distance_l >= 20){
turn_left();
delay(300);
forward();
delay(500);
}else{
turn_right();
delay(300);
turn_right();
delay(300);
}
car_stop();
Car_F = false;
Car_RR = false;
Car_RL = false;
Car_SP = false;
}
/*-----------------------------------------------------------------------------------------------------------*/
void CheckRPM(){
val = digitalRead(m1);// read input value
val2 = digitalRead(m2);
if (val == HIGH) { // check if the input is HIGH (button released)
// digitalWrite(ledPin, HIGH); // turn LED on
currentState = 1;
}
else {
// digitalWrite(ledPin, LOW); // turn LED off
currentState = 0;
}
if(currentState != previousState){
if(currentState == 1){
counter = counter + 1;
sum++;
}
}
if (val2 == HIGH) { // check if the input is HIGH (button released)
//digitalWrite(ledPin, HIGH); // turn LED on
currentState2 = 1;
}
else {
//digitalWrite(ledPin, LOW); // turn LED off
currentState2 = 0;
}
if(currentState2 != previousState2){
if(currentState2 == 1){
counter2 = counter2 + 1;
sum2 ++;
}
}
if (Timer_Status == true){
Serial.print("Motor1 RPM=");
Serial.println(counter);
Serial.println(sum);
Serial.print("Motor2 RPM=");
Serial.println(counter2);
Serial.println(sum2);
previousTime=millis();
counter = 0;
counter2 = 0;
Timer_Status = false;
}
previousState = currentState;
previousState2 = currentState2;
delay(10);
// car_stop();
// delay(1000);
}
void CheckButton(){
ReadButton=digitalRead(Start_Button);
if (ReadButton == HIGH){
Button_Current_Status = 1;
}
else{
Button_Current_Status = 0;
}
if (Button_Current_Status != Button_Previous_Status){
if (Button_Current_Status == 1){
Button_Click = 1;
}
}
Button_Previous_Status=Button_Current_Status;
}
long scan_f()
{ //感測副程式_前
long dur, dis;
digitalWrite(trigpinf, LOW);
delayMicroseconds(2);
digitalWrite(trigpinf, HIGH);
delayMicroseconds(10);
digitalWrite(trigpinf, LOW);
dur = pulseIn(echopinf, HIGH);
dis = (dur / 2) / 29.1;
return dis;
}
long scan_r()
{ //感測副程式_右
long dur, dis;
digitalWrite(trigpinr, LOW);
delayMicroseconds(2);
digitalWrite(trigpinr, HIGH);
delayMicroseconds(10);
digitalWrite(trigpinr, LOW);
dur = pulseIn(echopinr, HIGH);
dis = (dur / 2) / 29.1;
return dis;
}
long scan_l()
{ //感測副程式_左
long dur, dis;
digitalWrite(trigpinl, LOW);
delayMicroseconds(2);
digitalWrite(trigpinl, HIGH);
delayMicroseconds(10);
digitalWrite(trigpinl, LOW);
dur = pulseIn(echopinl, HIGH);
dis = (dur / 2) / 29.1;
return dis;
}
void forward() {
pwm_a = 100;
pwm_b = 100;
run_time;
analogWrite(m_pwm_a, pwm_a);
analogWrite(m_pwm_b, pwm_b);
digitalWrite(ain1, 0);
digitalWrite(ain2, 1);
digitalWrite(bin1, 1);
digitalWrite(bin2, 0);
digitalWrite(6, 1);
Car_F=true;
timer_1 = millis();
do{
timer_2 = millis();
if (ur_R == 0){
pwm_b -= 5;
analogWrite(m_pwm_b, pwm_b);
}
if (ur_L == 0){
pwm_a -= 5;
analogWrite(m_pwm_a, pwm_a);
}
}while (timer_1 - timer_2 >=1200)
}
void turn_right() {
analogWrite(m_pwm_a, 100);
analogWrite(m_pwm_b, 100);
digitalWrite(ain1, 0);
digitalWrite(ain2, 1);
digitalWrite(bin1, 0);
digitalWrite(bin2, 1);
digitalWrite(6, 1);
Car_RR = true;
delay(280);
car_stop();
}
void turn_left() {
analogWrite(m_pwm_a, 100);
analogWrite(m_pwm_b, 100);
digitalWrite(ain1, 1);
digitalWrite(ain2, 0);
digitalWrite(bin1, 1);
digitalWrite(bin2, 0);
digitalWrite(6, 1);
Car_RL = true;
delay(280);
car_stop();
}
void car_stop() {
digitalWrite(6, 0);
Car_SP = true;
}
```
> ## 108/07/27
```cpp
//108/07/27
//馬達轉速(常數)
const int m_pwm_a = 3;//右邊
const int m_pwm_b = 9;//左邊
//馬達轉速(變數)
int pwm_a = 0;//右邊
int pwm_b = 0;//左邊
//右邊馬達正反轉
const int ain1 = 5;//反轉
const int ain2 = 4;//正轉
//左邊馬達正反轉
const int bin1 = 8;//正轉
const int bin2 = 7;//反轉
//超音波_前
#define echopinf A4
#define trigpinf 11
long distance_f;
long distance_f_2;
//超音波_右
#define echopinr A3
#define trigpinr 12
long distance_r;
//超音波_左
#define echopinl A2
#define trigpinl 13
long distance_l;
//紅外線_右
#define ur_r 2
int ur_R;
//紅外線_左
#define ur_l 10
int ur_L;
#define m1 A6
#define m2 A7
#define Start_Button A0
#define Mode_SW A1
boolean Time_Status = false;
int Previous_Time = 0;
int Current_Time = 0;
int Timmer = 0;
long Timer_Start_Time= 0;
boolean Car_Cal = false;
boolean Car_RR = false;
boolean Car_RL = false;
boolean Car_F = false;
boolean Timer_Status = false;
boolean Car_Start_Flag = false;
boolean OP_Mode = false;
boolean Button_Click = false;
boolean Button_Previous_Status = 1;
boolean Button_Current_Status = 1;
boolean ReadButton;
boolean Car_SP = false;
boolean start_flag = false;
int val = 0;// variable for reading the pin status
int val2 =0;
int counter = 0;
int counter2 = 0;
int sum = 0;
int sum2 = 0;
int currentState = 0;
int currentState2 = 0;
int previousState = 0;
int previousState2 = 0;
long previousTime = 0;
long currentTime =0;
int Timer = 0;
int run_time;
int timer_1, timer_2;
/*-----------------------------------------------------------------------------------------------------------*/
void setup() {
//馬達(輸出)
pinMode(m_pwm_a, OUTPUT);//右邊
pinMode(m_pwm_b, OUTPUT);//左邊
//右邊馬達(輸出)
pinMode(ain1, OUTPUT);//反轉
pinMode(ain2, OUTPUT);//正轉
//左邊馬達(輸出)
pinMode(bin1, OUTPUT);//反轉
pinMode(bin2, OUTPUT);//正轉
pinMode(6, OUTPUT);
//設定超音波_前
pinMode(echopinf, INPUT);//輸出
pinMode(trigpinf, OUTPUT);//輸入
//設定超音波_右
pinMode(echopinr, INPUT);//輸出
pinMode(trigpinr, OUTPUT);//輸入
//設定超音波_左
pinMode(echopinl, INPUT);//輸出
pinMode(trigpinl, OUTPUT);//輸入
pinMode(Start_Button,INPUT);
pinMode(Mode_SW,INPUT);
Serial.begin(9600);
Serial.println("begin");
pinMode(m1, INPUT);
pinMode(m2, INPUT);
previousTime=millis();
Serial.println("Starting...");
Serial.println(digitalRead(Start_Button));
// delay(5000);
}
/*-----------------------------------------------------------------------------------------------------------*/
void loop() {
while (Car_Start_Flag == false){
CheckButton();
if (Button_Click == 1){
OP_Mode = digitalRead(Mode_SW);
Car_Start_Flag = true;
Button_Click = 0;
delay(500);
}
}
while (start_flag == false){
distance_f = scan_f();
forward();
delay(run_time);
Car_F = false;
distance_r = scan_r();
delay(500);
if (distance_r >= 30) {
turn_right();
delay(run_time);
forward();
delay(run_time);
}
Car_F = false;
Car_RR = false;
start_flag = true;
}
distance_r = scan_r();
distance_l = scan_l();
distance_f = scan_f();
Serial.print("f:");Serial.println(distance_f);
delay(500);
if (distance_r >= 30){
turn_right();
delay(run_time);
forward();
delay(run_time);
}else if (distance_f >= 30){
forward();
delay(run_time);
}else if (distance_l >= 30){
turn_left();
delay(run_time);
forward();
delay(run_time);
}else{
turn_right();
delay(run_time);
turn_right();
delay(run_time);
}
car_stop();
Car_F = false;
Car_RR = false;
Car_RL = false;
Car_SP = false;
}
/*-----------------------------------------------------------------------------------------------------------*/
void CheckRPM(){
val = digitalRead(m1);// read input value
val2 = digitalRead(m2);
if (val == HIGH) { // check if the input is HIGH (button released)
// digitalWrite(ledPin, HIGH); // turn LED on
currentState = 1;
}
else {
// digitalWrite(ledPin, LOW); // turn LED off
currentState = 0;
}
if(currentState != previousState){
if(currentState == 1){
counter = counter + 1;
sum++;
}
}
if (val2 == HIGH) { // check if the input is HIGH (button released)
//digitalWrite(ledPin, HIGH); // turn LED on
currentState2 = 1;
}
else {
//digitalWrite(ledPin, LOW); // turn LED off
currentState2 = 0;
}
if(currentState2 != previousState2){
if(currentState2 == 1){
counter2 = counter2 + 1;
sum2 ++;
}
}
if (Timer_Status == true){
Serial.print("Motor1 RPM=");
Serial.println(counter);
Serial.println(sum);
Serial.print("Motor2 RPM=");
Serial.println(counter2);
Serial.println(sum2);
previousTime=millis();
counter = 0;
counter2 = 0;
Timer_Status = false;
}
previousState = currentState;
previousState2 = currentState2;
delay(10);
// car_stop();
// delay(1000);
}
void CheckButton(){
ReadButton=digitalRead(Start_Button);
if (ReadButton == HIGH){
Button_Current_Status = 1;
}
else{
Button_Current_Status = 0;
}
if (Button_Current_Status != Button_Previous_Status){
if (Button_Current_Status == 1){
Button_Click = 1;
}
}
Button_Previous_Status=Button_Current_Status;
}
long scan_f()
{ //感測副程式_前
long dur, dis;
digitalWrite(trigpinf, LOW);
delayMicroseconds(2);
digitalWrite(trigpinf, HIGH);
delayMicroseconds(10);
digitalWrite(trigpinf, LOW);
dur = pulseIn(echopinf, HIGH);
dis = (dur / 2) / 29.1;
return dis;
}
long scan_r()
{ //感測副程式_右
long dur, dis;
digitalWrite(trigpinr, LOW);
delayMicroseconds(2);
digitalWrite(trigpinr, HIGH);
delayMicroseconds(10);
digitalWrite(trigpinr, LOW);
dur = pulseIn(echopinr, HIGH);
dis = (dur / 2) / 29.1;
return dis;
}
long scan_l()
{ //感測副程式_左
long dur, dis;
digitalWrite(trigpinl, LOW);
delayMicroseconds(2);
digitalWrite(trigpinl, HIGH);
delayMicroseconds(10);
digitalWrite(trigpinl, LOW);
dur = pulseIn(echopinl, HIGH);
dis = (dur / 2) / 29.1;
return dis;
}
void forward() {
pwm_a = 150;
pwm_b = 150;
run_time = 700;
analogWrite(m_pwm_a, pwm_a);
analogWrite(m_pwm_b, pwm_b);
digitalWrite(ain1, 0);
digitalWrite(ain2, 1);
digitalWrite(bin1, 1);
digitalWrite(bin2, 0);
digitalWrite(6, 1);
Car_F=true;
timer_1 = millis();
do{
timer_2 = millis();
ur_R = digitalRead(ur_r);
ur_L = digitalRead(ur_l);
if (ur_R == 1){
pwm_b -= 10;
analogWrite(m_pwm_b, pwm_b);
while (ur_R == 1){
ur_R = digitalRead(ur_r);
}
pwm_b = 150;
analogWrite(m_pwm_b, pwm_b);
}
if (ur_L == 1){
pwm_a -= 10;
analogWrite(m_pwm_a, pwm_a);
while (ur_L == 1){
ur_L = digitalRead(ur_r);
}
pwm_a = 150;
analogWrite(m_pwm_a, pwm_a);
}
}while (timer_2 - timer_1 <= run_time);
car_stop();
}
void turn_right() {
pwm_a = 100;
pwm_b = 100;
run_time = 280;
analogWrite(m_pwm_a, pwm_a);
analogWrite(m_pwm_b, pwm_b);
digitalWrite(ain1, 0);
digitalWrite(ain2, 1);
digitalWrite(bin1, 0);
digitalWrite(bin2, 1);
digitalWrite(6, 1);
Car_RR = true;
timer_1 = millis();
do{
timer_2 = millis();
}while (timer_2 - timer_1 >= run_time);
}
void turn_left() {
pwm_a = 100;
pwm_b = 100;
run_time = 280;
analogWrite(m_pwm_a, pwm_a);
analogWrite(m_pwm_b, pwm_b);
digitalWrite(ain1, 1);
digitalWrite(ain2, 0);
digitalWrite(bin1, 1);
digitalWrite(bin2, 0);
digitalWrite(6, 1);
Car_RL = true;
timer_1 = millis();
do{
timer_2 = millis();
}while (timer_2 - timer_1 >= run_time);
}
void car_stop() {
digitalWrite(6, 0);
Car_SP = true;
}
```
###### tags: `2019科展`