Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 5557|回復: 3
打印 上一主題 下一主題

超音波避障的判斷

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-4-30 19:52:42 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我的超音波避障是按照書籍的編譯去編寫的,可是寫出來編譯出現以下的這些訊息diy10_6A.ino: In function 'void loop()':
diy10_6A.ino:116:10: error: 'turnRigh' was not declared in this scope
diy10_6A.ino:116:37: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
編譯時發生錯誤


以下我的自編程式:

const byte TrigPin = 13;  
const int EchoPin = 12;  
const int dangerThresh = 580;  
const byte speed = 100;


long distance;      

const byte ENA = 5;  
const byte ENB = 6;  
const byte IN1 = 10;  
const byte IN2 = 9;  
const byte IN3 = 8;  
const byte IN4 = 7;  

byte dir = 0;  // 記錄行進狀態,0代表「前進」,1代表「判斷」。

void stop() {
// 馬達停止
analogWrite(ENA, 0);
// 馬達A的PWM輸出
analogWrite(ENB, 0);
// 馬達B的PWM輸出
}

void forward() {      // 馬達轉向:前進(兩個馬達都正轉)
analogWrite(ENA, speed);  // 馬達A的PWM輸出
digitalWrite(IN1, HIGH);   // 請參閱表10-5的設定
digitalWrite(IN2, LOW);
analogWrite(ENB, speed);  // 馬達B的PWM輸出
digitalWrite(IN3, HIGH);   // 請參閱表10-5的設定
digitalWrite(IN4, LOW);
}

void backward() {          // 馬達轉向:後退(兩個馬達都反轉)
analogWrite(ENA, speed);  // 馬達A的PWM輸出
digitalWrite(IN1, LOW);  // 請參閱表10-5的設定
digitalWrite(IN2, HIGH);
analogWrite(ENB, speed);  // 馬達B的PWM輸出
digitalWrite(IN3, LOW);   // 請參閱表10-5的設定
digitalWrite(IN4, HIGH);
}

void turnLeft() {          // 馬達轉向:左轉(馬達A反轉、馬達B正轉)
analogWrite(ENA, speed);  // 馬達A的PWM輸出
digitalWrite(IN1, LOW);   // 請參閱表10-5的設定
digitalWrite(IN2, HIGH);
analogWrite(ENB, speed);  // 馬達B的PWM輸出
digitalWrite(IN3, HIGH);  // 請參閱表10-5的設定
digitalWrite(IN4, LOW);
}

void turnRight() {         // 馬達轉向:右轉(馬達A正轉、馬達B反轉)
analogWrite(ENA, speed);  // 馬達A的PWM輸出
digitalWrite(IN1, LOW);   // 請參閱表10-5的設定
digitalWrite(IN2, HIGH);
analogWrite(ENB, speed);  // 馬達B的PWM輸出
digitalWrite(IN3, HIGH);  // 請參閱表10-5的設定
digitalWrite(IN4, LOW);
}

long ping() {              // 超音波感測程式
  digitalWrite(TrigPin, HIGH);   // 觸發腳設定成高電位
  delayMicroseconds(5);          // 持續5微秒
  digitalWrite(TrigPin, LOW);    // 觸發腳設定成低電位

  return pulseIn(EchoPin, HIGH);  // 測量高電位的持續時間(µs)
}

void setup(){
   pinMode(TrigPin, OUTPUT);    // 觸發腳設定成「輸出」
   pinMode(EchoPin, INPUT);    // 接收腳設定成「輸入」
   // 馬達控制板的接腳全都設定成「輸出」
   pinMode(IN1, OUTPUT);
   pinMode(IN2, OUTPUT);
   pinMode(IN3, OUTPUT);
   pinMode(IN4, OUTPUT);
}

void loop()
{
  distance = ping();             // 讀取障礙物的距離
  Serial.print("distance:");       //輸出距離(單位:公分)
  Serial.println(distance);         //顯示距離  
  if (distance>dangerThresh)    // 如果距離大於20cm…
  {
   if (dir != 0)               // 如果目前的行進狀態不是「前進」
   {
        dir = 0;    // 設定成「前進」
        stop();     // 暫停馬達0.5秒
        delay(500);
   }
    backward();     // 前進
  }
  else
   {   
    if (dir != 1)    // 如果目前的狀態不是「後退」
    {     
     if (turnRight > turnLeft)    // 右邊小於左邊 左轉
     {
      {
       dir = 1;       // 設定成「左轉」
       stop();        // 暫停馬達0.5秒
       delay(500);
      }
      turnRight();
     }
     if (turnRight <= turnLeft)   // 右邊大於左邊 右轉
     {
      {
       dir = 1;       // 設定成「右轉」
       stop();        // 暫停馬達0.5秒
       delay(500);
      }
      turnLeft();
     }
     if (turnRigh < 3 && turnLeft < 3)   //假如 左邊距離和右邊距離小於3公分
      {
       dir = 1;       // 設定成「右轉」
       stop();        // 暫停馬達0.5秒
       delay(500);
      }   
    }
    forward();     // 向後退
  }
    delay(500);     // 持續0.5秒
}


請教各位,小弟我編譯的程式,哪些出了問題,可以指導提點我一下,謝謝
2#
發表於 2015-5-4 15:12:48 | 只看該作者
請你先確定第116行程式跟書上的範例一樣
如果一樣這本書就不用看了
直接換下一本

如果發現是程式有打錯
就再確認turnLeft和turnRight這兩個命名到底是函式還是變數
3#
 樓主| 發表於 2015-5-7 18:38:53 | 只看該作者
回復 2# abcd1234abcd
不好意思,那個程式是我修改出來的

turnLeft和turnRight這兩個是變數

但問題來了,我使用全域變數怪怪的

無法去定義

之後判斷說不能用C語言去比較

可以提點我哪裡觀念錯誤,這個問題讓我一直卡著


不好意思~

diy10_6A.rar

1.26 KB, 下載次數: 905

避障程式

4#
發表於 2015-5-19 13:56:49 | 只看該作者
因為你的turnLeft和turnRight的名稱已經被

void turnLeft()和void turnRight()

這兩個函式用掉了

必須用別的名稱去命名這兩個變數
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-6-6 03:31 , Processed in 0.196706 second(s), 10 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表