Robofun 機器人論壇

標題: 想請問一下arduino如何控伺服馬達轉速(急)新手 [打印本頁]

作者: nick123    時間: 2016-10-24 20:02
標題: 想請問一下arduino如何控伺服馬達轉速(急)新手
本帖最後由 nick123 於 2016-10-24 21:06 編輯

用app控制了伺服馬達前進後退,想請問如何改良控制馬達轉速  加速或減速
#include <SoftwareSerial.h>
#include <Servo.h>

Servo servoRight;
Servo servoLeft;

char c ;
int ang;
float pos = 90;

void setup(){

  Serial.begin(9600);
  servoRight.attach(8);
  servoLeft.attach(9);


}

void loop(){

  if(Serial.available() >0)
{
  c = Serial.read();

  switch(c){  
    //---
    case'8':ang += 0.1;if(ang>180) ang=180;
    Serial.println("a");

    break;
    case '9':ang -= 0.1;if(ang<0) ang=0;
    Serial.println("b");

    break;  
case '4':                   //前進
     Serial.println("go");
     Up();  
     break;

    case '1':                   //右轉
     Serial.println("Right");
     Right();  

     break;

    case '5':                   //後退
     Serial.println("Back");
     Down();

     break;

     case '2':                   //左轉
     Serial.println("Left");
     Left();  

     break;

    case '3':                   //停止
     Serial.println("Stop");
     stop();
     break;

  }
}
}
int Up(){
  servoRight.writeMicroseconds(1300);
  servoLeft.writeMicroseconds(1300);
}
int Down(){
  servoRight.writeMicroseconds(1700);
  servoLeft.writeMicroseconds(1700);

}
int Right(){
  servoRight.writeMicroseconds(1700);
  servoLeft.writeMicroseconds(1300);
}
int Left(){
  servoRight.writeMicroseconds(1300);
  servoLeft.writeMicroseconds(1700);
}
int stop(){
  servoRight.writeMicroseconds(1500);
  servoLeft.writeMicroseconds(1500);
}
作者: croma    時間: 2016-10-24 22:48
本帖最後由 croma 於 2016-10-24 22:49 編輯

伺服馬達要控制速度?
一般調整你輸出的 PWM 信號的脈衝比例就能調整速度
先確定一下你所使用的伺服馬達是哪一種呢?
看一下馬達的說明書吧 接受PWM信號轉動角度的舵機很多是不能控制速度的
作者: nick123    時間: 2016-10-25 19:37
是用Gws s35 的連續式的馬達 調整脈衝的大小好像可以改變快慢
但不知道 怎麼改成用按鍵式控制加速 減速
作者: croma    時間: 2016-10-25 20:26
那就不難啦~ 這馬達應該是 1500 停止 1300 往前  1700 往後
宣告一個變數叫 speed 在處理 up down 函數的時候調整速度就行了,你可能要限制一下 upSpeed 和 downSpeed 的邊界值,另外在 狀態改變的時候 把另一個參數恢復初始值

int upSpeed = 1300;
int downSpeed = 1700;

int Up(){
  upSpeed -= 100;
  servoRight.writeMicroseconds(upSpeed );
  servoLeft.writeMicroseconds(upSpeed );
}
int Down(){
  downSpeed += 100;
  servoRight.writeMicroseconds(downSpeed );
  servoLeft.writeMicroseconds(downSpeed );

}
作者: croma    時間: 2016-10-25 20:34
回覆 3# nick123


    等等~ 這樣設計好像不太好~ 這樣只能一直往前往後加速~

    改成 只有一個 speed 參數應該會比較好

    按上 speed 參數 -100 按下 speed +100 直到邊界值
    左右應該 根據現在前進的方向 根據 speed 製造速度差才對
作者: nick123    時間: 2016-10-25 21:32
請問 改成一個speed的意思是怎麼改有點不懂   
我的馬達  在執行前進時 案加速減速 兩顆馬達會反轉 是因為沒設邊界值的關西嗎??
謝謝
作者: croma    時間: 2016-10-26 01:40
回復 6# nick123

與邊界值沒什麼關係,邊界值是怕你一直按著把數值加到超過馬達反應的程度
從你的程式碼來看速度
1500 是 停止
1300 是 前進
1700 是 後退

你現在按 上下 就瞬間由 前進變後退 而不是速度的加減速,如果你要控制速度應該是 設定一個變數 初始值 為 1500
按上就減少這個變數 按下 就增加 這個變數
作者: nick123    時間: 2016-10-26 17:14
本帖最後由 nick123 於 2016-10-26 20:21 編輯

所以像是這樣嗎??
#include <SoftwareSerial.h>
#include <Servo.h>

Servo servoRight;
Servo servoLeft;

char c ;
int pin = 1500;

void setup(){

  Serial.begin(9600);
  servoRight.attach(8);
  servoLeft.attach(9);


}

void loop(){

  if(Serial.available() >0)
{
  c = Serial.read();
       switch(c){  

      case '8':                   //前進
     Serial.println("a");
     pinMode(pin, OUTPUT);

     Up1();  
     break;
      case '9':                   //前進
     Serial.println("b");
     digitalWrite(pin, HIGH);     
     Up2();  
     break;

    case '4':                   //前進
     Serial.println("go");
     Up();  
     break;

    case '1':                   //右轉
     Serial.println("Right");
     Right();

     break;

    case '5':                   //後退
     Serial.println("Back");
     Down();

     break;

     case '2':                   //左轉
     Serial.println("Left");
     Left();  

     break;

    case '3':                   //停止
     Serial.println("Stop");
     stop();
     break;

  }
}
}
int Up(){
  servoRight.writeMicroseconds(1300);
  servoLeft.writeMicroseconds(1300);
}
int Down(){
  servoRight.writeMicroseconds(1700);
  servoLeft.writeMicroseconds(1700);

}
int Right(){
  servoRight.writeMicroseconds(1700);
  servoLeft.writeMicroseconds(1300);
}
int Left(){
  servoRight.writeMicroseconds(1300);
  servoLeft.writeMicroseconds(1700);
}
int stop(){
  servoRight.writeMicroseconds(1500);
  servoLeft.writeMicroseconds(1500);
}
int Up1(){
  pin -= 100;
  servoRight.writeMicroseconds(pin );
  servoLeft.writeMicroseconds(pin );
}
int Up2(){
  pin += 100;
  servoRight.writeMicroseconds(pin );
  servoLeft.writeMicroseconds(pin );

}
作者: 超新手    時間: 2016-10-27 09:11
1. 以下兩行是多餘的
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);   
2. 以下兩行的後面要加判斷式 if, 以免 PIN 值加(或減)超過範圍
pin -= 100;
pin += 100;




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2