» » Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

 
 
 
16

Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 2

Разместил erbol 6 апреля 2016. Просмотров: 8 195

Продолжаем разговор. Как-то раз мы с пацанами решили соединить радио-модуль «nRF24L01+» вот с таким «тараканом» — Attiny85.


Двигали нами три мотива:
• Прикладной — надо было уместить передатчик в пространство строго определенного размера.
• Исследовательский — неужели эта кроха ни на что путное, кроме как растерянно моргать светодиодами, не способна?
• Биологический — жаба задавила. Использовать нафаршированный ATmega328 только для того, чтобы он изредка выходил из беспробудной спячки, опрашивал пару датчиков и отправлял данные в эфир, показалось нам верхом расточительства.

Что в конце концов из этого получилось вы узнаете во второй части статьи.
Внимательный читатель при прочтении первой части статьи наверняка обратил внимание на то, что в Таблице 1 не нашлось места для ATtiny85, хотя в тексте он упомянут не один раз. Дело в том, что стандартный способ соединения радио-модуля с этим МК "вывод к выводу" не возможен по причине ограниченного количества последних - всего 5 пинов в заводской конфигурации.

Можно, конечно, пожертвовать функцией Reset и обеспечить недостающий, шестой вывод. Но ведь помимо обслуживания nRF24L01+ хотелось бы ещё что-то делать, датчики, к примеру, опрашивать.

Давайте попробуем выжать из малютки ATtiny85 все соки ноги! Используем для этого четыре простых, но изящных приёма.

Из рассмотренных в первой части статьи способов организации протокола SPI мы будем использовать только программный. Его применением достигается максимальная экономия выводов МК. Он универсален, всё, что вы прочтёте ниже, можно повторить на любом другом микроконтроллере.
Комментарии к коду по-прежнему будут подробными, однако повторяющиеся я буду опускать, так что при необходимости вам придётся обращаться к первой части статьи.

1) Прощайте, прерывания. Здравствуй, первая освобождённая нога!

Идея лежит на поверхности - отказ от прерываний. Создадим единую для передатчика и приёмника функцию проверки флагов регистра STATUS и поместим её в тело основной функции.

Удаляем из программы всё, что связано с прерываниями. Один вывод сэкономили.

2) CE нам больше не CE. Вторая свободная нога тиньки

Установим вывод CE в 1 на постоянной основе. С приёмником всё просто. Соединяем указанный вывод с питанием и, как только биты PWR_UP и PRIM_RX регистра CONFIG будут установлены в 1, трансивер готов принимать данные.

В случае с передатчиком есть одно препятствие. Согласно спецификации nRF24L01+ не должен единовременно находится в режиме передатчика более 4 миллисекунд. Какие кары ждут нарушителя, производитель умалчивает. Не будем рисковать и преступать запрет, а, по привычке, обойдём его.

Обратимся к диаграмме из спецификации и, следуя выделениям красным и зелёным, выпишем, что нужно сделать для успешной передачи в эфир данных.

1. Установить бит PWR_UP регистра CONFIG в 1, а PRIM_RX - в 0.
2. Загрузить отправляемые данные в стек FIFO.
3. Вывод CE должен находится в высоком состоянии хотя бы 10 мкс.
4. Соблюсти все временные задержки и ограничения, включая злосчастные 4 мс.
В первой части мы так и делали – настраивали трансивер, загружали данные и передергивали на 11 мкс вывод CE.

Однако, пункты 1-4 определяют необходимые и достаточные условия, но - не последовательность. Что это означает? А то, что мы можем:
1. Подключить всё же вывод CE к питанию.
2. Загрузить отправляемые данные в стек FIFO.
3. Установить бит PWR_UP регистра CONFIG в 1, а PRIM_RX - в 0.
4. Выдержать 1.5 мс для перехода трансивера в состояние Standby-I, 10 мкс и 130 мкс, необходимые для отправки данных, что суммарно не превышает ограничение в 4 мс.
5. Вернуть бит PWR_UP в 0.

Говоря иначе, мы будем передёргивать бит PWR_UP, а не вывод CE. Можно передёргивать и бит PRIM_RX, но я выбрал этот вариант, поскольку он позволяет добиться максимального энергосбережения – передатчик большую часть времени находится в состоянии Power Down.

Перейдём к программе. Расширим макрофункции sbi() и cbi(), сделав их более универсальными:

и, для удобства, оформим процесс отправки данных в виде трёх функций:

