Общение двух Arduino Nano

uscr
Offline
Зарегистрирован: 17.08.2012

Здравствуйте. Нужно подружить 2 ардуины по проводу. Насколько я понял, предпочтительней использовать i2c интерфейс. Но примеров общения двух ардуин по i2c в интернете не особенно много, зато много про serial. Вот и подумал я: может быть, i2c имеет какие-либо проблемы? Мне нужно из одного контроллера отправить, во втором, соответственно, получить номер вывода и значение ШИМ, ну и запустить ШИМ на соответствующем выводе. Физически платы могут распологаться сколь угодно близко.

leshak
Offline
Зарегистрирован: 29.09.2011

Не, не имеет. Просто Serial знают все, а I2c - боятся.

Ну и для i2c еще пару резисторов нужно, а сериал - только проводки.

И в Serial - все равноправны, а в i2c - один главный, второй "слушающий" (и отвечает только по запросу от главного, хотя, вроде можно нагуглить и схемы с несколькими "главными"). Но, как я понял, в вашем случае - это не проблема.

С другой стороны сериал это "для двоих" изначально, а в i2c - на шине может много девайсов висеть, просто каждый имеет свой адресс.

С третьей стороны, для Serial проще найти програмную реализацию, если нужно на другие пины переехать, а для I2C трудней найти (хотя, возможно есть).

У той же меги, Serial имеется три штуки, а I2c - одно. Тоже может "предопределить выбор".

А может I2C уже занят у вас по "100 датчиков" и между дуинами планируется гонять много данных, вот что-бы "не занимать эфир" и пустим его через сериал.

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

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

uscr
Offline
Зарегистрирован: 17.08.2012

Соединил 2 ардуины Nano. Потом попробовал уно+мега. Результат аналогичен. Заливал скетч "master_writer", "slave_receiver", которые затем модифицировал для контроля. Показываю модифицированные версии:

// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

void setup()
{
  Wire.begin(); // join i2c bus (address optional for master)
  pinMode(13, OUTPUT);
}

byte x = 0;
byte pin = 0;
void loop()
{
  Wire.beginTransmission(4); // transmit to device #4
  Wire.write("x is ");        // sends five bytes
  Wire.write(x);              // sends one byte  
  Wire.endTransmission();    // stop transmitting

  x++;
  delay(500);
  pin=!pin;
  digitalWrite(13, pin);
  
}
// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>
byte pin=0;
void setup()
{
  pinMode(13, OUTPUT);
  Wire.begin(4);                // join i2c bus with address #4
  Wire.onReceive(receiveEvent); // register event
  Serial.begin(9600);           // start serial for output
}

