Трансивер 2.4 гГц nRF24L01+
Купить на Паркфлаере
Купить на Паркфлаере (другая распиновка)
Купить на Паркфлаере
Купить на "Умные устройства"
Радиомодуль построен на однокристальном трансивере nRF24L01. Радиус действия до 100м. Его удобно использовать для построения беспроводных сетей домашней автоматизации, каналов дистанционного управления, в игрушках. Модуль имеет компактные размеры и встроенную антенну.
Характеристики:
Интерфейс подключения: SPI (5V tolerant)
Напряжения питания: 3.3В
Диапазон: 2.4 гГц
Модуляция: GFSK
Количество каналов: 128
Количество одновременных каналов радиосвязи: 6
Длинна сетевого адреса: 5байт
Скорость радиоканала: 250Кбит/с, 1Мбит/с, 2Мбит/с
Даташит
Библиотека для Arduino (Mirf)
Используя эту библиотеку, я столкнулся с неожиданной проблемой: на одной из моих плат разъем для модуля оказался на программном SPI (iBoard Pro от Itead Studio). Библиотеку пришлось несколько подредактировать, чтоб была возможность использовать как хардверный, так и софтверный SPI. Результат можно скачать тут.
Распиновка:
NRF24L01 pin |
Arduino Uno/Nano/Mini |
Arduino Mega |
1 - GND |
GND |
GND |
2 - VCC |
3.3V |
3.3V |
3 - CE(прием/передача) |
9 |
9 |
4 - CSN(Выбор устройства, инвертированный) |
10 |
53 |
5 - SCK(тактирование) |
13 |
52 |
6 - MOSI |
11 |
51 |
7 - MISO |
12 |
50 |
8 - IRQ(прерывание) |
2 |
2 |
Для тестирования необходимо 2 модуля с двумя микроконтроллерами. Тестовый пример передает данные, принятые по параллельному порту МК1 на параллельный порт МК2.
При прошивке микроконтроллеров необходимо установить для МК1:
#define TX_ADDR "app1"
#define RX_ADDR "app2"
Для МК2:
#define TX_ADDR "app2"
#define RX_ADDR "app1"
Пример кода (Arduino) для теста:
#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
#define MAX_BUFF 32 //Буфер приёма-передачи
#define TX_ADDR "app2"
#define RX_ADDR "app1"
void setup(){
Serial.begin(9600);
Mirf.spi = &MirfHardwareSpi;
Mirf.cePin = 9;
// UNO
Mirf.csnPin = 10;
//MEGA
//Mirf.csnPin = 53;
Mirf.init();
Mirf.setRADDR((byte *)RX_ADDR); //Здесь задаём собственный адрес
Mirf.payload = MAX_BUFF; //Здесь задаём буфер
Mirf.channel = 10;
//Это канал приёма-передачи - должен быть одинаковым у устройств.
Mirf.config();
Serial.println("Start..");
}
char buff[MAX_BUFF];
int c_count = 0;
void loop(){
int i;
//sending
if (c_count = Serial.available()) {
if (c_count <= MAX_BUFF) {
for (i=0; i<c_count; i++) {
buff[i] = Serial.read();
}
} else {
for (i=0; i<MAX_BUFF; i++) {
buff[i] = Serial.read();
}
}
buff[i] = 0;
Mirf.setTADDR((byte *)TX_ADDR); //Адрес получателя
Serial.print(">");
Mirf.send((uint8_t *)buff);
while(Mirf.isSending()){
}
Serial.println(buff);
}
delay(10);
//receiving
if(Mirf.dataReady()) {
Mirf.getData((uint8_t *)buff);
if (buff[0]!=0)
{
Serial.print("<");
Serial.println(buff);
}
}
delay(100);
}
|