Общение двух Arduino Nano
- Войдите на сайт для отправки комментариев
Втр, 15/01/2013 - 17:16
Здравствуйте. Нужно подружить 2 ардуины по проводу. Насколько я понял, предпочтительней использовать i2c интерфейс. Но примеров общения двух ардуин по i2c в интернете не особенно много, зато много про serial. Вот и подумал я: может быть, i2c имеет какие-либо проблемы? Мне нужно из одного контроллера отправить, во втором, соответственно, получить номер вывода и значение ШИМ, ну и запустить ШИМ на соответствующем выводе. Физически платы могут распологаться сколь угодно близко.
Не, не имеет. Просто Serial знают все, а I2c - боятся.
Ну и для i2c еще пару резисторов нужно, а сериал - только проводки.
И в Serial - все равноправны, а в i2c - один главный, второй "слушающий" (и отвечает только по запросу от главного, хотя, вроде можно нагуглить и схемы с несколькими "главными"). Но, как я понял, в вашем случае - это не проблема.
С другой стороны сериал это "для двоих" изначально, а в i2c - на шине может много девайсов висеть, просто каждый имеет свой адресс.
С третьей стороны, для Serial проще найти програмную реализацию, если нужно на другие пины переехать, а для I2C трудней найти (хотя, возможно есть).
У той же меги, Serial имеется три штуки, а I2c - одно. Тоже может "предопределить выбор".
А может I2C уже занят у вас по "100 датчиков" и между дуинами планируется гонять много данных, вот что-бы "не занимать эфир" и пустим его через сериал.
Вообщем нет "плохой и хороший". Для каждой задачи подбираем более подходящие. Ну и дело предпочтений/страхов, конешн, играет рояль.
А если вы собираетесь "стать разработчиком", то вам нужно и такой вариант сделать и другой. Владеть всеми способами "подачи мяча".
Соединил 2 ардуины Nano. Потом попробовал уно+мега. Результат аналогичен. Заливал скетч "master_writer", "slave_receiver", которые затем модифицировал для контроля. Показываю модифицированные версии:
Ожидаю, что на мастере диод на 13 пине будет мигать 2 раза в секунду (и так оно и есть), на слейве, соответственно, жду того-же (и этого не происходит).
Соединял пин 4 с пином 4, пятый с пятым. Резисторов на 1,5К у меня нет, поэтому пробовал ставить 1K, 2.2K, 1K+220Ом (последовательно).
Что я делаю не так?
Земли соеденить не забыли?
Попробуйте резисторы побольше (до 10K).
Или вообще без них , как в туториале: http://arduino.cc/en/Tutorial/MasterReader
(хотя я считаю что "без" - это не правильно/не стабильно).
А еще посмотрите что у вас приходит на слейве в Serial.
Возможн оу вас светик включается слишком не надолго и вы просто не видите его.
А еще посмотрите что у вас приходит на слейве в Serial.
Возможн оу вас светик включается слишком не надолго и вы просто не видите его.
Сериал смотрю, конечно - пусто. Земли соединены. Вообще, ардуины запитаны от одного источника 5В. Без резсторов пробовал, с большим номиналом попробую.
А случайно не перепутали цифровые и аналоговые пины? Кажись у Nano это A4,A5, а не D4,D5
Вообщем - код ваш рабочий. Проверил тупо соеденив (без резисторов). Проверял между Mega и голым кристалом на макетке (можете считать его наной :)
Все блымает (мигает) синхронно (пока соеденино, выдергиваешь - слейв перестает мигать), в порт - пишется.
Так что "ищите сопли в подключениях".
а после востановления связи, прием слейвом продолжается или нужен ресет???
интерес представляет типа гарячая смена или подключение слейвов...
Ну, раз пять разрывал/соединял SDA линию - все востанавливалось.
Потом, один раз, выключил/включил камень - не хотело востанавливатся, даже после Reset. Где-то с седьмой попытки "завелось".
Но, честно говоря - не копал причину. Оно мне не нужно было, я просто "проверил побырику".
Причиной "плохо заводилось" могло быть:
1. То что у меня камень на макетке "ну вообще голый". Даже без внешнего кварца и на 8-ми мегагерцах работает (а значит частота плавать у него может). Плюс плохо экранированно, без фильтров по питанию и проч. Вообщем он иногда и так "не хочется заводится" даже сам по себе. Так что скорее всего дело было вообще не в I2C
2. Возможно причина в int x = Wire.read(); , без проверки available()
3. Все таки я включал без резисторов подтягивающих. А значит линия "подвержена помехам". А нажимая на слейве ресет, я как раз машу рукой на "паутиной" проводков-соплей.
Вообщем на 95% уверен что при должной аккуратности в коде и сборке схемы - горячая замена возможна.
вопрос к знатокам.
можна илинет с использованием беспроводных приемопередатчиков связать ардуино с дисплеем. необходимость второго мк необсуждается. вопрос можно или нет, нужен второй мк значит нужен второй мк. есть необходимость индикацию удалить от основного блока на несколько метров.
гуру, подскажите пожалста...
гуру, подскажите пожалста...
Гуру пользования гуглом? Простите, но вы явно даже не пытались погуглить на эту тему. Или хотя-бы сделать поиск по форуму. Да просто зайти в любой ардуино-магазин и посмотреть доступные шилды.
Вариантов такая масса, с разными достоинствами/недостатками, областями применимости, рабросом цен и легкости подключения, что даже перечислять нет смысла.
В вашей же задаче, если я правильно понял "пройти 6-ть метров", думаю это не самая лучшая идея. Как по цене, так и по сложности/надежности. Кабель - оно всегда надежней будет.
Вообщем-то I2C при правильном проводе спокойно на 15-20 метров тягают (опять-таки, поищите буквально неделю назад была ветка на форуме). А если "передавать" не в виде 5-ти вольт, а до 12-ти поднятся - думаю вообще не будет проблем. Возможно не I2C тогда будет, а в сторону тех-же K-Line, RS-485 (и проч. пром шины) - то думаю вполне все реально (на крайний случай какой-нибудь свой 12-ти вольтовый стандарт изобрести не долго, для простоты).
Вот еще статейка по поводу "сигнал по проводу подальше" - http://easyelectronics.ru/tokovaya-petlya.html
А случайно не перепутали цифровые и аналоговые пины? Кажись у Nano это A4,A5, а не D4,D5
Какой позор... Я не перепутал, я целенаправленно соединял 2 цифровых порта - даже в голову не пришло проверить, какие нужно - аналоговые или цифровые.
Всё работает. Всем спасибо.
я не просил изложения технического решения или на чем и как это выполнить. я то всего можна или нет...
без подробностей...
о надежности кабельного соединения спорить небуду, точнее оспаривать. в моем случае кабель не всегда удобно...
А случайно не перепутали цифровые и аналоговые пины? Кажись у Nano это A4,A5, а не D4,D5
Какой позор... Я не перепутал, я целенаправленно соединял 2 цифровых порта - даже в голову не пришло проверить, какие нужно - аналоговые или цифровые.
Всё работает. Всем спасибо.
Да ладно. Это "они гады". Написали, в "описании плат" 4,5-тый пин. Обычно когда не указывается "какой" - действительно цифровые подразумеваются. Кстати я тоже думал что D4,D5. Выяснил когда полез соединять.
на I2C лучше не делать если речь о нескольких метрах. I2C это больше внутрикорпусная шина.
Если с проводами, то самое простое RS485 на трансиверах типа 75176, ну или если мега крутой дорогой, то ADM485. чтобы не мудрить особо с кодом, можно использовать библиотеку DMXSerial.
Если без проводов то на каком-нибудь дешевом трансивере типа nRF24L01. Второй МК ессно нужен.
ИК-канал не советую т. к. у него паршивая помехоустойчивость. Голубой зуб не советую т. к. он достаточно дорог.
шоб не плодить подобных тем, спрошу тут
у меня бортовой компьютер на машине, считывает с ECU машины по сериалу данные и ввыводит на экран
ардуина делает запрос, отправив данные, потом принимает ответ
возможно ли подключить параллельно еще одну ардуину к сериалу, которая будет только слушать?! параллельно первой ?
если да то как.. просто параллелить - не получилось, одна ардуина не видит ....
raptoridze
Easytransfer
спасибо, правда я не очень силен в английском