Беспроводной приемопередатчик NRF905

Описание

Универсальный приемопередатчик работающий в ISM диапазоне (Industrial, Scientific, Medical), предназначен для построения радиочастотных систем передачи данных в нелицензированных частотных диапазонах. Приемопередатчики устойчивы к помехам, высокочувствительны, превосходная стабильность частоты, имеют низкое энергопотребление. Применяются для: Удаленного управления, телеметрии, создания беспроводных сетей, систем контроля доступа, систем мониторинга, промышленных систем сбора данных, для беспроводных меток, идентификации, беспроводных радиочастотных смарт-карт, беспроводные терминалы данных, системы безопасности, системы пожарной безопасности, гидрологический и метеорологический мониторинг, управление роботами, цифровая аудио- и видеопередача.

Технические характеристики

  • Напряжение питания: 2,7-3,3В
  • Потребляемый ток в режиме передачи: 30мА
  • Потребляемый ток в режиме приема: 13мА
  • Потребляемый ток в режиме ожидания: 8мкА
  • Рабочая частота: 433МГц
  • Скорость передачи данных: 76,8Кбит/с
  • Количество независимых каналов: 170
  • Чувствительность приемника: -105ДБм
  • Выходная мощность: 10ДБм
  • Дальность связи в прямой видимости: 1000 м

Физические размеры

  • Приемопередатчик (ДхШхВ): 33 х 20 х 15 мм
  • Антенна (ДхШхВ): 8 х 8 х 50 мм

Плюсы использования:

  • Высокая дальность связи
  • Хорошая помехоустойчивость
  • Шифрование сигнала
  • Низкое энергопотребление
  • Одно устройство и приемник и передатчик одновременно

Минусы использования:

  • Интерфейс подключения: SPI – занято много выходов
  • Требуется контроллер для работы
  • Сложны в подключении

Библиотека для работы с модулем

Примеры подключения и использования:

Пример 1 (Передатчик): В примере иллюстрируется отправка абстрактных данных (счетчик) на аналогичный модуль связи, а также попытка приема данных, если они есть и вывод данных в монитор Serial порта. (Пример тестировался на контроллере Smart UNO)

Подключение:

Скетч для загрузки:

#include <nRF905.h>
#include <SPI.h>
 
#define RXADDR {0xFE, 0x4C, 0xA6, 0xE5} // Адрес этого устройства (4 байта)
#define TXADDR {0x58, 0x6F, 0x2E, 0x10} // Адрес устройства, которому будем отправлять (4 байта)
 
#define TIMEOUT 1000 // 1 секунда для перерыва между соединениями
 
void setup()
{
	// Инициализация модуля
	nRF905_init();
 
	// Уставновка адреса (идентификатора) этого устройства
	byte addr[] = RXADDR;
	nRF905_setRXAddress(addr);
 
	// Перевод в режим получения данных
	nRF905_receive();
 
        //Связь с компьютером (для отладки)
	Serial.begin(9600);
	//Вывод сообщения
	Serial.println(F("Client started"));
}
 
void loop()
{
        // Переменная counter - счетчик 
        // Квалификатор static означает что переменная сохраняет значение между вызовами функции
	static byte counter;
 
	// Создание данных для передачи
	char data[NRF905_MAX_PAYLOAD] = {0};
	sprintf(data, "test %hhu", counter);
 
	// Инкремент счетчика
	counter++;
 
	// Запомнить текущее "время"
	unsigned long startTime = millis();
 
	// Установка адреса для передачи
	byte addr[] = TXADDR;
	nRF905_setTXAddress(addr);
 
	// Установка данных
	nRF905_setData(data, sizeof(data));
 
	// Отправить данные (отправить сбой, если происходит другая передача данных,
	// продалжать попытки пока не появится удачная отправка)
	while(!nRF905_send());
 
	// Перевести в режим получения данных
	nRF905_receive();
 
	// Создание буфера для ответа
	byte buffer[NRF905_MAX_PAYLOAD];
	bool success;
 
	// Дождаться ответа с задержкой между соединениями
	unsigned long sendStartTime = millis();
	while(1)
	{
		success = nRF905_getData(buffer, sizeof(buffer));
		if(success)// Получены данные
			break;
 
		// Задержка
		if(millis() - sendStartTime > TIMEOUT)
			break;
	}
 
        // Если данные успешно получены, вывести на дисплей (в терминал)
	if(success)
	{
		unsigned int totalTime = millis() - startTime;
		Serial.print(F("Ping time: "));
		Serial.print(totalTime);
		Serial.println(F("ms"));
 
		// Вывод содержимого соединения
		Serial.print(F("Data from server: "));
		Serial.write(buffer, sizeof(buffer));
		Serial.println();
	}
	else
		Serial.println(F("Ping timed out"));
 
	delay(1000);
}

Пример 2 (Приемник): В примере иллюстрируется прием данных от передатчика, и отправка полученных данных как ответ об успешном получении данных. (Пример тестировался на контроллере Smart UNO)

Подключение:

Скетч для загрузки:

Приемник:
#include <nRF905.h>
#include <SPI.h>
 
#define RXADDR {0x58, 0x6F, 0x2E, 0x10} // Адрес этого устройства (4 байта)
#define TXADDR {0xFE, 0x4C, 0xA6, 0xE5} // Адрес устройства, которому будем отправлять (4 байта)
 
void setup()
{
  // Инициализация модуля
  nRF905_init();
 
  // Уставновка адреса (идентификатора) этого устройства
  byte addr[] = RXADDR;
  nRF905_setRXAddress(addr);
 
  // Перевод в режим получения данных
  nRF905_receive();
 
  //Связь с компьютером (для отладки)
  Serial.begin(9600);
  //Вывод сообщения
  Serial.println(F("Server started"));
}
 
void loop()
{
	Serial.println(F("Waiting for ping..."));
 
	// Создание буфера для данных
	byte buffer[NRF905_MAX_PAYLOAD];
 
	// Ожидание данных
	while(!nRF905_getData(buffer, sizeof(buffer)));
 
        //Произведено соединение
	Serial.println(F("Got ping"));
 
	// Установка адреса для передачи
	byte addr[] = TXADDR;
	nRF905_setTXAddress(addr);
 
	// Установить основные данные (ответ с полученными данными)
	nRF905_setData(buffer, sizeof(buffer));
 
        //Сообщение об отправке ответа
	Serial.println(F("Sending reply..."));
 
        // Отправить данные (отправить сбой, если происходит другая передача данных,
        // продолжать попытки пока не появится удачная отправка)
	while(!nRF905_send());
 
	// Вернуть в режим получения данных
	nRF905_receive();
 
        // Сообщение об успешной отправке ответа
	Serial.println(F("Reply sent"));
 
	// Вывести содержание соединения
	Serial.print(F("Data: "));
	Serial.write(buffer, sizeof(buffer));
	Serial.println();
}