| 。。 |
|
在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。 舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。 1.舵机与控制原理 2.servo类介绍 servo类下有以下成员函数 attach()//连接舵机 write()//角度控制 writeMicroseconds()// read()//读上一次舵机转动角度 attached()// detach()//断开舵机连接 普通舵机有3根线:GND(黑)、VCC(红)、Signal(黄),一般情况下,我们建议为舵机单独供电,此处实验为了图方便,用arduino为舵机供电。 3.实例1 需要的器材: arduino控制器、舵机、杜邦线若干 首先将舵机如下图连接:
下载以下例程(程序可以在IDE>File>Examples>Servo>Sweep中找到,我只是做个中文介绍) [C++] 纯文本查看 复制代码 #include <Servo.h>
Servo myservo; //创建一个舵机控制对象
// 使用Servo类最多可以控制8个舵机
int pos = 0; // 该变量用与存储舵机角度位置
/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */
void setup()
{
myservo.attach(9); // 该舵机由arduino第九脚控制
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线 ~~~~~~~~~~~~~~~~~~~~~~~~~~ */
void loop()
{
for(pos = 0; pos < 180; pos += 1) // 从0度到180度运动
{ // 每次步进一度
myservo.write(pos); // 指定舵机转向的角度
delay(15); // 等待15ms让舵机到达指定位置
}
for(pos = 180; pos>=1; pos-=1) //从180度到0度运动
{
myservo.write(pos); // 指定舵机转向的角度
delay(15); // 等待15ms让舵机到达指定位置
}
}
4.实例2 需要的器材: arduino控制器、舵机、电位器、杜邦线若干 首先将舵机如下图连接:
下载以下例程(程序可以在IDE>File>Examples>Servo>Knob中找到) [C++] 纯文本查看 复制代码 #include <Servo.h>
Servo myservo;
//创建一个舵机控制对象
int potpin = 0; //该变量用于存储用电位器读出的模拟值
int val;
// 该变量用与存储舵机角度位置
void setup()
{
myservo.attach(9);
// 该舵机由arduino第九脚控制
}
void loop()
{
val = analogRead(potpin); //读取电位器控制的模拟值 (范围在0-1023)
val = map(val, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val);
// 指定舵机转向的角度
delay(15);
// 等待15ms让舵机到达指定位置
}5.其他驱动方法: 用延时写的 [C++] 纯文本查看 复制代码 int sp1=10;//定义舵机接口数字接口7
int pulsewidth;//定义脉宽变量
int val;
int val1;
int myangle1;
//下面是servopulse函数部分(此函数意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)
void servopulse(int sp1,int val1)//定义一个脉冲函数
{
myangle1=map(val1,0,180,500,2480);
digitalWrite(sp1,HIGH);//将舵机接口电平至高
delayMicroseconds(myangle1);//延时脉宽值的微秒数
digitalWrite(sp1,LOW);//将舵机接口电平至低
delay(20-val1/1000);
}
//servopulse函数部分到此结束
void setup()
{
pinMode(sp1,OUTPUT);//设定舵机接口为输出接口
//设置两组串口波特率
Serial.begin(9600);
delay(500);
Serial.println("servu=o_seral_simple ready" ) ;
}
void loop()//将0到9的数转化为0到180角度,并让LED闪烁相应数的次数
{
val=Serial.read();//读取串行端口的值
if(val>'0'&&val<='9')
{
val1=val-'0';//将特征量转化为数值变量
val1=map(val1,0,9,0,180);//将角度转化为500-2480的脉宽值
Serial.print("moving servo to ");
Serial.print(val1,DEC);
Serial.println();
for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
{
servopulse(sp1,val1);//引用脉冲函数
}
}
}转自Arduino中文社区 |

