Robofun 機器人論壇

標題: 有沒有辦法同一的字元只讀取一次!? [打印本頁]

作者: w72321    時間: 2016-10-17 09:51
標題: 有沒有辦法同一的字元只讀取一次!?
本帖最後由 w72321 於 2016-10-17 09:53 編輯

請問各位專家

我找出我伺服馬達抖動的原因了
不知道有沒有解

我有一個讀取參數
會變化為 A.D.M
三個英文數字
控制伺服馬達

但因為訊息是一直發出的
所以我一直讀取到同一個訊號
造成伺服馬達不斷歸位=伺服馬達一直在抖動

有沒有辦法同一的字元只讀取一次!?

以下是區段語法!

    char Y = PosY ;
    int angle = 87 ;

    if (Y == 'A') {
      LR_Servo.write( angle += 25) ; //若接受到字元'A'時,左
    } else if (Y == 'D') {
      LR_Servo.write( angle -= 25); //若接受到字元'D'時,右
    } else  if (Y == 'M') {
      LR_Servo.write(angle);//若接受到字元'M'時,置中
    }




作者: croma    時間: 2016-10-17 10:00
宣告一個變數紀錄最後一次使用的狀態,比較新舊狀態是否相同一樣就不處理
作者: croma    時間: 2016-10-17 10:09
你的伺服馬達下角度參數還會歸位?
作者: 超新手    時間: 2016-10-17 10:27
你的伺服機還蠻敏感的
我的伺服機就算程式寫成下面這樣, 一直送同一角度
也不會抖
#include <Servo.h>
Servo myservo;  
void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
void loop() {
    myservo.write(90);              // tell servo to go
}
作者: w72321    時間: 2016-10-17 10:49
超新手大大:

我的在藍芽位連線之前是很穩定的!
但當藍芽一連線!
會接收到M字元!因為還沒下轉項指令
所以一直是MMMMMMMMMMM..........
然後就開始中風了!

直到下了A or D 轉向 0.5秒後! A or D也會抖

還是因為我最後有設定    delay(40); ???
可是他的抖動間格跟    delay(40)  秒數搭不上關係

很困惑

croma大大:

宣告一個變數紀錄最後一次使用的狀態,比較新舊狀態是否相同一樣就不處理
這段有沒有例句或參考的資料呢??

想查查學習

謝謝兩位大大
作者: w72321    時間: 2016-10-17 11:43
char Y = PosY ;
    int angle = 87 ;
    static int oldAngle = 999;

    if (Y == 'A') {
      angle += 25 ; //若接受到字元'A'時,車左轉
    } else if (Y == 'D') {
      angle -= 25; //若接受到字元'D'時,右轉
    } else  if (Y == 'M') {
      angle;
    }
    if (oldAngle != angle) {
      LR_Servo.write(oldAngle = angle);
    } else  if (oldAngle = angle) {

    }

這樣有意義嗎?
作者: 超新手    時間: 2016-10-17 11:59
>>這樣有意義嗎?
雖然有寫錯, 但不影響結果
所以你的抖動, 有解決了嗎?

寫錯的地方是
else  if (oldAngle == angle) {
}



PS 其實以下程式都是多餘的, 但寫了也沒差
else  if (Y == 'M') {
      angle;
    }
else  if (oldAngle == angle) {
    }
作者: w72321    時間: 2016-10-17 13:10
我晚上回家才會試~因為目前也在上班手邊沒有板子!!

不過謝謝回應!!也看到錯誤點了!!

我會再試試看
作者: croma    時間: 2016-10-17 20:22
如果你在意的是一直送 M 造成的

static char lastPosY;

.....
char Y = PosY ;
int angle = 87 ;

if (Y == 'A') {
  LR_Servo.write( angle += 25) ; //若接受到字元'A'時,左
} else if (Y == 'D') {
  LR_Servo.write( angle -= 25); //若接受到字元'D'時,右
} else  if (Y == 'M') {
  if( lastPosY != Y)
      LR_Servo.write(angle);//若接受到字元'M'時,置中
}

.................
lastPosY = Y;
作者: auto0629    時間: 2016-10-20 16:53
本帖最後由 auto0629 於 2016-10-21 08:46 編輯

可以試看看,
void loop()
{
if (Serial.available())
{
  Y=Serial.read()
   switch(Y)
    {
    case 'A':  
     LRA();
    break;
     case 'D':  
     LRD();
    break;
     case 'M':  
     LRM();
    break;
    }
  }
}
void LRA()
{
     LR_Servo.write( angle += 25);
}
void LRD()
{
     LR_Servo.write( angle -= 25);
}
void LRM()
{
     LR_Servo.write( angle);
}




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2