Arduino控制舵机详解 附代码
作者:项目申报小狂人
Arduino使用C/C++编写程序,虽然C++兼容C语言,但不是C语言。C语言是Arduino语言的一种。早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成。
rduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。由一个欧洲开发团队于2005年冬季开发。其成员包括Massimo Banzi、David Cuartielles、Tom Igoe、Gianluca Martino、David Mellis和Nicholas Zambetti等。
它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。
Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是通过 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,它们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
1. 舵机简介
舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。在需要角度不断变化并可以保持的控制系统中应用广泛。如遥控机械人、飞机模型等。
舵机的转动角度为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。主要有两种引出线的格式:
- 棕、红、橙(棕色连接GND、红色连接VCC、橙色连接信号);
- 红、黑、黄(红色连接VCC、黑色连接GND、黄色连接信号)。
图1 舵机实物图
2 硬件电路连线
Arduino
Arduino | 功能 | 舵机 | 功能 |
VCC | 正极 | 红色 | 正极 |
GND | 负极 | 棕色 | 负极 |
D9(PWM) | 数字引脚(PWM) | 橙色(信号传输) | 信号输入 |
3 项目:舵机来回转动
实现功能:舵机0~180°来回转动。
3.1 控制代码
#include <Servo.h> //加载文件库 int pos = 0; Servo myservo; void setup() { myservo.attach(9, 500, 2500); //修正脉冲宽度 } void loop() { for (pos = 0; pos <= 180; pos += 1) { //pos+=1等价于pos=pos+1 myservo.write(pos); delay(15); } for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } }
3.2 仿真结果
图2 舵机连线及仿真图
4 项目2:光控舵机
实现功能:随着光照强度增加,舵机跟着转动。A0产生的模拟值大于500时,内置的13引脚的可编程LED发光。
4.1硬件电路连线
Arduino
Arduino | 功能 | 舵机 | 功能 |
VCC | 正极 | 红色 | 正极 |
GND | 负极 | 棕色 | 负极 |
D9(PWM) | 数字引脚(PWM) | 橙色(信号传输) | 信号输入 |
A0 | 模拟接口(光敏电阻) |
4.2 控制代码
#include <Servo.h> const int sensorPin = A0; int led=13; int pos = 0; Servo myservo;//创建舵机对象 void setup(){ myservo.attach(9, 500, 2500); pinMode(led,OUTPUT); Serial.begin(9600); } void loop(){ int val=analogRead(sensorPin); if(val>500){ digitalWrite(led,HIGH); } else{ digitalWrite(led,LOW); } int yp=map(val,0,1023,0,180); //数值转换,将[0,1023]产生的模拟值转换成[0,180]中的值 Serial.println(yp); myservo.write(yp); delay(10); }
4.3 仿真结果
图4 光控舵机仿真
5项目3:串口控制舵机和内置LED灯
实现功能如下:
串口输入2,led点亮,同时串口打印“ON”,舵机转动到90°。
串口输入4,led熄灭,同时串口打印“OFF”,舵机转动到180°
#include <Servo.h> int led4=4; int led=13; Servo myservo;//创建舵机对象 void setup(){ myservo.attach(9, 500, 2500); pinMode(led,OUTPUT); pinMode(led4,OUTPUT); Serial.begin(9600); } void loop(){ if(Serial.available()>0){ char c=Serial.read(); if(c=='2'){ digitalWrite(led,HIGH); digitalWrite(led4,HIGH); myservo.write(90); Serial.println("ON"); } else if(c=='4'){ digitalWrite(led,LOW); digitalWrite(led4,LOW); myservo.write(180); Serial.println("OFF"); } } }
5.1仿真结果
图4 串口控制舵机仿真
6 用到的函数解释
- Serial.begin()是串口初始化函数,设置传输速率。
- Serial.println()与Serial.print()的区别在于前者具备换行功能,后者不具备。
- Servo.h是舵机库文件,直接在Aruidno IDE中可以加载。
- Servo myservo为创建对象,本质就是一个名称,myservo可自己命名。
- myservo.attach(9)表示控制舵机的引脚。
- myservo.write(45)表示舵机旋转到45°的位置,而不是旋转了45°。
- map()函数的使用率比较高,将某一区间的值转换为另外区间的值。
语法格式为: val =map(value, fromLow, fromHigh, toLow, toHigh);
val,value为同类型变量,fromHigh与fromLow为变量a的最大与最小值,toHigh与toLow为val变量的最大与最小值。map()函数根据范围比例即可将某一区间的值缩放至另外区间的值,并将值赋予val。
到此这篇关于Arduino控制舵机详解(含代码)的文章就介绍到这了,更多相关Arduino控制舵机内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!