其中一个舵机不能往返运动
先看代码#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号舵机)
发生模块就触发并且模拟恐龙叫声,然后闭上嘴巴,尾巴继续摇。
现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。代码里面是哪里出了错呢,编译时时没有显示错误!
单独运行摇尾巴的动作没问题,让他一直摇尾巴都可以,求高人解救啊! 大家好像不喜歡用 serial debug.
這樣的問題, 加幾句 debug code 不就可以清楚了嗎?
程式總不可能一開始就完全沒錯的, 除非你的 serial 有別的用途, 否則習慣加入 debug code 可以省去很多時間.
如果尾巴沒擺動, 就在最尾的 code block 加入 debug message, 看看那裡出問題吧. Super169 发表于 2015-9-22 18:11 static/image/common/back.gif
大家好像不喜歡用 serial debug.
這樣的問題, 加幾句 debug code 不就可以清楚了嗎?
能具体点不呢?不是很明白你的意思,谢谢 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 就可以了.
這都是很基本的除蟲方法, 你可以看看別人的庫, 當中可能也有不少用作除蟲的指令的.
Super169 发表于 2015-9-23 22:47 static/image/common/back.gif
比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"
那就針對擺尾的部 ...
这样的结果,显示ALL LOW 就是不显示val2 ,val3 ,val4 的数值
Super169 发表于 2015-9-23 22:47 static/image/common/back.gif
比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"
那就針對擺尾的部 ...
难道是没有读取val2,Vai3,val4 的数值?又或者不应该用HIGH LOW 指令,该用<>指令,明天试试看
流程上有點奇怪....
一定要經過 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 的值.
就是啊,应该就是出差错就是这里 Super169 发表于 2015-9-24 00:01 static/image/common/back.gif
流程上有點奇怪....
一定要經過 serial.print val2, val3, val4 才會到達之後的 All Low, 怎可能沒出現 va ...
就是啊,应该就是这些出了差错,改了很多次了,应该是哪儿没定义好,我把所有后面的程序删除了,留前面的定义,还是不能动,而用以前的源程序就可以动,谢谢你了哈! 本帖最后由 Super169 于 2015-9-25 00:28 编辑
有少少提議, 你現在是 5ms 就改變角度一次, 雖然只是一度的差距, 但不知你的電機反應如何.
可以試下改成 每 15-20ms 走一度 (every3 = 20), 先看看是否可以慢速擺動.
至於為何沒到出 val 的值, 可能是關鍵, 程式的流程有錯.但這麼細小的程式, 不可能用盡記憶體吧. 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;
}
}
我是把这个改造的
不知道能不能同时运行两套程序 word1975 发表于 2015-9-25 21:24 static/image/common/back.gif
改了,还是没啥反应,各一个舵机来回运动的原程序;
#include
Servo sv3; // 建立Servo物件,控制伺服 ...
這個也不行?不可能吧.
那你有沒有試試 arduino IDE 中的範例 knob 及 sweep?
sweep 就是一個擺動的例子. Super169 发表于 2015-9-26 00:34 static/image/common/back.gif
這個也不行?不可能吧.
那你有沒有試試 arduino IDE 中的範例 knob 及 sweep?
谢谢你的耐心回复哈,解决了,问题出在舵机3和按键3同时用一个接口的问题上,跟换了接口就好了,用扩展板一直没发现,谢谢了哈! word1975 发表于 2015-9-26 20:30 static/image/common/back.gif
谢谢你的耐心回复哈,解决了,问题出在舵机3和按键3同时用一个接口的问题上,跟换了接口就好了,用扩展板 ...
这样,服了哈哈 pumpitup 发表于 2015-9-26 21:08 static/image/common/back.gif
这样,服了哈哈
嘿嘿,就是啊
页:
[1]
2