柚子 發表於 2015-4-18 18:00:53

Arduion切換部分

請教各位大大,小弟我使用App Inventor透過HC-06藍芽模組來使Arduion切換避障與停止,請問我寫的程是是否哪裡出了些問題,無法使App Inventor來切換動作請各位大大提點我


#include <Servo.h>
#include <SoftwareSerial.h> // 引用''軟體序列埠''程式庫

SoftwareSerial BT(3,2); // 設定軟體序列埠(接收腳,傳送腳)
char command;   // 接收序列埠的變數
const byte speed = 255; // 馬達的 PWM 輸出值
const byte ENA = 5; // 馬達 A 的致能接腳
const byte ENB = 6; // 馬達 B 的致能接腳

int pinLB=10;   // 定義10腳位 左後
int pinLF=9;   // 定義9腳位 左前
int pinRB=8;    // 定義8腳位 右後
int pinRF=7;    // 定義7腳位 右前

int inputPin = A0;// 定義超音波信號接收腳位
int outputPin =A1;// 定義超音波信號發射腳位

int Fspeedd = 0;      // 前速
int Rspeedd = 0;      // 右速
int Lspeedd = 0;      // 左速
int directionn = 0;   // 前=8 後=2 左=4 右=6
Servo myservo;      // 設 myservo
int delay_time = 255; // 伺服馬達轉向後的穩定時間

int Fgo = 8;         // 前進
int Rgo = 6;         // 右轉
int Lgo = 4;         // 左轉
int Bgo = 2;         // 倒車
void setup()
{
Serial.begin(9600);   // 定義馬達輸出腳位
pinMode(pinLB,OUTPUT); // 腳位 7 (PWM)
pinMode(pinLF,OUTPUT); // 腳位 8 (PWM)
pinMode(pinRB,OUTPUT); // 腳位 9 (PWM)
pinMode(pinRF,OUTPUT); // 腳位 10 (PWM)

pinMode(inputPin, INPUT);    // 定義超音波輸入腳位
pinMode(outputPin, OUTPUT);// 定義超音波輸出腳位   

myservo.attach(4);    // 定義伺服馬達輸出第4腳位(PWM)
pinMode(pinLB,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
pinMode(pinLF,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
pinMode(pinRB,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
pinMode(pinRF,OUTPUT); // 馬達驅動模組的接腳全都設定成''輸出''
stop();            // 先停止馬達
}
//-------------------------------------------
void stop() // 馬達停止
{
analogWrite(ENA,0); // 馬達 A 的 PWM 輸出
analogWrite(ENB,0); // 馬達 B 的 PWM 輸出
}
//-------------------------------------------
void advance(int a)   // 前進
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,LOW);
   digitalWrite(pinRF,HIGH);
   analogWrite(ENB,speed);
   digitalWrite(pinLB,LOW);
   digitalWrite(pinLF,HIGH);
   delay(a * 100);   
    }

void right(int b)      //右轉(單輪)
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,LOW);   
   digitalWrite(pinRF,HIGH);
   analogWrite(ENB,speed);
   digitalWrite(pinLB,HIGH);
   digitalWrite(pinLF,HIGH);
   delay(b * 100);
    }
void left(int c)         //左轉(單輪)
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,HIGH);
   digitalWrite(pinRF,HIGH);
   analogWrite(ENB,speed);
   digitalWrite(pinLB,LOW);   
   digitalWrite(pinLF,HIGH);
   delay(c * 100);
    }
void turnR(int d)      //右轉(雙輪)
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,LOW);
   digitalWrite(pinRF,HIGH);
   analogWrite(ENB,speed);
   digitalWrite(pinLB,HIGH);
   digitalWrite(pinLF,LOW);
   delay(d * 100);
    }
void turnL(int e)      //左轉(雙輪)
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,HIGH);
   digitalWrite(pinRF,LOW);   
   analogWrite(ENB,speed);
   digitalWrite(pinLB,LOW);   
   digitalWrite(pinLF,HIGH);
   delay(e * 100);
    }   
void stopp(int f)         //停止
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,HIGH);
   digitalWrite(pinRF,HIGH);
   analogWrite(ENB,speed);
   digitalWrite(pinLB,HIGH);
   digitalWrite(pinLF,HIGH);
   delay(f * 100);
    }
void back(int g)          //後退
    {
   analogWrite(ENA,speed);
   digitalWrite(pinRB,HIGH);
   digitalWrite(pinRF,LOW);
   analogWrite(ENB,speed);
   digitalWrite(pinLB,HIGH);
   digitalWrite(pinLF,LOW);
   delay(g * 100);   
    }

void detection()      
    {      
      int delay_time = 255;   
      ask_pin_F();            

   if(Fspeedd < 4)         

      {
      stopp(1);            
      back(2);               
      }

      if(Fspeedd < 20)         
      {
      stopp(1);               
      ask_pin_L();            
      delay(delay_time);      
      ask_pin_R();            
      delay(delay_time);      

      if(Lspeedd > Rspeedd)   
      {
         directionn = Lgo;      
      }

      if(Lspeedd <= Rspeedd)   
      {
         directionn = Rgo;      
      }

      if (Lspeedd < 3 && Rspeedd < 3)   
      {
         directionn = Bgo;            
      }         
      }
      else                        
      {
      directionn = Fgo;            
      }

    }   
void ask_pin_F()   
    {
      myservo.write(90);
      digitalWrite(outputPin, LOW);   
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);   
      float Fdistance = pulseIn(inputPin, HIGH);
      Fdistance= Fdistance/5.8/10;      
      Serial.print("F distance:");      
      Serial.println(Fdistance);         
      Fspeedd = Fdistance;            
    }
void ask_pin_L()   
    {
      myservo.write(10);
      delay(delay_time);
      digitalWrite(outputPin, LOW);   
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);   
      float Ldistance = pulseIn(inputPin, HIGH);
      Ldistance= Ldistance/5.8/10;      
      Serial.print("L distance:");      
      Serial.println(Ldistance);         
      Lspeedd = Ldistance;            
    }
void ask_pin_R()   
    {
      myservo.write(177);
      delay(delay_time);
      digitalWrite(outputPin, LOW);   
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);   
      float Rdistance = pulseIn(inputPin, HIGH);
      Rdistance= Rdistance/5.8/10;      
      Serial.print("R distance:");      
      Serial.println(Rdistance);      
      Rspeedd = Rdistance;            
    }

void car()
{
    myservo.write(90);
    detection();      
    Serial.print("direction:");      
    Serial.println(directionn);      
   if(directionn == 2)//假如directionn(方向) = 2         
   {
   back(8);                  
   turnL(2);                  
   Serial.print(" Reverse ");   
   }
   if(directionn == 6)            
   {
   back(1);
   turnR(6);                  
   Serial.print(" Right ");   
   }
   if(directionn == 4)            
   {
   back(1);      
   turnL(6);                  
   Serial.print(" Left ");   
   }
   if(directionn == 8)            
   {
    advance(1);               
    Serial.print(" Advance ");
    Serial.print("   ");   
   }
}
//------------------------------------------
void loop()
{
if (BT.available() > 0)
{
    command = BT.read();
    switch (command)
    {
      case 's' : // 接收 's',停止
      stop();
      break;
      case 'x' : // 接收 'x',避障
      car();
      break;
    }
}
}
/***********************************************************************/
頁: [1]
查看完整版本: Arduion切換部分