- PVSM.RU - https://www.pvsm.ru -

Программируем радиомодуль NRF24LE1. Готовый беспроводной клиент

Ранее я писал [1] статью чем и как программировать радиомодули со встроенным микроконтроллером NRF24LE1. Вот и пришло время более подробно рассказать как научить данные радиомодули передавать и принимать информацию от других аналогичных радиомодулей NRF24LE1 или NRF24L01.
Рассмотрим пример беспроводного клиента для nRF24L01-USB описанного ранее [2], а так же в моем блоге [3]. Там же имеется вариант [4] опроса датчиков на базе Arduino+Ethernet w5100. Алгоритм данных примеров очень простой и заключается в том, что первый байт пакета содержит номер клиента.Все клиенты используют одинаковые pipe адреса приема и передачи. Вы конечно же можете реализовать свой алгоритм приема и отправки данных.

Компилирование прошивки под Linux

Основная операционная система на моем домашнем и рабочем компьютере — это Suse. Я не использую дополнительные IDE, а пишу в удобном текстовом редакторе KWrite.
Для начала установим компилятор SDCC. Для этого скачаем linux версию компилятора с сайта sdcc.sourceforge.net/ [5] и скопируем в соответствующие папки файлы из архива в систему.
Для конвертации файла hex в bin скачаем утилиту hex2bin [6]. Исполняемый файл утилиты можно разместить в папке с проектами NRF24LE1, указав правильный путь в makefile:

CCFLAGS=-I../include/ -I../src/--std-c99
LDFLAGS= -L../src/
PROGRAMS = main
SOURCES = ${PROGRAMS:=.c}
all: ${PROGRAMS}
${PROGRAMS}: ${SOURCES}
	sdcc --model-large $(CCFLAGS) $(LDFLAGS) main.c
	../hex2bin -p 00 main.ihx
clean:
	rm -rf  main.asm  main.cdb  main.ihx  main.lk  main.lst  main.map  main.mem  main.omf  main.rel  main.rst  main.sym

Компилирование прошивки под Windows

К сожалению прошивку для NRF24LE1 в Windows я не собирал за ненадобностью. Здесь так же можно использовать подходящий текстовый редактор или установить IDE. Компилятор SDCC для Windows аналогично можно скачать на сайте sdcc.sourceforge.net/ [5]. А если Вы хотите собирать прошивку через консоль, как linux, используя утилиту make, то вам может пригодится это [7] (не проверял). Не забываем так же скачать утилиту hex2bin [6] под Windows.

Пример исходного кода радиомодуля

Всю информацию и исходные коды я собрал на github [8]. В примере реализовано чтение датчиков ds18b20,dht11,dht22, чтение АЦП, управление ШИМ. Реализовал функцию millis() как в Arduino, используя таймер. Так же попытался реализовать функции для настройки радиомодуля аналогично библиотеке RF24 Arduino.
Я не являюсь «гуру» по программированию и относительно не так давно занялся микроконтроллерами и по этому мой подход в программировании не всегда может быть правильным.

Язык wiring или попытка реализовать arduino язык на радиомодуле

Функции у SDK радиомодуля имеют не удобное и длинное название, но а если попытаться реализовать язык wiring?

Очень просто:

#define digitalWrite		gpio_pin_val_write
#define digitalRead		gpio_pin_val_read
#define pinMode			gpio_pin_configure
#define OUTPUT			GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT
#define INPUT			GPIO_PIN_CONFIG_OPTION_DIR_INPUT
#define LOW			0
#define HIGH 			1
#define delay			delay_ms
#define delayMicroseconds	delay_us
#define AnalogWrite		pwm_start
#define AnalogRead		adc_start_single_conversion_get_value 

#define sei()			interrupt_control_global_enable()
#define cli()			interrupt_control_global_disable()

Данные макросы не увеличивают размер кода и дают возможность новичкам программировать радиомодуль как Arduino, для этого всего лишь необходимо включить этот код в проект. Позже этот список [9]может быть дополнен.
Сейчас мы можем задать режим вывода как в ардуино:

pinMode(5, OUTPUT);

Или установить высокий уровень на ножке микроконтроллера

digitalWrite(5, 1);

Кстати, к портам можно обращаться как по нумерации портов, например GPIO_PIN_ID_P1_4, а можно используя порядок выводов, например GPIO_PIN_ID_P1_2 будет соответствовать 10 (1*8+2).

Для инициализации АЦП необходимо все же выполнить функцию:

adc_configure (ADC_CONFIG_OPTION_RESOLUTION_10_BITS);

Где задается разрядность АЦП, которая может быть от 6 до 12 бит.

Для ШИМа (PWM):

pwm_configure(PWM_CONFIG_OPTION_PRESCALER_VAL_10 || PWM_CONFIG_OPTION_WIDTH_8_BITS);

Где задается делитель, а так же разрядность PWM.

Инициализация радиомодуля или файл nRFLE.c

В данном файле описаны функции инициализации радиомодуля для настройки регистров. Название функций соответствует библиотеке RF24. Пример инициализации:

radiobegin(); // инициализация радиомодуля и SPI.
openAllPipe(); // открываем 2 канала: прием и передачу.
// или по ардуиновски:
//openWritingPipe(0xD2); // канал передачи
//openReadingPipe(1,0xE1); // Открываем канал приема

setChannel(100); // установка канала
setDataRate(2); // установка скорости: 1 - 250кб , 2 - 1 мб , 3 -2 мб.
setAutoAck(false); // выключение автопотверждения.
setCRCLength(2); // режим crc: 0 - crc off ,1 - 8bit ,2 - 16bit
setPALevel(3) ; // мощность сигнала: 0..3

В отличии от библиотеки RF24 в функции openWritingPipe и openReadingPipe передаются только младшие байты адреса. Старшие байты задаются в файле nRFLE.c. Функции openWritingPipe и openReadingPipe в коде отключены и вместо их используется упрощенная функция openAllPipe().
Пример реализации находится на github [10]. В коде включен пример чтения DS12B20, пример чтения датчиков DHT отключен через #if 0. Чтение датчиков и работа с радио не использует функцию delay, а выполнена на millis().

Конечно же изучение NRF24LE1 будет продолжатся, например не протестирован интерфейс i2c -но тут нет ничего сложного. Проект [11] постараюсь развивать — так что следите за обновлением.

Отвечу в комментариях на интересующие вопросы.

Автор: MaksMS

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/56732

Ссылки в тексте:

[1] писал: http://habrahabr.ru/post/210974/

[2] ранее: http://habrahabr.ru/post/208470/

[3] моем блоге: http://homes-smart.ru/index.php/oborudovanie/bez-provodov-2-4-ggts/nrf24l01-usb-iz-usbasp

[4] вариант: http://homes-smart.ru/index.php/oborudovanie/bez-provodov-2-4-ggts/shlyuz-ethernet-nrf24l01-w5100-na-baze-arduino-dlya-obmena-dannymi-s-nrf24l01-i-nrf24le1

[5] sdcc.sourceforge.net/: http://sdcc.sourceforge.net/

[6] hex2bin: http://hex2bin.sourceforge.net/

[7] это: http://www.steve.org.uk/Software/make/

[8] github: https://github.com/maksms/NRF24LE1_client

[9] список : https://github.com/maksms/NRF24LE1_client/blob/master/wiringLE.c

[10] github: https://github.com/maksms/NRF24LE1_client/tree/master/nRF_TIMER

[11] Проект: https://github.com/maksms/NRF24LE1_client/

[12] Источник: http://habrahabr.ru/post/215187/