Главная » Статьи » Как подключить

Радиомодули nRF24L01



 Давно уже обзавелся я этими модулями, да все никак руки до них не доходили попробовать. В общих чертах, это радиомодули, работающие на частоте 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 который протестировал эти модули и указал на существующие ошибки в коде. Теперь работает как надо!



Ниже доступны для скачивания материалы статьи:

исходники и прошивки

 



Оптимизированный код от пользователя Valera18

В коде удаленны не используемые (действия и регистры).
Данная прошивка передаёт данные "AA+BB+CC+11+№посылки".

Внимание!!! прошивка только для "ПЕРЕДАТЧИКА" Attiny2313, специально оптимизирована, занимает 37% в памяти.


Внимание!!! прошивка только для "ПЕРЕДАТЧИКА" Atmega8, специально оптимизирована, занимает 9% в памяти.


Внимание!!! прошивка только для "ПРИЁМНИКА" Atmega8, специально оптимизирована, занимает 11% в памяти.



Теперь для проектов свободного места в памяти "много".


Категория: Как подключить | Добавлено: 25.06.2012
Просмотров: 157814 | Комментарии: 179 | Теги: радиопередача, SPI, ATmega8 | Рейтинг: 4.9/28
Всего комментариев: 179« 1 2 3 4 5 6 »
89 Polle   (27.10.2012 19:32) [Материал]
Посмотрите пожалуйста эта операция идёт сразу после приёма данных:
Call R_register(fifo_status , 1) 'Read FIFO_STATUS
Loop Until B_bytes(1).0 = True
что означает эта операция (в своей программе я её не делал)считывается FIFO_STATUS и..? И у меня похоже что то с настройкой модуля на приём после передачи, потому что если вык. и вкл. макетку которая после передачи собирается принимать то всё работает, а в на чале программы модуль настраивается на приём с нуля.

88 exersizze   (27.10.2012 19:22) [Материал]
Интересная у вас среда разработки. После привычного бэйсика, это брэйнфак какой-то)) Похоже что наступили на теже грабли что и я - использовали программный SPI

87 Polle   (27.10.2012 15:04) [Материал]
Наконец то приделал к одному из контроллеров индикатор и видно что все 5ть бать принимаются без ошибок. А то что вывод CSN перепаял на portb.2 не помогло, а как работать со встроенным модулем SPI знаю уже лет 6ть.

86 Valera18   (27.10.2012 12:44) [Материал]
Вы написали: Щас поставил задержку при включении контроллера 0,5 сек стал работать в две стороны только если чередовать отправки то с одной то сдругой стороны, а если в одну сторону проходят только 2 пакета.

Значит в одну сторону может принять только 2 раза, после перестаёт принимать? напоминает начальную проблему "проблема зависания" которая тут обсуждалась.

Проверьте эти аспекты:
1) ножка CSN "модуля" должна быть подключена к SPI каналу, т.е. у Atmega8 к PORTB.2=output, и должны быть настроены прерывания в прошивке (т.е. в прошивке по этому каналу SS).
2) так-же нужна задержка: приёмник должен настроиться (можно не ставить задержку), а передатчик должен подождать "1 секунду" или "0,5 секунд" после сам начать настраиваться на передачу.

85 Valera18   (27.10.2012 12:30) [Материал]
Ужас, ну и "среда программирования". Понятны только некоторые фрагменты.
Да, вы были правы "код не пойму".
Может у других будет больше успехов в понимание.

84 Valera18   (27.10.2012 12:10) [Материал]
Я согласен с max, не качает.
Теперь с Депозита качает, нет проблем.

Да, отправлять можно что угодно,
"&HAA,&HBB,&HCC,&H11,&HR" - это был как пример.
Я где-то прочитывал, что "отправляемый пакет" может быть больше, только не знаю максимальный объём отправляемого пакета.
Если я не ошибаюсь, то настройка количества принимаемых байт тут:
D_bytes(1) = Write_reg + Rx_pw_p0
D_bytes(2) = 5
точно не знаю, не пробовал.

+1   Спам
83 Polle   (27.10.2012 12:09) [Материал]
http://depositfiles.com/files/sdb3p2gci

+1   Спам
82 max   (27.10.2012 12:02) [Материал]
TO Polle
Выложите на другой обменник, с этого не качается.

81 Polle   (27.10.2012 11:32) [Материал]
ftp://ftp.bks-tv.ru/exchange/nRF24L01.rar

80 Polle   (27.10.2012 11:31) [Материал]
Попробуйте скачать мой архив, - там есть схема включения и фото алгоритма программы.
А всё перечисленное сделано правильно, не совсем уверен о сбросе модуля: подаю ноль на вывод контроллера на полсек. , а потом опять единицу которая идёт на питание модуля. Ещё не понятно с байтами для от правки: обязательно отправлять &HAA,&HBB,&HCC,&H11,&HR или можно отправлять что угодно и пакет написано может составлять до 32 байт. Щас поставил задержку при включении контроллера 0,5 сек стал работать в две стороны6 только если чередовать отправки то с одной то сдругой стороны, а если в одну сторону проходят только 2а пакета.

