Давно уже обзавелся я этими модулями, да все никак руки до них не доходили попробовать. В общих чертах, это радиомодули, работающие на частоте 2.4 ГГц с подключением к микроконтроллеру по SPI-интерфейсу. Для работы требуется напряжение в диапазоне от 1,8 до 3,6 вольт, входы/выходы толерантны к 5 вольтам, поэтому при подключении к пяти вольтовым устройствам дополнительные согласующие цепи ставить нет необходимости.
Для подключения радиомодуля выведена гребенка контактов, распиновка приведена ниже:
Так как на плате модуля предусмотрен разъем для подключения, для удобства собрал небольшую платку. На этой отладочной плате стоит микроконтроллер Atmega8A с обвязкой из внешнего кварца, кнопки сброса и пары светодиодов, ответный разъем под модуль и разъем для подключения программатора.
Схема всего этого дела выглядит следующим образом:
Для подключения радиомодуля использованы ножки аппаратного SPI микроконтроллера, поэтому разъемы подключения модуля и подключения программатор дублируют друг друга. Это сделано, чтобы удобней было прошивать микроконтроллер на отладночной платке, например, если использовать программатор который подает на схему 5 вольт, а для NRF24L01 это слишком большое напряжение. Чтобы перепрошить управляющий микроконтроллер, достаточно выдернуть трансивер с платы, перепрошить и всунуть его обратно - без лишней возни с перепайкой.
Код для работы с модулем целиком взят с примера AN #151 на официальном сайте mcselec.com Я только разделил программную часть приемника от программной части передатчика.
Код приемника залил в микроконтроллер на тестовой платке. Плату подключил к компьютеру через переходник USB-UART на FT232RL, а питание (3,3 вольта) у меня подается через программатор USBasp
Горит зеленый светодиод (D1) - приемник готов к работе. При приеме данных загорается красный светодиод (D2)
Вторую схему - для передатчика - собрал на макетке по той же схеме. Разъем на трансивере оказался не подходящим для того чтобы вставлять плату в макетку и поэтому соединил все проводами.
Скорость для соединения приемника с терминалом выставляется 19200 бод. При старте приемник напечатает "RX_device" а дальше - то, что получит с передатчика. В примере передаются постоянные данные "AA+BB+CC+11+#посылки"
На скрине ниже видно, что номера посылки прыгают, это из-за того что я включал/выключал передатчик пока бродил по двору (максимальное удаление метров 30-40). А видимо проверка CRC в приемнике не пропускала некоторые посылки от передатчика из-за ошибок передачи.
На мое удивление, когда искал примеры использования этих трансиверов с Bascom-AVR, ничего кроме вышеозвученного апнота #151 не находилось. Хотя в среде ардуинщиков эти трансиверы весьма распространены и под них написано уже куча кода и библиотек. Надо исправлять ситуацию :) Особенно радует цена на них - мне мои достались по 5$ за пару http://www.ebay.com/).
Сначала у меня возникли проблемы с зависанием модуля при передаче данных, но спасибо товарищу Valera18 который протестировал эти модули и указал на существующие ошибки в коде. Теперь работает как надо!
Вы после программирования отключаете программатор (((линии связи программатора с Atmega8)))? Не встречал, что-бы ножка SCK так себя вела. Попробуйте использовать внешний кварц с конденсаторами.
Попробуй убрать все значения "Const Write_reg = &H20" и так далее.
В настройках, сложи значения, и запиши в ручную, пример: D_bytes(1) = Write_reg + Tx_addr Write_reg = &H20 Tx_addr = &H10 следовательно D_bytes(1) = &H30 , и так со всеми, может поможет.
Мысли: у Atmega какая-то рассинхронизация, может из-за внутреннего кварца, может проблема где-то в настройках "Фьюзах".
Попробуй изменить частоту (у приёмника и передатчика) на другую. Call W_register(2) D_bytes(1) = Write_reg + Rf_ch 'Настройка каналов D_bytes(2) = 40 'Частота 2440 MГц нужно в настройках изменить число 40 на более высокое (диапазон от 0 до 125). Попробуй на улице.
Может у Тебя Atmega8 портачит (порты подпалённые), поэтому не работает.
насчет AVCC .. сейчас подключу конечно.. но я сейчас проверил - там уже "по умолчанию" - то же напряжение, что и на VCC - такое впечатление, что они соединены внутри микросхемы... но раз говорите - сейчас буду подпаивать...
Да, подключи AVCC к (+) плюсу. Был случай с Attiny26, не работала, оказалось без AVCC не работает, поэтому лучше и на Atmega8 тоже подключать к (+) плюсу. Лично Я всегда подключаю. И "все" VCC подключи к (+) плюсу, и "все" GND к (-) минусу.
Насчёт распечатки сказать не смогу, Сам не пробовал значение "Gosub Dump_registers".
Gosub Dump_registers включал.... Посыпалось много данных.... но я не знаю что должно быть , а что - неверно... могу включить и распечатку Вам показать..
Вообще, есть какие-то считывание у "Передатчика", можно попробовать скопировать и на "Приёмник": http://avrproject.ru/nrf24l01/reciever.rar нужно включить значение "Gosub Dump_registers", в главном цикле Do. Может пригодится для проверки "модулей".
AVCC я вобще не подключал.... только VCC и GND ... а что это надо было сделать обязательно ?? Прошивается то правильно - я пробовал разные варианты - когда менял частоту и длительность пауз - видно сразу - то быстро мигает диодом , то медленнее...
Ножка CSN "модуля nRF24L01" подключена к PORTB.2 ? У Atmega8 ножка AVCC подключена к (+) плюсу питания? Программатор после прошивки проверяет прошитые данные, может не верно пришивает?
скажите пожалуйста, а я могу проверить как то работоспособность самих модулей ?? Например - записью-чтением каких нибудь регистров ?? Может у меня неправильно изначально настраиваются они ??
питание - через КРЕН - 3.3 в .. сжечь вроде не должен был... Start-up time: 6 CK + 64 ms - конечно попробую... но я вроде все перепробовал - и 64 и 4 и 0 ... но сейчас ..буду пробовать приемник НИ РАЗУ не принимал сигнал...
Очень странно. За всё время приёмник хоть раз принимал сигнал? Проверьте ножку CSN и SCK, Вы их не перепутали? Используете Atmega8 (приёмник и передатчик)? Питание 3,3V для NRF24L01. Вы не могли случайно сжечь? Может происходит начальная просадка напряжения?
Вы написали: Boot Flash section size=1024, Brown-out detection level at VCC=2.7 V; Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms попробуйте изменить на Start-up time: 6 CK + 64 ms, вроде так, первоначальная задержка на 64 ms
Порты подключены правильно... проверял несколько раз... мало того, порты тоже менял - подключал и на D и на B // приемник подключил так :
Config Portb.1 = Output : Ce Alias Portb.1 'CE pin is output Config Portb.2 = Output : Ss Alias Portb.2 'SS pin is output Config Pinb.0 = Input : Irq Alias Pinb.0 'IRQ pin is input Config Portd.3 = Output : Red_led Alias Portd.3 а передатчик по другому...
Config Portb.1 = Output : Ce Alias Portb.1 'CE pin is output Config Portb.2 = Output : Ss Alias Portb.2 'SS pin is output Config Pind.7 = Input : Irq Alias Pind.7 'IRQ pin is input Config Portd.4 = Output : Red_led Alias Portd.4
подключил в соответствии с тем, что написано... использую оптимизированную прошивку....
Частота у Atmega может быть любой, даже разная у обоих. Вероятно, проблема в портах (не правильно написаны).
Проверьте прошивку (как выставлены порты): Config Portd.5 = Output : Ce Alias Portd.5 'CE pin is output Config Portb.2 = Output : Ss Alias Portb.2 'SS pin is output Config Pind.7 = Input : Irq Alias Pind.7 'IRQ pin is input сверьте с картинкой, попробуйте подключить так-же. Если используете "оптимизированную прошивку" проверьте как прописаны порты, и измените на те которые на картинке.
Если всё подключено по картинке, в прошивке порты верно выставлены, тогда заработает сразу. Для первого раза Фьюзы можно не трогать, на заводских (первоначальных) фьюзах оставить.
Уважаемый Valera18!! Бьюсь с этими NRF уже 4-й месяц... испробовал все - и заказывал уже разные ( в разных корпусах) и пробовал менять частоту в настройках SPI и длительность пауз ( думал что не успевает на большой частоте работать) Но все - бестолку.. это стало для меня просто какой то "идеей фикс" - заставить их работать...но что то не получается.. ATMEG-и работают от внутреннего кварца.(может здесь "собака порылась" ?? Говорят, что если хоть чуть чуть не совпадает частота - они не запустятся.. Передатчик вроде передает - смотрел логическим анализатором - по крайней мере на MOSI импульсы поступают... а вот на приемнике - на выходе IRQ - всегда тишина - ничего нету.... Может у меня фьюзы не так выставлены ( читал в переписке что было такое) ? У меня выставлено - Boot Flash section size=1024, Brown-out detection level at VCC=2.7 V; Int. RC Osc. 8 MHz; Start-up time: 6 CK + 0 ms а если в HEX ? то 0xD9, 0xC4 правильно ли это ?? Где мне рыть ??? что посоветуете ??
Да, верно, Int0 для выхода из Powerdown, подтяните 10 КОм к +питания. В Attiny2313 SPI интерфейс какой-то другой, как Я не мучил Attiny2313 в приёмнике задействовать с "модулем nRF24L01" не удалось, зато как передатчик работает отлично. Ещё можно задействовать в прошивке: TX Flussing TX буфера, проверка приёма, про который вы рассказывали. Удачи.
Про питание- при включении приёмник в терминал выдавал. Но приёмник не принимал. Толи nRF24L01 такой попался, толи SPI при низком напряжении глючил, не знаю. Про алгоритм понял. И Int0 для просыпания, так? А то думаю к чему, подпрограммы от прерывания нет. Ясно. Спасибо. Делать буду Меге48. Они дешевле 2313, а возможностей больше. Термометр- аналоговый. На TC1047AVNBTR (V=T+500mV). т.е можно мерять отрицательную температуру без смещения. Уже юзал, понравилось. Передатчики будут одинаковые. Три свободных пина Меги отведу под адресс. Замыкая их на минус будет определяться адресс передатчика.(ну вообщем как на памяти и2с) Ну и передатчики, где нужно, будут управлять нагрузкой, по команде с "центра". Алгоритм будет как у Вас. Дальше поглядим. Почему 2313 не может работать на приём?
Насчёт питания "модуля nRF24L01". Возможно от 3V не заработало, так как использовали Atmega8 (2,7V), просело напряжение (точно не знаю, не пробовал понижать напряжение у Atmega8). Пробовал "передатчик на Attiny2313", работоспособность сохранялась до 1,9V, "приёмник на Attiny2313" невозможен.
http://avrproject.ru/publ/peredacha_izmerennoj_temperatury_po_radiokanalu_svjazka_nrf24l01_i_ds18b20/1-1-0-106#comments Из 22 комментария, прошивка: http://yadi.sk/d/EOz1gCU063aZK
Принцип работы "приёмопередающего моста с режимом энергосбережения": 1. Приёмник выставляет "адрес" первого передатчика. 2. Приёмник отправляет "простой сигнал" первому передатчику, после приёмник переключается на приём.
а). Первый передатчик принимает "простой сигнал" и просыпается из (Powerdown). б). Первый передатчик отправляет "данные, число 28" (температуру, если вы добавите "код" опроса DS18B20). с). Первый передатчик переключается на приём и засыпает (Powerdown).
3. Приёмник получает "данные, число 28" и выводит на LCD. 4. После приёмник меняет "адрес" на второй передатчик, и все действия повторяются...
Внимание, прошивка тестовая, не проверял, была написана как ответ на вопрос.
Прочти "22 комментарий" и "30 комментарий". В "22 комментарии" есть ссылка на прошивку. Прошивка - это только приёмопередающий мост, для термометров DS18B20 нужно добавить в прошивку "код опроса DS18B20", в этом сложности быть не должно, так как "код" опроса есть в свободном доступе.
"Максимальное количество повторных попыток, TX Flussing TX буфера сейчас!" надо заменить на "Максимальное количество повторных попыток связаться с приёмником.Приёмник не обнаружен." Блин пол дня мучал. Чёт не подумал, что он держит обратную связь без установок.Надо даташит помучать и попробывать это как-то использовать. Как ни странно, приёмник не работал при 3вольтах. По этому и провозился. Поднял до 3,3 и заработало! На счёт радиомаяка- трудно использовать по силе сигнала. На таких частотах, передатчик за стеной в 5 метрах будет плохо принимать, чем за 50 метров по воздуху. Как определить? Да и множество отражённых сигналов будут вносить погрешность. Скорее эта функция нужна для настройки передатчика на излучаемую мощность, для экономии энергии. Valera18, каков алгоритм работы с тремя передатчиками.Если описывали, ссылочку плиз, а то чуго-то не встретил. Спасибо.
Ага, передатчик ждет подтверждения того что приемник поймал передачу. Если ответа нет, то шлет в терминал предупреждение. ЗЫ: комменты к коду конечно жгут, гугл постарался на славу 8)
Valera18 , наврятли в этих трансиверах есть такая фишка, по крайней мере я ничего не нашел. А так было бы очень здорово, радиомаячек штука полезная
Респект авторам! Пришли модули , запустил и сразу вопрос. Передатчик выдаёт "Максимальное количество повторных попыток, TX Flussing TX буфера сейчас!". Что это означает. Собственно пока приёмник не включен, передатчик выдаёт это. Передатчик после передачи пакета ждёт ответ?