本文介绍 Arduino和promini组装一个无线收发器

Arduino和promini组装一个无线收发器

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

缘起

话说我想做一个牛逼的东西,这个东西实现什么功能呢?就是我需要一个信号发送器,控制远方的无人机,注意这里的无人机是微型无人机,所有打在GPS芯片的基本上不用考虑了。可行的方案只有promini + nRF24L01, 这个芯片只要几块钱,可以买两块,一个发送指令,一个接受指令,然后用promini进行进行无人机的控制。

nRF24L01 闪亮登场

nRF24L01和Arduino怎么连接呢?

牛逼图片

牛逼图片


偷得图

偷得图

连线的顺序是这样的:
VCC <-> 3.3V
GND <-> GND
CE <-> D9
CSN <-> D10
MOSI<-> D11
MISO<-> D12
SCK <-> D13
IRQ <-> 不接
这里说明一下,CE, CSN 必须接D9和D10,但是其他可以不按照顺序接, 最后一个不需要接。贴出一个Sender的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
void setup()
{
Serial.begin(9600);
Mirf.cePin = 9; //设置CE引脚为D9
Mirf.csnPin = 10; //设置CE引脚为D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init(); //初始化nRF24L01
//设置接收标识符"Sen01"
Mirf.setRADDR((byte *)"Sen01");
//设置一次收发的字节数,这里发一个整数,写sizeof(unsigned int),实际等于2字节
Mirf.payload = sizeof(unsigned int);
//发送通道,可以填0~128,收发必须一致。
Mirf.channel = 3;
Mirf.config();
//注意一个Arduino写Sender.ino,另一个写Receiver.ino。
//这里标识写入了Sender.ino
Serial.println("I'm Sender...");
}
unsigned int adata = 0;
void loop()
{
//读取A0值到adata
adata = analogRead(A0);
//由于nRF24L01只能以byte单字节数组形式发送Mirf.payload个数据,
//所以必须将所有需要传输的数据拆成byte。
//下面定义byte数组,存放待发数据,因为Mirf.payload = sizeof(unsigned int);
//实际下面等于byte data[2];
byte data[Mirf.payload];
//adata是unsigned int双字节数据,必须拆开。
//将adata高低八位拆分:
data[0] = adata & 0xFF; //低八位给data[0],
data[1] = adata >> 8; //高八位给data[1]。
//设置向"serv1"发送数据
Mirf.setTADDR((byte *)"Rec01");
Mirf.send(data);
//while死循环等待发送完毕,才能进行下一步操作。
Serial.println(adata);
while (Mirf.isSending()) {}
delay(20);
}

结果显示如下: