Прошли те времена, когда для написания статьи было достаточно протеуса и часок-другой времени. Растут дети, растут и их игрушки 🙂
Начнем с того что это. Это радиомодули, т.е. если взять 2 таких модуля и 2 микроконтроллера, то можно передавать информацию без проводов. Причем довольно таки быстро.
Надо отметить NRF24L01 это чип-трансивер, т.е. его нужно запаивать, разводить под него схему, антенну, мне же он достался как модуль в сборе. Поэтому в дальнейшем речь будет идти именно про модуль.
Наружу торчат 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 нужно в регистре CONFIG загнать единицу в бит PWR_UP. Названия регистров отдельной табличкой
Для записи используются команды
Таким образом для записи нам нужна команда 001A AAAA и регистр по адресу 0, говорим модулю о том что хотим писать в этот регистр первый байт это команда второй адрес
spi(0b00100000+0b00000000);
Далее выставляем бит PWR_UP в единицу:
spi(0b00000010);
Из режима standby уже можно перейти либо к передаче, либо к приему
Даже имея понимание того, как работать с 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, приемник принимает их и посылает по юарту на комп
Тест 2 — определение максимальной дальности приема, первый модуль подключил к прикуривателю через стабилизатор 3.3В, второй модуль от батареек, при приеме правильного байта в прерывании дергал светодиод. В итоге дальность получилась примерно 90 шагов.
Выводы: по квартире берет отлично, что отправил то и пришло, на улице вышло почти 100м, причем на морозе. Цена приемлемая, есть совместимость с ранними модулями. Жрут 12мА. Легкие. В общем то продукт оставил положительные впечатления.
Если будет время прошивку допилю, пока как есть.
уважаемый автор!! вопившем что у меня получилось дальность около 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. Буду думать почему другие библиотеки не запускались. 😛