Подключение модуля nRF24L01 к Arduino – MicroPi

Подключение модуля nRF24L01  к Arduino - MicroPi Машинки
Содержание
  1. Что такое i2c?
  2. Что такое квадрокоптер?
  3. Описание модуля nrf24l01
  4. 1 модель
  5. 3 модель
  6. Getpalevel()
  7. Openreadingpipe()
  8. Setautoack()
  9. Startfastwrite()
  10. Write()
  11. Writefast()
  12. Вход bec для питания квадрокоптера
  13. Выбираем тип и размер квадрокоптера
  14. Дальнейшая модернизация квадрокоптера на arduino
  15. Материалы
  16. Настройка акселерометра-гироскопа (i2c)
  17. Необходимые узлы, детали и оборудование
  18. Организация питания nrf24l01
  19. Передача данных между платами arduino rf
  20. Передача структур nrf24l01
  21. Подключение nrf24l01 к arduino напрямую
  22. Подключение к arduino
  23. Подключение к ардуино через адаптер nrf24l01
  24. Подключение nrf24l01 к ардуино
  25. Пример 1: проверочный скетч
  26. Пример 2: передача данных
  27. Пример 4: передача данных с проверкой их доставки
  28. Пример 5: получение данных от одного или нескольких передатчиков
  29. Различные версии модуля nrf24l01
  30. Распиновка nrf24l01
  31. Результат
  32. Сборка
  33. Скетч для arduino
  34. Сокет для микроконтроллера
  35. Сравнение со связкой arduino leonardo модуль nrf24l01
  36. Сфера применения модуля nrf24l01
  37. Схема подключения arduino
  38. Установка библиотеки rf24
  39. Характеристики nrf24l01
  40. Шаг 3: делаем раму
  41. Шаг 6: соединяем esc и ресивер с контроллером полёта
  42. Шаг 7: настройка контроллера полёта (загрузка скетча)
  43. Заключение
  44. Выводы по nrf24l01

Что такое i2c?

На простых платах акселерометра все логично и понятно: на ней предусмотрены отдельные аналоговые выходы для осей X, Y и Z. Каждый выход соответствует отдельной оси акселерометра. Если вы теперь взглянете на плату с I2C, поймете, что тут все несколько запутаннее.

I2C – это стандарт обмена данными, при котором большие объемы информации передаются с помощью цифровых логических импульсов вместо аналоговых выходов. MPU6050 предоставляет вам 6 контролируемых осей (3 для гироскопа и 3 для акселерометра). Если бы они все были аналоговыми, нам пришлось бы задействовать все аналоговые порты на Arduino Uno. С протоколом I2C мы задействует гораздо меньше контактов для подключения.

Что такое квадрокоптер?

Уверен, что большинство читающих эту статью уже знают, что такое квадрокоптер. Если нет, привожу краткое описание этих замечательных устройств.

Смотрите про коптеры:  Самодельный FPV квадрокоптер

Квадрокоптер – это летающее устройство с четырьмя “ногами”, на каждой из которых установлен мотор с пропеллером. Квадрокоптеры по своей сути схожи с вертолетами, но перемещение, поворот, наклон у них обеспечивается за счет синхронной работы четырех пропеллеров.

Кроме того, у квадрокоптеров существует такое понятие как “pitch” (“тангаж”) – поворот вокруг продольной оси. Для того, чтобы стабилизировать полет квадрокоптера, два пропеллера вращаются в одно направлении (по часовой стрелке), а два – в противоположном направлении (против часовой стрелки).

Благодаря этой возможности – зависать в одном положении в воздухе, квадрокоптеры в первую очередь используются для фотографии с воздуха и видеосъемки. Конечно же, квадрокоптеры и остальные подобные устройства со множеством двигателей, используются в спасательных операциях, полицией, военными и т.п.

Итак, вы уже немного сориентировались, что такое квадрокоптер, давайте теперь перейдем к краткому описанию процесса его изготовления.

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

В большинстве случаев используются микроконтроллеры и безщеточные (вентильные) моторы. В качестве контроллера было решено использовать Arduino, так как это идеальная платформа с точки зрения цены. Первая проблема, которая возникла – безщеточные двигатели.

Помните, мы ведь ориентируемся на бюджет в 60 $. А стоимость одного безщеточного двигателя, который можно использовать в нашей конструкции квадрокоптера, колеблется в диапазоне от 20 $ до 60 $! Кроме того, использование этих моторов предполагает установку дополнительных контроллеров – speedcontrollers.

Так что было решено использовать щеточные двигатели. Габариты нашего квадрокоптера небольшие, так что были куплены моторы с относительно маленьким крутящим моментом. Гугл подсказал, что квадрокоптеры с подобными приводами существуют. Найденные моторы могут поднять до 55 грамм веса, что нас вполне устроило.

Следующий шаг – решение проблем стабилизации моторов с помощью гироскопов и акселерометров. Гироскоп – это устройство, которое использует гравитацию Земли для определения угла наклона (ориентации) в пространстве. Классическая конструкция гироскопа состоит из свободно вращающегося диска, который называется ротором.

Ротор установлен на оси, которая расположена по центру большего, более стабильного колеса. При вращении оси ротор остается в статичном состоянии, которое соответствует центру гравитации. Акселерометр же представляет из себя компактное устройство, которое используется для измерения ускорения.

