- PVSM.RU - https://www.pvsm.ru -
Ранее я писал [1] статью чем и как программировать радиомодули со встроенным микроконтроллером NRF24LE1. Вот и пришло время более подробно рассказать как научить данные радиомодули передавать и принимать информацию от других аналогичных радиомодулей NRF24LE1 или NRF24L01.
Рассмотрим пример беспроводного клиента для nRF24L01-USB описанного ранее [2], а так же в моем блоге [3]. Там же имеется вариант [4] опроса датчиков на базе Arduino+Ethernet w5100. Алгоритм данных примеров очень простой и заключается в том, что первый байт пакета содержит номер клиента.Все клиенты используют одинаковые pipe адреса приема и передачи. Вы конечно же можете реализовать свой алгоритм приема и отправки данных.
Основная операционная система на моем домашнем и рабочем компьютере — это 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
К сожалению прошивку для NRF24LE1 в Windows я не собирал за ненадобностью. Здесь так же можно использовать подходящий текстовый редактор или установить IDE. Компилятор SDCC для Windows аналогично можно скачать на сайте sdcc.sourceforge.net/ [5]. А если Вы хотите собирать прошивку через консоль, как linux, используя утилиту make, то вам может пригодится это [7] (не проверял). Не забываем так же скачать утилиту hex2bin [6] под Windows.
Всю информацию и исходные коды я собрал на github [8]. В примере реализовано чтение датчиков ds18b20,dht11,dht22, чтение АЦП, управление ШИМ. Реализовал функцию millis() как в Arduino, используя таймер. Так же попытался реализовать функции для настройки радиомодуля аналогично библиотеке RF24 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.
В данном файле описаны функции инициализации радиомодуля для настройки регистров. Название функций соответствует библиотеке 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/
Нажмите здесь для печати.