====== Беспроводной приемопередатчик 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 – занято много выходов
  * Требуется контроллер для работы
  * Сложны в подключении

==== Библиотека для работы с модулем ====
  * [[http://files.smartelements.ru/know_libs/nrf905.zip|Скачать (nrf905)]]

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

^ Что нужно                                                                                                                        ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                                     |  1          |
| [[http://smartelements.ru/collection/svyaz/product/besprovodnoy-priemoperedatchik-nrf905|Беспроводной приемопередатчик NRF905]]  |  1          |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-mama|Провода папа-мама]]           |  11          |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-papa|Провода папа-папа]]           |  7          |
| [[http://smartelements.ru/collection/radiodetali/product/nabor-rezistorov|Резисторы 4,7 кОм]]           |  6          |
| [[http://smartelements.ru/collection/radiodetali/product/nabor-rezistorov|Резисторы 220 Ом]]           |  6          |

**Подключение:**
{{ :главная:связь:nrf905_m.jpg |}}

**Скетч для загрузки:**
<file Arduino>
#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);
}

</file>

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

^ Что нужно                                                                                                                        ^ Кол-во, шт  ^
| [[http://smartelements.ru/collection/kontrollery/product/kontroller-smart-uno|Контроллер Smart UNO]]                                     |  1          |
| [[http://smartelements.ru/collection/svyaz/product/besprovodnoy-priemoperedatchik-nrf905|Беспроводной приемопередатчик NRF905]]  |  1          |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-mama|Провода папа-мама]]           |  11          |
| [[http://smartelements.ru/collection/provoda-i-kabeli/product/nabor-provodov-20-sht-20sm-papa-papa|Провода папа-папа]]           |  7          |
| [[http://smartelements.ru/collection/radiodetali/product/nabor-rezistorov|Резисторы 4,7 кОм]]           |  6          |
| [[http://smartelements.ru/collection/radiodetali/product/nabor-rezistorov|Резисторы 220 Ом]]           |  6          |


**Подключение:**
{{ :главная:связь:nrf905_m.jpg |}}

Скетч для загрузки:
<file Arduino>
Приемник:
#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();
}

</file>