Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров85K
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. Исходный код программатора был немного модифицирован и русифицирован — пришлось переводить с португальского. Модифицированную версию можно скачать по ссылке в конце статьи.

Для программирования радиомодуля необходимо подключить выводы 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. Про данный программатор ранее я упоминал, реализовав на нём несколько разнообразных устройств в том числе 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.
nRF24LE1 имеет SDK, где расписаны основные функции для работы с микроконтроллером.Этот SDK проверен и поправлен мною. Он собран из нескольких источников.

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

UPD: Забыл упомянуть, что компилятор создает hex файл, а программаторам нужен бинарный. Для преобразования файла можно воспользоваться утилитой hex2bin. Можно прописать команду hex2bin -p 00 main.ihx в make файл.

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


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

Исходные коды и пример:
Программатор на Raspberry PI
Программатор на USBasp (обновлено 5.02.14)
SDK
led_delay
Даташит

Может что-то упустил и остались вопросы — пишите в комментариях.
Теги:
Хабы:
Всего голосов 33: ↑31 и ↓2+29
Комментарии12

Публикации

Истории

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань