Arduino控制舵机

参考

伺服电机如何工作

原文地址:https://www.jameco.com/Jameco/workshop/howitworks/how-servo-motors-work.html
在这里插入图片描述
在这里插入图片描述

这个小马达效率高, 功率大

伺服电机已经存在了很长一段时间, 并被用于许多应用中。它们体积虽小, 但打孔很大, 并且非常节能。这些功能使它们可用于操作遥控或无线电遥控玩具车, 机器人和飞机。伺服电机还用于工业应用, 机器人技术, 在线制造, 制药和食品服务中。但是小家伙如何工作?

伺服电路内置在电机内部, 并具有可定位的轴, 该轴通常装有齿轮(如下所示)。电动机由电信号控制, 该电信号确定轴的运动量。

伺服器内部是什么?

为了完全理解伺服系统的工作原理, 您需要仔细研究一下引擎盖。里面有一个非常简单的设置:一个小型[直流电动机], [电位计]和一个控制电路。电机通过齿轮固定在控制轮上。随着电机旋转, 电位器的电阻发生变化, 因此控制电路可以精确地调节运动量和方向。

当电动机的轴是在所希望的位置时, [电源]供应到电动机被停止。如果不是, 则将电动机转向适当的方向。所需位置通过电脉冲通过[信号线发送]。电动机的速度与实际位置和所需位置之间的差异成正比。因此, 如果电动机在所需位置附近, 它将缓慢旋转, 否则将快速旋转。这称为**比例控制。**这意味着电机只会按照需要完成的工作而努力运行, 这是一个非常有效率的小家伙。

伺服如何控制?

在这里插入图片描述
通过通过控制线 发送可变宽度或脉冲宽度调制(PWM)的电脉冲来控制伺服。有最小脉冲, 最大脉冲和重复率。伺服电机通常只能在任一方向上旋转90°, 以实现总共180°的运动。电动机的空档位置定义为伺服系统在顺时针或逆时针方向上具有相同的潜在旋转量的位置。发送到电动机的PWM根据通过控制线发送的脉冲的持续时间确定轴的位置;该[转子]将转到所需位置。伺服电机期望每20毫秒(ms)看到一个脉冲, 而脉冲的长度将决定电机旋转多远。例如, 一个1.5ms的脉冲将使电动机转到90°位置。短于1.5毫秒将其沿逆时针方向移至0°位置, 长于1.5毫秒将使伺服器沿顺时针方向移至180°位置。
在这里插入图片描述
可变脉冲宽度控制伺服位置

当命令这些伺服器移动时, 它们将移动到该位置并保持该位置。如果在伺服器保持某个位置的同时有外力压在伺服器上, 则伺服器将阻止其移出该位置。伺服器可以施加的最大力称为伺服器的扭矩额定值。Servos不会永远保住自己的位置;必须重复位置脉冲以指示伺服器保持在原位。

伺服电机类型

伺服电机有两种类型:交流和直流。交流伺服可以处理更高的电流浪涌, 并且倾向于用于工业机械中。[直流伺服]不是为高电流浪涌而设计的, 通常更适合于较小的应用。一般而言, 直流电动机比交流电动机便宜。这些也是专门为连续旋转而制造的伺服电机, 这是使机器人运动的简便方法。它们在输出轴上带有两个滚珠轴承, 以减少摩擦, 并易于使用静止点调节电位计。

伺服电机应用

伺服系统用于无线电控制飞机中, 以定位控制表面, 例如电梯, 方向舵, 机器人行走或操作**抓具。**伺服电机体积小, 具有内置控制电路, 并且具有适合其尺寸的良好功率。

在食品服务和药品中, 该工具设计用于较苛刻的环境, 因为在高压和高温下反复清洗以保持严格的卫生标准, 因此腐蚀的可能性很高。Servos还用于在线制造中, 在这种情况下, 需要高重复性和精确的工作。

当然, 您不必知道伺服系统是如何工作的, 但是与大多数电子设备一样, 您越了解, 就越有机会为扩展项目敞开大门。和项目的能力。无论您是建筑机器人的业余爱好者, 还是设计工业系统的工程师, 或者只是不断好奇, 伺服电机会将您带往何处?

如何使用ServoTimer2库(简单说明)伺服扫描

