首先,本人的水平是从这里学习来的,一直在本坛索取,混成了中级会员,感觉应该回报一点,至少可以给初学者看看.
多路舵机的同时操作,最好是用并口定时器中断方式,可惜本人不会,所以用ARDUINO写了(抄)一个”伪“同时操作多路舵机程序,试验下来,效果还是可以的,不多说,上菜啦........
/---------------------------------------------------------------------------------------------------------------------------------------------------------
//串口接收命令方式:"x1,x2,x3,x4,",其中xy为0-225之间的整数(我的烂货舵机不能满量程0-250),注意每个数字后面要加逗号//
//PWM引脚8,9,10,11分别对应SERVO 0,1,2,3四个舵机,并且分别与X1,X2,X3,X4四个控制字对应//
//SERVO库舵机刷新率已由50HZ,改为200HZ;注改为400HZ时我的舵机抖舵,可能数字舵机在400HZ刷新时是不会抖的.//
//代码大部份是来源于本论坛的大神们,感谢他们!//
/---------------------------------------------------------------------------------------------------------------------------------------------------------
#include <Servo.h>
int numdata[4] = {0} ;
int mark = 0;
String rcvByte ="";
int servoPins[] = {8,9,10,11};
Servo myServo[4];
void setup()
{
Serial.begin(38400);
for(int i = 0; i < 4; i++) myServo[i].attach(servoPins[i]);
}
void loop()
{
int j = 0;
// Serial.println("input 0-250:");
long t0 = micros();
double T = 2400; //数据源自SERVO库
while(Serial.available())
{
rcvByte += char(Serial.read());
delay(5);
mark = 1;
}
if(mark == 1)
{
//Serial.println(rcvByte);
//Serial.println(rcvByte.length());
for(int i = 0; i < rcvByte.length() ; i++)
{
if(rcvByte[i] == ',')
{
j++;
}
else
{
numdata[j] = numdata[j] * 10 + (rcvByte[i] - '0');
}
}
rcvByte = String("");
for(int i = 0; i < 4; i++)
{
Serial.print("servo "); //这几句串口输出可以去掉,这是调试时用的.
Serial.print(i);
Serial.print(" = ");
Serial.println(numdata[i]);
myServo[i].writeMicroseconds(544 + numdata[i] * 7.4); //具体数据来源于SERVO库,7.4=(2400-544)/250,即DIV值!
int leftMs = (int) (t0 + T - micros());
delayMicroseconds(leftMs);
numdata[i] = 0;
}
mark = 0;
}
} |