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