原文地址:https://www.hackster.io/ashraf_minhaj/how-to-use-servotimer2-library-simple-explain-servo-sweep-512fd9

介绍

我最近一直在尝试制作人形机器人-这意味着要处理伺服电机。在我尝试使机器人成为TALK之前, 一切工作都一样好。当我需要使用TMRpcm库时。但是有些像

#TMRpcm.h
#VirtualWire.h

是使用Arduino的Timer1的库。看来您不能同时使用两个使用相同计时器的设备…因此, 如果我的机器人讲话-伺服器不起作用。因为Servo.h和TMRpcm都可以在Arduino TImer1上使用。真是一团糟。如果要使它们都工作, 则必须使用另一个用于伺服的库。哪个是ServoTimer2库?它在Arduino上使用了Timer2 …不幸的是, 在互联网上, 我没有找到任何教程来了解ServoTimer2库的实际工作方式以及如何在代码中使用它。因此, 我决定制作一个教程, 以便像我这样的人可以更好地理解。我们将在该库中使用一个伺服电机, 并编写一个简单的伺服扫描代码

步骤1:零件和组装:

在这里插入图片描述
在这里插入图片描述
主要部分是伺服电动机。

我使用的是微型伺服SG90, 任何型号都可以。

然后像图2中一样拿起伺服臂并将其粘贴在硬纸板上(这只是为了获得良好的可见度)。

步骤2:下载ServoTimer2库并将其添加到Arduino

在这里插入图片描述
首先, 您必须从这里https://github.com/nabontra/ServoTimer2下载该库并将其粘贴到Arduino库文件夹中。

然后从库文件夹转到草图>包含库>添加zip.file。

现在您可以开始了。

步骤3:建立简单电路

在这里插入图片描述
在这里插入图片描述
这是最简单的部分

  • 伺服红线连接到Arduino vcc(5v)

  • 灰色-Gnd

  • 橙色数字6

注意:由于我们仅使用一个没有任何负载的伺服器, 因此可以从Arduino 5v为伺服器供电。当您将伺服器用于带有更多传感器的其他项目时, 请勿使用Arduino 5v源为伺服器供电。什么都不会燃烧, 只是项目不会运行。

步骤4:代码。

在我们了解ServoTimer2代码之前, 让我们回顾一下Servo.h库扫描。

(电动机将从0度旋转到90度-等待1秒-然后旋转到180度-等待1秒)

#include<Servo.h>
Servo servo1;
void setup() 
{
servo1.attach(6);   // put your setup code here, to run once
}
void loop() 
{  // put your main code here, to run repeatedly:
servo1.write(0);
delay(1000);
servo1.write(90);
delay(1000);
servo1.write(180);
delay(1000);
}

在该库中可以看到, 如果我们希望将Servo旋转到某个位置, 我们只需要编写度数即可, 而Servo就可以转动了。但是在ServoTimer2库中, 我们必须编写伺服器的Pulsewidth, 然后伺服器使用该脉冲宽度移动到该位置。最常见的1500表示90度。最大脉冲宽度为2250, 最小为750。这意味着750表示0度, 2250表示180度。但是, 我要告诉您, 这随伺服系统的不同而不同。只需输入您的数值, 看看会发生什么。不必担心这会不会破坏或损害您的伺服电机。

现在, 我将为ServoTimer 2编写相同的代码, 因此您将了解到实际的区别。

#include"ServoTimer2.h"
ServoTimer2 servo1;
void setup() 
{
servo1.attach(6);   
}
void loop() 
{                 // put your main code here, to run repeatedly:
servo1.write(750);  //min pulse width for 0 degree
delay(1000);
servo1.write(1500);  //pulse width for 90 degree
delay(1000);
servo1.write(2250);  //max pulse width for around 180 degree
delay(1000);
}

现在, 只需给arduino供电, 然后以度刻度查看该伺服旋转的角度值。通过这样做, 您可以使您的项目继续进行。Happy Making.o 2700可以完成它。

第5步:最后接通Arduino的电源并进行实验

在这里插入图片描述
在这里插入图片描述

现在, 只需给arduino供电, 然后以度刻度查看该伺服旋转的角度值。并购买这样做, 可以使您的项目继续进行。制作愉快。

原理图

ServoTimer2电路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJeeQ8p9-1617865330209)(C:%5CUsers%5CAdministrator%5CPictures%5Ctypora%5C20210408135003442.PNG)]