Когда объект выходит из состояния покоя (начинает двигаться) акселерометр фиксирует вибрации, которые возникают при этом движении. В акселерометрах используются микроскопические кристаллы, которые генерируют напряжение при ударах. Это напряжение снимается и формируется значение ускорения.

Квадрокоптер на Arduino

Описание модуля nrf24l01

Нельзя создать по-настоящему интересный проект, не дав возможность создания коммуникаций между различными элементами системы. Поэтому так важно выбрать правильную платформу для организации связи между модулями. NRF24l01 отлично подходит для создания распределенных систем с датчиками и контроллерами, разнесенными на расстояния до 100 метров.

NRF24l01 – это высокоинтегрированная микросхема с пониженным потреблением энергии (ULP) 2Мбит/с для диапазона 2,4 ГГц. При помощи модуля можно связать несколько устройств для передачи данных по радиоканалу. Можно объединить до семи приборов в одну общую радиосеть на частоте 2,4 ГГц, один из модулей будет выступать в роли ведущего, остальные – ведомые.

1 модель

Для начала решил выбрать тип корпуса: катамаран. За основу взял данную картинку:

По данной картинке был сделан набросок 3D модели, для того чтобы из нее сделать выкройку в одной замечательной программе pepakura designer:

Но конечно программа не смогла сделать нормальную выкройку по моим слишком криволинейным поверхностям. Пока шло мое обучение, какие все-таки должны быть 3D модели, решил делать без чертежей «на глаз»:

И собственно сама ардуина (самодельная) с драйвером на SI9986:

3 модель

Данную модель я не собрал до конца, но научился делать 3D модели для получения выкроек, а также узнал что такое шпангоуты и их назначение.

По данной модели была сделана выкройка:

Также узнал о отличной замене потолочной плитки: подкладка под ламинат.

У подкладки ряд плюсов по сравнению с потолочкой:

  1. Размер листов: 1000 х 500 мм.
  2. Различная толщина, я купил толщиной 3 и 5 мм, но использую пока только 5 мм.
  3. Отсутствие различного профиля и картинок.
  4. Хорошая прочность за счет большей толщины (для 5 мм).


А в остальном очень похожи:

  1. Малый вес.
  2. Не боятся воды.
  3. Низкая цена и доступность.

Клей использовал Титан, но затем перешел на термоклей, с которым сборка ускорилась в несколько раз.

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

Данный мотор очень прожорлив, и имеет огромный пусковой ток, около 10 А, может и выше. Поэтому я решил сделать драйвер двигателя проще: из 1 полевого транзистора, отказался от заднего хода и упростил разработку платы.

Была разработана, разведена и изготовлена плата управления, состоящая из самодельной ардуины на Atmega328P, радио модуля NRf24L01, драйвера полевого транзистора, нескольких стабилизаторов напряжения. Также плата была протестирована:

Осталось проверить плату с «большим» мотором, и установить в плату, установить сервопривод с обвесом, продумать герметизацию крышки катера и можно будет испытывать на воде.

И конечно делюсь выкройками катеров, с различными габаритами, для желающих собрать:

Катер_v3.1_450х173х85

Катер_v3.1_590х227х112

Катер_v3.1_750х288х142

Продолжение:

Сделал небольшое видео, показывающее все основные этапы сборки катера

Getpalevel()

Получить текущий уровень усиления мощности передатчика.

uint8_t RF24::getPALevel(void);

Возвращаетзначение одной из констант сопоставленной мощности:RF24_PA_MIN — минимальный уровень усиления = -18 дБм.

  • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
  • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
  • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.
  • RF24_PA_ERROR — уровень усиления не определён.

Openreadingpipe()

Открыть трубу для приёма данных.

void RF24::openReadingPipe(uint8_t number, const uint8_t * address);
void RF24::openReadingPipe(uint8_t number, uint64_t address);

Параметрыnumber — Номер трубы (число от 0 до 5).address — Адрес трубы, состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы приёмника должен совпадать с адресом трубы передатчика.

Setautoack()

Управление автоматической отправкой пакетов подтверждения приёма данных.

void RF24::setAutoAck(bool enable);
void RF24::setAutoAck(uint8_t pipe, bool enable);

Параметрыpipe — номер трубы, для которой разрешается / запрещается автоматическая отправка пакетов подтверждения приема. Указывается только на стороне приёмника. Если номер трубы на стороне приёмника не указан, то действие функции распространяется на все трубы.

Startfastwrite()

Начать быструю отправку данных.

void RF24::startFastWrite(const void * buf, uint8_t len, const bool multicast, bool startTx = 1);

Параметрыbuf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.len — Размер отправляемых данных в байтах.multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.startTx — флаг перехода в режим TX или STANDBY-II. Если не указан, значит установлен.

Write()

Отправить данные по радиоканалу.

bool RF24::write(const void * buf, uint8_t len, const bool multicast);

Параметрыbuf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.len — Размер отправляемых данных в байтах.multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.Возвращаетbool — результат доставки данных приёмнику (true / false).

Writefast()

Быстро отправить данные по радиоканалу.

