通过一个无人机代码例程学会ardunio

2023-11-08

 

第一部分:关于接线

1.首选在接收机的任意一个空置插口引出一个vcc和GND,直接连接arduino 5v 和GND,这时你的arduino就和飞机连成了一套系统,可以共同工作了。

2.接下来把接收机供给飞控的四根信号线从飞控上卸下,连接在arduino上的任意数字端口,我连接的是22,24,26,28,而这四根线的作用分别是AIL副翼,ELE升降,THR油门,RUD方向

下面具体解释这四个名词,其实这些词都是固定翼飞机的,那么在多旋翼无人机上的意思是什么呢,很简单,

AIL副翼信号:它是控制飞机在水平面俯仰的,也就是说当飞机俯下去的时候,飞机会产生一个向前的分解力,就会向前飞,向后仰的时候会分解一个向后的力飞机向后飞。

ELE升降:它其实不是真正控制无人机升降的,是和副翼一样,不过是向左倾斜和向右倾斜而已,飞机就向左向右飞。

THR油门:其实是控制飞机起飞和下降的,油门大飞机就直升,油门小了就将下来了。

RUD方向:它是控制飞机水平转动的,左转右转,飞机的方向改变,但位置不会变。

 

把这几个接口接上arduino后,我们开始用arduino来看看这个信号的奥秘,其实它就是PWM信号,不信你直接接一个舵机去试试,舵机会随着遥控的控制而转动,那么怎么读取这个PWM信号呢,我们从源代码开始讲!

#include<Servo.h>;
#define AIL1  22   //定义前后飞引脚为22号
#define ELE2  24   //定义左右飞引脚为24号
#define THR3  26   //定义升降引脚为26号
#define RUD4  28   //定义左右转引脚为28
#define LED   13   //定义LED灯
unsigned long INAIL;   //定义四个输入变量
unsigned long INELE;
unsigned long INTHR;
unsigned long INRUD;
int OUTAIL;            //定义四个输出变量
int OUTELE;
int OUTTHR;
int OUTRUD;
Servo AIL;          
Servo ELE;
Servo THR;
Servo RUD;

void setup()
{  
  pinMode(AIL1,0);    //初始化引脚状态
  pinMode(ELE2,0);
  pinMode(THR3,0);
  pinMode(RUD4,0);
  pinMode(LED,1);

  AIL.attach(4);
  ELE.attach(5);
  THR.attach(6);
  RUD.attach(7);

  Serial.begin(9600);
}
void loop()
{
  digitalWrite(LED,1);
  INAIL = pulseIn(AIL1, 1);   //读取之前定义的四个引脚状态
  INELE = pulseIn(ELE2, 1);
  INTHR = pulseIn(THR3, 1);
  INRUD = pulseIn(RUD4, 1);

  OUTELE = map(INELE,1010,2007,47,144);  //计算
  OUTTHR = map(INTHR,1010,2007,47,144);
  OUTRUD = map(INRUD,1010,2007,47,144);
  
  AIL.write(OUTAIL);  //输出
  ELE.write(OUTELE);
  THR.write(OUTTHR);
  RUD.write(OUTRUD);

  int dianya = analogRead(A0);   //读取A0输入值
  float wendu = dianya * (5.0 / 1023.0*100);    //计算温度
  Serial.print("AIL=");
  Serial.print(INAIL);
  Serial.print(" ELE=");
  Serial.print(INELE);
  Serial.print(" THR=");
  Serial.print(INTHR);
  Serial.print(" RUD=");
  Serial.print(INRUD);
  Serial.print(" wendu=");
  Serial.println(wendu);      

  digitalWrite(LED,0);
  delay(5);

}

 

第二部分:编程函数:https://www.arduino.cc/reference/en/#functions

附基础教程系列:https://www.arduino.cn/thread-76154-1-1.html

 

Arduino自带的Servo函数及其语句,先来介绍一下舵机函数的几个常用语句吧。

