极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24546|回复: 15

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

[复制链接]
发表于 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号舵机)
发生模块就触发并且模拟恐龙叫声,然后闭上嘴巴,尾巴继续摇。  
现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。代码里面是哪里出了错呢,编译时时没有显示错误!
单独运行摇尾巴的动作没问题,让他一直摇尾巴都可以,求高人解救啊!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-9-22 18:11:31 | 显示全部楼层
大家好像不喜歡用 serial debug.

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

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

使用道具 举报

 楼主| 发表于 2015-9-23 20:05:47 | 显示全部楼层
Super169 发表于 2015-9-22 18:11
大家好像不喜歡用 serial debug.

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

能具体点不呢?不是很明白你的意思,谢谢
回复 支持 反对

使用道具 举报

发表于 2015-9-23 22:47:14 | 显示全部楼层
word1975 发表于 2015-9-23 20:05
能具体点不呢?不是很明白你的意思,谢谢

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

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

例如:


  1. Serial.print(val2);
  2. Serial.print(" : ");
  3. Serial.print(val3);
  4. Serial.print(" : ");
  5. Serial.println(val4);
  6. if(val2==LOW&&val3==LOW&&val4==LOW)

  7.    Serial.println("All LOW");
  8.    if(millis( ) - last3 < every3) return; // 還沒到
  9.    last3 = millis( );
  10.    pos90 += dir3;
  11.    Serial.print("Go ");
  12.    Serial.println(pos90);
  13.    sv3.write(pos90);
  14.    if(dir3 == 1){
  15.       if(pos90 >179) dir3 = -1;
  16.    }else{
  17.       if(pos90 < 1) dir3 = 1;
  18.    }
  19. }
复制代码


先看看是否有顯示 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 就可以了.
這都是很基本的除蟲方法, 你可以看看別人的庫, 當中可能也有不少用作除蟲的指令的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 23:37:45 | 显示全部楼层
Super169 发表于 2015-9-23 22:47
比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"

那就針對擺尾的部 ...



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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-23 23:40:55 | 显示全部楼层
Super169 发表于 2015-9-23 22:47
比方說, 你現在的問題, 是 "现在就是尾巴只有在通电的瞬间动一下,然后一直不动了。"

那就針對擺尾的部 ...

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

使用道具 举报

发表于 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 的值.

回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-24 23:28:17 | 显示全部楼层
就是啊,应该就是出差错就是这里
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-24 23:33:28 | 显示全部楼层
Super169 发表于 2015-9-24 00:01
流程上有點奇怪....
一定要經過 serial.print val2, val3, val4 才會到達之後的 All Low, 怎可能沒出現 va ...

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

使用道具 举报

发表于 2015-9-25 00:27:33 | 显示全部楼层
本帖最后由 Super169 于 2015-9-25 00:28 编辑

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

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

使用道具 举报

 楼主| 发表于 2015-9-25 21:24:27 | 显示全部楼层
Super169 发表于 2015-9-25 00:27
有少少提議, 你現在是 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;
   }
}



我是把这个改造的
不知道能不能同时运行两套程序
回复 支持 反对

使用道具 举报

发表于 2015-9-26 00:34:52 | 显示全部楼层
word1975 发表于 2015-9-25 21:24
改了,还是没啥反应,各一个舵机来回运动的原程序;
#include
Servo sv3; // 建立Servo物件,控制伺服 ...

這個也不行?  不可能吧.

那你有沒有試試 arduino IDE 中的範例 knob 及 sweep?
sweep 就是一個擺動的例子.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-26 20:30:14 | 显示全部楼层
Super169 发表于 2015-9-26 00:34
這個也不行?  不可能吧.

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

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

使用道具 举报

发表于 2015-9-26 21:08:05 | 显示全部楼层
word1975 发表于 2015-9-26 20:30
谢谢你的耐心回复哈,解决了,问题出在舵机3和按键3同时用一个接口的问题上,跟换了接口就好了,用扩展板 ...

这样,服了哈哈
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-26 21:18:49 | 显示全部楼层
pumpitup 发表于 2015-9-26 21:08
这样,服了哈哈

嘿嘿,就是啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 16:26 , Processed in 0.070835 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表