Arduino在Zipwhip TextSpresso上手动控制伺服

原文地址:https://www.zipwhip.com/blog/manual-control-of-a-servo-on-the-arduino-for-the-zipwhip-textspresso-machine/
无需使用Arduino舵机库即可控制舵机。

Arduino有一个很棒的舵机库, 但是我们在制造TextSpresso机器时发现舵机库不能与我们的步进电机配合使用。我们很高兴将步进电机连接到针脚2到9, 因为我们使用的是步进电机护罩。然后, 我们将舵机连接到更高的引脚号, 例如26和27。每当我们向步进器发送命令时, 我们都会感到沮丧, 这会导致舵机发生大的回转。

这让我们调查了正在发生的事情, 并且要做到这一点, 我们必须在舵机库的掩盖下进行挖掘。没有多少新手知道Arduino的定时器功能。舵机库使我们远离了棘手的细节。好吧, 事实证明, 舵机库依赖于计时器回调来获得舵机的精确控制。这个回调意味着Arduino在回调发生的那一刻无法处理任何其他代码。如果Arduino繁忙, 那么在发送到舵机的脉冲的确切时序上, 所有的地狱之举都会丢失。

Servos希望有20毫秒(ms)的脉冲。要将舵机设置为零度, 请在20 ms脉冲的第一ms中向其发送高电压。要将舵机设置为180度, 请在20毫秒脉冲的第一个2毫秒内向其发送一个高电压。实际上很容易。在1.0毫秒至2.0毫秒之间的任何位置, 您可以得到0到180之间的不同程度。

我们在下面编写了示例代码, 以帮助您手动控制舵机。它只需要一个毫秒值, 然后将其发送到舵机, 然后在剩余的脉冲时间内暂停。我实际上不确定Arduino IDE为什么不给出这样的手动示例, 因为它很容易做到。我们也无法在Internet上找到用于“ Arduino上的手动舵机控制”的任何示例代码。希望对您有所帮助。

//手动舵机控制
// Zipwhip版权所有2012。
//您可以在自己的软件中自由使用和修改此代码。

#define SERVO_PIN 39   // Arduino或Mega上的任何引脚都可以使用。

void setup()
{
  pinMode(SERVO_PIN, OUTPUT);

}

int lenMicroSecondsOfPeriod = 20 * 1000; // 20毫秒(int ) 
int lenMicroSecondsOfPulse = 1.8 * 1000; // 1.0 ms是0度

void loop()
{

 // Servos通过发送20 ms脉冲来工作。  
 //脉冲开始时1.0毫秒将舵机转到0度位置
 // //脉冲开始时1.5毫秒将舵机转到90度位置
 // //脉冲开始时2.0毫秒将转向舵机到180度位置
 //将电压调高以启动周期和脉冲
 digitalWrite(SERVO_PIN, HIGH);

 //延迟时间为脉冲的长度
 delayMicroseconds(lenMicroSecondsOfPulse);

 //在剩下的脉冲中将电压调低
 digitalWrite(SERVO_PIN, LOW);

 //将这个循环延迟一段时间, 这样我们就不会,太快或太迟才发送下一个信号
 delayMicroseconds(lenMicroSecondsOfPeriod-lenMicroSecondsOfPulse);

}

手动从0到180度扫动舵机

在这里插入图片描述
进一步采用上面的示例, 并尝试模仿舵机的Arduino样本扫描代码, 我们在下面生成了测试代码。这使我们可以完全测试我们对舵机的手动控制。我们发现, 对于我们的HiTec HS-422舵机, 0度位置约为0.5 ms脉冲, 而整个180度约为2.2 ms脉冲。您可能会发现舵机系统有所不同, 但是您可以在下面的代码中调整控制变量, 直到满意为止。

我们还发现, 大约25 ms的脉冲长度对于我们的舵机效果更好。标准时间是20毫秒, 因此我们发现比预期脉冲工作时间更长的时间并不令我感到惊讶, 这并不奇怪。当我们在18 ms左右的脉冲上变短时, 我们发现舵机的动作确实很奇怪。这可能是因为在舵机完成测量之前就已施加了电压, 这将使总体的脉冲长度下降。

//手动将舵机从0度扫到180度
// Zipwhip版权所有2012。
//您可以在自己的软件中自由使用和修改此代码。

