【SG90舵机】arduino uno控制SG90舵机
这里写自定义目录标题
- SG90舵机硬件
- arduino uno 简单控制SG90舵机
- 硬件连接arduino uno
- Arduino IDE代码
- arduino uno 可视化电位器控制SG90舵机
- 电位器
- 硬件连接arduino uno
- Arduino IDE代码(通过Servo库)
- Arduino IDE代码(不通过Servo库)
老样子,重拾csdn记录博文,存档记录自己电机舵机的硬件软件研究过程,以便之后鱼的记忆忘了的时候使用读档之术复刻现在的行动
SG90舵机硬件
参考链接.
懒得上图了,想看去看参考链接,一般找到这里的手上都会有这个东西的实物
首先这个舵机的三根线,接线方法:
红-------------------------VCC
棕色----------------------GND
橙色----------------------信号线
这玩意的控制原理这里就不说了,我自己也没研究明白,这篇博文主要是用于打通arduino uno到SG90舵机的控制流程,具体的原理请各位移步各种频道
(我不了解原理)
arduino uno 简单控制SG90舵机
硬件连接arduino uno
三根线连接到uno的对应位置,VCC连接到5v,gnd连接到gnd,信号线连接到9号引脚(~9,这个带波浪线的九号,波浪线代表这个引脚是pwm口)(别问我什么是pwm,自行学习谢谢啦)
接线如图所示
Arduino IDE代码
#include <Servo.h>//调用库函数
Servo me; //设置舵机名称
void setup() {
me.attach(9); // 设置控制引脚
//当然,这里引脚改成别的pwm引脚也没问题,但是需要记得改这里的9为你连接的引脚号
//亲,记得看代码注释哦
//当然,不看也无所谓2333
}
void loop() {
for (int i=0;i++;i<180){
me.write(i);//设置旋转角度
delay(5);
}
for (int i=180;i--;i>=0){
me.write(i);//设置旋转角度
delay(5);
}
}
然后烧录到板子上,舵机就能(开环)运动了
(开环,是指给舵机一个角度,让它自己到那个角度,但是什么时候到,现在转到什么角度什么的都无法控制)(与之对应的是闭环,但那得看看我能不能找到闭环控制教程)(寻找稚辉君.jpg)
arduino uno 可视化电位器控制SG90舵机
电位器
这玩意,学名电位器,但我更想叫他旋钮
总之这个东西也有个VCC,GND,和信号线OUT
硬件连接arduino uno
首先这里硬件连接有所改变,因为我发现ardunio uno好像只有一个5V的引脚电源供电,而这俩玩意(电位器,舵机)都需要5v供电
所以这时候就需要面包板了
面包板使用参考链接.
将ardunio uno 的5v还有gnd连接到面包板上,然后舵机和电位器就从面包板上获取5v和gnd
然后sg90舵机的信号线还是连接到9号引脚,电位器的out连接到arduino uno 的a0引脚(感觉A0~A5应该都可以,但是目前还不知道这几个跟pwm引脚有什么区别,顺带一提,不带波浪线的引脚我也不知道叫什么)
总之,接线如图所示
大概理解下就好
Arduino IDE代码(通过Servo库)
参考链接
【Arduino入门14:SG90最常用的舵机,如何使用,制作机械臂必备知识点】
#include <Servo.h>//调用库函数
Servo me; //设置舵机名称
int val=0;
int SG=0;
void setup() {
me.attach(9); // 设置控制引脚
Serial.begin(115200);
}
void loop() {
val=analogRead(A0);
SG=map(val,0,1023,0,180);
// 电位器控制舵机
Serial.print("sg90 ");
Serial.println(SG);
me.write(SG);//设置旋转角度
delay(5);
}
这里使用了Serial.println来通过串口打印输出,与之对应的是需要在setup里面设置波特率
不设置波特率的话就无法从arduino 的ide的串口监视器里面看见输出的角度信息
然后使用过程就是旋转电位器就能看见舵机旋转
Arduino IDE代码(不通过Servo库)
参考链接
【5分钟入门了解RC伺服电机SG90控制原理及在Arduino的使用(无依赖库)】
#define Servo_Pin 9
#define Pot_Pin A0
void setup() {
// put your setup code here, to run once:
pinMode(Servo_Pin, OUTPUT);
pinMode(Pot_Pin, INPUT);
}
void PWMServo(int angleArg){
if (angleArg<0)angleArg=0;
if (angleArg>180)angleArg=180;
int PWMWidth=(angleArg *11)+500;
//好家伙这教程直接从pwm高低电平控制,nb
digitalWrite(Servo_Pin,HIGH);
delayMicroseconds(PWMWidth);
digitalWrite(Servo_Pin,LOW);
delayMicroseconds(20000-PWMWidth);
}
void loop() {
// put your main code here, to run repeatedly:
int pot = analogRead(Pot_Pin);
int angleNum= map(pot,0 ,1023,0,180);
PWMServo(angleNum);
}