Содержание
Урок 1. Первый проект
Урок 2. Управление кнопками
Урок 3. Подключение LCD
Урок 4. Использование ШИМ
Урок 5. Таймеры
Урок 6.1. Статическая индикация
Урок 6.2. Динамическая индикация
Урок 7.1. Генерация звука
Урок 7.2. Генерация звука. Продолжение
Урок 8.1. Передача данных через UART
Урок 8.2. Передача данных через UART. Продолжение»
Урок 9. Передача данных через SPI
Урок 10. Изучение АЦП. Простой вольтметр
Урок 11. Получение синуса при помощи ШИМ
Урок 12. Измерение температуры
Урок 13. Внешние прерывания.
Урок 14. Использование отладчика
Урок 15.1. Управление инкрементальным энкодером
Урок 15.2. Управление громкостью, при помощи энкодера
Урок 16. Управление RGB светодиодом
Урок 17. Использование ИК
Урок 18.1. Знакомство с графическим дисплеем
Урок 18.2 Вывод изображения на графический дисплей
Урок 18.3 Вывод русскоязычного текста
Урок 19. Формирование сигнала, при помощи ЦАП (R2R)
Урок 20. Опрос матричной клавиатуры
Урок 21. Сторожевой таймер
Урок 22.1 Воспроизведение wav. Введение.
Урок 22.2 Воспроизведение wav. Продолжение.
Урок 23.1 Работа с внешней памятью
Урок 23.2 Работа с файловой системой Fat

Прошли те времена, когда для написания статьи было достаточно протеуса и часок-другой времени. Растут дети, растут и их игрушки 🙂

Начнем с того что это. Это радиомодули, т.е. если взять 2 таких модуля и 2 микроконтроллера, то можно передавать информацию без проводов. Причем довольно таки быстро.

Краткая информация 🙂
info

Надо отметить NRF24L01 это чип-трансивер, т.е. его нужно запаивать, разводить под него схему, антенну, мне же он достался как модуль в сборе. Поэтому в дальнейшем речь будет идти именно про модуль.
2modules

Наружу торчат 8 ножек:
CE — Вход. Выбор в какой режим переходить приемника или передатчика
VDD — питание +1.9V — +3.6V DC
VSS — земля 0V
IRQ — Выход. Прерывание по приему байтов. Можно подцепить на ножку внешнего прерывания мк, чтобы принимать данные.

И четыре ноги обычный SPI
CSN — Chip Select
SCK — SPI Clock
MOSI — SPI Slave Data Input
MISO — SPI Slave Data Output

Общение с модулем происходит по SPI интерфейсу, после старта сразу попадаем в режим Power Down, т.е. экономии энергии. В этом режиме мы можем читать регистры.
standby

Чтобы перейти в основной режим Standby нужно в регистре CONFIG загнать единицу в бит PWR_UP. Названия регистров отдельной табличкой
register

Для записи используются команды
comand

Таким образом для записи нам нужна команда 001A AAAA и регистр по адресу 0, говорим модулю о том что хотим писать в этот регистр первый байт это команда второй адрес
spi(0b00100000+0b00000000);
Далее выставляем бит PWR_UP в единицу:
spi(0b00000010);

Из режима standby уже можно перейти либо к передаче, либо к приему
standby2

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

В общем накачал кучу исходников и… ни один не заработал. Поэтому пришлось отложить до лучших времен, спустя некоторое время, решился и начал усиленно искать. В итоге скачал баскомовский исходник с аврпрожекта, загрузил и тишина… Не знаю, или пока пробовал прошивки под студию спалил, или из магазина такое доставили. В общем пришлось заказать еще 2 модуля ведь я не знал работает ли хоть один вообще. Дело еще затянулось.

В итоге все пришло, залил баскомовские прошивки, заработало. Начал пробовать опять из того, что накачано под avr studio — все компилится, но не работает и все тут. Самое главное, что с тем как они работают я разобрался намного позже, у меня задача была простая — завести, посмотреть, получить общее представление. Вместо этого — танцы с бубном.