#define SERVO_PIN 39 // 26或39。Arduino或Mega上的任何引脚都可以使用。

int lenMicroSecondsOfPeriod = 25 * 1000; // 25毫秒(ms)。发现在25毫秒而不是20毫秒时平滑度更好。
int lenMicroSecondsOfPulse = 0; //在下面的while循环中使用
int lenMicroSecondsOfPulseStart = 0.5 * 1000; // 0度
int lenMicroSecondsOfPulseEnd = 2.2 * 1000; // 180度
int lenMicroSecondsOfPulseStep = 0.01 * 1000; // .1毫秒。那是200增量的黑白1.0和2.0

void setup()
{
  pinMode(SERVO_PIN, OUTPUT);

  //为我们的主循环设置起点
  lenMicroSecondsOfPulse = lenMicroSecondsOfPulseStart + lenMicroSecondsOfPulseStep;

}

void loop()
{

 // Servos通过发送20 ms脉冲来工作。
 //脉冲开始1.0毫秒会将舵机转到0度位置
 //脉冲开始1.5 ms会将舵机转到90度位置
 //脉冲开始时的2.0毫秒会将舵机转到180度位置

 //从我们的起始脉冲开始做一个while循环, 每次循环都递增
 //到达最终终点时停止
 while(lenMicroSecondsOfPulse = lenMicroSecondsOfPulseStart)
 {
   //将电压调高以启动周期和脉冲
   digitalWrite(SERVO_PIN, HIGH);

   //延迟脉冲长度
   delayMicroseconds(lenMicroSecondsOfPulse);

   //在剩下的脉冲中将电压调低
   digitalWrite(SERVO_PIN, LOW);

   //将此循环延迟到剩余时间, 这样我们就不会
   //太早或太晚发送下一个信号
   delayMicroseconds(lenMicroSecondsOfPeriod- lenMicroSecondsOfPulse);

   //增加我们的脉搏
   lenMicroSecondsOfPulse + = lenMicroSecondsOfPulseStep;

 }

 //现在反转步骤, 以便我们朝相反的方向前进
 lenMicroSecondsOfPulseStep = lenMicroSecondsOfPulseStep * -1;
 lenMicroSecondsOfPulse + = lenMicroSecondsOfPulseStep;

 //延迟几秒钟, 然后再做一次
 delay(2 * 1000);

}

如何使用Arduino控制伺服电机(无噪音, 无振动)

在本教程中, 我提供了足够的深度, 以通知您如何使用Arduino控制伺服电机。我使用PWM软件和硬件资源, 因为这是控制一个或多个伺服电机的正确方法。阅读本文之后, 您应该能够控制自己的业余伺服器而不会产生噪音或振动。另外, 我在文章末尾写了一个小节, 描述了如何修复几个MG996R伺服器和一个结论。

在详细介绍之前, 我想告诉您一些事情。我知道制作出色的作品然后将其发布到世界上有多么艰辛。但是, 无论在论坛和博客上写了多少关于如何控制诸如MG996R之类的业余伺服电机的文章, 几乎所有这些教程都提供了在不施加扭矩的情况下自由工作时对其进行控制的信息。伺服器在施加扭矩的情况下改变其行为。如果控制不正确, 则伺服器会振动, 发出噪音并随机旋转。这就是我写本教程的方式。我想向您详细介绍尝试控制伺服器的解决方案, 以及在施加扭矩的同时平稳控制许多爱好伺服器(如MG996R)的解决方案–在我的情况下, 伺服器会驱动机械臂。

故事:
在这里插入图片描述
RoboBioca机器人手臂

MG996R伺服器是用于移动SainSmart 6轴机器人手臂的主伺服电机。MG996R可以从手臂的所有6个轴上驱动其中四个轴。仅两个轴使用SG90伺服器移动末端执行器。

我用这条机械臂搭建了一个机器人服务员, 可以抓住并搬运一个小塑料杯。因为我的项目需要其他内容, 所以无法使用手臂的默认配置。我仅用一台带有金属齿轮箱和爪的伺服电动机替换了SG90伺服电动机。这样, 我将手臂的自由度数从6减少到5。

在这个项目中, 我使用了Blynk应用程序将命令发送到机器人。运行Blynk的Android平板电脑与机器人之间的通信是通过蓝牙连接无线完成的。

