草庐IT

Arduino从零开始(2)——控制舵机与步进电机

羽徵角 2023-04-26 原文

0.前言

本文主要介绍通过Arduino控制舵机,步进电机以及循环的使用

目录

0.前言

1.介绍

2.Arduino控制舵机:

2.1方法一

2.2方法二

3.Arduino控制步进电机


1.介绍

对于Arduino控制舵机的方法是通过其输出PWM信号来实现控制的。这里所谓的PWM信号其本质上就是脉冲信号。而对于步进电机的控制,则是通过输出脉冲信号来实现控制的。这两者有怎样的区别,首先要理解什么是PWM信号——是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形。也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。简而言之,对于角度的控制,舵机的核心是在脉冲的频率上,而步进电机则是在脉冲个数上。

2.Arduino控制舵机:

这里总共会介绍两种方法来控制舵机,方法一是简单的使用其自带的库来实现控制。方法二是我们以原理出发,直接通过脉冲来控制舵机。舵机的话就是普通实验用的。

2.1方法一

接线图:

代码 :

#include <Servo.h>
Servo myservo;
void setup()
{
 myservo.attach(2);//定义PWM输出的引脚
}

void loop()
{
 myservo.write(90); //写出输出角度
 delay(1000);
 myservo.write(0); 
 delay(1000); 
}

 

效果如下:

 

说明:

1.以上代码是最简形式,通过使用Arduino所自带的Servo.h库来实现,效果为转90°延迟1s转回0°。唯一要注意的就是myservo.write中的值直接是角度值,一般的范围就是0~180°,也有360°的舵机可以使用。

2.对于舵机的控制我们发现该库并没有对速度的控制。就步进电机而言是通过频率来控制速度,而舵机是拿频率来控制角度。故对于速度的控制可以采用微分化来实现,简而言之就是把目标角度分成多段行走,并控制每段的时间来实现。这里分段最小单位可以采取1°,代码如下:

#include <Servo.h>
Servo myservo;
void setup()
{
	myservo.attach(2);
}

void loop()
{
  for(int i=0;i<90;i++){
   myservo.write(i);
   delay(1);
  }
  delay(2000);
  for(int i=90;i>0;i--){
   myservo.write(i);
   delay(50);
  }
  delay(2000);
}

效果如下:

 对比之前,我们就能发现,由0到90°是快速,在由90到0°就变成慢速了。

3.说明2中出现了for循环,for语句用于重复执行被花括号包围的语句块。一个增量计数器通常被用来递增和终止循环。for语句对于任何需要重复的操作是非常有用的。常常用于与数组联合使用以收集数据/引脚。for循环的头部有三个部分:

for (初始化部分; 条件判断部分; 数据递增部分) {
//语句块
。。。
}
初始化部分被第一个执行,且只执行一次。每次通过这个循环,条件判断部分将被测试;如果为真,语句块和数据递增部分就会被执行,然后条件判断部分就会被再次测试,当条件测试为假时,结束循环。

2.2方法二

回归到PWM的定义上,是通过调节占空比的变化来调节角度。也就是其控制需要Arduino产生一定量的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度。对于180°的舵机而言,其对应关系如下:

0.5ms=500us-------------0度
1.0ms=1000us------------45度
1.5ms=1500us------------90度
2.0ms=2000us-----------135度
2.5ms=2500us-----------180度

因此我们可以通过for循环函数,控制普通数字引脚端口高低电平的变化,直接实现控制舵机。

接线图与方法1一样,代码如下:

void setup()
{
  pinMode(2,OUTPUT);
  for(int i=0;i<=80;i++){
  	digitalWrite(2,HIGH);
  	delayMicroseconds(2500);//旋转180度
    digitalWrite(2,LOW);
    delay(100);
  }
}

void loop()
{

}

效果如下:

说明:

1.这里for循环次数(脉冲输出的个数)也会直接影响舵机的旋转的角度。当循环次数不够时,角度也会走不到需要的位置,但次数过多到不会影响其最后的角度,次数合适即可。

2.for循环中的第二个延时dely(100);这里可以直接完成对速度的控制。

3.Arduino控制步进电机

以带驱动器的57型步进电机为例:

驱动器端接线如下:

 备注:这里Arduino采用的是nano,如果是uno也可一样的接。引脚上数字引脚与模拟引脚都无所谓,模拟引脚也能当数字引脚用。

代码如下:

void setup()
{
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  digitalWrite(A2,HIGH);//设定电机旋转方向
  for(int i=0;i<=80;i++){//走80个脉冲
  	digitalWrite(A1,HIGH);
  	delayMicroseconds(500);
    digitalWrite(A1,LOW);
    delayMicroseconds(500);
    }
}

void loop()
{

}

另外关于步进电机的进阶使用,可以参考我另外的文章:

Arduino 控制多轴步进电机,基于SPI通信

Arduino 控制多轴步进电机,基于RS485串口通信

 

有关Arduino从零开始(2)——控制舵机与步进电机的更多相关文章

  1. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  2. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  5. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  6. ruby-on-rails - 在 Rails 控制台中使用 asset_path - 2

    在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O

  7. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

  8. ruby - 将全局 $stdout 重新分配给控制台 - ruby - 2

    我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r

  9. ruby-on-rails - Ruby 流量控制 : throw an exception, 返回 nil 还是让它失败? - 2

    我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id

  10. ruby-on-rails - ruby 新手,有人可以帮我从控制台破译这个错误吗? - 2

    我真的只是不确定这意味着什么或我应该做什么才能让网页在我的本地主机上运行。现在它只是显示一个错误,上面写着“我们很抱歉,但出了点问题。”当我运行railsserver并在chrome中打开localhost:3000时。这是控制台输出:StartedGET"/users/sign_in"for127.0.0.1at2013-07-0512:07:07-0400ProcessingbyDevise::SessionsController#newasHTMLCompleted500InternalServerErrorin55msNoMethodError(undefinedmethod`

随机推荐