word1975 发表于 2015-9-22 17:48:55

其中一个舵机不能往返运动

先看代码

#include <Servo.h>
Servo sv3;
Servo sv9;
Servo sv10;// 建立Servo物件,控制伺服馬達
int pin8=8;//定义数字8 接口
int pin2=2;
int val2;
int pin3=3;
int val3;
int pin4=4;
int val4;//定义数字接口
const int sv3Pin = 3; // sv3 接 Pin 3
const int sv9Pin = 9;
const int sv10Pin = 10;
const int every3 = 5;//控制速度,数值越大舵机越慢
unsigned long last3 = 0;
int dir3 = 1;
int pos90 = 90;
int pos10 = 10;
int pos170 = 170;

void setup()
{
sv3.attach(sv3Pin); // pin3, 故意名稱叫 sv
sv9.attach(sv9Pin);
sv10.attach(sv10Pin);Serial.begin(9600);
pinMode(pin8,OUTPUT);//定义小灯接口为输出接口
pinMode(pin2,INPUT);
pinMode(pin3,INPUT);
pinMode(pin4,INPUT);//定义按键接口为输入接口
sv9.write(pos10);
sv10.write(pos90);
}

void loop()
{
val2=digitalRead(pin2);//读取数字2 口电平值赋给val
val3=digitalRead(pin3);
val4=digitalRead(pin4);
while(val2)//检测按键是否按下,按键按下时小灯亮起
{
if(val2==HIGH)
digitalWrite(pin8,HIGH);
delay(2000);
digitalWrite(pin8,LOW);
sv9.write(pos10);
delay(1000);
sv10.write(pos170);
delay(1000);
sv10.write(pos10);
delay(1000);
return;
}
while(val3)//检测按键是否按下,按键按下时小灯亮起
{
if(val3==HIGH)
digitalWrite(pin8,HIGH);
delay(2000);
digitalWrite(pin8,LOW);
sv9.write(pos90);
delay(1000);
sv10.write(pos170);
delay(1000);
sv10.write(pos10);
delay(1000);
return;
}
while(val4)//检测按键是否按下,按键按下时小灯亮起
{
if(val4==HIGH)
digitalWrite(pin8,HIGH);
delay(2000);
digitalWrite(pin8,LOW);
sv9.write(pos170);
delay(1000);
sv10.write(pos170);
delay(1000);
sv10.write(pos10);
delay(1000);
return;
}
if(val2==LOW&&val3==LOW&&val4==LOW)

   if(millis( ) - last3 < every3) return; // 還沒到
   last3 = millis( );
   pos90 += dir3;
   sv3.write(pos90);
   if(dir3 == 1){
      if(pos90 >179) dir3 = -1;
   }else{
      if(pos90 < 1) dir3 = 1;
   }
}





再看看照片




思路是这样的:
当2,3,4按钮分别按下时灯8,舵机9,10都有相应的运动。
当2,3,4按钮没有按下时,只有舵机3做往返运动,

正在做一个玩具,就是一个恐龙,然后面前有三个蛋,当没人拿蛋的时候,恐龙就只摇尾巴(3号舵机往返运动)。
当有人拿走一个蛋就会触发其中的一个相应的按钮,恐龙就会把头移向哪里(舵机9),然后张开嘴巴(10号舵机)
发生模块就触发并且模拟恐龙叫声,然后闭上嘴巴,尾巴继续摇。
现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。代码里面是哪里出了错呢,编译时时没有显示错误!
单独运行摇尾巴的动作没问题,让他一直摇尾巴都可以,求高人解救啊!

Super169 发表于 2015-9-22 18:11:31

大家好像不喜歡用 serial debug.

這樣的問題, 加幾句 debug code 不就可以清楚了嗎?
程式總不可能一開始就完全沒錯的, 除非你的 serial 有別的用途, 否則習慣加入 debug code 可以省去很多時間.

如果尾巴沒擺動, 就在最尾的 code block 加入 debug message, 看看那裡出問題吧.

word1975 发表于 2015-9-23 20:05:47

Super169 发表于 2015-9-22 18:11 static/image/common/back.gif
大家好像不喜歡用 serial debug.

這樣的問題, 加幾句 debug code 不就可以清楚了嗎?


能具体点不呢?不是很明白你的意思,谢谢

Super169 发表于 2015-9-23 22:47:14

word1975 发表于 2015-9-23 20:05 static/image/common/back.gif
能具体点不呢?不是很明白你的意思,谢谢

比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"

那就針對擺尾的部份, 看看程式的流程, 是否跟你所想的一樣.
你的程式中, sv3 是接尾巴的, 如果要擺尾就是靠最後的一部份吧.
就針對那段程式, 加入除蟲的訊息.

例如:


Serial.print(val2);
Serial.print(" : ");
Serial.print(val3);
Serial.print(" : ");
Serial.println(val4);
if(val2==LOW&&val3==LOW&&val4==LOW)

   Serial.println("All LOW");
   if(millis( ) - last3 < every3) return; // 還沒到
   last3 = millis( );
   pos90 += dir3;
   Serial.print("Go ");
   Serial.println(pos90);
   sv3.write(pos90);
   if(dir3 == 1){
      if(pos90 >179) dir3 = -1;
   }else{
      if(pos90 < 1) dir3 = 1;
   }
}

先看看是否有顯示 val2, val3, val4 的值,
再看看 val2, val3 及 val4 是否都是 low, 以及是否有顯示 "All LOW".
然後看看是否收到 不斷的 "Go 91", "Go 92", "Go 93"......