而且因为我没有足够的问题要解决, 所以蓝牙连接会干扰伺服电机。这些在运行蓝牙连接时发出噪音并随机运行。因此, 还有一个额外的问题需要解决。

电源
必须为伺服电机供电需要6V的稳定电源。我使用了可调节的LTC3780 DC降压/升压转换器模块。另外, 我有一个电源适配器(12V – 3A)为转换器供电。我使用数字万用表为转换器设置了接近6V的输出电压。

第一次尝试
第一次尝试是使用Arduino Sensor Shield V5控制伺服电机。Arduino UNO的最大问题是, 我只有两个PWM引脚(引脚9和10)可以在运行Servo2库时与PWM一起使用 。PWM引脚用于伺服电机的控制信号。与直流电动机不同, 伺服器需要PWM控制来确定位置而不是伺服轴的速度。

这是随Arduino 0016和更早版本分发的Servo库。它可以使用标准板上的引脚9和10或Mega上的11和12来驱动最多两个伺服器。其他引脚将无法正常工作。

当我用PWM控制它们时, 我有两个伺服电机运行良好, 仅此而已。我离开他们, 再试一次。

第二次尝试
我可以使用五个伺服器和只有两个带PWM的引脚, 尝试了另一种方式来控制伺服电动机。我放弃了Servo2库, 使用电容器和Servo库。这项尝试比前一次尝试更成功。根据Internet上的解决方案, 我为每个伺服器使用了470uF 50V电解电容器。它有效, 但是不如我所愿。大多数伺服位置都不会发生晃动和振动, 但是随机旋转仍在继续。

第三次尝试
第三次尝试成功。我使用Adafruit 16通道PWM / Servo驱动器来控制所有五个伺服器。该驱动器使用i2c控制的PWM驱动器, 每个驱动器均具有内置时钟和12位分辨率, 这意味着在60Hz更新速率下分辨率约为4us。

我使用了Adafruit_PWMServoDriver库, 编写代码的灵感来自该库提供的示例。

这是一个演示, 演示了使用Adafruit的驱动器通过PWM控制机器人手臂的方法。

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();


#define MIN_PULSE_WIDTH 135
#define MAX_PULSE_WIDTH 470
#define DEFAULT_PULSE_WIDTH 150
#define FREQUENCY 50


const uint8_t servoA = 0;
const uint8_t servoB = 1;
const uint8_t servoC = 2;
const uint8_t servoD = 3;
const uint8_t servoE = 4;

const uint8_t delayServo = 25;


void controlServo0(uint8_t oldPos, uint8_t newPos)
{
  if (oldPos <= newPos) switchServo = UP; else switchServo = DOWN;

  switch (switchServo) {
    case UP: {
        for (uint8_t pos = oldPos; pos <= newPos; pos += 1) {
          delay(delayServo);
          pwm.setPWM(0, 0, angleToPulse(pos));
        }
        break;
      }
    case DOWN: {
        for (uint8_t pos = oldPos; pos >= newPos; pos -= 1) {
          delay(delayServo);
          pwm.setPWM(0, 0, angleToPulse(pos));
        }
        break;
      }
  }
}


void controlServo1(uint8_t oldPos, uint8_t newPos)
{
  if (oldPos <= newPos) switchServo = UP; else switchServo = DOWN;

  switch (switchServo) {
    case UP: {
        for (uint8_t pos = oldPos; pos <= newPos; pos += 1) {
          delay(delayServo);
          pwm.setPWM(1, 0, angleToPulse(pos));
        }
        break;
      }
    case DOWN: {
        for (uint8_t pos = oldPos; pos >= newPos; pos -= 1) {
          delay(delayServo);
          pwm.setPWM(1, 0, angleToPulse(pos));
        }
        break;
      }
  }
}


void controlServo2(uint8_t oldPos, uint8_t newPos)
{
  if (oldPos <= newPos) switchServo = UP; else switchServo = DOWN;

  switch (switchServo) {
    case UP: {
        for (uint8_t pos = oldPos; pos <= newPos; pos += 1) {
          delay(delayServo);
          pwm.setPWM(2, 0, angleToPulse(pos));
        }
        break;
      }
    case DOWN: {
        for (uint8_t pos = oldPos; pos >= newPos; pos -= 1) {
          delay(delayServo);
          pwm.setPWM(2, 0, angleToPulse(pos));
        }
        break;
      }
  }
}