bool RF24::writeFast(const void * buf, uint8_t len);
bool RF24::writeFast(const void * buf, uint8_t len, const bool multicast);

Параметрыbuf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.len — Размер отправляемых данных в байтах.multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.Возвращаетрезультат записи данных в буфер для передачи (true / false).

Вход bec для питания квадрокоптера

Все, кроме одного контакта питания BEC (cистема питания приемника и квадрокоптера от силовой батареи и отключении мотора при достижении порогового напряжения) должны быть отключены. Порой на форумах люди заявляют, что несколько источников питания может вызывать неполадки из-за разницы в напряжениях (что очень похоже на правду, так как на них действительно разные регуляторы напряжения, хоть и очень маленькие).

По сути эти источники питания BEC 5 В надо убрать или использовать в других целях. Например, можно предусмотреть дополнительный источник питания для контроллера, если первый перестал работать. Остальные BEC можно использовать для серводвигателей видеокамеры.

Выбираем тип и размер квадрокоптера

При сборке квадрокоптера выберите подходящий размер аппарата. Бывают такие:

  • Мини квадрокоптер – маленькая модель, с небольшим радиусом действия. Помещается в ладонь, подходит для полетов в помещениях.
  • Трикоптер — модель беспилотника,у которого только три пропеллера. Это делает его легче и маневреннее, однако теряется крутящий момент. Вместо этого используется механизм наклона заднего ротора. Сложно сделать своими руками.
  • Обычный квадрокоптер – простой и недорогой беспилотник. Диагональный размер в среднем 35 см (без пропеллеров). Состоит из минимального набота деталей с целью уменьшения веса устройства. Характеризуется большой скоростью передвижения и маневренностью.
  • Складной квадрокоптер берут в поездки, путешествия, когда важен размер и вес устройства. Складная рама облегчает транспортировку устройства. В самостоятельном изготовлении сложен.
  • Большой квадрокоптер – самый дорогой и тяжелый тип беспилотника. Способен летать на дальние расстояния, оборудован емким аккумулятором, несет сложное фото- и видеооборудование. Делайте самостоятельно только если уже владеете навыками изготовления подобных устройств.

Дальнейшая модернизация квадрокоптера на arduino

Квадрокоптер на Arduino 2

Основные проблемы с маленьким квадрокоптером – его стоимость и вес. Можете поискать моторы побольше и помощнее, но это особо не улучшит его характеристики. Что вам действительно поможет, (если вы готовы отдать больше денег) – это безщеточные (вентильные) моторы.

Для уменьшения веса конструкции лучше всего использовать именно Arduino Uno, так как к этой модели контроллера можно снять “прошитый” чип микропроцессора и установить его непосредственно на вашу ProtoBoard. В результате вы выиграете около 30 грамм веса, что немало при таких масштабах.

Программа для Arduino, которая написана и представлена в предыдущем разделе, может быть легко расширена и обогащена дополнительным функционалом. Самое главное, что на этом этапе квадрокоптер уже может автоматически стабилизировать полет. Если вы хотите настроить дистанционное управление, можете посмотреть в сторону трансмиттеров/ресиверов или bluetooth модулей. В общем, основа у вас теперь есть, а пространства для дальнейшей модернизации – еще больше.

Материалы

Радио модуль NRF24L01 / PA LNA 2.4G (Trema-модуль V2.0)Урок 26.4 Соединяем две arduino по радиоканалу через nRF24L01 Optimized High Speed NRF24L01 Driver Class Documenation

Настройка акселерометра-гироскопа (i2c)

MPU-6050 SparkFun

TL;DR:

1. Не подключайте к 5 В!

2. Рекомендуем использовать вот эту библиотеку для Arduino: Github.

В этом примере использовалась плата MPU6050 от SparkFun. На Amazon она стоит около $10, работает хорошо. Аналогичный Китай на Aliexpress или Ebay предлагает подобные платы по цене до 5 долларов. Тоже отлично работает.

Необходимые узлы, детали и оборудование

Для проекта квадрокоптера с управлением от Arduino нам понадобятся:

  • – провода;
  • – литиевые аккумуляторы на 3.7 В;
  • – транзистор: ULN2003A Darlington Transistor (можно взять транзистор, который поддерживает нагрузки и побольше);
  • – моторы: 0820 Coreless Motors;
  • – микроконтроллер: Arduino Uno;
  • – акселлерометр/гироскоп: плата MPU-6050 (дешевый и сердитый вариант типа “все в одном”);
  • – 3D принтер или доступ к нему для печати деталей конструкции квадрокоптера;
  • – инструменты (в том числе паяльник и умение им пользоваться!).

Ссылки для заказа необходимого электронного оборудования, которое использовалось в проекте из Китая

Организация питания nrf24l01

Во время запуска микроконтроллера могут возникнуть проблемы, которые связаны с тем, что не предусмотрена нужная сила тока в модуле питания 3,3 В. Из-за этого могут возникнуть помехи, мешающие стабильной работе. Обычно подобные трудности появляются, когда используются платы Arduino Uno, Nano, Mega, то есть в тех, в которых не хватает мощности. Для приведенных видов плат на пины подается небольшой ток 50 мА.

