“乐动魔块(旧版)-舵机”的版本间的差异
小 |
小 (Wujingui移动页面乐动魔块-舵机至乐动魔块(旧版)-舵机,不留重定向) |
||
(未显示1个用户的15个中间版本) | |||
第15行: | 第15行: | ||
{| class="wikitable" style="text-align: center;" | {| class="wikitable" style="text-align: center;" | ||
|- | |- | ||
− | ! | + | !MicroUSB接口||说明 |
|- | |- | ||
| <small>GND</small> || <small>地</small> | | <small>GND</small> || <small>地</small> | ||
第21行: | 第21行: | ||
|<small>NC</small> || <small>空</small> | |<small>NC</small> || <small>空</small> | ||
|- | |- | ||
− | |<small>DIN</small> || <small> | + | |<small>DIN</small> || <small>舵机控制信号</small> |
|- | |- | ||
− | |valign="center" align="left" | ● <small>VCC</small> || <small>电源</small> | + | |valign="center" align="left" | ● <small>VCC</small> || <small>电源</small> |
|} | |} | ||
+ | |||
+ | {| class="wikitable" style="text-align: center;" | ||
+ | |- | ||
+ | !舵机连接||说明 | ||
+ | |- | ||
+ | | <small>S</small> || <small>控制信号线(舵机连接线的橙色)</small> | ||
+ | |- | ||
+ | |<small>+</small> || <small>电源(舵机连接线的红色)</small> | ||
+ | |- | ||
+ | |<small>-</small> || <small>地(舵机连接线的棕色)</small> | ||
+ | |} | ||
+ | == 舵机原理 == | ||
+ | {{舵机原理}} | ||
== 使用说明 == | == 使用说明 == | ||
+ | === Arduino控制舵机 === | ||
+ | <pre style="color:blue"> | ||
+ | /************************************************* | ||
+ | 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); | ||
+ | } | ||
+ | </pre> | ||
+ | === 使用Servo库控制舵机 === | ||
+ | Servo库各函数详细说明可到Arduino官网查阅 https://www.arduino.cc/en/Reference/Servo <br/><br/> | ||
+ | <big>Servo库官方示例</big> | ||
+ | <pre style="color:blue"> | ||
+ | /* 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 | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | === 图形化 === | ||
+ | [[文件:舵机 11.png|700px|无框]] |
2022年9月13日 (二) 15:25的最新版本
概述
舵机旋转范围为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); }
使用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 } }