如果還是不足夠, 可以再顯示其他變數, 看看是那一個不正確.
甚至加入大量的 Serial.print 去看看程式執行的流程, 是否你所想的一樣.

當程序執行沒錯時, 再刪走所有 Serial.print.

又或者可以加入 #define DEBUG, 並在每句 Serial.print 的除蟲訊息之前加上 #ifdef DEBUG, 當不需要再除蟲時, 就 comment 了 #define DEBUG 的一句.將來有需要, 只要 uncomment #define DEBUG 就可以了.
這都是很基本的除蟲方法, 你可以看看別人的庫, 當中可能也有不少用作除蟲的指令的.

word1975 发表于 2015-9-23 23:37:45

Super169 发表于 2015-9-23 22:47 static/image/common/back.gif
比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"

那就針對擺尾的部 ...



这样的结果,显示ALL LOW 就是不显示val2 ,val3 ,val4 的数值

word1975 发表于 2015-9-23 23:40:55

Super169 发表于 2015-9-23 22:47 static/image/common/back.gif
比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"

那就針對擺尾的部 ...

难道是没有读取val2,Vai3,val4 的数值?又或者不应该用HIGH LOW 指令,该用<>指令,明天试试看

Super169 发表于 2015-9-24 00:01:16

流程上有點奇怪....
一定要經過 serial.print val2, val3, val4 才會到達之後的 All Low, 怎可能沒出現 val2, val3,val4 的數值?

之前沒留意, 那些 "{" "}" 好像有問題, if 之後是否少了一個 "{" ?   流程 變成

if(val2==LOW&&val3==LOW&&val4==LOW) 就執行一次Serial.println("All LOW");
之後的任何情況都執行.

但也不應該會出現沒有 val2, val3, val4 的值.

word1975 发表于 2015-9-24 23:28:17

就是啊,应该就是出差错就是这里

word1975 发表于 2015-9-24 23:33:28

Super169 发表于 2015-9-24 00:01 static/image/common/back.gif
流程上有點奇怪....
一定要經過 serial.print val2, val3, val4 才會到達之後的 All Low, 怎可能沒出現 va ...

就是啊,应该就是这些出了差错,改了很多次了,应该是哪儿没定义好,我把所有后面的程序删除了,留前面的定义,还是不能动,而用以前的源程序就可以动,谢谢你了哈!

Super169 发表于 2015-9-25 00:27:33

本帖最后由 Super169 于 2015-9-25 00:28 编辑

有少少提議, 你現在是 5ms 就改變角度一次, 雖然只是一度的差距, 但不知你的電機反應如何.
可以試下改成 每 15-20ms 走一度 (every3 = 20), 先看看是否可以慢速擺動.

至於為何沒到出 val 的值, 可能是關鍵, 程式的流程有錯.但這麼細小的程式, 不可能用盡記憶體吧.

word1975 发表于 2015-9-25 21:24:27

Super169 发表于 2015-9-25 00:27 static/image/common/back.gif
有少少提議, 你現在是 5ms 就改變角度一次, 雖然只是一度的差距, 但不知你的電機反應如何.
可以試下改成 ...

改了,还是没啥反应,各一个舵机来回运动的原程序;
#include <Servo.h>
Servo sv3; // 建立Servo物件,控制伺服馬達



const int sv3Pin = 3;// sv3 接 Pin 3
const int every3 = 15;//控制速度,数值越大舵机越慢
unsigned long last3 = 0;
int dir3 = 1;
int pos3 = 90;
void setup() {
   sv3.attach(sv3Pin); // pin3, 故意名稱叫 sv
   Serial.begin(9600);
   sv3.write(pos3);
   Serial.println("Test 2 Serbo");
   delay(10);
}
void loop( ) {
check3( );
}
void check3( ) {
   if(millis( ) - last3 < every3) return; // 還沒到
   last3 = millis( );
   pos3 += dir3;
   sv3.write(pos3);
   if(dir3 == 1){
      if(pos3 >179) dir3 = -1;
   }else{
      if(pos3 < 1) dir3 = 1;
   }
}



我是把这个改造的
不知道能不能同时运行两套程序

Super169 发表于 2015-9-26 00:34:52

word1975 发表于 2015-9-25 21:24 static/image/common/back.gif
改了,还是没啥反应,各一个舵机来回运动的原程序;
#include
Servo sv3; // 建立Servo物件,控制伺服 ...

這個也不行?不可能吧.

那你有沒有試試 arduino IDE 中的範例 knob 及 sweep?
sweep 就是一個擺動的例子.

word1975 发表于 2015-9-26 20:30:14

Super169 发表于 2015-9-26 00:34 static/image/common/back.gif
這個也不行?不可能吧.

那你有沒有試試 arduino IDE 中的範例 knob 及 sweep?


谢谢你的耐心回复哈,解决了,问题出在舵机3和按键3同时用一个接口的问题上,跟换了接口就好了,用扩展板一直没发现,谢谢了哈!

pumpitup 发表于 2015-9-26 21:08:05

word1975 发表于 2015-9-26 20:30 static/image/common/back.gif
谢谢你的耐心回复哈,解决了,问题出在舵机3和按键3同时用一个接口的问题上,跟换了接口就好了,用扩展板 ...

这样,服了哈哈

word1975 发表于 2015-9-26 21:18:49

pumpitup 发表于 2015-9-26 21:08 static/image/common/back.gif
这样,服了哈哈

嘿嘿,就是啊
页: [1] 2
查看完整版本: 其中一个舵机不能往返运动