Существует несколько методов решения этой проблемы:

  • Подключение конденсатора к микросхеме на 3, 3 В( ) и землю GND (-). Емкость лучше выбирать 10 мкФ и более.
  • Дополнительный источник напряжения на 3,3 В.
  • Разработка отдельной платы, установка на нее модуля nRF24L01 и добавление конденсаторов на 1 и 10 мкФ.
  • Применение YourDuinoRobo1, который обладает дополнительным регулятором на 3,3 В.

Передача данных между платами arduino rf

Обе платы Arduino RF подключаются к портам одного ноутбука. Для работы с платами я использую среду Arduino Studio, в которой выполняю следующие настройки:

Tools -> Boards-> Arduino AVR Boards->Arduino Nano

Tools -> Processor-> ATmega328P (Old Bootloader)

Tools -> Managie Libraries-> “RF24” -> установка последней версии библиотеки RF24 by TMRh20 ( у меня версия 1.4.1). Также понадобятся библиотеки SPI.h и printf.h

работа с разными портами в Arduino Studio

Если у вас есть проблема одновременного открытия двух окон SerialMonitor, в которые выводится информация от двух Arduino, подключенных к разным портам, нужно сначала запустить ArduinoStuio в обычном режиме и отобразить информацию с одного порта, а потом запустить среду ArduinoStuio в режиме “от администратора”  и отобразить информацию с другого порта.

Для проверки плат использовался пример, поставляемый с библиотекой RF24, который нужно загрузить на обе платы Arduino.

Files-> Examples-> GettingStarted

Передача структур nrf24l01

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

Во время работы со структурами нужно внимательно рассчитать ее размер и указать PAYLOAD. Общий размер структуры будет равен сумме всех размеров составляющих ее переменных.

Основные элементы кода:

#define ADDR “mod0” //указывается адрес модуля

#define NEXT “mod1” //указывается адрес следующего модуля

boolean iamfirst=true;//начинает ли этот модуль цепочку?

#define PAYLOAD 5 //размер полезной нагрузки

Все модули в итоге будут получать одинаковый скетч, в котором различаться будут только переменные ADDR, NEXT и iamfirst.

Подключение nrf24l01 к arduino напрямую

Внимание!

  • Необходимо помнить, что модуль работает от 3.3 В и в нем нет защиты от переполюсовки, если не соблюдать два этих правила, можно сжечь модуль!
  • Для стабильной работы модуля NRF24L01 необходимо припаять конденсатор на 10 мкФ между VCC и GND.

nRF24L01Arduino UNO/Pro MiniArduino MEGA2560
GNDGNDGND
VCC3.3V3.3V
CE99
CSN1053
SCK1352
MOSI1151
MISO1250
IRQ

Подключение к arduino

Подключение акселерометра мы рассмотрели. Следующий шаг – заставить Arduino управлять моторами. Плата Arduino предоставляет на выход небольшое значение силы тока и напряжения, так что вместо того, чтобы подключать моторы напрямую к цифровым выходам платы, мы используем транзисторы для “усиления” напряжения.

Начнем сборку электросхемы. На этом этапе нам понадобятся Arduino, моторы, транзисторы (монтажная плата и коннекторы). Схема подключения приведена ниже, под необходимыми текстовыми пояснениями. Подключите четыре ШИМ выхода (отмечены на Arduino знаком ~ ) к транзистору, как это показано на рисунках.

Убедитесь, что транзисторы заземлены, и земля на Arduino подключена к земле от источника питания. Убедитесь, что роторы двигателей вращаются в правильном направлении (они должны обеспечивать подъем квадрокоптера, а не крен). Если вы переключите контакт мотора с 5 В на транзистор, ротор двигателя начнет вращаться в противоположном направлении. После настройки изменять направление вращение двигателей больше не придется. Изменять мы будем только скорость.

После запуска акселерометра и его проверки, необходимо установить все на ProtoBoard (можно использовать монтажную плату, на которую напаять рельсы для установки на Arduino. Можно пойти по более элегантному пути и приобрести Proto Shield).

В нашем случае мы припаяли акселерометр к плате и только после этого провели калибровку. Но практика показывает, что это не совсем правильно. Для увеличения точности показаний гироскопа/акселерометра, его лучше сначала откалибровать на ровной поверхности и только потом припаять.

Подключение к Arduino 1

Подключение к ардуино через адаптер nrf24l01

Адаптер специально разрабатывался для модуля NRF24L01 . На нем имеется специальный стабилизатор напряжения и удобно расположены выходы к контроллерам и платам Ардуино.

Как видно, на  адаптере имеется 2 вида разъемов. Двухрядный разъем используется для подключения радиомодуля, однорядный – для соединения с Ардуино. Отдельно расположены выходы на питание (5В) и землю.

Для подключения радиомодуль NRF24L01 нужно вставить в соответствующий двухуровневый разъем. При помощи проводов адаптер подключается к плате Ардуино к тем же выводам, которые нужны для подключения напрямую к модулю. Для подключения к Arduino Uno, Nano: MISO-12, MOSI-11, SCK-13,выводы CE –к D10 и CSN – D9, вывод VCC к Arduino ( 5V), а вывод GND к Arduino (GND).

Подключение nrf24l01 к ардуино

