подключение нескольких модулей к ардуино нано
- Войдите на сайт для отправки комментариев
Добрый день всем! Ребята, подскажите - КАК подключить к Ардуино Нано (китайский клон) одновременно nRF24L01+, драйвер двигателей TB6612FNG, контроллер скорости двигателя bustophedon ESC и два сервопривода? По-моему, на ардуинке просто не хватит цифровых пинов для подключения. Хочу собрать катер на радиоуправлении - на нем планирую установить:
основной мотор -1 шт (контроллер bustopeddon ESC)
серво для поворота пера руля - 1 шт
серво для поворота грузового крана - 1 шт
моторчики для подъема стрелы и гака на кране - 2 шт (эти моторчики от китайской игрушки-вертолета, очень маленькие) (драйвер двигателей TB6612FNG). Вот схема, сам сделал. тут только серво для поворота руля, двигатель лодки и радиомодуль. Куда подключить еще серво и TB6612&
Обычно контроллер выбирают, исходя из задачи. Так что если чего-то "не хватает", берут другой контроллер.
Хотя во многих случаях можно воспользоваться и альтернативными решенияи, например, расширителем портов.
Добрый день всем! Ребята, подскажите - КАК подключить к Ардуино Нано (китайский клон) одновременно nRF24L01+, драйвер двигателей TB6612FNG, контроллер скорости двигателя bustophedon ESC и два сервопривода? По-моему, на ардуинке просто не хватит цифровых пинов для подключения.
скорее не цифровых пинов не хватит, а функционала - таймеров и прерываний для подключения трех моторов, двух серв и NRF-ки...
А пинов то там много, если грамотно подойти.
Спасибо за комментарии. Буду дальше изучать Ардуино. Решил пока отказаться от крана с двумя движками. Вторую серву поставлю на корме катера для рыбалки - доставка блесны или крючка удочки до места и сброс их там.
Спасибо за комментарии. Буду дальше изучать Ардуино. Решил пока отказаться от крана с двумя движками. Вторую серву поставлю на корме катера для рыбалки - доставка блесны или крючка удочки до места и сброс их там.
НРФ-ка подключается как понял по SPI - он есть в НАНО, плюсом можно добавить вывод IRQ на какое-то прерывание - оно тоже вроде как есть и даже 2шт ардуиновских и много PCINT. На контроллер моторов потребуется по 3 провода на управление мотором - итого 6. Неплохо бы 2 из них задействовать от таймерного ШИМ - тут 8-и битного таймера0 и его пары ног ШИМ - вполне достаточно. 2 сервы конечно лучше всего сажать на таймер1 - тогда будет "аппаратное управление сервой", но можно обойтись и так "ногодрыгом", т.к. OC1B занимается под SS от SPI. Под сервы - библиотека типовая Servo.h, ESC-контроллер - ваще в последнюю очередь, его "хоть куда".
В общем, ног - с запасом, функционал - относительно прост, а управление сервами через библиотеку. Насколько помню, её применение не влияет на SPI.
P.S. Ещё можно посмотреть в сторону Atmega128a там ресурсов чутка побольше (примерно 1/2 от Мега2560).
вот полная схема подключения, не подключены серво 2, серво 3 и контроллер bustopeddon ESC. Я на других форумах прочитал, что можно на один пин подключить несколько модулей и управлять этими модулями по очереди - программно. Для какого модуля поступил сигнал на пин - тот модуль и активируется.
Там "ног с запасом", но ваша картинка практически нечитаема с моими глазами .. подключаете устройства по степени требования к пинам: сначала те, что используют "альтернативные функции" пина. У Вас это НРФ-ка - использует SPI и он один и все пины назначены "до Вас". Занимаете их, оставляя "свободным" пин IRQ от НРФ-ки (позже).
Далее, у Вас драйвер 2-х моторов - подключаете его пины ШИМ управления, ибо они "хотят таймер и ШИМ выход". Такие у Вас есть - выходы таймера Т0 - OC0A, OC0B. Подключаете их. У Вас осталось тут ещё 4 провода управления моторами - они в общем-то "любые" под "ногодрыг", также "на потом".
Затем у Вас идут 3 сервы и контроллер БЛДС мотора. Серва очень хорошо управляется напрямую аппаратным ШИМ от 16-и битного таймера, но у Вас осталась свободной только 1 нога для этого. Или взять иной контроллер (Леонардо, Мега128а, Мега2560.. их много) или посадить сюда самую гоняемую серву. Кроме этого, у Вас контроллер, который может принимать как ШИМ сигнал, так и УРОВЕНЬ (смотрите описание своего, они бывают разные, я Ваш не знаю) .. Вот если он принимает ШИМ, то есть работает также как серва, то имеете практически 4 сервы и T1OC1A (кажется он остается свободным от SPI) наверное лучше выделить ему, а сервы посадить на "любые" пины как и всё оставшееся не распределенным.
Не забывайте что аналоговые входы точно также могут работать как обычный цифровой выход под "ручное управление" (ногодрыг).
Для управления сервами в ручном режиме подходит библиотека Servo.h, стоит её посмотреть внимательно на предмет конфликта с аппаратным управлением оставшимся выходом таймера1 (она вроде бы в первую очередь использует его, а другого на НАНО и нет в общем-то) и конфликта с работой по SPI, но такого как-бы "быть не должно", но кто знает .. давно смотрел, не запоминаю уже давно ничего (своп забит).
Если надо чтобы микроконтроллер реагировал на события от НРФ-ки, то подключаете и его пин IRQ, а если захотите использовать SPI для чего-то ещё, то вот тут да, надо будет "включать и выключать" требуемое устройство программно. Собственно для вашей комплектации - это не надо ни разу.
Расписав ноги, Вы тем самым получите ограничения для своего алгоритма управления: "тут пишем, тут читаем, а тут рыбу заворачивали" .. и уже после этого можно писать программу и смотреть что не так..
P.S. Кстати, это "главный косяк" того, чему учат "преподы": возможность адаптации программы под разные ноги микроконтроллера, типа так "универсальней". Это НЕВЕРНО! Сначала расписываются ноги ПОД ЗАДАЧУ, а потом она уже программируется и хранить "номер пина" в переменной - убожество от непонимания работы микроконтроллера. Тут каждая нога имеет свою "специфику".
Вторая проблема - это использование "плюсов" для написания программы. Да, С++ позволяет писать "красиво и универсально", инкапуслируя, виртуализируя те или иные места программы для .. лучшего восприятия программистом (чужим исключительно!).
К сожалению, "за всё надо платить" и ООП С++ с виртуализацией и наследованием это 2(ДВА!) уровня косвенности, а каждый "уровень" понижает производительность примерно в 10 раз .. то есть, конкретно тут - это .. способ превратить 16 мегагерцовую машинку в продукт с тактированием в 100кГц и меньше (по количеству "слоев" используемых библиотек).
Отсюда - чем меньше будете использовать чужие библиотеки, тем шустрее работает машинка. И меньше занимает место код и данные.
Из моей ПРАКТИКИ (за три года тут): управление моторами, сервами, НРФ-ками (SPI, I2C, UART) "в среднем по больнице" формирует кусок кода, который исполняется около 3-6 микросекунд. Итого, "без математики", при средней времени реакции "параллельной ОС" (RTOS) в 1миллисекунду, даже НАНО способна одновременно отрабатывать очень большое количество аппаратуры около 20-40 устройств даже с небольшой математикой .. у неё нет столько ног и периферии.
Так что, ваша задача вполне по силам даже НАНО. С запасом.
Спасибо за комментарий, но я в этих делах только начинаю разбираться - многое еще не знаю а задач выше крыши сам себе ставлю (вы уж не сердитесь на дилетанта.) Сейчас вот разбираюсь - как написать ПРОСТОЙ скетч отправки данных с джойстика в монитор порта одной ардуинки на другую через НРФ. Не подскажете - какие данные вписывать в скетч приемника в раздел "void loop" чтобы он считал посланные от передатчика данные?
Я не работал с НРФ-ками. Только-только осваиваю модуль на базе Si4432, ещё знакомлюсь с регистрами и только попробовал простой пример: "радиосвисток" или как его зовут "маяк". Напишите простой скетч, который будет свистеть 1 байт в передатчик с интервалом в 1сек, и простой приемник, который будет его принимать и отправлять в монитор. Если связь получается, то можно двигаться дальше. Долны быть подобные готовоые примеры в Сети. поищите. Код, по ряду причин я тут больше не выкладываю. Никакой. Сожалею, но давно похоже на то, что так теперь тут поступает много кого.
Ясно. Я простейшие скетчи из интернета уже отсылал/принимал, но там готовый сигнал с НРФ-передатчика на НРФ-приемник в монитор порта. Уже почти разобрался как программно настраивать приемник и передатчик, вот теперь с потенциометрами/джойстиком разбираюсь. Спасибо Вам за помощь в изучении сей науки! :)
С потенциометром всё ещё проще: analogRead() в помощь и аналоговый вход Ардуино. Далее, для перевода попугаев АЦП в нужный диапазон значений - функция map(). Этого "более чем достаточно". :)
Это я уже изучил. Записываем эти данные в передающий скетч, а вот дальше я пока завис: как сдеать, чтобы эти данные получил приемный ардуино? какие данные для этого надо прописывать в приемном скетче?
Приемный скетч должен быть настроен на прием "куда-то", то есть у него должно быть "место" куда принять и либо его опрашивать в цикле "ты уже принял?" либо настраивать прерывание от него "принял - дерни меня за это".. тут у НРФ-ки есть выход IRQ он как раз для второго режима. Его подключаете на вход прерывания (у НАНО их 2) или на любую ножку и на ней настраиваете обработку прерывания типа PCINT (это уже ручками, в Wiring нет таких средств).. и вот в обработчике прерывания или как только цикл сказал "принято" - вытаскиваете то что принято из того места, на которое натстроили приемник. Или из него по SPI читаете из нужного регистра. Посмотрите в примерах, откуда и как читает приемник.
Я тут подумал - скорее всего оптимальным вариантом будет использовать плату arduino 2560 pro, там и ШИМ-выходов побольше и размером для моего катера подходит, хоть и впритык.
А можно перенести часть (или все) исполнительные механизмы на вторую нану и подавать ей команды хоть по UARTу. Должно получиться дешевле чем 2560 про и программировать легче.
В том-то и проблема, что вторая ардуино Нано просто не влезет в корпус кораблика.
Ну тогда я бы посмотрел в сторону Blue Pill (Stm32f103c8t6). Стоит как нано, а рессурсов намного больше. Но рассчитан на 3.3В только.
Ну даже ЕСЛИ И ПОДКЛЮЧИТЬ вторую Нано по TX-RX к первой: я предполагаю использовать только один радиомодуль, подключенный к первой Нано, и ПОКА не знаю - как передавать данные для второй Нано транзитом через первую. Ведь в скетче получается нумерация пинов будет одинаковая, КАК первая Нано определит, что это данные для второй и эти данные надо ей отправить? А по поводу цены ардуин - меня это не очень волнует, зарплата позволяет (как говорится - любой каприз за ваши деньги). А если оставить на пульте Нано, а на кораблик поставить Мега 2560 Про - будут ли они работать совместно? (понимаю - вопросы дилетанта).
В том-то и проблема, что вторая ардуино Нано просто не влезет в корпус кораблика.
выкинуть НАНО, поставить МИНИ... выкинуть МИНИ оставить голый проц под своим обвесом (изучить ЛУТ).
писать код под свою задачу, а передача данных между ведущим и ведомым процом не самая сложная. недавно эту тему встречал, вроде библиотеки есть.
если хотите делать своими силами " НА интерес, хобби" это оно самое - много читать, много писать, много ошибаться, делать выбор...
"если хотите делать своими силами " НА интерес, хобби" это оно самое - много читать, много писать, много ошибаться, делать выбор..."
Чем, собственно, я и занимаюсь - ломаю себе мозг, попутно спрашивая совета у более знающих людей :)
Чем, собственно, я и занимаюсь - ломаю себе мозг, попутно спрашивая совета у более знающих людей :)
Ну тогда, купите радиомодуль + ардуино + питание + моторчик. И начинайте писать, а там как пойдет...
купить FS-i6 или чего профессиональние всегда успеется - хобби вообще очень дорогое удовольствие.
радиомодуль + ардуино + питание + моторчик - уже всё собрано на самом кораблике, так сказать "по месту". Пока стопорюсь на скетче - изучаю основы программирования на С++ и попутно пытаюсь собрать свой скетч из частей других, найденных в интернете. Простое прямое управление (без радиомодуля) сервой с потенциометра получается, а с джойстика не выходит. А вот с мотором пока глухо - нужно плавное увеличение/уменьшение оборотов мотора вперед-назад с потенциометра-слайдера. Среднее положение слайдера = остановка мотора.
Ну даже ЕСЛИ И ПОДКЛЮЧИТЬ вторую Нано по TX-RX к первой: я предполагаю использовать только один радиомодуль, подключенный к первой Нано, и ПОКА не знаю - как передавать данные для второй Нано транзитом через первую.
Ну, например, переносим все сервы на вторую нану (или, как тут уже советовали, про микро). Придумываем примитивный протокол обмена. Пусть, скажем, каждая команда передается 2мя байтами. Старшие 2 бита номер сервы, остальные 14 угол поворота. (Я с вашими сервами не знаком, может им и 8 бит для угла хватит). Дальше пишем простенькую програмку, которая слушает USART. Как только приходит команда - задает нужный ШИМ для нужной сервы и слушает USRAT опять. Для помехозащищенности можно повторять команду, скажем, три раза и при приеме сверять, что бы хоть две совпали. Дальше "основная" нана работает с радиомодулем и остальной переферией. Вся управляющая логика реализуется там. Ну а как надо повернуть серву - просто посылается соответствующая команда ведомой нано или микро.
Так вот я только начинаю изучать программную часть, а уже лезу в дебри программирования. Но, как говорил Остап-Берта-Мария-Ибрагим-Бендер-Бей: "СРАЗУ ТОЛЬКО КОШКИ РОДЯТСЯ".
Простое прямое управление (без радиомодуля) сервой с потенциометра получается, а с джойстика не выходит.
и что тут может не получится если первое работает?
А вот с мотором пока глухо - нужно плавное увеличение/уменьшение оборотов мотора вперед-назад с потенциометра-слайдера. Среднее положение слайдера = остановка мотора.
форма потенциометра ни на что не влияет, только его параметры и схема подключения.
чтобы понять, необходимо видить скетч и схему... чтобы как-то помочь - строки в скетче должны иметь коментарии. Чтобы скетч правильно выполнялся, программист несет ответственность за любой и каждый символ кода.