“乐动魔块(旧版)-舵机”的版本间的差异
来自Labplus盛思维基百科
小 (→Arduino控制舵机) |
小 (→Arduino控制舵机) |
||
第89行: | 第89行: | ||
− | </ | + | </source> |
2018年3月8日 (四) 14:17的版本
概述
舵机旋转范围为0-180°,它可以接受控制精确旋转到指定的角度,但不可以连续旋转
技术参数
- 工作电压:VCC 5V
- 舵机型号:SG90
- 旋转角度180度
- 工作扭矩1.6KG/CM
- 使用电压3.5-6V
- 反应转速0.12-0.13/60°
- Micro USB接口
- 双层PCB结构及彩色软质外壳保护,避免学生使用时受伤。
- 模块尺寸:23x23mm
引脚定义
MicroUSB接口 | 说明 |
---|---|
GND | 地 |
NC | 空 |
DIN | 舵机控制信号 |
● VCC | 电源 |
舵机连接 | 说明 |
---|---|
S | 控制信号线(舵机连接线的橙色) |
+ | 电源(舵机连接线的红色) |
- | 地(舵机连接线的棕色) |
舵机原理
什么是舵机?
舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度。)与普通直流电机的区别主要在,直流电机是一圈圈转动的,舵机只能在一定角度内转动,不能一圈圈转(数字舵机可以在舵机模式和电机模式中切换,没有这个问题)。普通直流电机无法反馈转动的角度信息,而舵机可以。用途也不同,普通直流电机一般是整圈转动做动力用,舵机是控制某物体转动一定角度用(比如机器人的关节)。
标准的舵机有3条引线,分别是:电源线Vcc、地线GND和控制信号线
舵机的控制
舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。例如:1.5毫秒脉冲会到转动到中间位置(对于180°舵机来说,就是90°位置)。当控制系统发出指令,让舵机移动到某一位置,并让他保持这个角度,这时外力的影响不会让他角度产生变化,但是这个是由上限的,上限就是他的最大扭力。除非控制系统不停的发出脉冲稳定舵机的角度,舵机的角度不会一直不变。
180°舵机控制的PWM信号 |
注意:不同舵机的脉宽范围会有所不一样,控制时需要留言!
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:
使用说明
Arduino控制舵机
/*************************************************
Copyright:wiki.labplus.cn
Author:tangliufeng
Date:Mar 2018
Description:通过串口接收舵机角度,控制舵机的示例
**************************************************/
#define Servo_Pin 7 //定义舵机引脚
String Angle_In = "";
int Angle_INT;
void setup()
{
pinMode(Servo_Pin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
while (Serial.available() > 0)
{
Angle_In += char(Serial.read());
delay(2);//为了防止数据丢失,在此设置短暂延时delay(2)
}
if (Angle_In.length() > 0)
{
Angle_INT = Angle_In.toInt();//转化成INT型数值
Serial.println(Angle_INT);
Angle_In = "";
}
ServoPulse(Angle_INT);
}
void ServoPulse(int angle)//定义一个脉冲函数
{
int angle1 = map(angle, 0, 180, 500, 2500); //不同舵机的脉冲范围会有不同,可调节最大最小脉宽
digitalWrite(Servo_Pin, HIGH);//将舵机接口电平至高
delayMicroseconds(angle1);//延时脉宽值的微秒数
digitalWrite(Servo_Pin, LOW);//将舵机接口电平至低
delay(20 - angle1 / 1000);
}