В итоге сделал просто, портировал исходник с баскома под CAVR, это оказалось не сложно 🙂 Когда уже все заработало, разобрался уже и с тем что как работает. Самое странное, что в процессе эксплуатации у меня еще раз накрылся модуль, причем тот который новый. Подозреваю что сдох он от 3.6В, но это лишь догадки. По самому исходнику объяснять нет смысла — 5 байт отправляются, 5 байт принимаются. Какие то дополнения и ковыряния планируются в апдейтах статьи. На текущий момент: используется проверка контрольной суммы CRC, SPI работает на частоте 2МГц (если использовать 1МГц то можно добиться чуть большей дальности). Выходная мощность 0dB, т.е. максимум. Пин IRQ проверяется в основном цикле.

Ножки SPI подключаются в соответствии с «железом»:
MOSI — PB3
MISO — PB4
SCK — PB5

SS — PB2(можно переназначить, но лучше этого не делать, см. даташит про SPI)
IRQ — PB0 (можно переназначить в nrf24.h)
CE — PB1 (можно переназначить в nrf24.h)

Первый тест выглядел так: передатчик посылает пять байт 1,2,3,4,5, приемник принимает их и посылает по юарту на комп
test_module

Тест 2 — определение максимальной дальности приема, первый модуль подключил к прикуривателю через стабилизатор 3.3В, второй модуль от батареек, при приеме правильного байта в прерывании дергал светодиод. В итоге дальность получилась примерно 90 шагов.

Выводы: по квартире берет отлично, что отправил то и пришло, на улице вышло почти 100м, причем на морозе. Цена приемлемая, есть совместимость с ранними модулями. Жрут 12мА. Легкие. В общем то продукт оставил положительные впечатления.

Если будет время прошивку допилю, пока как есть.

49 комментариев: Nrf24l01

  • Хочу сделать видео передачу с квадрокоптера. Интересно потянет видеопоток? Хотябы 320х240.

  • Потоковое из разряда фантастики. Если только через буфер, но это задача явно не для микроконтроллера.

  • М. у меня таких модулей 5 штуков. Ну че с ними делать? Все таки надо попробовать. Хочу взять 2 stm32f103c8, tft дисплей на 128х160 и попробовать на этом. Вдруг что выйдет. Вот только камеру бы где взять.

  • Попробуй просто изображения с компа слать через модуль, сразу станет понятно что можно выжать.

  • А это идея. Если завтра на работе не загонят как лошадь, попробую. А то они уже пылью покрылись 😛

  • Алексей, ты для начала без радиомодулей с камеры видео на экранчик выведи, обалдеешь. 😉

    Касательно 320×240, сырая 8-бит RGB картинка в таком формате занимает 230 кБайт. Передатчик тянет максимум 262 кБайт, так что фреймрейт видео через такие передатчики будет не более 1.1 FPS. :mrgreen:

  • Ну вот. Я только потянул руку к модулю, а мне сразу низяяяяяя.

  • Ооо, наконец то вышла эта статья))) благодарю)))

  • Мда… все таки надо попробовать понять как это устройство работает))) :mrgreen: а то так и нет примера для cvar

  • Не понял, пример работает под CAVR, если не лезть в дебри то там настроек особо и нет, на передатчике ложите свои данные в массив, на приемнике обрабатываете. Или вы чего то еще ожидаете? Поделитесь, я тогда буду копать в ту сторону.

  • Большое спасибо за действительно работающие в CAVR пример.
    Возник вопрос, для чего в бесконечном цикле каждый раз перед отправкой данных происходит настройка модуля (ф-я setup_nrf())?
    А копать, как вариант, в сторону многоканальности. Например 3 передатчика и 1 приемник. Думаю в этом примере будет наглядна конфигурация адресов на TX и RX а так же смысл Пайпов.

  • Посмотрите диаграмму выше. После отправки данных модуль переходит в режим standby, ибо если данных нет, то дальше можно уйти в power down. Либо снова перейти к настройке и отправлять данные. Таким образом выходит, что настраивать нужно каждый раз.

  • Denis. Может один передатчик и 3 приемника? Один мастер и три ведомых. Или я что-то не понимаю?

  • Приемники и передатчики можно переконфигурировать без перепрошивки. Вообще если 1 модуль опрашивает 3 датчика, то 1 приемник и 3 передатчика, а если нужно что то выполнять, то 1 передатчик и 3 приемника.

  • Как раз если модуль опрашивает 3 датчика то он мастер. Если наоборот, то будет коллизия. Сразу трое как за говорят. Мастер по надобности опрашивает модули, отсюда он и передатчик. Ну и где вы видели чтобы датчики температуры, влажности, тахометры и т д сами о себе заявляли?

  • Алексей on, Как явный пример — моя домашняя метеостанция. Приемник 1, который отображает инфу от каждого передатчика. А передатчиков (в моей версии) можно установить до 4х штук. Частота фиксированная, пользователь может выбрать только номер канала на передатчике (1-4). Каждый передатчик (сам, без запросов) посылает в воздух информацию о температуре, влажности и атмосферном давлении в воздух, т.е. в никуда. Если приемник в радиусе действия, он поймает сигнал, если нет, то нет. В результате 4 независимых мастера и один слейв приемник.
    И как правильно заметил Admin, кто будет мастером, а кто слейвом определяет только поставленная задача.

  • Извините Админ, я на 9 посте, немного «погнал»))) все ок… вы супер!!!

  • Denis Ну это бессмыслица какая-то. Сколько разных шин данных знаю, везде больше одного мастера это уже эксклюзив. Так же при таком раскладе нужен арбитраж. Просто слать с периодичностью данные в никуда это расточительство энергии. Слушать эфир и при запросе крякнуть в ответ куда более экономичнее чем гнать волну в эфир. Я так понимаю для метеостанции такой подход принят для облегчения сопряжения датчиков. Не надо парится с адресацией. Но это решается просто, как на шине 1wire. Даже если взять шину I2C где тоже есть возможность несколько мастеров, но там работает принцип, кто первый встал того и тапки. А как например можно задать несколько каналов на одной частоте? Я честно с беспроводными линиями не занимался, но все же как их разбить если несущая одна для всех?

  • Алексей, Я Вам привел пример как делает брэндовый производитель. Как делать по уму — это вопрос другой. Главное что это работает и продается. А большего производителю не надо. Пользователь оценивает стабильность и качество работы девайса. Вы, или я можем сделать совсем иначе, так как нам кажется проще, удобнее и (или) правильнее.
    Касательно каналов опять же не могу ответить Вам точно, поскольку не знаю всех схемотехнических и программных решений устройства. На каждом передатчике стоит наклейка 433,92MHz и ползунковый переключатель на 4 фиксированных положения. Определяет этот переключатель частоту или адрес устройства, мне не известно.
    И соглашусь с Вами в вопросе перехлеста информации. Был момент, когда на одном из каналов принимал показания с неизвестного мне устройства. Естественно отображал нереальные значения.

  • Denis Сдаюсь!

  • Подскажите пожалуйста… Если используется передача в одну сторону, возможно подключение к МК (по проводам всё работает) без дополнительных изменений кода и настроек регистров? Просто подав уровни в одном случае для передатчика, в другом — для слейва? Если что, простите неофита, кодов под CVAVR не нашел, а хотелось бы использовать именно его…

  • нет, так работать не будет

  • Здоров ребята!
    Я уже несколько месяцем ломаю голову по трансиверу nrf24l01 все как то не получается , кто может сказать в чем я ошибаюсь . СПОСИБО за помощь! вот код.
    #include «stm32f4xx.h»
    #include «stm32f4xx_gpio.h»
    #include «stm32f4xx_rcc.h»
    #include «stm32f4xx_spi.h»
    #define ce_on GPIO_SetBits(GPIOA, GPIO_Pin_2);
    #define ce_off GPIO_ResetBits(GPIOA, GPIO_Pin_2);
    #define cs_on GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    #define cs_off GPIO_SetBits(GPIOA, GPIO_Pin_4);
    #define cs_onB GPIO_ResetBits(GPIOB, GPIO_Pin_12);
    #define cs_offB GPIO_SetBits(GPIOB, GPIO_Pin_12);
    #define ce_offB GPIO_ResetBits(GPIOB, GPIO_Pin_11);
    #define ce_onB GPIO_SetBits(GPIOB, GPIO_Pin_11);
    #define irqB GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10);
    #define led1_on GPIO_SetBits(GPIOD, GPIO_Pin_12);
    #define led1_off GPIO_ResetBits(GPIOD, GPIO_Pin_12);
    #define led2_on GPIO_SetBits(GPIOD, GPIO_Pin_13);
    #define led2_off GPIO_ResetBits(GPIOD, GPIO_Pin_13);
    #define led3_on GPIO_SetBits(GPIOD, GPIO_Pin_14);
    #define led3_off GPIO_ResetBits(GPIOD, GPIO_Pin_14);
    #define led4_on GPIO_SetBits(GPIOD, GPIO_Pin_15);
    #define led4_off GPIO_ResetBits(GPIOD, GPIO_Pin_15);

    int main(void)
    {

    nrf24l01_init();
    ms_100();
    write(0x20, 0x0A); // включаем модуль А
    writeB(0x20, 0x0A); // включаем модуль B
    ms_1_5_();
    int t;

    uint8_t dec = 0;

    // channel

    write(0x25, 100);
    writeB(0x25, 100);
    //

    led1_on;
    uint8_t d = 0;
    uint8_t def = 0;

    while(1)
    {

    // На одном контроллере подключены два трансивера , цель заключается в том,
    // чтоб убедиться что все работает ( передать данные через один трансивере а принять на ругом)
    // замете что функции с большой быквы B например writeB() это обраение передающему модулю а если без B ,
    // то обращение принимающему модулю.
    write(0x20, 0x0b); // трансивер А устанавливается на приемник с помощью регистра конфигурации
    ce_on; // поднимаем ногу CE принимающего модуля
    mcs_130(); // ждем 130 микросекунд
    writeB(0xa0, d); // передаем данные в payload
    writeB(0x20, 0x0a); // Устанавливаем трансивер Б на выход
    ce_onB; // поднимаем ногу CE передающего модуля
    mcs_130(); // для уверенности ждем 130 микросекунд
    ce_offB; // опускаем ногу CE передающего модуля
    dec = readB(0x07); // читаем регистр статуса
    write(0x27, dec); // сбрасываем флажки
    dec = 0;
    dec = read(0x07);
    write(0x27, dec);
    def = read(0x61); // читаем из регистра payload принимающего модуля
    dec = read(0x07);
    write(0x27, dec);

    d ++;

    if(def == 0xaa){
    led1_on
    }else{
    led1_off;
    }

    if(def == 0xa0){
    led2_on
    }else{
    led2_off;
    }

    if(def == 0xff){
    led3_on
    }else{
    led3_off;
    }

    if(def == 0x0f){
    led4_on
    }else{
    led4_off;
    }

    ms_100();

    }
    }

  • Начните с проверки работы spi, сравните инициализацию с исходником авр, я не так много ковырял nrf24, чтобы с ходу найти косяк.

  • Здравствуйте, Admin!
    По тексту статьи не понял на какой частоте работает микроконтроллер.
    В исходниках открыл файл nrf_b.cwp, он не настроен.
    Можно ли использовать внутренний генератор 8mhz?

  • я во всех проектах использую кварц 8мгц

  • Здравствуйте, Admin!
    Можете добавить в архив исходники для ТЕСТ 2. Хочу проверить свои модули.

  • добавьте условие на приемнике if(rec_data[0] == »){led = 1;} в rec_data[0] какой то заранее известный символ

  • Давно валяются два модуля, все руки не доходили. Спасибо за публикацию — полезная информация ! Посмотрел исходники, так вроде примерно понятно но не дает покоя навязчивая идея двустороннего обмена между, в простейшем варианте, двумя модулями.
    Типа управления с обратной связью, в виде передачи данных с датчиков или «доклада»
    о выполнении команды, состоянии удаленного устройства и.т.д. Проблема в том как объединить два кода, код приемника и передатчика в один. С идеями туговато, требуется наставление на путь истинный.
    Заранее благодарен.
    С уважением Александр.

  • Думаю будет продолжение статьи, есть пара идей

  • Если предположить, что памяти мк на код. Можно ли организовать нейкое подобие передачи аудио типа wav на расстояние? Скорость передачи ведь должна потянуть?

  • можно

  • Есть ли аналогичные модули, способные передавать данные на метров 500-1000?

  • не интересовался, но наверняка есть

  • Нашел нейкое подобие под названием «NRF24L01+PA+LNA SMA Antenna Wireless Transceiver communication module 2.4G 1000m». Я так понимаю это тотже NRF24L01 с усилителем на антенну? Он выглядит примерно также, но там антенка как на модеме и элементы на плате другие. Вопрос. Можно ли полноценно заменить обычный NRF24L01?

  • «Думаю будет продолжение статьи, есть пара идей»

    Очень жду! Тоже долго бился над приемопередатчиком в одном устройстве. Пока безрезультатно.

  • когда будет дальше???да если можно схему 😛

  • что именно хочется увидеть в продолжении?

  • admin
    например многоканальность и/или приемопередатчик

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика