СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

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

Ранее я писал статью чем и как программировать радиомодули со встроенным микроконтроллером 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 -но тут нет ничего сложного. Проект постараюсь развивать — так что следите за обновлением.

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

комментарии (7)

0
utya ,  

Спасибо за пост. А не могли бы сделать небольшую заметку как всё таки это всё делать поднять под Windows. Спасибо

+1
MaksMS ,   * (был изменён)

Можно конечно дописать без проблем, а какой именно вопрос необходимо раскрыть под Windows? Вот подсказали редактор для кода — Sublime Text.

0
utya ,  

Тоесть надо какое-то IDE, на вкус. Компилятор к нему прикрутить, и утиль hex2bin? И заливаем прошивку через малину, usbasp (всё как в прошлой статье)?

+1
MaksMS ,   * (был изменён)

Да, например Eclipse, если не ошибаюсь…

0
DrDiza ,  

Я прошу прощения, но разве вместо битового адреса нельзя сделать стек TCp/IP на этих железяках?

0
MaksMS ,  

Где-то видел комментарий — не помню на каком форуме, что человек реализовал такое на nrf24l01+. По идее можно и тут это реализовать, если хватит ресурсов -все таки тут всего 16кб флеша и 1 кб озу…

0
wrewolf ,  

Благодаря вашим статьям я могу не думая собирать конструктор из кирпичиков.
Но уже есть набор своих грабель. Надо будет тоже выложить в виде статьи.