【SG90舵机】arduino uno控制SG90舵机

发布于:2025-03-24 ⋅ 阅读:(152) ⋅ 点赞:(0)

老样子,重拾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);


}


网站公告

今日签到

点亮在社区的每一天
去签到