Содержание
Урок 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

  • уважаемый автор!! вопившем что у меня получилось дальность около 30 сантиметров 1 мгц делал по вашему образцу и самое странно он делает так 1.2.3.4.5..потом второй рас 55555 почему так у меня комплект 7 шт nRF24L01+ …думал может модули барахлит ?! .если есть возможность другой пример с ледом и бутоном ???

  • while(1)
    {

    if(PINB.0 == 0)
    {

    if(rec_data[0]);
    {
    LED_RX=1;
    printf(«OK»);
    putchar(‘\n’);
    putchar(‘\r’);
    delay_ms(500);
    LED_RX=0;
    }

    //’Подождите, пока IRQ происходит, pin-код становится низким на прерывание
    nrf24_read(rec_data);
    putchar(rec_data[0]);
    putchar(rec_data[1]);
    putchar(rec_data[2]);
    putchar(rec_data[3]);
    putchar(rec_data[4]);
    putchar(‘\n’);
    putchar(‘\r’);
    }
    else
    {
    LED_RX_eror=1;
    delay_ms(100);
    LED_RX_eror=0;
    printf(«Failed_Rx»);
    putchar(‘\n’);
    putchar(‘\r’);
    delay_ms(300);
    }

  • Всем привет.
    Спасибо за все Ваши статьи.
    А не пробовали реализацию беспроводной mesh-сети на базе данного устройства?

  • Подскажите. как перекроить Вашу библиотеку под Atmega16? Никак не получается запустить её

  • нет, пока глубже копать не стал. под атмегу16 надо только spi перенастроить

  • Интересует пара вопросов связанных с модулем…

    1) Можно ли как-то уменьшить радиус действия до 1-2 метров? (чтобы приемник улавливал только близь-лежащие передатчики)

    2) Позволит ли это уменьшить потребление?

  • Можно изменить мощность сигнала, это позволит снизить потребление. Погуглите есть серия статей как товарищ боролся с токопотреблением этих модулей

  • Данный урок повторил. Заработало сразу. Добавил мигание светодиода в проект. В UART данные тоже хорошо идут. Покупал всего два модуля — хорошие попались. Спасибо admin.

  • Спасибо admin пример заработал , а то думал , что модули убитые были .Правда приемник сделал с LCD3510. Буду думать почему другие библиотеки не запускались. 😛

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

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

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