void controlServo3(uint8_t oldPos, uint8_t newPos)
{
  if (oldPos <= newPos) switchServo = UP; else switchServo = DOWN;

  switch (switchServo) {
    case UP: {
        for (uint8_t pos = oldPos; pos <= newPos; pos += 1) {
          delay(delayServo);
          pwm.setPWM(3, 0, angleToPulse(pos));
        }
        break;
      }
    case DOWN: {
        for (uint8_t pos = oldPos; pos >= newPos; pos -= 1) {
          delay(delayServo);
          pwm.setPWM(3, 0, angleToPulse(pos));
        }
        break;
      }
  }
}

void controlServo4(uint8_t oldPos, uint8_t newPos)
{
  if (oldPos <= newPos) switchServo = UP; else switchServo = DOWN;

  switch (switchServo) {
    case UP: {
        for (uint8_t pos = oldPos; pos <= newPos; pos += 1) {
          delay(delayServo);
          pwm.setPWM(4, 0, angleToPulse(pos));
        }
        break;
      }
    case DOWN: {
        for (uint8_t pos = oldPos; pos >= newPos; pos -= 1) {
          delay(delayServo);
          pwm.setPWM(4, 0, angleToPulse(pos));
        }
        break;
      }
  }
}

void robotServoExample() {
  controlServo0(140, 140); 
  controlServo1(145, 145); 
  controlServo3(85, 85); 
  controlServo4(155, 155);
}

void setup() {
  pwm.begin();
  pwm.setPWMFreq(FREQUENCY);
}

void loop() {
	robotServoExample();
}

MG996R伺服器的故事

第一个故障的伺服电机是转动机器人手臂的伺服电机。它很容易失效-我注意到操作过程中散发了一些烟雾。第二个失败的伺服器位于基座。这一人不再承认这一立场。无论特定位置的命令如何, 它都会随机更改其位置。原因未使用蓝牙模块。我试图在不连接通讯模块的情况下定位伺服电机。

运行约30分钟后, 第一个伺服器发生故障。第二个操作更友好, 并且在大约另外两个小时的操作后失败了。在这段时间里, 我使用了机械臂来测试不同的位置。

当我着手解决实际上导致血压升高的两个问题时, 我遇到了两个MG996R伺服电动机出现故障的情况:随机摇动(振动)和噪音。

最初, 我以为我做错了, 这就是为什么伺服电机这么快损坏的原因。在Google上搜索之后, 看来我不是唯一与MG996R一起工作过并且在测试阶段将其破坏的人。最后, 我订购了一些新的舵机, 然后开始工作以查看错误的地方以及如何解决此问题。

我订购了三台MG996R伺服电机。他们很快就来了, 我开始测试它们。这不是我第一次买到非常便宜的东西(MG996R的价格大约为6欧元/ 7美元)并且没有用。这次对我来说很特别。从三个伺服电机来看, 它们全部都不起作用。

对于三台无法使用的新型伺服电机, 我认为最好寻找一种替代方案。我一直在寻找具有与SainSmart机械臂相同大小的替代产品。我找到了Power HD Servo 1501MG。它们的尺寸与MG996R相同, 但扭矩更高。

机器人手臂升级版中使用的五个MG996R伺服电机(原始版本的手臂使用4个MG996R)中, 剩下三个。1501MG取代了两个MG996R伺服器。一个MG996R伺服器驱动肩偏航, 另一个驱动手腕偏航, 另一个驱动机器人爪。

我如何修复MG996R

以下任何方法都需要接受电子学方面的培训, 并且需要一定的螺丝, 变速箱和润滑脂经验。在伺服系统内部工作时, 请务必格外小心, 您将自行承担责任。

  1. 我仅通过拧下螺丝就固定了两个伺服电机。我控制它们在不放置变速箱盖的情况下从位置30来回移动到160, 然后固定变速箱盖…就可以了。听起来有些愚蠢, 但这就是我的工作方式。我怀疑问题出在变速箱内的齿轮位置上。最有可能的是, 直流电动机在旋转时没有全部啮合。可能有组装错误或运输冲击。

  2. 一种新的伺服器存在一些更大的问题。一档没有一两个牙齿。除此之外, 我在变速箱内发现了一块塑料。幸运的是, 我从那里拿走了备用零件的伺服器烧毁了, 我重新装回了所有零件, 并且工作正常。
    在这里插入图片描述
    MG996R

