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