Вычищаем из кода все упоминания о выводе CE, радуемся ещё одному свободному выводу и делаем

3) Превращаем CSN и SCK в CSN_SCK

Здесь и дальше нам с мальчишками помогла замечательная статья Нёда Ральфа [1]. Идея состоит в объединении выводов CSN и SCK в один посредством RC-цепочки.

Работает это при общении МК с nRF24L01+ следующим образом:
1. Сначала МК использует объединённый вывод CSN_SCK в качестве CSN, выставляя его в низкое состояние.
2. Затем - как SCK, подавая тактовые импульсы.

Параметры RC-цепочки подбираются таким образом, чтобы с одной стороны уровень напряжения на выводе CSN трансивера не успел подняться до логического 1 за время передачи байта, а с другой - чтобы SPI-протокол не получился совсем уж медленным.

В программе мы, во-первых, заменим макроопределения выводов CSN и SCK на CSN_SCK и добавим ещё одно - времени задержки цепочки RC_DELAY.
Можно, конечно, с помощью заумных формул высчитать значение задержки, мы же применили простой и проверенный способ – метод «тыка». В нашем случае вышло 1 мс.

Во-вторых, в функциях, созданных нами в первой части статьи, добавится строка _delay_ms(RC_DELAY). Где именно, вы узнаете, сделав завершающий шаг.

4) Превращаем MOSI и MISO в MOMI

Тот, кто успел уже пробежаться по вышеуказанной статье, понял, что речь снова идёт про объединение, только других выводов – MOSI и MISO в MOMI через резистор.

Программно мы будем менять через регистр DDR направление вывода MOMI, используя его то как вход, то как выход, в зависимости от требований текущего момента.

Внесём соответствующие изменения в макросы и в окончательном виде они будут выглядеть так:


А написанные нами в прошлый раз функции примут такой вид:


Полный код для передатчика:


Полный код для приёмника:


Заключение

В итоге, ценой программных и минимальных аппаратных затрат, мы добились управления радио-модулем всего двумя выводами МК. В запасе осталось ещё три, ну и пин Reset прозапас.

Как вы понимаете, эта часть статьи не только о трансивере nRF24L01+, но и о SPI-протоколе в целом. К примеру, мы использовали описанные здесь приёмы для управления TFT-дисплеем всё тем же ATtiny85. Более того, информацию, полученную из пунктов 3 и 4, можно применить и в других случаях, при нехватке выводов.

Третья часть статьи целиком и полностью будет посвящена «ардуинщикам». В ней я покажу, как подружить оболочку Arduino IDE и ATtiny85, как запустить режим «Power Down» не только на nRF24L01+, но и на МК, чтобы получить максимальную экономию энергии.

Кроме того, мы рассмотрим вполне конкретный пример опроса датчика температуры, передачу и приём показаний по радиоканалу.

Всего вам доброго! Продолжение следует.

Ссылки

1. Nerd Ralph. nRF24l01 control with 2 MCU pins using time-division duplexed SPI
Ербол (erbol)
Актобе, Казахстан
Профиль erbol
Мне 50 лет. Родился и вырос в г. Актюбинск (ныне - Актобе), Казахстан. Женат, воспитываю четверых прекрасных детей.

С программированием и электроникой имею может и не отдаленные, но весьма эпизодические отношения: в далекие и бурные 90-е годы аж прошлого века посчастливилось участвовать в автоматизации экспериментальной установки с использованием микропроцессорного комплекта КР580.

А пару лет назад мои сорванцы вдруг заинтересовались микроконтроллерами. Пришлось из дальних уголков памяти вытаскивать свои старые познания и стряхивать с них пыль.
 

Понравилось? Палец вверх!

  • всего лайков: 60

Поделись с друзьями!

