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

Программируем nRF24LE1 через Raspberry PI и USBasp

image
Некоторое время назад на хабре упоминались недорогие (от $6 ) радио модули nRF24LE1 со встроенным микроконтроллером.На этих радио модулях ребята из COOLRF планировали осуществлять свой проект, но в итоге «переехали» на более дорогой чип Atmega128RFA1, а nRF24LE1 как я понял отодвинули на второй план.

В статье мы рассмотрим возможность прошивки радио модуля через Raspberry PI и USBasp а так же пару примеров кода на Си.

Описание nRF24LE1

Существует 3 варианта корпуса чипа: QFN24 (4×4 mm), QFN32 (5×5 mm), QFN48 (7×7 mm).И периферия I2C, UART, SPI находятся на разных выводах (см с 131 страницы даташита). Здесь я рассмотрю вариант QFN32 и технические характеристики будут относится к нему.

Радио передающая часть полностью аналогична «безмозглому» варианту nRF24L01:
2.4 Ггц,125 каналов. Поддерживаемые скорости 250kbps, 1Mbps и 2Mbps и т.д.

Встроенный же 8051-совместимый микроконтроллер имеет следующие параметры:

  • Тактовая частота 16мгц.Частотой можно управлять (понижать до 125кгц) в реальном времени.
  • Доступная flash память для программы 16кб.
  • ОЗУ (RAM) память 1 кб.
  • 1 кб. NVRAM (EEPROM память)
  • 7 выводов поддерживают 6..12 битных АЦП .
  • Два восьмибитных PWM (ШИМ) вывода.
  • А так же имеются интерфейсы: I2C, UART, SPI.
  • Напряжение питания 1,9В...3,6В.
  • Программирование через slave SPI.

Программирование nRF24LE1 через Raspberry PI

Прошить nRF24LE1 возможно через «родной» программатор, который относительно дорог — около $30 на Ebay. Цена мне конечно не понравилась и на просторах интернета был найден вариант программатора на основе Raspberry PI github.com/derekstavis/nrf24le1-libbcm2835 [1]. Исходный код программатора был немного модифицирован и русифицирован — пришлось переводить с португальского. Модифицированную версию можно скачать по ссылке в конце статьи.

Для программирования радио модуля необходимо подключить выводы SPI согласно таблице:
image
Вывод PROG nRF24LE1 необходимо подключить к 24 выводу GPIO на Raspberry PI. FCSN подключаем аналогично на СЕ0 (вывод 8) .Reset подтягиваем на плюс.Не забываем подключить GND и VDD к 3.3в.
Карта нумерации выводов радио модуля может быть разная(из-за разного корпуса микросхемы и разводки печатной платы) и обычно данную информацию можно найти там же где продается сам nRF24LE1, например при покупке на Ebay карта нумерации указывается на странице товара.

Для заливки прошивки воспользуемся скомпилированной программой nrf24le1 используя следующие команды:

  • ./nrf24le1 test — выводит тестовую информацию nRF24LE1 (InfoPage).
  • ./nrf24le1 write — прошьет файл main.bin, лежащий в этой же папке в nRF24LE1.
  • ./nrf24le1 read -создаст дамп прошивки из nRF24LE1 под имененем main-dump.bin .

Программирование nRF24LE1 через USBasp

После изучения варианта прошивки через Raspberry PI, был разработан свой вариант более простой, который может реализовать любой пользователь, программирующий микроконтроллеры AVR и имеющий на вооружении программатор USBasp. Про данный программатор ранее я упоминал [2], реализовав на нём несколько разнообразных устройств в том числе nRF24L01-USB.
Для данной идеи был использован тот же исходный код программатора под Raspberry PI. А USBasp перепрограммирован в USB-SPI переходник используя библиотеку V-USB.
Программатор на базе USBasp относительно медленный -вся прошивка в 16кб. «заливается» за 12 секунд, но это компенсируется ценой — все же цена этого программатора $3, а не $30.
Подключение nRF24LE1 к USBasp в следущем порядке, по нумерации десяти контактного разъема:
image
Кстати, неясно толерантны ли выводы nRF24LE1 к 5 Вольтам и нужны ли делители на резисторах для согласования уровней между nRF24LE1 и USBasp. В итоге я не использовал делители и никаких негативных последствий не получил — Вы можете так же не устанавливать делители, но на свой страх и риск. Например у nRF24L01+ выводы толеранты и допускают подключение 5 Вольтовым микроконтроллерам.
Все действия по программированию аналогичны программированию через Raspberry PI.