void loop()
{
  digitalWrite(13, pin);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
void receiveEvent(int howMany)
{
  pin=!pin;
  while(1 < Wire.available()) // loop through all but the last
  {
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  int x = Wire.read();    // receive byte as an integer
  Serial.println(x);         // print the integer
}

Ожидаю, что на мастере диод на 13 пине будет мигать 2 раза в секунду (и так оно и есть), на слейве, соответственно, жду того-же (и этого не происходит).

Соединял пин 4 с пином 4, пятый с пятым. Резисторов на 1,5К у меня нет, поэтому пробовал ставить 1K, 2.2K, 1K+220Ом (последовательно).

Что я делаю не так?

leshak
Offline
Зарегистрирован: 29.09.2011

Земли соеденить не забыли?

Попробуйте резисторы побольше (до 10K).

Или вообще без них , как в туториале: http://arduino.cc/en/Tutorial/MasterReader    

(хотя я считаю что "без" - это не правильно/не стабильно).

leshak
Offline
Зарегистрирован: 29.09.2011

А еще посмотрите что у вас приходит на слейве в Serial.

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

uscr
Offline
Зарегистрирован: 17.08.2012

leshak пишет:

А еще посмотрите что у вас приходит на слейве в Serial.

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

 

Сериал смотрю, конечно - пусто. Земли соединены. Вообще, ардуины запитаны от одного источника 5В. Без резсторов пробовал, с большим номиналом попробую.

leshak
Offline
Зарегистрирован: 29.09.2011

А случайно не перепутали цифровые и аналоговые пины? Кажись у Nano это A4,A5, а не D4,D5

leshak
Offline
Зарегистрирован: 29.09.2011

Вообщем - код ваш рабочий. Проверил тупо соеденив (без резисторов). Проверял между Mega и голым кристалом на макетке (можете считать его наной :)

Все блымает (мигает) синхронно (пока соеденино, выдергиваешь - слейв перестает мигать), в порт - пишется.

Так что "ищите сопли в подключениях".

 

chaytan
Offline
Зарегистрирован: 02.02.2012

а после востановления связи, прием слейвом продолжается или нужен ресет???

интерес представляет типа гарячая смена или подключение слейвов...

leshak
Offline
Зарегистрирован: 29.09.2011

Ну, раз пять разрывал/соединял SDA линию - все востанавливалось.

Потом, один раз, выключил/включил камень - не хотело востанавливатся, даже после Reset. Где-то с седьмой попытки "завелось".

Но, честно говоря - не копал причину. Оно мне не нужно было, я просто "проверил побырику".

Причиной  "плохо заводилось" могло быть:

1. То что у меня камень на макетке "ну вообще голый". Даже без внешнего кварца и на 8-ми мегагерцах работает (а значит частота плавать у него может). Плюс плохо экранированно, без фильтров по питанию и проч. Вообщем он иногда и так "не хочется заводится" даже сам по себе. Так что скорее всего дело было вообще не в I2C

2. Возможно причина в int x = Wire.read();   , без проверки available()

3. Все таки я включал без резисторов подтягивающих. А значит линия "подвержена помехам". А нажимая на слейве ресет, я как раз машу рукой на "паутиной" проводков-соплей.

 

Вообщем на 95% уверен что при должной аккуратности в коде и сборке схемы - горячая замена возможна.

chaytan
Offline
Зарегистрирован: 02.02.2012

вопрос к знатокам.

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

гуру, подскажите пожалста...

leshak
Offline
Зарегистрирован: 29.09.2011

 

chaytan пишет:

гуру, подскажите пожалста...

Гуру пользования гуглом? Простите, но вы явно даже не пытались погуглить на эту тему. Или хотя-бы сделать поиск по форуму. Да просто зайти в любой ардуино-магазин и посмотреть доступные шилды.

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

В вашей же задаче, если я правильно понял "пройти 6-ть метров", думаю это не самая лучшая идея. Как по цене, так и по сложности/надежности. Кабель - оно всегда надежней будет.

Вообщем-то I2C при правильном проводе спокойно на 15-20 метров тягают (опять-таки, поищите буквально неделю назад была ветка на форуме). А если "передавать" не в виде 5-ти вольт, а до 12-ти поднятся - думаю вообще не будет проблем. Возможно не I2C тогда будет, а в сторону тех-же K-Line, RS-485 (и проч. пром шины) - то думаю вполне все реально (на крайний случай какой-нибудь свой 12-ти вольтовый стандарт изобрести не долго, для простоты).

Вот еще статейка по поводу "сигнал по проводу подальше" - http://easyelectronics.ru/tokovaya-petlya.html

 

uscr
Offline
Зарегистрирован: 17.08.2012

leshak пишет:

А случайно не перепутали цифровые и аналоговые пины? Кажись у Nano это A4,A5, а не D4,D5

Какой позор... Я не перепутал, я целенаправленно соединял 2 цифровых порта - даже в голову не пришло проверить, какие нужно - аналоговые или цифровые.

 

Всё работает. Всем спасибо.

chaytan
Offline
Зарегистрирован: 02.02.2012

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

без подробностей...

о надежности кабельного соединения спорить небуду, точнее оспаривать. в моем случае кабель не всегда удобно...

leshak
Offline
Зарегистрирован: 29.09.2011

uscr пишет:

leshak пишет:

А случайно не перепутали цифровые и аналоговые пины? Кажись у Nano это A4,A5, а не D4,D5

Какой позор... Я не перепутал, я целенаправленно соединял 2 цифровых порта - даже в голову не пришло проверить, какие нужно - аналоговые или цифровые.

 

Всё работает. Всем спасибо.

Да ладно. Это "они гады". Написали, в "описании плат" 4,5-тый пин. Обычно когда не указывается "какой" - действительно цифровые подразумеваются. Кстати я тоже думал что D4,D5. Выяснил когда полез соединять.

std
Offline
Зарегистрирован: 05.01.2012

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

на I2C лучше не делать если речь о нескольких метрах. I2C это больше внутрикорпусная шина.

Если с проводами, то самое простое RS485 на трансиверах типа 75176, ну или если мега крутой дорогой, то ADM485. чтобы не мудрить особо с кодом, можно использовать библиотеку DMXSerial.

Если без проводов то на каком-нибудь дешевом трансивере типа nRF24L01. Второй МК ессно нужен.

ИК-канал не советую т. к. у него паршивая помехоустойчивость. Голубой зуб не советую т. к. он достаточно дорог.

raptoridze
Offline
Зарегистрирован: 10.01.2014

шоб не плодить подобных тем, спрошу тут

у меня бортовой компьютер на машине, считывает с ECU машины по сериалу данные и ввыводит на экран

ардуина делает запрос, отправив данные, потом принимает ответ

возможно ли подключить параллельно еще одну ардуину к сериалу, которая будет только слушать?! параллельно первой ?

если да то как.. просто параллелить - не получилось, одна ардуина не видит .... 

std
Offline
Зарегистрирован: 05.01.2012

raptoridze

Easytransfer

raptoridze
Offline
Зарегистрирован: 10.01.2014

спасибо, правда я не очень силен в английском