Robofun 機器人論壇

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2016-10-17 09:51:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 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'時,置中
    }



2#
發表於 2016-10-17 10:00:38 | 只看該作者
宣告一個變數紀錄最後一次使用的狀態,比較新舊狀態是否相同一樣就不處理
3#
發表於 2016-10-17 10:09:37 | 只看該作者
你的伺服馬達下角度參數還會歸位?
4#
發表於 2016-10-17 10:27:37 | 只看該作者
你的伺服機還蠻敏感的
我的伺服機就算程式寫成下面這樣, 一直送同一角度
也不會抖
#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
}
5#
 樓主| 發表於 2016-10-17 10:49:34 | 只看該作者
超新手大大:

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

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

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

很困惑

croma大大:

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

想查查學習

謝謝兩位大大
6#
 樓主| 發表於 2016-10-17 11:43:49 | 只看該作者
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) {

    }

這樣有意義嗎?
7#
發表於 2016-10-17 11:59:49 | 只看該作者
>>這樣有意義嗎?
雖然有寫錯, 但不影響結果
所以你的抖動, 有解決了嗎?

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



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

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

我會再試試看
9#
發表於 2016-10-17 20:22:58 | 只看該作者
如果你在意的是一直送 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;
10#
發表於 2016-10-20 16:53:59 | 只看該作者
本帖最後由 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);
}
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-5-5 11:59 , Processed in 0.102861 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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