Пишем первые программы на nRF24LE1

Для написания программы я воспользовался бесплатным кросс платформенным компилятором SDCC sdcc.sourceforge.net/ [3].
nRF24LE1 имеет SDK [4], где расписаны основные функции для работы с микроконтроллером.Этот SDK [5] проверен и поправлен мною. Он собран из нескольких источников.

Вот так выглядит пример мигания светодиодом

#include <stdint.h>
#include <stdio.h>

//подключение необходимых функций SDK:

#include "src/gpio/src/gpio_pin_configure.c"
#include "src/gpio/src/gpio_pin_val_clear.c"
#include "src/gpio/src/gpio_pin_val_set.c"

#include "delay.h"
#include "src/delay/src/delay_us.c"
#include "src/delay/src/delay_s.c"
#include "src/delay/src/delay_ms.c"

void main()
{
 // мигаем портом P0_0
	gpio_pin_configure(GPIO_PIN_ID_P0_0, // укажем необходимые параметры
			GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT |
			GPIO_PIN_CONFIG_OPTION_OUTPUT_VAL_CLEAR |
			GPIO_PIN_CONFIG_OPTION_PIN_MODE_OUTPUT_BUFFER_NORMAL_DRIVE_STRENGTH);
	
		while(1)
	{
gpio_pin_val_set(GPIO_PIN_ID_P0_0); // установка в 1
	 delay_ms(500); 
gpio_pin_val_clear(GPIO_PIN_ID_P0_0); //установка в 0
	 delay_ms(500); 
	}
}

Пример плавного зажигания светодиода используя PWM вывод

#include <stdio.h>

//подключение необходимых функций SDK:
#include "delay.h"
#include "src/delay/src/delay_us.c"
#include "src/delay/src/delay_s.c"
#include "src/delay/src/delay_ms.c"

#include "src/pwm/src/pwm_configure.c"
#include "src/pwm/src/pwm_start.c"

void main()
{
int i=0;
  // делитель на 10 , битность 8
  pwm_configure(PWM_CONFIG_OPTION_PRESCALER_VAL_10 || PWM_CONFIG_OPTION_WIDTH_8_BITS);
  
	//main program loop
	while(1)
	{

pwm_start(PWM_CHANNEL_0,i);

	  i++;

	 delay_ms(200);   

	 if (i>255) i=0;

	}
}

В данный момент доделываю пример для работы с nRF24L01-USB. Уже реализовано чтение датчика DHT22 и управление нагрузками по радиоканалу. В будущем планирую сделать примерный аналог библиотеки Arduino RF24 -осталось доделать пару функций.
В целом, после программирования на микроконтроллерах AVR программирование nRF24LE1 мне показался не чуть не сложным.

Какие подручные железки можно ещё переделать под программирование nRF24LE1 ?

Подойдет любой аналогичный мини компьютеру Raspberry PI, например Cubieboard.
Можно реализовать программатор на Arduino.Возможно займусь таким вариантом.
Любой микроконтроллер с аппаратной поддержкой USB, например STM-ки.

Исходные коды и пример:
Программатор на Raspberry PI [6]
Программатор на USBasp [7]
SDK [5]
led_delay [8]
Даташит [9]

Может что-то упустил и остались вопросы — пишите в комментариях.

Автор: MaksMS

Источник [10]


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

Путь до страницы источника: https://www.pvsm.ru/raspberry-pi/54054

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

[1] github.com/derekstavis/nrf24le1-libbcm2835: https://github.com/derekstavis/nrf24le1-libbcm2835

[2] упоминал: http://habrahabr.ru/post/208470/

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

[4] SDK: http://www.diyembedded.com/lib/nrf24le1/lib_nrf24le1_sdk_v4.0.zip

[5] SDK: http://homes-smart.ru/upload/NRF24LE1/SDK_work.zip

[6] Программатор на Raspberry PI: http://homes-smart.ru/upload/NRF24LE1/nrf24le1-libbcm2835_hs.zip

[7] Программатор на USBasp: http://homes-smart.ru/upload/NRF24LE1/nrf24le1_Downloader.zip

[8] led_delay: http://homes-smart.ru/upload/NRF24LE1/led_delay.zip

[9] Даташит: http://homes-smart.ru/upload/NRF24LE1/nRF24LE1_OTP_Product_Specification_rev1_2.pdf

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