“舵机驱动”的版本间的差异

来自Microduino Wikipedia
跳转至: 导航搜索
原理
程序
第32行: 第32行:
  
 
== 程序 ==
 
== 程序 ==
 +
<source lang="cpp">
 +
int  servoPin=13;  //servo control pin
 +
int  inputPin=14;  //read the voltage value of the potentiometer
 +
int voltage;
 +
// Define a pulse function
 +
// period:20ms    pulsewidth 0.5-2.5ms = 0-180 angle
 +
void servoPulse(int pin,int angle)
 +
{
 +
  int  pulseWidth=map(angle,0,180,500,2500);
 +
  digitalWrite(pin,HIGH);//set servo port HIGH
 +
  delayMicroseconds(pulseWidth);
 +
  digitalWrite(pin,LOW);//set servo port LOW
 +
  delayMicroseconds(20000-pulseWidth);
 +
}
 +
void setup()
 +
{
 +
  pinMode(servoPin,OUTPUT);
 +
  pinMode(inputPin,INPUT_ANALOG);
 +
}
 +
void loop()
 +
{
 +
  voltage=analogRead(inputPin); 
 +
  int angle=map(voltage,0,4096,0,180);
 +
  SerialUSB.println(angle);
 +
  servoPulse(servoPin,angle);
 +
  delay(10);
 +
}
 +
</source>
 +
程序说明:
 +
*servoPulse(int pin,int angle) 产生不同脉宽的PWM波形。把0-180角度映射到0.5ms-2.5ms的脉宽上,脉宽不同多盘的位置不同。
 +
 
== 调试 ==
 
== 调试 ==
 
== 结果 ==
 
== 结果 ==
 
== 视频 ==
 
== 视频 ==

2015年1月26日 (一) 11:48的版本

目的

最近几年国内机器人开始起步发展,很多高校、中小学都开始进行机器人技术教学。小型的机器人、模块化的机器人、组件式的机器人是教学机器人的首选。在这些机器人产品中,舵机是最关键,使用最多的部件。

根据控制方式,舵机应该称为微型伺服马达。早期在模型上使用最多,主要用于控制模型的舵面,所以俗称舵机。舵机接受一个简单的控制指令就可以自动转动到一个比较精确的角度,所以非常适合在关节型机器人产品使用。仿人型机器人就是舵机运用的最高境界。

本讲将大家用Microduino-CoreSTM32驱动一个舵机。

设备

Microduino-CoreSTM32是采用 STM32F103CBT6芯片的ARM开发板,采用独特的Upin7接口,大小与一枚一元硬币差不多大,完全兼容Microduino其他扩展模块。

  • 其他硬件设备
  • 面包板跳线 一盒
  • 面包板 一块
  • 3线电位器 一个
  • 舵机 一个
  • USB数据连接线 一根

原理

电位器

电位器是具有三个引出端、阻值可按某种变化规律调节的电阻元件。电位器通常由电阻体和可移动的电刷组成。当电刷沿电阻体移动时,在输出端即获得与位移量成一定关系的电阻值或电压。电位器的作用是调节电压(含直流电压与信号电压)和电流的大小,本课通过电位器调节电压的大小来控制舵机转动的角度。

舵机

这讲采用的舵机为辉盛 SG90舵机,其外形图如下所示。图中红线为为正,棕色为负,橙色为信号线。

机的控制信号为周期20ms的脉宽调制信号(PWM),其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。也就是说, 给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎么变化,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。 舵机内部有一个基准电路,产生周期20ms、宽度1.5ms的基准信号,有一个比较器将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。

原理图

程序

int  servoPin=13;  //servo control pin
int  inputPin=14;  //read the voltage value of the potentiometer 
int voltage;
// Define a pulse function
// period:20ms     pulsewidth 0.5-2.5ms = 0-180 angle
void servoPulse(int pin,int angle)
{
  int  pulseWidth=map(angle,0,180,500,2500);
  digitalWrite(pin,HIGH);//set servo port HIGH 
  delayMicroseconds(pulseWidth);
  digitalWrite(pin,LOW);//set servo port LOW 
  delayMicroseconds(20000-pulseWidth);
}
void setup()
{
   pinMode(servoPin,OUTPUT);
   pinMode(inputPin,INPUT_ANALOG);
}
void loop() 
{
   voltage=analogRead(inputPin);  
   int angle=map(voltage,0,4096,0,180); 
   SerialUSB.println(angle);
   servoPulse(servoPin,angle);
   delay(10);
}

程序说明:

  • servoPulse(int pin,int angle) 产生不同脉宽的PWM波形。把0-180角度映射到0.5ms-2.5ms的脉宽上,脉宽不同多盘的位置不同。

调试

结果

视频