Вывод MOSI с платы nRF24L01 подключается к пину 11 для Ардуино Uno, Nano и на 51 для Arduino Mega. Контакт SCK нужно подключить к 13 для Ардуино Uno, Nano и 52 для Arduino Mega. MISO – к 12 для Ардуино Uno, Nano и 50 для Arduino Mega. Контакты CE и CSN подключаются к любому  цифровому пину Ардуино.

Питание – на 3,3 В. Если используется плата Arduino Mini, придется использовать внешний стабилизатор напряжения, так как на плате отсутствует выход 3,3В. Также к пинам питания можно добавить конденсатор на 10 мкФ и более для обеспечения стабильной и качественной работы. Модуль с припаянным конденсатором изображен на рисунке.

Беспроводной модуль NRF2401 в Arduino
Питание для NRF2401

Внешний вид макета представлен на рисунке ниже.

При подключении важно не перепутать напряжение – 5 Вольт могут вывести модуль из строя.

Пример 1: проверочный скетч

/*
  Подключаем файл настроек из библиотеки RF24.
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку для работы с nRF24L01 .
*/
#include <RF24.h>
#include <printf.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  printf_begin();
  /*
    Инициируем работу модуля nRF24L01 .
  */
  radio.begin();
  if (radio.isPVariant()) {
    /*
      Если модуль поддерживается библиотекой RF24,
      то выводим текст «Модуль nRF24L01 подключен».
    */
    Serial.println("Модуль nRF24L01 подключен");
    /*
      Дамп конфигурации RF для отладки
    */
    radio.printDetails();
  } else {
    /*
      Иначе, если модуль не поддерживается,
      то выводи текст «Неизвестный модуль».
    */
    Serial.println("Неизвестный модуль");
  }
}

void loop() {
}

Пример 2: передача данных

В функции setup() данного примера модулю задаются основные настройки:

  • по умолчанию модуль работает в качестве передатчика;
  • 0x30 канал;
  • скорость 1 Мбит/сек (RF24_1MBPS);
  • максимальная мощности (RF24_PA_MAX);
  • адрес трубы 0x0123456789LL.

На стороне приёмника нужно указать тот же номер канала, скорость передачи, мощность и адрес трубы.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01 
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
   Объявляем массив для хранения и передачи данных
   (до 32 байт включительно).
*/
int dataToBeTransmitted[5] = {'0', '1', '2', '3', '4'};

void setup() {
  /*
    Инициируем работу nRF24L01 
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);

  /*
     Открываем трубу с адресом 0x0123456789LL для передачи данных
     (передатчик может одновременно вещать только по одной трубе).
  */
  radio.openWritingPipe(0x0123456789LL);
}

void loop() {
  /*
     Отправляем данные из массива dataToBeTransmitted
     указывая весь размер массива в байтах.
  */
  radio.write(&dataToBeTransmitted, sizeof(dataToBeTransmitted));
  /*
     Устанавливаем задержку на 1000 мс.
  */
  delay(1000);
}

Пример 4: передача данных с проверкой их доставки

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01 
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
   Объявляем массив для хранения и передачи данных
   (до 32 байт включительно).
*/
uint8_t dataToBeTransmitted[5] = {'0', '1', '2', '3', '4'};

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01 
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);

  /*
     Открываем трубу с адресом 0x0123456789LL для передачи данных
     (передатчик может одновременно вещать только по одной трубе).
  */
  radio.openWritingPipe(0x0123456789LL);
}

void loop() {
  /*
     Отправляем данные из массива dataToBeTransmitted
     указывая весь размер массива в байтах.
  */
  if (radio.write(&dataToBeTransmitted, sizeof(dataToBeTransmitted))) {
    /*
       Данные передатчика были корректно приняты приёмником
    */
    Serial.println("Данные были корректно приняты приёмником");
  } else {
    /*
       Данные передатчика не приняты или дошли с ошибкой CRC
    */
    Serial.println("Данные не приняты или дошли с ошибкой CRC");
  }
  /*
     Устанавливаем задержку на 1000 мс.
  */
  delay(1000);
}

Пример 5: получение данных от одного или нескольких передатчиков

Приёмнику можно задать до 6 труб функцией openReadingPipe(номер, адрес) с номерами труб от 0 до 5 и адресами труб совпадающими с адресами труб передатчиков.

/*...*/
radio.openReadingPipe(0, 0x0123456789LL);
radio.openReadingPipe(1, 0x0123456799LL);
radio.openReadingPipe(2, 0x012345679ALL);
radio.openReadingPipe(3, 0x01234567AALL);
radio.openReadingPipe(4, 0x01234567ABLL);
radio.openReadingPipe(5, 0x01234567BBLL);
/*...*/

Сколько труб Вы укажете, столько передатчиков будет слушать приёмник.

Методом available() осуществляется проверка получения данных. Метод возвращает true если в буфере есть принятые данные доступные для чтения. В качестве необязательного аргумента можно указать адрес переменной в которую будет помещён номер трубы по которой были приняты данные (в примере используется адрес переменной &pipe), зная номер трубы мы знаем от какого передатчика пришли данные.

if(radio.available(&pipe)) {
  /*...*/
}

