arduino的外部中断与舵机

arduino中的外部中断:

中断模式就是你的中断触发方式。在大多数arduino上有以下四种触发方式:
LOW 低电平触发
CHANGE 电平变化,高电平变低电平、低电平变高电平
RISING 上升沿触发
FALLING 下降沿触发
HIGH 高电平触发(该中断模式仅适用于Arduino due)

在定义中断函数后,要使用外部中断,你只需要在程序的Setup部分配置好中断函数即可,配置函数如下:
attachInterrupt(interrupt, function, mode);//interrupt为你中断通道编号,function为中断函数,mode为中断触发模式
需要注意的是在Arduino Due中,中断设置有点不同:
attachInterrupt(pin, function, mode); //due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。
如果在程序中途,你不需要使用外部中断了,你可以用中断分离函数detachInterrupt(interrupt );来取消这一中断设置。
同样在Arduino Due上,该函数为detachInterrupt(interrupt );。

4.例程
外部中断的使用也是非常简单的,下面我们来看一个官方提供的例程
int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()//中断函数
{
  state = !state;
}

2.各种型号Arduino外部中断引脚

外部中断在不同的Arduino型号上位置也不同,只有外部中断发生在以下端口,Arduino才能捕获到,以下例举了常见的几种型号的外部中断引脚标号。
型号 int.0 int.1 int.2 int.3 int.4 int.5
UNO\Ethernet 2 3        
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1    
Due  所有IO口均可

3.中断函数,中断触发模式与设置中断

中断函数就是你要去执行的函数,这个函数不能带任何参数,且没有返回类型。

舵机

舵机,又称伺服马达,是一种具有闭环控制系统的机电结构。舵机主要是由外 壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由控制器发出PWM(脉冲宽度调制)信号给舵机,经电路板上的IC处理后计算出转动方向, 再驱动无核心马达转动,透过减速齿轮将动力传至摆臂,同时由位置检测器(电位器)返回位置信号,判断是否已经到达设定位置,一般舵机只能旋转180度。舵机有3根线,棕色为地,红色为电源正,橙色为信号线,但不同牌子的舵机,线的颜色可能不同,需要注意。
舵机的转动位置是靠控制PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms,占空比0.5~2.5ms 的正脉冲宽度和舵机的转角-90°~90°相对应。注意,由于舵机牌子不同,其控制器解析出的脉冲宽度也不同,所以对于同一信号,不同牌子的舵机旋转的角度也不同。
如果自己做实验,舵机5v 电源就暂时使用Arduino 上的,但不可长时间使用,因为舵机转动时电流比较大,Arduino 上的电源芯片可能会因过热而保护甚至损坏,所以正常使用时需要使用外部电源给舵机供电。
为了便于理解,下面就来具体分析一下Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句。
1.attach(接口)——设定舵机的接口,只有9或10接口可利用

 2.write(角度)——用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°

 3.read(读取)——用于读取舵机角度的语句,可理解为读取最后一条write( )命令中的值

 4.attached( )——判断舵机参数是否已发送到舵机所在的接口

 5.detach( )——使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口
注:以上语句的书写格式均为“舵机变量名.具体语句()”例如:myservo.attach(9)。

下面就来具体分析一个小程序:
#include <Servo.h>//定义头文件,这里有一点要注意,可以直接在Arduino软件菜单栏单击Sketch>Importlibrary>Servo,调用Servo函数,也可以直接#include <Servo.h>,但是在输入时要注意在#include 与<Servo.h>之间要有空格,否则编译时会报错。

Servo myservo;//定义舵机变量名

Servo myservo;//定义舵机变量名
void setup()
{
	myservo.attach(9);//定义舵机接口,9或10 
}
void loop()
{
	myservo.write(90);//设置舵机旋转的角度
}

以某项目为例,舵机姿态控制程序分析如下:
方案:控制底部舵机1以1度为步进值做周期性270度的四分之三圆周运动,控制上部舵机2以20度为步进值,做0-180度的半圆周运动,舵机1每完成半个周期,舵机2步进一次。
优缺点分析:
优点:程序较易实现,能基本实现较大的转动空间;
缺点:两个舵机相对独立动作,舵机1负责画四分之三圆周,且在画圆周的过程中舵机2保持在某一角度不运动;理论上存在90度的转动死角。
程序:

