一种念头 发表于 2013-6-5 21:32:10

关于超声波智能车转向问题,求代码(或求改正)谢谢!!!

我们做了超声波智能车,但是代码输进去后,没有遇到障碍物还是在原地转圈,我们希望改成向前进,求高手帮帮忙,谢谢!!!{:soso_e100:}

一种念头 发表于 2013-6-5 21:32:44

/*程式的開頭要描述你的設備
    再來要說是脽寫的日期版本
    然後碰到問題一次一次都要寫清楚
    馬達幾個驅動電路都要描述
    L = 左
    R = 右
    F = 前
    B = 後
*/
#include <Servo.h>
int pinLB=6;   // 定義8腳位 左後
int pinLF=9;   // 定義9腳位 左前

int pinRB=10;    // 定義10腳位 右後
int pinRF=11;    // 定義11腳位 右前

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 = 250; // 伺服馬達轉向後的穩定時間

int Fgo = 8;         // 前進
int Rgo = 6;         // 右轉
int Lgo = 4;         // 左轉
int Bgo = 2;         // 倒車

void setup()
{
Serial.begin(9600);   // 定義馬達輸出腳位
pinMode(pinLB,OUTPUT); // 腳位 8 (PWM)
pinMode(pinLF,OUTPUT); // 腳位 9 (PWM)
pinMode(pinRB,OUTPUT); // 腳位 10 (PWM)
pinMode(pinRF,OUTPUT); // 腳位 11 (PWM)

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

myservo.attach(5);    // 定義伺服馬達輸出第5腳位(PWM)
}
void advance(int a)   // 前進
    {
   digitalWrite(pinRB,LOW);// 使馬達(右後)動作
   digitalWrite(pinRF,HIGH);
   digitalWrite(pinLB,LOW);// 使馬達(左後)動作
   digitalWrite(pinLF,HIGH);
   delay(a * 100);   
    }

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

   digitalWrite(pinRB,HIGH);//使馬達(右後)動作
   digitalWrite(pinRF,LOW);
   digitalWrite(pinLB,HIGH);//使馬達(左後)動作
   digitalWrite(pinLF,LOW);
   delay(g * 100);   
    }
   
void detection()      //測量3個角度(0.90.179)
    {      
      int delay_time = 250;   // 伺服馬達轉向後的穩定時間
      ask_pin_F();            // 讀取前方距離
      
   if(Fspeedd < 10)         // 假如前方距離小於10公分
      {
      stopp(1);               // 清除輸出資料
      back(2);                // 後退 0.2秒
      }
         
      if(Fspeedd < 25)         // 假如前方距離小於25公分
      {
      stopp(1);               // 清除輸出資料
      ask_pin_L();            // 讀取左方距離
      delay(delay_time);      // 等待伺服馬達穩定
      ask_pin_R();            // 讀取右方距離
      delay(delay_time);      // 等待伺服馬達穩定
      
      if(Lspeedd > Rspeedd)   //假如 左邊距離大於右邊距離
      {
         directionn = Rgo;      //向右走
      }
      
      if(Lspeedd <= Rspeedd)   //假如 左邊距離小於或等於右邊距離
      {
         directionn = Lgo;      //向左走
      }
      
      if (Lspeedd < 10 && Rspeedd < 10)   //假如 左邊距離和右邊距離皆小於10公分
      {
         directionn = Bgo;      //向後走      
      }         
      }
      else                      //加如前方不小於(大於)25公分   
      {
      directionn = Fgo;      //向前走   
      }
   
    }   
void ask_pin_F()   // 量出前方距離
    {
      myservo.write(90);
      digitalWrite(outputPin, LOW);   // 讓超聲波發射低電壓2μs
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);    // 維持超聲波發射低電壓
      float Fdistance = pulseIn(inputPin, HIGH);// 讀差相差時間
      Fdistance= Fdistance/5.8/10;       // 將時間轉為距離距离(單位:公分)
      Serial.print("F distance:");      //輸出距離(單位:公分)
      Serial.println(Fdistance);         //顯示距離
      Fspeedd = Fdistance;            // 將距離 讀入Fspeedd(前速)
    }
void ask_pin_L()   // 量出左邊距離
    {
      myservo.write(5);
      delay(delay_time);
      digitalWrite(outputPin, LOW);   // 讓超聲波發射低電壓2μs
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);    // 維持超聲波發射低電壓
      float Ldistance = pulseIn(inputPin, HIGH);// 讀差相差時間
      Ldistance= Ldistance/5.8/10;       // 將時間轉為距離距离(單位:公分)
      Serial.print("L distance:");       //輸出距離(單位:公分)
      Serial.println(Ldistance);         //顯示距離
      Lspeedd = Ldistance;            // 將距離 讀入Lspeedd(左速)
    }
void ask_pin_R()   // 量出右邊距離
    {
      myservo.write(177);
      delay(delay_time);
      digitalWrite(outputPin, LOW);   // 讓超聲波發射低電壓2μs
      delayMicroseconds(2);
      digitalWrite(outputPin, HIGH);// 讓超聲波發射高電壓10μs,這裡至少是10μs
      delayMicroseconds(10);
      digitalWrite(outputPin, LOW);    // 維持超聲波發射低電壓
      float Rdistance = pulseIn(inputPin, HIGH);// 讀差相差時間
      Rdistance= Rdistance/5.8/10;       // 將時間轉為距離距离(單位:公分)
      Serial.print("R distance:");       //輸出距離(單位:公分)
      Serial.println(Rdistance);         //顯示距離
      Rspeedd = Rdistance;            // 將距離 讀入Rspeedd(右速)
    }
   
void loop()
{
    myservo.write(90);//讓伺服馬達回歸 預備位置 準備下一次的測量
    detection();      //測量角度 並且判斷要往哪一方向移動
      
   if(directionn == 2)//假如directionn(方向) = 2(倒車)            
   {
   back(8);                  //倒退(車)
   turnL(2);                   //些微向左方移動(防止卡在死巷裡)
   Serial.print(" Reverse ");   //顯示方向(倒退)
   }
   if(directionn == 6)         //假如directionn(方向) = 6(右轉)   
   {
   back(1);
   turnR(6);                   // 右轉
   Serial.print(" Right ");    //顯示方向(左轉)
   }
   if(directionn == 4)          //假如directionn(方向) = 4(左轉)   
   {
   back(1);      
   turnL(6);                  // 左轉
   Serial.print(" Left ");   //顯示方向(右轉)   
   }
   if(directionn == 8)          //假如directionn(方向) = 8(前進)      
   {
    advance(1);               // 正常前進
    Serial.print(" Advance ");   //顯示方向(前進)
    Serial.print("   ");   
   }
}

一种念头 发表于 2013-6-5 21:33:16

麻烦网友:)

一种念头 发表于 2013-6-6 20:34:35

:'(请大家帮帮忙,谢了!!!十分感激!!!

熊猫 发表于 2013-6-7 13:36:48

检查一下引脚,看引脚有没有错,还有看代码你的车轮前后两排轮是反着安的,
页: [1]
查看完整版本: 关于超声波智能车转向问题,求代码(或求改正)谢谢!!!