Связанные материалы:


Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 3. TFT дисплей 2.8" (240х320) на ILI9341... Битва за урожай закончена, можно продолжить повествование. Полноцветный TFT-дисплей 240×320 ILI9341...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 2. TFT дисплей 1.8" (128х160) на ST7735... Следующий из рассматриваемых нами модулей обладает полноцветным дисплеем под управлением...
Схема на Датагоре. Новая статья Визуализация для микроконтроллера. Часть 1. OLED дисплей 0.96" (128х64) на SSD1306... Добрый день, друзья! Эта статья открывает цикл, посвящённый средствам визуального отображения...
Схема на Датагоре. Новая статья Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01. Перевод таблиц даташита, пояснения и коды для организации сети... Wireless Transceiver Module NRF24L01+ 2.4GHz, 4 шт. на Али Привет, датагорцы! Выкладываю перевод...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 3... Wireless Transceiver Module NRF24L01+ 2.4GHz, 4 шт. на Али Приветствую всех настоящих и будущих...
Схема на Датагоре. Новая статья Беспроводной канал связи 2,4 ГГц на базе трансивера nRF24L01+ от Nordic Semiconductor. Часть 1... Доброго вам дня, уважаемые граждане и гости Датагор.ру - этого замечательного сообщества увлечённых...
Схема на Датагоре. Новая статья Предварительный усилитель на аудиопроцессоре TDA7318 (TDA7313) и Arduino. Часть 2... Проект в сборе. Сборка займет у вас примерно 15 минут. В первой части статьи мы подробно...
Схема на Датагоре. Новая статья Вторая жизнь лампового радиоприемника Philips 592LN (Голландия, 1947). Часть 4. Модуль BlueTooth OVC3860... Привет, датагорцы! В этой части моего повествования речь пойдёт о модуле BlueTooth OVC3860 (далее...
Схема на Датагоре. Новая статья Реинкарнация компьютерных БП. Часть 2... Если уж брать от убитого компьютерного БП, то - по максимуму. А это значит, что кроме перечисленных...
Схема на Датагоре. Новая статья Руководство по электрическому оборудованию автомобилей. A. Трантер... Эта книга предназначена дли тех, кто хочет понять работу электрических и электронных систем...
Схема на Датагоре. Новая статья Технология выпаивания радиодеталей с односторонних плат... Я перепробовал несколько способов распайки плат. Иголками - происходит травмирование ножек...
Схема на Датагоре. Новая статья Анатомия микроконтроллеров ATmega - 2... Итак, продолжим издевательство над МК. Что же нам ещё такого сделать? Давайте заставим мигать...
<

StalKer-NightMan

Игорь Читатель Датагора
  • Гражданин
Комментарий # 1 от 6 апреля 2016 10:11.
Ответить
  • С нами с 15.03.2012
  • Ушёл в реал Пользователь offline
  • 96 комментариев
  • 1 публикация
 
Спасибо, Ербол, за хорошо прописанный материал.

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 2 от 6 апреля 2016 10:19.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Спасибо Игорь! smile Тут ведь ещё немалый редакторский труд Датагора присутствует, так что принимаю благодарность за двоих drinks

<

Yamazaki

Сергей Читатель Датагора
  • Гражданин
Комментарий # 3 от 7 апреля 2016 01:51.
Ответить
  • С нами с 2.07.2009
  • Ушёл в реал Пользователь offline
  • 164 комментария
  • 7 публикаций
 
Класс! Красивые хаки, аккуратная оптимизация. Изящно сделано!

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 4 от 7 апреля 2016 02:10.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Спасибо, Сергей! smile Рад, что Вам понравилось! handshake

<

Yamazaki

Сергей Читатель Датагора
  • Гражданин
Комментарий # 5 от 7 апреля 2016 10:44.
Ответить
  • С нами с 2.07.2009
  • Ушёл в реал Пользователь offline
  • 164 комментария
  • 7 публикаций
 
На али атмега8 стоит дешевле, чем тини85 wacko
Вот и оптимизируй, блин lol

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 6 от 7 апреля 2016 11:10.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Цитата: Yamazaki
На али атмега8 стоит дешевле, чем тини85 wacko
Вот и оптимизируй, блин lol

Кто не успел убежать, того и оптимизировали smile

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 7 от 7 апреля 2016 11:20.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Ну а если серьёзно, то такими темпами скоро многоножка с линуксом на борту будет общедоступной. Так что, все в этой части статьи - из темы "погоня за лишним байтом". smile Просто решил поделиться, вдруг кому пригодится

<

Datagor

Игорь Котов Читатель Датагора
  • Главный редактор
Комментарий # 8 от 7 апреля 2016 12:00.
Ответить
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 2 090 комментариев
  • 275 публикаций
 
Цитата: Yamazaki
а али атмега8 стоит дешевле, чем тини85

Цены на Али - не показатель.Чего больше смогли украсть с завода или выкопать из отбраковки, то и подешевле может оказаться.
На промышленных складах оптовые цены на ATTINY85 ниже.
Это про бабки, хотя мы договорились здесь никогда экономические вопросы не обсуждать. smile

А про оптимизацию кода - ОНА НЕСОМНЕННО И ВСЕГДА НЕОБХОДИМА (главное, без фанатизма), иначе получаем горы кривого прожорливого кода с горами глюков. Привычка не экономить ресурсы (МК, процессора, памяти ли) - плохая, хоть и барская. crazy
Утрируя, скажу, что раньше Фотошоп занимал 68 Мб, теперь 3 Гб, а делает тоже самое. Он - Фотошоп. Тоже самое с Офисом и пр.
Про игры вааще помолчу.

<

Datagor

Игорь Котов Читатель Датагора
  • Главный редактор
Комментарий # 9 от 7 апреля 2016 19:29.
Ответить
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 2 090 комментариев
  • 275 публикаций
 
Немного весёлого оффтопа


<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 10 от 7 апреля 2016 20:09.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
История из жизни! yahoo

<
  • Кандидат
Комментарий # 11 от 25 апреля 2016 18:31.
Ответить
  • С нами с 4.04.2015
  • Ушёл в реал Пользователь offline
  • 2 комментария
  • 0 публикаций
 
Здравствуйте! Во-первых, спасибо вам огромное за статью!
А во-вторых, скажите пожалуйста, если мне хватит и одной–двух освобожденных ног на AtTiny85, но при этом мне очень важно энергопотребление, то бишь важна скорость SPI (быстро передали и уснули), то какой лучше способ использовать из последних трех? Какой менее замедляет SPI? MOMI, CSN_SCK или метод с CE?

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 12 от 27 апреля 2016 09:16.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Цитата: spasum
Здравствуйте! Во-первых, спасибо вам огромное за статью!
А во-вторых, скажите пожалуйста, если мне хватит и одной–двух освобожденных ног на AtTiny85, но при этом мне очень важно энергопотребление, то бишь важна скорость SPI (быстро передали и уснули), то какой лучше способ использовать из последних трех? Какой менее замедляет SPI? MOMI, CSN_SCK или метод с CE?

Добрый день! Меньше всего затраты по времени при использовании MOMI, поскольку в двух остальных двух случаях приходится использовать задержки. Но, если речь идёт о передатчике, можно применить ещё один приём - полностью отказаться от линии MISO. В 3 части будет показано, как это сделать. Удачи Вам! smile

<
  • Кандидат
Комментарий # 13 от 28 апреля 2016 06:02.
Ответить
  • С нами с 4.04.2015
  • Ушёл в реал Пользователь offline
  • 2 комментария
  • 0 публикаций
 
Спасибо вам за ответ! Да, интересует именно передатчик, с нетерпением жду 3ю часть!

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 14 от 28 апреля 2016 17:09.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Почти готова smile. Правда, она для ардуинщиков, но большая часть кода передатчика на Си, так что должна Вам пригодиться

<

kuzen_a76

Алексей Читатель Датагора
  • Кандидат
Комментарий # 15 от 3 января 2018 21:05.
Ответить
  • С нами с 3.01.2017
  • Ушёл в реал Пользователь offline
  • 1 комментарий
  • 0 публикаций
 
Здравствуйте, Ербол!
Очень понравились ваши статьи про Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01!
Сам в программирование слаб, только начинаю.

<

erbol

Ербол Читатель Датагора
  • Гражданин
Комментарий # 16 от 27 февраля 2018 10:08.
Ответить
  • С нами с 11.12.2014
  • Ушёл в реал Пользователь offline
  • 74 комментария
  • 9 публикаций
 
Цитата kuzen_a76
Здравствуйте, Ербол!
Очень понравились ваши статьи про Трансивер 2,4 ГГц Nordic Semiconductor nRF24L01!
Сам в программирование слаб, только начинаю.


Добрый день, Алексей! smile
Спасибо за тёплый отзыв о моей работе! yahoo
Все когда-то начинают с нуля. Уверен, у Вас всё получится! Будут вопросы, обращайтесь, чем смогу, помогу bye

Добавление комментария


Налетай! Паяльники, станции, жала с доставкой
  • smilelolhellowinkscepticthumbupbored
    crazybadcryingsadirefulsickstraight
    ballooncakegooddrinksmailbombsun
    nightrainstarscolddashpartyhandshake
    musicnegativenowordspardonshoksleepunknown
    wackoyawnsainthelmethashsmokingwhew
Скопируйте текст вашего комментария на случай неверного ответа на контрольный вопрос.