Беспроводной приемопередатчик 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();
}