乐动魔块(旧版)-舵机

来自Labplus盛思维基百科
Wujingui讨论 | 贡献2022年9月13日 (二) 15:25的版本 (Wujingui移动页面乐动魔块-舵机乐动魔块(旧版)-舵机,不留重定向)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索
Ledongkit 舵机.png

概述

舵机旋转范围为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和控制信号线

舵机引脚说明.jpg

舵机的控制

舵机的伺服系统由可变宽度的脉冲来进行控制,控制线是用来传送脉冲的。脉冲的参数有最小值,最大值,和频率。一般而言,舵机的基准信号都是周期为20ms,宽度为1.5ms。这个基准信号定义的位置为中间位置。角度是由来自控制线的持续的脉冲所产生。这种控制方法叫做脉冲调制。脉冲的长短决定舵机转动多大角度。例如:1.5毫秒脉冲会到转动到中间位置(对于180°舵机来说,就是90°位置)。当控制系统发出指令,让舵机移动到某一位置,并让他保持这个角度,这时外力的影响不会让他角度产生变化,但是这个是由上限的,上限就是他的最大扭力。除非控制系统不停的发出脉冲稳定舵机的角度,舵机的角度不会一直不变。


舵机控制信号.png
180°舵机控制的PWM信号


注意:不同舵机的脉宽范围会有所不一样,控制时需要留言!
舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:

Servo timing.jpg

使用说明

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);
}

使用Servo库控制舵机

Servo库各函数详细说明可到Arduino官网查阅 https://www.arduino.cc/en/Reference/Servo

Servo库官方示例

/* Sweep
 by BARRAGAN <http://barraganstudio.com>
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Sweep
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

图形化

舵机 11.png