Ранее я писал статью чем и как программировать радиомодули со встроенным микроконтроллером NRF24LE1. Вот и пришло время более подробно рассказать как научить данные радиомодули передавать и принимать информацию от других аналогичных радиомодулей NRF24LE1 или NRF24L01.
Рассмотрим пример беспроводного клиента для nRF24L01-USB описанного ранее, а так же в моем блоге. Там же имеется вариант опроса датчиков на базе Arduino+Ethernet w5100. Алгоритм данных примеров очень простой и заключается в том, что первый байт пакета содержит номер клиента.Все клиенты используют одинаковые pipe адреса приема и передачи. Вы конечно же можете реализовать свой алгоритм приема и отправки данных.
Компилирование прошивки под Linux
Основная операционная система на моем домашнем и рабочем компьютере — это Suse. Я не использую дополнительные IDE, а пишу в удобном текстовом редакторе KWrite.
Для начала установим компилятор SDCC. Для этого скачаем linux версию компилятора с сайта sdcc.sourceforge.net/ и скопируем в соответствующие папки файлы из архива в систему.
Для конвертации файла hex в bin скачаем утилиту hex2bin. Исполняемый файл утилиты можно разместить в папке с проектами 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/. А если Вы хотите собирать прошивку через консоль, как linux, используя утилиту make, то вам может пригодится это (не проверял). Не забываем так же скачать утилиту hex2bin под Windows.
Пример исходного кода радиомодуля
Всю информацию и исходные коды я собрал на github. В примере реализовано чтение датчиков 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, для этого всего лишь необходимо включить этот код в проект. Позже этот список может быть дополнен.
Сейчас мы можем задать режим вывода как в ардуино:
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. В коде включен пример чтения DS12B20, пример чтения датчиков DHT отключен через #if 0. Чтение датчиков и работа с радио не использует функцию delay, а выполнена на millis().
Конечно же изучение NRF24LE1 будет продолжатся, например не протестирован интерфейс i2c -но тут нет ничего сложного. Проект постараюсь развивать — так что следите за обновлением.
Отвечу в комментариях на интересующие вопросы.
Автор: MaksMS