业余爱好伺服器的结论

  • 尽量减少手动更改伺服器的位置。这可能会迅速损坏变速箱, 而伺服器可能会出故障;
  • 爱好项目中使用的伺服电机在位置10和170之间工作良好。如果位置小于10或大于170, 则会产生噪音并产生振动;
  • 伺服电源必须尽可能接近6V的值。较高的电压会燃烧它, 而较低的电压会使它随机运行。另外, 请不要尝试直接从Arduino开发板或项目中使用的任何其他控制器馈送伺服器。您将会有很多惊喜;
  • 如果同时使用多个伺服电机(例如, 一个机械手), 则需要对它们进行逐一编程。如果其中一个伺服器命令不正确并移动到较不理想的位置, 则会对其他伺服器产生很大影响。机械手可能会碰到工作台或工作台周围的其他物体, 从而损坏伺服系统的变速箱。
  • 如果没有稳定的6V电源, 则必须在伺服电机的电源线之间使用电解电容器。

How to Control Speed of Servo Motor 伺服电机的速度如何控制

您可能会在网上看到接线图,这些接线图描述了伺服电机的 VCC 引脚直接连接到 Arduino 板的 5V 引脚。虽然这种方法可能有效,但由于存在损坏Arduino板的潜在风险,因此强烈建议不要这样做。

为了保护您的Arduino板,我们强烈建议为伺服电机使用外部电源。下面的接线图说明了如何将伺服电机连接到外部电源。

Arduino servo motor external power supply wiring diagram

请确保将外部电源的 GND 连接到 Arduino 板的 GND。不要忽视这一关键步骤。

By using map() and millis() functions, we can control the speed of servo motor smoothly without blocking other code
通过使用 map() millis() 函数,我们可以在不阻塞其他代码的情况下平稳地控制伺服电机的速度

/*
 * Created by ArduinoGetStarted.com
 *
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-servo-motor
 */

#include <Servo.h>

Servo myServo;
unsigned long MOVING_TIME = 3000; // moving time is 3 seconds
unsigned long moveStartTime;
int startAngle = 30; // 30°
int stopAngle  = 90; // 90°

void setup() {
  myServo.attach(9);
  moveStartTime = millis(); // start moving

  // TODO: other code
}

void loop() {
  unsigned long progress = millis() - moveStartTime;

  if (progress <= MOVING_TIME) {
    long angle = map(progress, 0, MOVING_TIME, startAngle, stopAngle);
    myServo.write(angle); 
  }

  // TODO: other code
}

Additional Knowledge 其他知识

  • The Servo library supports up to 12 motors on Arduino UNO and 48 on the Arduino Mega.
    伺服库在 Arduino UNO 上支持多达 12 个电机,在 Arduino Mega 上支持多达 48 个电机。

  • Power from 5V pin of Arduino maybe NOT enough for servo motor in one of the following cases:
    在以下情况之一中,Arduino 的 5V 引脚的电源可能不足以满足伺服电机的需求:

    • Using a high-torque servo motor, which can carry a high-weight thing.
      采用高扭矩伺服电机,可以承载高重量的东西。

    • Using many servo motors. 使用许多伺服电机。
      

In these cases, we may need to provide an extra power source for servo motors.
在这些情况下,我们可能需要为伺服电机提供额外的电源。

Arduino Servo Motor Extra Power

This image is created using Fritzing. Click to enlarge image
此图像是使用 Fritzing 创建的。点击放大图片

As we can see in the above diagram, the VCC pin of servo motor doest NOT connect to the 5V pin of Arduino. It connects to the positive pin of an extra power source.
从上图中可以看出,伺服电机的VCC引脚没有连接到Arduino的5V引脚。它连接到额外电源的正极引脚。

Please note that: 请注意:

  • Do not connect the positive pin of extra power source to 5V pin of Arduino.
    请勿将额外电源的正极引脚连接到Arduino的5V引脚。
  • Must connect the negative pin of extra power source to the GND pin of Arduino.
    必须将额外电源的负极引脚连接到Arduino的GND引脚。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚蓝慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值