1、attach(接口)——设定舵机的接口,只有9或10接口可利用。

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

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

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

5、detach()——使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口。

注:以上语句的书写格式均为“舵机变量名.具体语句()”例如:myservo.attach(9)。//可以定义舵机接口,9或10

Arduino自带的Servo函数库只可以同时控制两个模拟舵机。而且最好接到数字9 、 10脚上。想控制多个舵机就要使用到Arduino的Pwm功能了。

下面介绍几个常用函数:

pinMode()

[数字I / O]

描述

将指定引脚配置为输入或输出。有关引脚功能的详细信息,请参见(数字引脚)的说明。

从Arduino 1.0.1开始,可以使用模式INPUT_PULLUP使能内部上拉电阻。此外,INPUT模式明确禁用内部上拉。

句法

pinMode(pin, mode)

参数

pin:要设置其模式的引脚编号

modeINPUTOUTPUT,或INPUT_PULLUP。(有关功能的更完整说明,请参阅(数字引脚)页面。)

返回

没有

示例代码

该代码使得数字销13 OUTPUT与切换之HIGHLOW

void setup()
{
  pinMode(13,OUTPUT); //将数字引脚13设置为输出
}

void loop()
{
  digitalWrite(13,HIGH); //设置数字引脚13
  延迟(1000); //等一下
  digitalWrite(13,LOW); //将数字引脚13设置为关闭
  延迟(1000); //等一下
}

pulseIn()

[高级I / O]

描述

读取引脚上的脉冲(HIGH或者LOW)。例如,如果valueHIGHpulseIn()等待从销去LOWHIGH,开始计时,然后等待销去LOW并停止定时。返回脉冲的长度(以微秒为单位)或放弃,如果超时内未收到完整脉冲,则返回0。

该功能的时间已经凭经验确定,并且可能在较长脉冲中显示错误。适用于长度为10微秒至3分钟的脉冲。

句法

pulseIn(pin, value)

pulseIn(pin, value, timeout)

参数

pin:要读取脉冲的引脚编号。(INT)

value:要读取的脉冲类型:HIGHLOW。(INT)

timeout(可选):等待脉冲开始的微秒数; 默认是一秒(无符号长)

返回

脉冲的长度(以微秒为单位),如果在超时之前没有脉冲开始,则为0(无符号长整数)

示例代码

该示例计算了引脚7上脉冲的持续时间。

int pin = 7;
unsigned long duration;

void setup()
{
  pinMode(pin, INPUT);
}

void loop()
{
  duration = pulseIn(pin, HIGH);
}

digitalWrite()

[数字I / O]

描述

将数字HIGHLOW值写入数字引脚。

如果引脚已配置为OUTPUTwith pinMode(),则其电压将设置为相应的值:5V(或3.3V板上3.3V)HIGH,0V(接地)LOW

如果引脚配置为a INPUTdigitalWrite()将使能(HIGH)或禁用(LOW)输入引脚上的内部上拉。建议设置pinMode()INPUT_PULLUP使能内部上拉电阻。有关更多信息,请参阅数字引脚教程。

如果未设置pinMode()OUTPUT,并将LED连接到引脚,则在呼叫时digitalWrite(HIGH),LED可能显得暗淡。如果没有明确设置pinMode()digitalWrite()将启用内部上拉电阻,它就像一个大限流电阻。

句法

digitalWrite(pin, value)

参数

pin:引脚号

valueHIGHLOW

返回

没有

示例代码

该代码使得数字销13的OUTPUT和由之间交替切换它HIGHLOW以一秒的步伐。

void setup()
{
  pinMode(13,OUTPUT); //将数字引脚13设置为输出
}

void loop()
{
  digitalWrite(13,HIGH); //设置数字引脚13
  延迟(1000); //等一下
  digitalWrite(13,LOW); //将数字引脚13设置为关闭
  延迟(1000); //等一下
}

备注和警告

模拟输入引脚可用作数字引脚,称为A0,A1等。

 