Если приемник будет принимать данные только от одного передатчика, то переменную pipe можно не использовать, а метод available() можно вызвать без параметра, так как в этом случае не требуется узнавать от какого передатчика приняты данные.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01 
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
  Объявляем массив для хранения и передачи данных
  (до 32 байт включительно).
*/
uint8_t receivedData[5];

/*
  Объявляем переменную в которую будет сохраняться
  номер трубы по которой приняты данные.
*/
uint8_t pipe;

uint8_t i;

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01 
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);
  /*
    Открываем 1 трубу с адресом 1 передатчика 0x0123456789LL, для приема данных.
  */
  radio.openReadingPipe(1, 0x0123456789LL);
  /*
    Открываем 2 трубу с адресом 2 передатчика 0x0123456799LL, для приема данных.
  */
  radio.openReadingPipe(2, 0x0123456799LL);
  /*
    Включаем приемник, начинаем прослушивать открытые трубы.
  */
  radio.startListening();
}

void loop() {
  /*
    Если в буфере имеются принятые данные, то получаем номер трубы
    по которой эти данные пришли в переменную pipe.
  */
  if (radio.available(&pipe)) {
    /*
      Читаем данные из буфера в массив receivedData указывая
      сколько всего байт может поместиться в массив.
    */
    radio.read(&receivedData, sizeof(receivedData));
    /*
      Если данные пришли от 1 передатчика (по 1 трубе),
      то можно выполнить соответствующее действие ...
    */
    Serial.print("Данные [ ");
    for (i = 0; i < 5; i  ) {
      Serial.print((char) receivedData[i]);
      Serial.print(' ');
    }
    Serial.print("] пришли по трубе ");
    Serial.println(pipe);
  }
}

Различные версии модуля nrf24l01

Беспроводной модуль NRF2401 в Arduino
Беспроводной модуль NRF2401

Данная версия обладает дальностью до 100 м для открытого пространства, в помещении дальность ниже – до 30 м. Размеры 29х15 мм.

Мини NRF24L01. Характеристики и параметры те же, размеры 18х12 мм.

Модуль, оснащенный внешней антенной и усилителем. Дальность увеличена до 1000 м на открытых территориях.

Беспроводной модуль NRF2401 в Arduino
Беспроводной модуль NRF2401 с антенной

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

Беспроводной модуль NRF2401 в Arduino
Беспроводной модуль NRF2401 в Arduino

Распиновка nrf24l01

Беспроводной модуль NRF2401 в Arduino
Схематичное изображение модуля

Помимо выходов питания линии сигналов могут подключаться к контактам с питающим напряжением 5 В. Вход устройства, которое подключается к плате, должен потреблять ток не выше 10 мА.

Микросхема содержит следующие выходы:

  • GND – земля;
  • VCC – напряжение питания 3,3В
  • CE – высокий уровень микросхемы;
  • CSN – включение низкого уровня микросхемы. В этом случае устройство реагирует на SPI команды;
  • SCK – такт SPI, максимальное значение 10 МГц;
  • MOSI – передача информации от контроллера;
  • MISO – прием данных в контроллер;
  • IRQ – сигнал для аппаратного прерывания.

Результат

Подключение модуля nRF24L01  к Arduino - Передача данных с проверкой, РезультатСкетч данного примера отличается от предыдущего только кодом loop() где функция write() вызывается в условии оператора if(). Дело в том, что функция write() не только отправляет данные, но и возвращает true (если данные были доставлены) или false (если данные не доставлены). По умолчанию передача данных реализована так, что передатчик не только отправляет данные, но и запрашивает у приёмника подтверждение их получения, а приёмник получив данные и проверив CRC, возвращает передатчику пакет подтверждения приема данных. Таким образом на стороне передатчика можно контролировать факт доставки данных приёмнику.

Если не нужно определить факт доставки данных приёмнику, можете заменить write() на writeFast().

/*
   Отправляем данные из массива dataToBeTransmitted 
   указывая сколько байт массива мы хотим отправить.
 */
radio.writeFast(&dataToBeTransmitted, sizeof(dataToBeTransmitted));

writeFast() принимает те же параметры что и write(), но возвращает не флаг доставки данных приёмнику, а флаг записи данных в буфер FIFO. Значит в большинстве случаев функция вернёт true даже до того как приёмник получит данные.

Запретить отправку пакетов подтверждения приёма можно и на стороне приёмников, вызвав у них функцию setAutoAck(false) или setAutoAck(номер_трубы, false). Но в таком случае и на стороне передатчика нужно вызвать функцию setAutoAck(false) иначе приёмник не будет понимать что ему прислал передатчик.

Сборка

Прежде всего, подготавливаем и соединяем лучи и раму. Если нет возможности напечатать раму на 3D принтере, то вместо нее используйте обычную фанеру. В месте соединения деталей рамы установите силовую плату. Закрепить ее следует внизу в центральной части.

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

Следующим шагом идет установка батареи. Используйте два аккумулятора Zippy Compact по 3700 мА·ч. Крепить их необходимо по диагонали сразу к двум лучам. Используйте для этого широкий пластиковый ремешок и скотч. Крестовина в центральной части также подойдет для установки аккумуляторов. Между крестовиной и контрольной панелью имеется пространство, туда просуньте ремешок для крепления аккумуляторов.

