подключение нескольких модулей к ардуино нано

Biker
Offline
Зарегистрирован: 26.09.2018

Добрый день всем! Ребята, подскажите - КАК подключить к Ардуино Нано (китайский клон) одновременно nRF24L01+, драйвер двигателей TB6612FNG,  контроллер скорости двигателя bustophedon ESC и два сервопривода? По-моему, на ардуинке просто не хватит цифровых пинов для подключения. Хочу собрать катер на радиоуправлении - на нем планирую установить:

основной мотор -1 шт (контроллер bustopeddon ESC)

серво для поворота пера руля - 1 шт

серво для поворота грузового крана - 1 шт

моторчики для подъема стрелы и гака на кране - 2 шт (эти моторчики от китайской игрушки-вертолета, очень маленькие) (драйвер двигателей TB6612FNG). Вот схема, сам сделал. тут только серво для поворота руля, двигатель лодки и радиомодуль. Куда подключить еще серво и TB6612&

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Обычно контроллер выбирают, исходя из задачи. Так что если чего-то "не хватает", берут другой контроллер.

Хотя во многих случаях можно воспользоваться и альтернативными решенияи, например, расширителем портов.

b707
Offline
Зарегистрирован: 26.05.2017

Biker пишет:

Добрый день всем! Ребята, подскажите - КАК подключить к Ардуино Нано (китайский клон) одновременно nRF24L01+, драйвер двигателей TB6612FNG,  контроллер скорости двигателя bustophedon ESC и два сервопривода? По-моему, на ардуинке просто не хватит цифровых пинов для подключения.

скорее не цифровых пинов не хватит, а функционала - таймеров и прерываний для подключения трех моторов, двух серв и NRF-ки...

А пинов то там много, если грамотно подойти.

Biker
Offline
Зарегистрирован: 26.09.2018

Спасибо за комментарии. Буду дальше изучать Ардуино. Решил пока отказаться от крана с двумя движками. Вторую серву поставлю на корме катера для рыбалки - доставка блесны или крючка удочки до места и сброс их там.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Biker пишет:

Спасибо за комментарии. Буду дальше изучать Ардуино. Решил пока отказаться от крана с двумя движками. Вторую серву поставлю на корме катера для рыбалки - доставка блесны или крючка удочки до места и сброс их там.

Да вроде бы "все влезаемо":

НРФ-ка подключается как понял по SPI - он есть в НАНО, плюсом можно добавить вывод IRQ на какое-то прерывание - оно тоже вроде как есть и даже 2шт ардуиновских и много PCINT. На контроллер моторов потребуется по 3 провода на управление мотором - итого 6. Неплохо бы 2 из них задействовать от таймерного ШИМ - тут 8-и битного таймера0 и его пары ног ШИМ - вполне достаточно. 2 сервы конечно лучше всего сажать на таймер1 - тогда будет "аппаратное управление сервой", но можно обойтись и так "ногодрыгом", т.к. OC1B занимается под SS от SPI. Под сервы - библиотека типовая Servo.h, ESC-контроллер - ваще в последнюю очередь, его "хоть куда".

В общем, ног - с запасом, функционал - относительно прост, а управление сервами через библиотеку. Насколько помню, её применение не влияет на SPI.

P.S. Ещё можно посмотреть в сторону Atmega128a там ресурсов чутка побольше (примерно 1/2 от Мега2560).

Biker
Offline
Зарегистрирован: 26.09.2018

вот полная схема подключения, не подключены серво 2, серво 3 и контроллер bustopeddon ESC. Я на других форумах прочитал, что можно на один пин подключить несколько модулей и управлять этими модулями по очереди - программно. Для какого модуля поступил сигнал на пин - тот модуль и активируется.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Там "ног с запасом", но ваша картинка практически нечитаема с моими глазами .. подключаете устройства по степени требования к пинам: сначала те, что используют "альтернативные функции" пина. У Вас это НРФ-ка - использует 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 устройств даже с небольшой математикой .. у неё нет столько ног и периферии.

Так что, ваша задача вполне по силам даже НАНО. С запасом.

Biker
Offline
Зарегистрирован: 26.09.2018

Спасибо за комментарий, но я в этих делах только начинаю разбираться - многое еще не знаю а задач выше крыши сам себе ставлю (вы уж не сердитесь на дилетанта.) Сейчас вот  разбираюсь - как написать ПРОСТОЙ скетч отправки данных с  джойстика в монитор порта  одной ардуинки на другую через НРФ. Не подскажете - какие данные вписывать в скетч приемника в раздел "void loop" чтобы он считал посланные от передатчика данные?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Я не работал с НРФ-ками. Только-только осваиваю модуль на базе Si4432, ещё знакомлюсь с регистрами и только попробовал простой пример: "радиосвисток" или как его зовут "маяк". Напишите простой скетч, который будет свистеть 1 байт в передатчик с интервалом в 1сек, и простой приемник, который будет его принимать и отправлять в монитор. Если связь получается, то можно двигаться дальше. Долны быть подобные готовоые примеры в Сети. поищите. Код, по ряду причин я тут больше не выкладываю. Никакой. Сожалею, но давно похоже на то, что так теперь тут поступает много кого.

Biker
Offline
Зарегистрирован: 26.09.2018

Ясно. Я простейшие скетчи из интернета уже отсылал/принимал, но там готовый сигнал с НРФ-передатчика на НРФ-приемник в монитор порта. Уже почти разобрался как программно настраивать приемник и передатчик, вот теперь с потенциометрами/джойстиком разбираюсь. Спасибо Вам за помощь в изучении сей науки! :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

С потенциометром всё ещё проще: analogRead() в помощь и аналоговый вход Ардуино. Далее, для перевода попугаев АЦП в нужный диапазон значений - функция map(). Этого "более чем достаточно". :)

Biker
Offline
Зарегистрирован: 26.09.2018

Это я уже изучил. Записываем эти данные в передающий скетч, а вот дальше я пока завис: как сдеать, чтобы эти данные получил приемный ардуино? какие данные для этого надо прописывать в приемном скетче?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Приемный скетч должен быть настроен на прием "куда-то", то есть у него должно быть "место" куда принять и либо его опрашивать в цикле "ты уже принял?" либо настраивать прерывание от него "принял - дерни меня за это".. тут у НРФ-ки есть выход IRQ он как раз для второго режима. Его подключаете на вход прерывания (у НАНО их 2) или на любую ножку и на ней настраиваете обработку прерывания типа PCINT (это уже ручками, в Wiring нет таких средств).. и вот в обработчике прерывания или как только цикл сказал "принято" - вытаскиваете то что принято из того места, на которое натстроили приемник. Или из него по SPI читаете из нужного регистра. Посмотрите в примерах, откуда и как читает приемник.