Пользователь
0,0
рейтинг
1 февраля 2014 в 19:42

Разработка → Программируем 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. Исходный код программатора был немного модифицирован и русифицирован — пришлось переводить с португальского. Модифицированную версию можно скачать по ссылке в конце статьи.

Для программирования радиомодуля необходимо подключить выводы 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
Даташит

Может что-то упустил и остались вопросы — пишите в комментариях.
Макс @MaksMS
карма
22,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (12)

  • 0
    Отлично, что кто-то смог взяться за это благое дело. Может быть после этой статьи у кого-нибудь другого дойдут руки прикрутить NRF24LE1 к управлению нашем диммером. Статьи с инструкцией по управлению мы еще не публиковали, но можем ответить в личку на все вопросы желающих.
    • 0
      Мы перешли на более дорогой атмел по трем причинам: 1) появился человек, который хорошо в них разбирается, 2) большинство ембеддеров России прекрасно разбираются в программировании атмелов, 3) на нем можно реализовать ZigBee, что дает возможность использовать наши модули совместно с другими, сторонне произведенными.

      Кстати, для NRF24LE1 у нас разработан универсальный USB-модуль на базе FT232, который позволяет шить модули и работать с ними по последовательному порту. Проблема та же. Железо разработано и даже тестовая серия плат сделана, софт писать некому.

      MaksMS, может быть интересно будет разобраться?
      • +1
        Да, я в курсе про программирование через последовательный порт — для этого необходима установка загрузчика на NRF24LE1. Это значит, что хотя бы один раз полноценный программатор требуется, чтобы его туда загрузить. Сам пока этот вариант прошивки не тестировал.
        Я начинал программировать так же на атмел, даже изначально начинал с ардуино, но потом пошло поехало… После атмел изучение NRF24LE1 мне не показалось сложным — есть даташит и там расписано все что нужно. Есть SDK, который упрощает написание прошивки.
        Да, мне интересно будет разобраться.
        • 0
          Нет, у нашего модуля не так немного. Он двухрежимный. Может шить голые NRF24LE1 стандартными SPI FLASH-пинами. И может работать в качестве serial port для последующего общения уже запрограммированного модуля с софтом на компьютере.

          У меня все разработчики вокруг — атмеловцы. И все испугались NRF24LE1, как огня :) Если будет кто-то, кто разберется нормально в этих чипов, часть модулей COOLRF (которые с сокетом под радиомодуль на борту) смогут быть сопряжены с NRF24LE1. Это актуально для совсем экономных самоделкиных.
          • 0
            Да точно, у FT232 есть «bit-bang mode» режим, для обычного дерганья пинов.
      • +1
        Осмелюсь посоветовать выслать ваши железяки автору, в качестве стимула ;) По договорённости конечно.
        • 0
          Обсуждаемо в личке. Я уже правда пытался так ускорить ковыряния с этими модулями, один программатор так и осел без дела на Украине :)
    • +1
      Вот такая платка размером 2,5х5 см с двумя сокетами под оба вида модулей NRF24LE1:

  • +2
    «Не забываем подключить GND и VDD к 3.3в.»
    заставило задуматься на 10 секунд
    • 0
      Ок, уточнил ).
  • +2
    Буду следить за вашими статьями. Считаю что данный модуль является оптимальными, в нем есть уже микроконтроллер который может считывать данные с датчиков и встроенный передатчик.
  • 0
    Дополню статью:
    Существуют программаторы USBasp как минимум двух видов (об этом я писал), в одном имеется стабилизатор на 3.3в и разведены контакты 4 и 6 на десяти контактный разъем, а у другого нет стабилизатора и 4 и 6 контакты на земле.

    Для программирования радиомодуля урезанный USBasp тоже подойдет, только необходим внешний стабилизатор на 3.3в и вывод PROG необходимо вручную подключать на плюс при программировании. Можно поправить прошивку и переделать этот вывод на другой доступный на м/к USBasp.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.