В завершении собираем и устанавливаем винты на концах лучей на специальные площадки. Остается только подключить провода и можно приступить к первым полетам. Лучше всего для начала засечь время полета, чтобы успеть сделать мягкую посадку. Это особенно важно, если на сделанный своими руками беспилотник не было прикреплено шасси.

Скетч для arduino

На этом этапе вам понадобятся некоторые знания в программировании Arduino. Если вы чего-то не понимаете, остановитесь на этом моменте и постарайтесь с ним разобраться. Приведенные ниже пояснения помогут вам со многими вопросами, но описать все возможные нюансы невозможно.

После того как вы подключили MPU-6050 к вашему Arduino, включите его и загрузите скетч I2C scanner code.

Скопируйте код программы, вставьте его в пустой скетч и запустите. Откройте серийный монитор Arduino IDE (Tools->Serial Monitor) и убедитесь, что вы подключены к 9600 (нижний левый).

Если вы все сделали правильно, должно обнаружиться устройство I2C и ему присвоиться адрес 0x68 ил 0x69. Запишите его. Если появились ошибки, проверьте подключение.

Теперь вам надо загрузить скетч, который обрабатывает информацию с акселерометра/гироскопа. По сети гуляет не один вариант подобных скетчей, рекомендуем использовать вот этот. После перехода по ссылке, нажмите “Download Zip”. После скачки, разархивируйте архив.

После того как вы установили библиотеки, откройте файл MPU6050_DMP6 (MPU6050 -> Examples). Рекомендую вам его просмотреть, даже если вы не особо ориентируетесь в коде. Если у вас присвоился адрес 0x69, вам надо раскомментировать одну строку в верхней части кода (после #includes), так как по умолчанию стоит 0x68. Теперь программа должна компилироваться.

Загрузите программу, откройте окно серийного монитора (в этот раз с 115200) и следуйте инструкциям. Поздравляю, так как сейчас вы должны были получить значения с акселерометра/гироскопа через Arduino!

Прежде чем двигаться дальше, надо откалибровать ваш гироскоп/акселерометр. Найдите плоскую горизонтальную поверхность и поставьте на нее плату MPU6050.

Сокет для микроконтроллера

Для того, чтобы передавать данные по GPS или использовать ультразвуковой датчик расстояния с Arduino Nano, UNO или Pro Mini, нам понадобится дополнительный микроконтроллер. Он будет обрабатывать данные с GPS или сонар модулей и передавать их на плату контроллера полета через I2C.

Очень удобная фича – встроенный сокет для легкого подключения по I2C для периферийных устройств.

2 дополнительных контакта для моторов (для гексакоптера) показаны на риунке ниже.

Сравнение со связкой arduino leonardo модуль nrf24l01

Данный краткий обзор был бы совсем кратким, не выполни я пример gettingstarted на стандартной связке Arduino NRFL01 и Raspberry NRFL01

Схема подключения NRFL01 к Arduino Nano изображена в посте выше. У меня не было под рукой Arduino Nano, но была Arduino Leonardo, у которой SPI пины вынесены сбоку платы.

Результат:

В конце поста, также покажу результат передачи информации о расстоянии до объекта, полученной с помощью имеющегося в наличии ультразвукового датчика, подключенного по схеме ( как подключается NRF24L01 модуль показано выше):

код Arduino US.ino

Результат выполнения показан ниже. Время передачи значительно выше. С ходу не хватает знаний понять, почему так вышло и как улучшить результат.

Сфера применения модуля nrf24l01

Одним из самых главных компонентов проектов IoT являются средства коммуникации. nrf24l01 можно с успехом применять в следующих областях:

  • Мобильная электроника;
  • Компьютеры;
  • Автоматизированные системы;
  • Различные элементы «умного дома» – сигнализация, регулирование температуры и другие функции;
  • Игры;
  • Бытовая электроника.

В плату nRF24L01 входят синтезатор частот, демодулятор, усилители и другие составляющие. Рабочая частота модуля определяется номером канала, диапазон частот, в котором происходит связь, 2,4 – 2,483 ГГц. Каналы располагаются через 1 МГц, то есть нулевому соответствует частота 2,4ГГц, каналу 83 – 2,483 ГГц.

Модуль имеет 4 рабочих режима – выключение (Power Down), спящий режим (Standby), прием данных(RX mode), передача данных (TX Mode). В режиме приема данных RX потребление тока выше, чем в режиме передачи данных TX.

За стабильную и надежную передачу и прием данных отвечает протокол Enhanced ShockBurst. Принимающее устройство должно давать ответ о приеме данных, подтверждая таким образом обратную связь.

Схема подключения arduino

Схема подключения платы MPU6050 приведена ниже. Обратите внимание, что библиотека для Arduino предполагает использование именно этих контактов. Как правило, даже если у вас плата от другого производителя, контакты обозначены одинаково, следовательно, схема подключения остается такой же.

VDD -> 3.3v

GND -> GND

INT-> digital 2

SCL -> A5

SDA -> A4

VIO -> GND

Если вы запитаете от 5 В, плата может испортиться, так что будьте внимательны и используйте именно 3.3 В. На некоторых платах MPU6050 есть регулятор напряжения, который выполняет роль предохранителя, но рисковать все равно не стоит. Если на вашей плате есть контакт AD0, его надо подключить к земле (GND). В нашем случае контакт VIO подключен к AD0 на самой плате, так что подключать пин AD0 не надо.

Установка библиотеки rf24

Работать с nRF24L01 можно с помощью библиотеки RF24 — довольно популярная и удобная библиотека. Скачиваем, распаковываем и закидываем библиотеку RF24 в папку Arduino/libraries. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Библиотеку можно установить из самой среды следующим образом:

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…Подключение модуля nRF24L01  к Arduino - Управлять библиотеками...
  2. В строке поиска вводим «RF24», находим библиотеку автора TMRh20, выбираем последнюю версию и кликаем Установить.Подключение модуля nRF24L01  к Arduino - RF24 Установка
  3. Библиотека установлена (INSTALLED).Подключение модуля nRF24L01  к Arduino - RF24 INSTALLED

Характеристики nrf24l01

  • Низкие затраты энергии;
  • Наличие усовершенствованного ускорителя аппаратного протокола ShockBurst;
  • Операционная система ISM;
  • Скорость передачи данных 250 Кбит/с, 1 Мбит/с и 2 Мбит/с;
  • Полная совместимость со всеми стандартными сериями nRF24L Nordic, а также сериями nRF24E и nRF240;
  • Напряжение питания 3,3В;
  • Рабочие температуры от -40С до 85С, температуры хранения от -40С до 125С;
  • Дальность связи до 100 м.

Основой модуля служит nRF24L01 производства компании Nordic Semiconductor. На микросхеме расположены все необходимые элементы и вилка разъема. По интерфейсу SPI можно произвести настройку протокола, установить выходную мощность и наладить каналы обмена данных.

Шаг 3: делаем раму

Я использую старую алюминиевую антенну, мягкое дерево и алюминиевую пластину (лопасть вентилятора), чтобы сделать каркас. Отрежьте 4 куска алюминиевого бруска по 20см. Размер центральной пластины составляет около 11 * 18 см…. Деревянное крепление для двигателя имеет длину около 10 см и диаметр 4,5 см (там, где установлен двигатель).

Закрепите алюминиевые стержни с помощью центральной пластины с помощью винтов и вставьте крепление двигателя под алюминиевые стержни. Ваша рама готова (см. видео).

Шаг 6: соединяем esc и ресивер с контроллером полёта

*** Не соединяйте BEC-провод ESC (5 вольт), соединяйте лишь сигнальный провод*** Запитывайте ресивер от 5вольтового источника Ардуино

Соединение ESC:

  • Цифровой пин-4 к ESC1 (правый передний CCW)
  • Цифровой пин-5 к ESC2 (правый задний CW)
  • Цифровой пин-6 к ESC3 (левый задний CCW)
  • Цифровой пин-7 к ESC4 (левый передний CW)

Соединение ресивера:

  • Цифровой пин-8 к каналу 1 ресивера
  • Цифровой пин-9 к каналу 2 ресивера
  • Цифровой пин-10 к каналу 3 ресивера
  • Цифровой пин-11 к каналу 4 ресивера

Шаг 7: настройка контроллера полёта (загрузка скетча)

*** На этом этапе не подключайте лётную батарею

Теперь загрузите Arduino IDE и приложенный скетч и извлеките файл. Вы найдете схемы YMFC-Al, файл Readme, код калибровки ESC, код настройки и код контроллера полета.

Arduino IDEСкетч контроллера полета

Сначала загрузите код и откройте последовательный монитор на 56000b и следуйте инструкциям в видеоЕсли ошибки не возникло, загрузите скетч калибровки ESC после загрузки кода. Поставьте передатчик на полную мощность и подключите летную батарею после нескольких звуковых сигналов, выключите дроссель (я думаю, что этот метод работает не для всех типов и марок ESC, но у меня это работает отлично).

После загрузки скетча калибровки ESC загрузите скетч контроллера полета и Ваш FC готов.


Файлы

Заключение

К сожалению мне сходу не удалось найти в интернете подробных гайдов по работе с Arduino RF, поэтому пришлось пару недель повозиться. Знакомство с библиотекой Mirf как-то сразу не задалось. После многих попыток разобраться в теме, получился вот такой вот гайд.

Оказалось, что работать с Arduino RF интересно и не так уж и трудно. Надеюсь что мой опыт пригодится новичкам и желающим построить какой-либо проект на базе Arduino RF. Также хочу выразить благодарность авторам постов про NRF24L01, которых набралось уже не мало 🙂

Выводы по nrf24l01

Беспроводной модуль nrf24l01 нельзя назвать простым в освоении устройством. И подключение, и программирование требует определенных навыков. Но стоимость и доступность модуля позволяет рекомендовать его для тех, кто занимается проектами интернета вещей или нуждается в простых инструментов для коммуникаций.

Купив специальный адаптер для nrf24l01 вы можете существенно упростить подключение к ардуино. А использование библиотек позволяет максимально упростить код. Старайтесь не покупать модули nrf24l01 дешево у совсем уж неизвестных продавцов, и тогда никаких проблем с работой ваших проектов не будет.

Оцените статью
Радиокоптер.ру
Добавить комментарий