混成了中级会员,尝试给初学者写个例程(舵机控制方面)
首先,本人的水平是从这里学习来的,一直在本坛索取,混成了中级会员,感觉应该回报一点,至少可以给初学者看看.多路舵机的同时操作,最好是用并口定时器中断方式,可惜本人不会,所以用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 = {0} ;
int mark = 0;
String rcvByte ="";
intservoPins[] = {8,9,10,11};
Servo myServo;
void setup()
{
Serial.begin(38400);
for(int i = 0; i < 4; i++) myServo.attach(servoPins);
}
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 == ',')
{
j++;
}
else
{
numdata = numdata * 10 + (rcvByte - '0');
}
}
rcvByte = String("");
for(int i = 0; i < 4; i++)
{
Serial.print("servo "); //这几句串口输出可以去掉,这是调试时用的.
Serial.print(i);
Serial.print(" = ");
Serial.println(numdata);
myServo.writeMicroseconds(544 + numdata * 7.4);//具体数据来源于SERVO库,7.4=(2400-544)/250,即DIV值!
int leftMs = (int) (t0 + T - micros());
delayMicroseconds(leftMs);
numdata = 0;
}
mark = 0;
}
} 先谢谢大神 你的这个方法是通过接收字符串来控制舵机的 我也做成过用L R DU 这四个字母来控制舵机的左右上下动。现在是要用C# 发送十六进制的1 2 3 4给arduino,再控制舵机动。不是字符串了。 罹凝寒冰 发表于 2013-8-8 14:36 static/image/common/back.gif
先谢谢大神 你的这个方法是通过接收字符串来控制舵机的 我也做成过用L R DU 这四个字母来控制舵机的 ...
你不会把十六进制数当成字符串啊 拾瑞 发表于 2013-8-8 15:48 static/image/common/back.gif
你不会把十六进制数当成字符串啊
C#发送十六进制很容易 可是arduino接收就比较困难 该怎么接收呢?》 正找这个资料,感谢楼主的奉献
页:
[1]