#include <Servo.h>
Servo myservo1,myservo2;  //创建两个舵机控制对象	 
// 使用Servo类最多可以控制8个舵机	 
int pos = 0, i=0;   // 该变量用与存储舵机角度位置
int t = 20;      //定义延时函数变量
/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线~~~~~~~~~~~~~~~~~~~~~~~~~~ */	 
void setup()	 
{	 
	myservo1.attach(9);  // 该舵机由arduino第九脚控制	 
    myservo2.attach(10);  // 该舵机由arduino第十脚控制	 
}	 
/*~~~~~~~~~~~~~~~~~~~~~~~~~~华丽的分割线 ~~~~~~~~~~~~~~~~~~~~~~~~~~ */	 
void loop()	 
{
	for(i=160;i>0;i-=20)	 
		{
            for(pos = 0; pos < 180; pos += 1)  // 从0度到180度运动,每次步进一度	 
	            {                                                     
	 
	              myservo1.write(pos);        // 指定舵机1转向的角度 
	              myservo2.write(i);        // 指定舵机2转向的角度
	 
	              delay(t);            // 等待t ms让舵机到达指定位置	 
	            }
	 
	            i-=20;
	 
	            for(pos = 180; pos>=1; pos-=1)   //从180度到0度运动  
      	            {                               
	                myservo1.write(pos);         // 指定舵机转向的角度.	 
	                myservo2.write(i);        // 指定舵机转向的角度
	                delay(t);                        // 等待t ms让舵机到达指定位置	 
	             }
	        }  
  }


  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 可以使用Arduino Mega256来控制舵机。首先需要将舵机的信号线连接到Arduino的数字引脚上,然后使用Arduino的PWM输出来控制舵机的角度。可以使用Servo库来简化控制舵机的代码编写。在代码中,需要指定舵机连接的引脚和舵机的初始位置,然后使用write()函数来控制舵机的角度。例如,以下代码可以将舵机连接到数字引脚9上,并将舵机的初始位置设置为90度: #include <Servo.h> Servo myservo; // 创建一个舵机对象 void setup() { myservo.attach(9); // 将舵机连接到数字引脚9上 myservo.write(90); // 将舵机的初始位置设置为90度 } void loop() { // 控制舵机动到不同的角度 myservo.write(); // 动到度 delay(100); // 等待1秒钟 myservo.write(90); // 动到90度 delay(100); // 等待1秒钟 myservo.write(180); // 动到180度 delay(100); // 等待1秒钟 } ### 回答2: Arduino Mega2560是一款功能强大的微控制器板,它是Arduino菜鸟和专业人士之间的理想选择。Arduino Mega2560板子有54个数字I / O引脚和16个模拟输入引脚,内置16MHz晶体,具有非常强大的计算能力。它还具有EEPROM,SRAM和Flash存储器,可以用于存储程序代码、传感器数据和其他重要信息。 舵机是一种普遍用于控制机器人手臂、自主车和其他自动化系统的电动原件。它可以控制角度,根据特定的输入信号移动或旋Arduino Mega2560可以通过PWM输出引脚控制舵机,使其旋到合适的角度位置。 以下是使用Arduino Mega2560控制舵机的步骤: 1.将舵机信号线连接到Arduino Mega2560板子的一个PWM引脚,如D9。 2.将舵机的电源线连接到供应电路,建议使用降压器将舵机电源的输入限制在5V以内。 3.将舵机的接地线连接到Arduino Mega2560板子的地电平。 4.通过Arduino的IDE软件,打开一个新的项目。 5.在sketch文件中加入Servo库文件,这样就可以调用库里面的舵机函数。 6.使用load函数为舵机电机设置一个起始位置。 7.在主程序中使用write函数将舵机电机动到所需的角度位置,函数输入参数为0-180的整数值(对应标准舵机)。 8.通过程序调整舵机的角度位置,完成舵机控制。 总之,使用Arduino Mega2560控制舵机非常简单,并且可以在您的DIY机器项目中提供持久的控制功能。需要注意的是,舵机的用途是非常广泛的,普通的舵机比较容易被损坏,实际使用的时候需要注意使用舵机尽量精准控制。 ### 回答3: Arduino Mega2560是一个集成了大量硬件资源的微控制器模块,拥有54个数字输入/输出引脚,16个模拟输入引脚和4个串行通信口,同时也是常用的舵机控制系统。舵机是由电机、控制电路和各种机械结构组成的一种精密电机。舵机是十分常用的一个舵机舵机是一种特殊的电机,它能够感知自己的位置,并根据本身的位置和输入信号精准地控制运动角度到达指定的目标位置,使用arduino mega2560实现对舵机的控制,需要进行以下步骤: 第一步,舵机的接线。将舵机的三线连接到arduino板的数字信号接口上。其中,红色线连接到电源正极和舵机的Vcc上,黑色线连接到地线和舵机的Gnd上,橙色线连接到任意一个数字输入口上。 第二步,调整舵机初始位置。舵机在我们拿到它的时候并不能准确地停在初始位置上。因此,我们需要通过代码来调整它的初始位置。我们需要调整两个参数,一个是舵机引脚号,一个是需要调整到的角度。我们通过在代码中使用arduino的Servo库,并调用write()函数控制舵机的角度。 第三步,控制舵机运动。根据需要,我们可以在程序中使用delay()函数来控制运动时间和位置。也可以使用pulsein()来读取舵机返回的脉冲信号。 第四步,进行反馈控制。在实际应用场景中,舵机的位置往往需要根据输入信号或者环境条件动态调整。对于这种情况,我们可以通过添加各种传感器、光电开关等来进行反馈控制,实现自动控制。 总的来说,使用arduino Mega2560控制舵机需要我们在硬件接线和软件代码编写中加以注意,并对于实际应用场景中可能出现的各种问题进行有效地预测和解决,从而实现精准、稳定和可靠的控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值