79 Valera18   (26.10.2012 21:30) [Материал]
Вы написали: Всё работает в одну (любую) сторону, а при попытке отослать 5-ть байт с другой макетке приёмная часть (которая была передатчиком, но "перестроилась на приём") не работает пока не сбросишь ATMega8.
Значит в одну сторону работает безупречно? тогда нужно выявлять проблему с момента "смены положения работы". Вы применили программный сброс "модуля"?

Вопросы:
1) вы проверяли несколько раз отправлять 5-ть байт в одну сторону, работает без потерь?
2) если вы использовали Atmega8 как подключёны сигнальные контакты "модуля" к Atmega8, так-же как и на этой статье?
3) что прописали в прошивке по сигналам?:
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
4) как у Вас происходит программный сброс "модуля" при смене положения работы "модуля" (приём или передача)?, т.к. при смене нужно полностью сбрасывать "модуль".

78 Polle   (26.10.2012 19:54) [Материал]
В моей прошивке вы наверно ничего не поймёте, она в другой среде: ftp://ftp.bks-tv.ru/exchange/nRF24L01.rar

77 Valera18   (26.10.2012 18:12) [Материал]
Трудно так сказать, в чём проблема (выложите свою прошивку), может проблема в настроечном коде, а может в сбросе "модуля".

Я уже пробовал писать "тестовую" прошивку с возможностью смены положения (приём или передача), только всё времени не было проверить работоспособность, но прошивка должна быть рабочая. Попробуйте сравнить "момент настройки" в моём коде со своим, может найдёте проблему.
http://yadi.sk/d/EOz1gCU063aZK

Может другие пользователи сталкивались с такой проблемой, и напишут решение.
Было бы проще, если бы выложили свою прошивку.

76 Polle   (26.10.2012 13:56) [Материал]
как только подключаю + питания модуля на ножку контроллера модуль перестаёт вообще работать на приём.

75 Valera18   (25.10.2012 20:27) [Материал]
При смене нужно сбрасывать "модуль", а Atmega8 сбрасывать не надо.

Просто подключи ножку (+) питания "модуля" к любой ножке (порту) Atmega8.
Например: к PORTD.3 = Output, т.е. появится возможность сбрасывать "модуль" меняя "PORTD.3 = 1" на "PORTD.3 = 0", и обратно на "PORTD.3 = 1".

Принцип работы:
1) выставляем порт в "PORTD.3 = 1" на "модуль" идёт питание, и производим настройку на передачу.
2) сбрасываем "модуль" отключением питания, а после включаем снова, т.е. меняем "PORTD.3 = 1" на "PORTD.3 = 0".
3) подаём питание на "модуль" включением "PORTD.3 = 1", и производим настройку на приём.

У модуля nRF24L01 токовое потребление как у светодиода, поэтому с портом Atmega8 ничего не будет (не зажжёте, проверено).

Выложите свою прошивку.

+1   Спам
74 Polle   (25.10.2012 18:55) [Материал]
Большое спасибо всем за ответы! Почти заработало: У меня собрано 2е совершенно одинаковые макетки модуль nRF24L01 на разъёме отключаемый от ATMega8 (для перепрограммирования). При нажитии на кнопку на одной макетке модуль настраивается на передачу и передаёт 5 байт о чём видно по красному светодиоду и перестраивается на приём, а на другой макетке при приёме 5ти байт включается зелёный светодиод(проверяется по последнему байту).Всё работает в одну (любую) сторону, а припопытке отослать 5 ть байт с другой макетке приёмная часть (которая была передатчиком, но "перестроилась на приём") не работает пока не сбросишь ATMega8. Что может быть?

73 exersizze   (25.10.2012 12:53) [Материал]
Можно, но тогда в коде появится, непонятно откуда взявшееся, значение &H22. Для себя сгодится, а кто будет в код вникать непоймет.

72 Polle   (25.10.2012 11:59) [Материал]
Спасибо за ответ! А что нельзя было написать вместо:
D_bytes(1) = Write_reg + En_rxaddr например так:
D_bytes(1) = &H22 ?

71 exersizze   (25.10.2012 11:35) [Материал]
Да, это сложение двух байт.
По типам все верно, если перед значением стоит &H то это шестнадцатеричный тип переменной, если просто число - то в десятичной.