map()

描述

将数字从一个范围重新映射到另一个范围。也就是说,fromLow的值将被映射到toLow,值从hightoHigh,值介于两者之间,等等。

不会将值限制在该范围内,因为超出范围的值有时是有意义且有用的。该constrain()函数可以之前或此功能后使用,如果限制范围是期望的。

注意,任一范围的“下限”可以大于或小于“上限”,因此该map()函数可以用于反转数字范围,例如

y = map(x, 1, 50, 50, 1);

该函数也很好地处理负数,所以这个例子

y = map(x, 1, 50, 50, -100);

也是有效的,效果很好。

map()函数使用整数数学,因此当数学可能表明它应该这样做时,不会生成分数。分数剩余部分被截断,并且不是圆形或平均的。

南叔的表述:map函数其实就是归一化,可以归到任意区间

句法

map(value, fromLow, fromHigh, toLow, toHigh)

参数

value:要映射的数字

fromLow:值的当前范围的下限

fromHigh:值的当前范围的上限

toLow:值的目标范围的下限

toHigh:值的目标范围的上限

返回

映射的值。

示例代码

/* Map an analog value to 8 bits (0 to 255) */
void setup() {}

void loop()
{
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

附录

对于数学倾向,这是整个函数

long map(long x, long in_min, long in_max, long out_min, long out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

 

第三部分:引脚说明

数码针脚

Arduino上的引脚可配置为输入或输出。本文档解释了这些模式下引脚的功能。虽然本文档的标题涉及数字引脚,但重要的是要注意绝大多数Arduino(Atmega)模拟引脚可以以与数字引脚完全相同的方式进行配置和使用。

配置为INPUT的引脚属性

Arduino(Atmega)引脚默认为输入,因此当您将它们用作输入时,不需要将它们显式声明为带有pinMode()的输入。以这种方式配置的引脚被称为处于高阻抗状态。输入引脚对它们采样的电路提出极小的要求,相当于引脚前面100兆欧的串联电阻。这意味着将输入引脚从一种状态移动到另一种状态所需的电流非常小,并且可以使这些引脚对于实现电容式触摸传感器,将LED读取为光电二极管或使用方案读取模拟传感器等任务非常有用比如RCTime。

然而,这也意味着,配置为pinMode(引脚,INPUT)的引脚没有连接到它们,或连接到它们的未连接到其他电路的引线,将报告引脚状态看似随机的变化,从而拾取电源噪声环境,或电容耦合附近引脚的状态。

上拉电阻,引脚配置为INPUT

如果不存在输入,通常将输入引脚转向已知状态是有用的。这可以通过在输入端添加上拉电阻(至+ 5V)或下拉电阻(对地电阻)来实现。对于上拉或下拉电阻,10K电阻是一个很好的值。

配置为INPUT_PULLUP的引脚属性

Atmega芯片内置20K上拉电阻,可通过软件访问。通过将pinMode()设置为INPUT_PULLUP来访问这些内置上拉电阻。这有效地反转了INPUT模式的行为,其中HIGH表示传感器关闭,LOW表示传感器开启。

该上拉值取决于所使用的微控制器。在大多数基于AVR的电路板上,该值保证在20kΩ和50kΩ之间。在Arduino Due上,它介于50kΩ和150kΩ之间。有关确切值,请参阅电路板上微控制器的数据表。

将传感器连接到配置有INPUT_PULLUP的引脚时,另一端应接地。在简单开关的情况下,这会导致引脚在开关打开时读取高电平,在按下开关时读取低电平。

上拉电阻提供足够的电流,使连接到已配置为输入的引脚的LED灯亮。如果项目中的LED似乎工作,但非常模糊,这可能是正在发生的事情。

上拉电阻由相同的寄存器(内部芯片存储器位置)控制,控制引脚是高电平还是低电平。因此,当引脚为INPUT时,配置为使上拉电阻导通的引脚,如果引脚随后通过pinMode()切换到OUTPUT,则引脚将配置为高电平。这也适用于另一个方向,如果切换到带有pinMode()的输入,则保持高电平状态的输出引脚将设置上拉电阻。

在Arduino 1.0.1之前,可以通过以下方式配置内部上拉:

pinMode(引脚,INPUT); //设置引脚输入
digitalWrite(pin,HIGH); //打开上拉电阻

注意:数字引脚13比其他数字引脚更难用作数字输入,因为它上面连有一个LED和电阻,焊接在大多数电路板的电路板上。如果你启用其内部20k上拉电阻,它将挂在1.7V左右,而不是预期的5V,因为板载LED和串联电阻将电压降低,这意味着它总是返回LOW。如果必须将引脚13用作数字输入,则将其pinMode()设置为INPUT并使用外部下拉电阻。

引脚的属性配置为OUTPUT

配置为带有pinMode()的OUTPUT的引脚被称为处于低阻抗状态。这意味着它们可以为其他电路提供大量电流。Atmega引脚可以为其他器件/电路提供高达40 mA(毫安)的电流(提供正电流)或吸收(提供负电流)。这是足够的电流,可以明亮地点亮LED(不要忘记串联电阻),或运行多个传感器,但电流不足以运行大多数继电器,电磁阀或电机。

Arduino引脚上的短路或试图从它们运行高电流器件会损坏或破坏引脚中的输出晶体管,或损坏整个Atmega芯片。这通常会导致微控制器中的“死”引脚,但剩余的芯片仍能正常工作。因此,最好将OUTPUT引脚连接到具有470Ω或1k电阻的其他器件,除非特定应用需要从引脚获取最大电流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过一个无人机代码例程学会ardunio 的相关文章

  • 科大讯飞、博世、蔚来、华为实习面试总结

    实习面试总结 为了给自己的秋招先铺铺路 找了一些公司实习面试 需要注意 华为实习很看学历 本科基本上过不了简历 苏州科大讯飞 挂 岗位 硬件实习生 问题 1 PCB板子上对外输出电流的时候是不是需要对电流的开关进行控制 如果需要的话 用什么

随机推荐

  • 4378 选取数对(递推)

    1 问题描述 给定一个长度为 n 的整数数列 a1 a2 an 请你选择 k 个数对 l1 r1 l2 r2 lk rk 要求所选数对满足 1 l1 r1 lt l2 r2 lt lt lk rk n 对于 1 i k ri li 1 m
  • Highly recommend using Dart Sass.

    为什么要替换 1 因为node sass和node js版本关联太紧了 如果这两个版本不匹配 就会起冲突 导致项目无法运行 但是dart sass 安装没有兼容性问题 2 sass官网团队也强烈建议使用dart sass sass团队强烈建
  • LNMP部署及搭建论坛

    目录 前言 一 LNMP架构的部署 理论 1 1 LNMP架构概述 1 2 MySQL安装配置 1 3 PHP解析环境的安装 1 4 配置Ngnx支持PHP环境 二 LNMP应用部署 实操 2 1 Nginx安装 2 1 1 编译安装步骤
  • HDLbits Popcount3的一点疑问

    题目 A population count circuit counts the number of 1 s in an input vector Build a population count circuit for a 3 bit i
  • FFmpeg从RTSP获取流时:h264、h265 判断 I 帧的方法

    H264中 I 帧的判断 这是用ffmpeg接口 av read frame 从IPC摄像头获取得到每一帧数据的前几十个字节 一般00 00 00 01分割之后的下一个字节就是NALU类型 NALU类型是可以用来判断帧的类型是I帧 还是P帧
  • Flask-SQLAlchemy(一) 一对一关系

    前言 课程中经常需要进行web开发 往往是采用Flask框架 建立数据库时就避免不了Flask SQLAlchemy的使用 此文章将记录创建关系表的过程 方便日后回顾以及大家交流讨论 一对一关系 下面的一对一关系以用户和身份证为例 首先创建
  • c++ 友元的三种形式和声明方式

    1 成员函数做友元 include
  • HDU 1716 排列2

    测试数据都能过但是WA 求帮看哪里出了问题 题目链接 Hdu 1716 使用STL的next permutation 函数求解 include
  • 消息驱动 微服务器,消息驱动的微服务 - Spring Cloud Alibaba RocketMQ

    引入MQ后的架构演进 MQ的选择 消息队列对比参照表 RocketMQ vs ActiveMQ vs Kafka 参考至 CentOS7上搭建RocketMQ 环境要求 CentOS 7 2 64位JDK1 8 4G 的可用磁盘空间 1 下
  • VIM工具设置步骤

    VIM工具设置步骤入门 引子 找到配置文件 修改配置文件 引子 VIM作为常用的文本编辑器有很多可以设置项 比如我们打开一个文件以后在命令行模式输入set nu来显示行号 但是这个是针对当前打开的这个文件有效 有时候我们想对所有用vim打开
  • Integer. valueOf()的用法

    Integer valueOf 作用 将基本类型int转换为包装类型Integer 或者将String转换成Integer String如果为Null或 都会报错 Integer valueOf 方法实现如下 public static I
  • 用 ASTERISK 搭建自己的免费 VOIP 服务器

    服务器别闲着 博主又要给大家带来新的玩法咯 1 这里以 Debian 为例子 安装 Asterisk apt get update apt get install asterisk 2 预设置 Asterisk 修改 sip conf 和
  • chrome浏览器安装插件方法

    我的浏览器版本 99 0 4844 51 正式版本 64 位 之前收集安装方法 现在做个处理 实际上对于我的不行 但总有一款适合你 首先打开chrome 的设置 gt 更多工具 gt 扩展程序 开启开发者模式 1 直接把 crx文件拖拽到这
  • java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

    2019独角兽企业重金招聘Python工程师标准 gt gt gt ssm框架报错 原因是事务配置在service spring的配置文件对应方法设置位read only true 解决办法 该方法是DML语句的方法 修改该方法的事务传播属
  • 专利申请过程中出现的20种状态,你都知道吗

    转自 https zhuanlan zhihu com p 32940506 专利申请过程中出现的20种状态 你都知道吗 从专利申请到专利驳回或者授权 会出现以下状态 归结起来 有以下一些 1 等待申请费 此状态表示 专利局已经受理该专利
  • java 读写中文文本

    读取中文文本 要设置gbk格式 该格式中文可以识别 英文也可以 reader new InputStreamReader new FileInputStream filename gbk 拓展 分词 分词时候 读取中文文本 TokenStr
  • java 实现常用后端分页

    背景说明 在实际开发中 基于数据库表结构进行SQL查询 如果要对结果进行分页 可以借助一些工具类 如 基于Mybatis的 工具类 PageHelper 但是 有时分页的对象是经过一些业务逻辑处理的列表 如 两个列表取了交集后 或者按照一定
  • 基于鸿蒙js框架实现的wearable五子棋软件

    我基于鸿蒙js框架开发了一个运行于wearable设备的五子棋软件 主要供大家交流学习使用 软件主要由三个page组成 主要逻辑在index中 其余用来显示输赢 鸿蒙os每个page都由一个css 一个js 一个hml组成 hml编程方式与
  • 配置pycharm解释器

    之前学习的时候下载的社区版本的pycharm 配置的解释器是conda3 8 过了好久以为电脑i没有python 所以又下载了python3 9 最近实习社区版本已经不足以满足日常工作 所以就下载了专业版本 但是配置出现了问题我以前的路径识
  • 通过一个无人机代码例程学会ardunio

    第一部分 关于接线 1 首选在接收机的任意一个空置插口引出一个vcc和GND 直接连接arduino 5v 和GND 这时你的arduino就和飞机连成了一套系统 可以共同工作了 2 接下来把接收机供给飞控的四根信号线从飞控上卸下 连接在a