Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 11385|回復: 5

arduino怎麼控制伺服馬達轉速?

[複製鏈接]
發表於 2015-12-13 23:34:39 | 顯示全部樓層 |閱讀模式
我有一個問題,我用藍芽+arduino+伺服馬達,想用藍芽控制伺服馬達,我的寫法比較簡單用app做三個按鈕這樣就能從0轉到180度,然後在將第三個鍵用deatach()中斷,讓它停止,可是馬達轉動的速度太快了,人的手按下去之後到它停止,都沒辦法停在想要的位子,想請問有什麼辦法可以讓伺服馬達的轉速變慢?





#include<SoftwareSerial.h>
#include <Servo.h>
Servo myservo;

SoftwareSerial BT (3,2);
char command;

int ang = 90;



void setup()
{
  BT.begin(9600);
myservo.attach(9);
  myservo.write(90);
}
void loop()
{

  if(BT.available()>0)
{
  command=BT.read();
  switch(command)
{
  case'a':
       myservo.write(0);              // tell servo to go to position in variable 'pos'


   break;

case'd':
myservo.write(180);
break;

case'x':ang += 1;if(ang>180) ang=180;
myservo.write(ang);delay(40);
break;

case 'w':
ang -= 1;if(ang<0) ang=0;
myservo.write(ang);delay(40);
break;
}
}   
}
發表於 2015-12-14 06:08:49 | 顯示全部樓層
方法很多
最簡單的方法是
把 ang 宣告成浮點數
然後收到 x(或w)時
把ang 加(減) 0.1
如果速度太快或太慢,再自己調整
 樓主| 發表於 2015-12-14 17:06:47 | 顯示全部樓層
這是我現在的程式,已經可以慢慢轉了,可是又有新的問題,detach()指令不能在旋轉的中途發揮中斷的作用,想請問要怎麼改比較好   很急   拜託
#include<SoftwareSerial.h>
#include <Servo.h>
Servo myservo;

SoftwareSerial BT (3,2);
char command;

float pos = 90;



void setup()
{
  BT.begin(9600);
myservo.attach(9);
  myservo.write(90);
}
void loop()
{

  if(BT.available()>0)
{

  command=BT.read();
  myservo.attach(9);
  switch(command)
{
  case'a':
    {
      for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees
  {                                  // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(25);                       // waits 25ms for the servo to reach the position
  }  
    }
    myservo.write(pos);
    break;

case'd':
    {
    for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(25);                       // waits 25ms for the servo to reach the position
  }
    }
    myservo.write(pos);
    break;

case'x':
myservo.detach();
break;

}
}   
}
發表於 2015-12-14 17:28:52 | 顯示全部樓層
這樣做..整個程式會卡在那個FOR 迴圈長達 5 秒
一直 ATTCH 又 DEATCH 的, 真的有點問題
還是原來的架構比較好...
如果硬要改, 應該是在兩個 FOR 迴圈中
for(pos = 180; pos>=0; pos-=1)
for(pos = 0; pos <= 180; pos += 1)
再去檢查一次if(BT.available()>0)
如果讀出來是 X, 就去 detach, 並且跳出......
不過....真的超級超級超級超級不建議改成這樣......
 樓主| 發表於 2015-12-14 18:45:10 | 顯示全部樓層
我剛剛測試過了,是傳出x沒錯,但是detach()沒反應,對不起我真的是一個新手,可以幫我改一下嗎?
我試了好久還是沒辦法同時做到慢慢轉然後轉到我要的地方按停,然後停在我要的地方
真的很抱歉,請你幫幫我
發表於 2015-12-14 20:29:44 | 顯示全部樓層
其實你第一次貼的程式, 只要改三行就可以了
1)float ang = 90;
2)case'x':ang += 0.1;if(ang>180) ang=180;
3)ang -= 0.1;if(ang<0) ang=0;

後面你改的, 雖然可以動
其實整個架構是不對的, 也很難改
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-4-19 06:53 , Processed in 0.309264 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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