70 Polle   (25.10.2012 10:55) [Материал]
спасибо это понятно не совсем ясно: D_bytes(1) = Write_reg + Tx_addr? Это сложение двух констант? И отображение чисел:
D_bytes(1) = Write_reg + En_rxaddr
D_bytes(2) = &H01
Call W_register(2)
D_bytes(1) = Write_reg + Rf_ch
D_bytes(2) = 40
&H01 - это шестнадцатеричное число?
40 - десятичное число?

69 exersizze   (25.10.2012 08:17) [Материал]
Waitms - миллисекунды. Waitus - микросекунды
Call W_register Это вызов подпрограммы W_register, в которой байты задвигаются в регистр трансивера
Code
Sub W_register(byval C_bytes As Byte)   
Reset Ss   
Spiout D_bytes(1) , C_bytes   
Set Ss   
End Sub

68 Polle   (25.10.2012 01:00) [Материал]
Задержки в милисек. или микросек? Это значение равно десятичному числу:
D_bytes(2) = 40

67 Polle   (25.10.2012 00:44) [Материал]
Это объявление констант (постоянных значений занесенных в озу): Const Tx_addr = &H10?
А это сложение двух байт и отправка суммы в SPI: D_bytes(1) = Write_reg + Tx_addr?
А это что значит: Call W_register?

66 Polle   (24.10.2012 20:26) [Материал]
Не совсем так: ATMega8 и nRF24L01 будут составлять новый модуль который должен по приходу байта или пакета байт на вход RXD ATMega8 перестраивать модуль в режим передатчика и передавать полученную информацию в эфир, и наоборот при приёме пакета байт модулем nRF24L01 (при включении должен быть готов к приёму и после передачи должен пере настроиться на приём) передать полученный пакет TXD ATMega8.

65 Valera18   (24.10.2012 16:21) [Материал]
Начальная статья по модулю "http://www.mcselec.com/index.php?option=com_content&task=view&id=212&Itemid=57"

Вы планируете: Предавать команду через "UART компьютера" на передатчик (Atmega8 и nRF24L01), а приёмник (Atmega8, nRF24L01 и "Исполнительное устройство") будет выполнять действие?

64 Polle   (24.10.2012 15:08) [Материал]
Переделать управление модулем на USART и управлять модулем будит другой контроллер

63 Valera18   (24.10.2012 14:17) [Материал]
Да, но только в "последовательном режиме", изначально прошивки были двух направленные:
(последовательная работа: сначала как передатчик (передаёт данные), после перенастраивается на приём (принимает данные)).
В последствии для экономии места (в памяти) были разделены действия на приёмник и передатчик.

Направление работы модуля зависит от вызова каманды: Gosub Setup_tx или Gosub Setup_rx, и ещё от некоторых действий.

Например в последнем комментарии добавлена "тестовая" прошивка на последовательный опрос трёх передатчиков: http://avrproject.ru/publ....omments
-там объединён код приёмника и передатчика, если внесёте свои изменения, то получите необходимую работу модуля (замените в начале кода на $crystal = 8000000).

К сожалению осуществить одновременный приём и передачу не получается, можно только "последовательный режим", сначала передаёт, после принимает или наоборот.

А что вы хотите получить от "последовательного" объединения действий "приёмника" и "передатчика"?

62 Polle   (24.10.2012 13:32) [Материал]
а можно объединить 2е последнии прошивки для ATMega8 на кварц 8МГц, чтобы модуль nRF24L01 мог работать и как приёмник и как передатчик?

+1   Спам
61 Valera18   (23.10.2012 19:06) [Материал]
Для пользователя Polle

Честно, описывать код очень долго, т.к. при включение проходит объёмная настройка "модуля nRF24L01". Может у других больше свободного времени, и они опишут принцип работы модуля.
Совет: установите BASCOM-AVR, просмотрите несколько примеров в сети, попробуйте написать простые действия. Все с этого начинали.
По мне язык программирования BASCOM оптимальный (не сложный) для хобби.
Здесь размещены работающие оптимизированные прошивки (удаленно всё лишнее) с комментариями. Поэтому вы сможете понять принцип работы "модуля nRF24L01", может вам понравится язык программирования BASCOM и вы будите работать с ним (хотя каждый решает, что ему изучать).
Используя BASCOM-AVR вам здесь подскажут, если будут вопросы.

60 Polle   (23.10.2012 17:38) [Материал]
Приобрёл по случаю два модуля NRF24L01, долго переводил, а потом изучал PDF, но с сожелению так и не понял как он работает? В отличии от вас я програмирую совсем в другой среде: AlgorithmBuilder, поэтому ваш код мне почти совсем не понятен. Напишите пожалуйста по простому что нужно отправить через модуль SPI микроконтроллера в NRF24L01 чтобы с помощью другого микроконтроллера можно было бы считать с другого NRF24L01 1н байт информации.

1-30 31-60 61-90 91-120 121-150 151-179
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]






авторизация
Логин:
Пароль: