Amateur Radio Station R9AL



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

В модуле использована частотная модуляция с минимальной девиацией частоты, а запатентованная технология ShockBurst повышает помехоустойчивость. Имеется возможность программной смены чувствительности приемника и мощности передатчика. Управление модулем выполняется по SPI. Микросхема nRF905 имеет встроенный стабилизатор напряжения питания.

nRF905 не совместим с 5В уровнями логики, поэтому подключение без преобразователя уровней может вывести модуль из строя.

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

Габаритные размеры Библиотека для работы с модулем: nrf905.zip

Подключение модуля выполняется по следующей схеме: Интерфейс SPI:

Принципиальная схема, для демонстрации работы модуля


Схема подключения модуля nRF905 к Arduino одинакова и для приемника и для передатчика. В качестве преобразователей уровня использованы делители на резисторах.



Передатчик


Скетч для передатчика: В примере иллюстрируется отправка абстрактных данных (счетчик) на аналогичный модуль связи, а также попытка приема данных, если они есть и вывод данных в монитор Serial порта. (Пример тестировался на контроллере Arduino 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);
}




Приемник


Скетч для приемника: В примере иллюстрируется прием данных от передатчика, и отправка полученных данных как ответ об успешном получении данных. (Пример тестировался на контроллере Arduino 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();
}








Copyright © R9AL 2023 Все права защищены
Рейтинг@Mail.ru Яндекс цитирования