第一部分:关于接线
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
:要设置其模式的引脚编号
mode
:INPUT
,OUTPUT
,或INPUT_PULLUP
。(有关功能的更完整说明,请参阅(数字引脚)页面。)
返回
没有
示例代码
该代码使得数字销13 OUTPUT
与切换之HIGH
和LOW
void setup()
{
pinMode(13,OUTPUT); //将数字引脚13设置为输出
}
void loop()
{
digitalWrite(13,HIGH); //设置数字引脚13
延迟(1000); //等一下
digitalWrite(13,LOW); //将数字引脚13设置为关闭
延迟(1000); //等一下
}
pulseIn()
[高级I / O]
描述
读取引脚上的脉冲(HIGH
或者LOW
)。例如,如果value
是HIGH
,pulseIn()
等待从销去LOW
到HIGH
,开始计时,然后等待销去LOW
并停止定时。返回脉冲的长度(以微秒为单位)或放弃,如果超时内未收到完整脉冲,则返回0。
该功能的时间已经凭经验确定,并且可能在较长脉冲中显示错误。适用于长度为10微秒至3分钟的脉冲。
句法
pulseIn(pin, value)
pulseIn(pin, value, timeout)
参数
pin
:要读取脉冲的引脚编号。(INT)
timeout
(可选):等待脉冲开始的微秒数; 默认是一秒(无符号长)
返回
脉冲的长度(以微秒为单位),如果在超时之前没有脉冲开始,则为0(无符号长整数)
示例代码
该示例计算了引脚7上脉冲的持续时间。
int pin = 7;
unsigned long duration;
void setup()
{
pinMode(pin, INPUT);
}
void loop()
{
duration = pulseIn(pin, HIGH);
}
digitalWrite()
[数字I / O]
描述
将数字HIGH
或LOW
值写入数字引脚。
如果引脚已配置为OUTPUT
with pinMode()
,则其电压将设置为相应的值:5V(或3.3V板上3.3V)HIGH
,0V(接地)LOW
。
如果引脚配置为a INPUT
,digitalWrite()
将使能(HIGH
)或禁用(LOW
)输入引脚上的内部上拉。建议设置pinMode()
以INPUT_PULLUP
使能内部上拉电阻。有关更多信息,请参阅数字引脚教程。
如果未设置pinMode()
为OUTPUT
,并将LED连接到引脚,则在呼叫时digitalWrite(HIGH)
,LED可能显得暗淡。如果没有明确设置pinMode()
,digitalWrite()
将启用内部上拉电阻,它就像一个大限流电阻。
句法
digitalWrite(pin, value)
参数
pin
:引脚号
value
:HIGH
或LOW
返回
没有
示例代码
该代码使得数字销13的OUTPUT
和由之间交替切换它HIGH
和LOW
以一秒的步伐。
void setup()
{
pinMode(13,OUTPUT); //将数字引脚13设置为输出
}
void loop()
{
digitalWrite(13,HIGH); //设置数字引脚13
延迟(1000); //等一下
digitalWrite(13,LOW); //将数字引脚13设置为关闭
延迟(1000); //等一下
}
备注和警告
模拟输入引脚可用作数字引脚,称为A0,A1等。
map()
描述
将数字从一个范围重新映射到另一个范围。也就是说,fromLow的值将被映射到toLow,值从high到toHigh,值介于两者之间,等等。
不会将值限制在该范围内,因为超出范围的值有时是有意义且有用的。该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电阻的其他器件,除非特定应用需要从引脚获取最大电流。