Обмен данными между ардуинами. Проводное соединение Ардуин при помощи UART(Serial) 22

В продолжении статьи о проводном соединении ардуин, рассмотрим пример соединения нескольких контроллеров при помощи .

Wiki — Универсальный асинхронный приёмопередатчик (УАПП, англ. Universal Asynchronous Receiver-Transmitter (UART)) — узел вычислительных устройств, предназначенный для связи с другими цифровыми устройствами. Преобразует заданный набор данных в последовательный вид так, чтобы было возможно передать их по однопроводной цифровой линии другому аналогичному устройству. Метод преобразования хорошо стандартизован и широко применялся в компьютерной технике.

IMG_4162.JPG

Далее рассмотрим:

1. Однопроводная схема соединения без обратной связи

  •  Алгоритм работы основного контроллера
  •  Алгоритм работы дополнительных контроллеров
  • Схема подключения

2. Двупроводная схема соединения с обратной связью

  • Алгоритм работы основного контроллера
  • Алгоритм работы дополнительных контроллеров
  • Схема подключения
  • Скетч

Возьмем в качестве основного контроллера(Master) — UNO, в качестве дополнительных контроллеров(Slave) —

1. Однопроводная схема соединения без обратной связи

Алгоритм работы основного контроллера

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

Алгоритм работы дополнительных контроллеров

  1. При включении контроллера активируем Serial соединение.
  2. Выполняем основную программу, ожидая сигнала о начале передачи.
  3. По прерыванию входим в функцию для анализа сообщения
  4. Парсим принятую строку и перезаписываем глобальные переменные, влияющие на работу основной программы.

Схема подключения
Serialone_net.png

Пример для контроллера Arduino PRO MINI:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
String Var;
String A1T1;//команда 1 для 1 контроллера
String A1T2;//команда 2 для 1 контроллера
//String A2T1;//команда 1 для 2 контроллера
//String A2T2;//команда 2 для 2 контроллера
 
void setup() {
attachInterrupt(0, serialwait, RISING);//определяем функцию по прерыванию
}
 
void serialwait()
{
 
detachInterrupt(0);//отключаем прерывание
interrupts();
Serial.begin(9600);//активируем прием сообщения
Var="";
time = millis();
while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
delay(20);
delay(200);//ожидаем получения всего сообщения
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
Serial.end();//закрываем сериал соединение
if (Var!=0){//если пришло сообщение
parseParams(Var);
}
attachInterrupt(0, serialwait, RISING);//активируем прерывание
}
 
void parseParams(String inputString){
String bb=inputString;
if (bb.substring(0,2)=="A1"){//сообщение для контроллера №1
A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
}
// if (bb.substring(0,2)=="A2"){//сообщение для контроллера №2
// A2T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
// A2T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
// }
}
 
void loop() {
//программа
}
String Var;
String A1T1;//команда 1 для 1 контроллера
String A1T2;//команда 2 для 1 контроллера
//String A2T1;//команда 1 для 2 контроллера
//String A2T2;//команда 2 для 2 контроллера

void setup() {
attachInterrupt(0, serialwait, RISING);//определяем функцию по прерыванию
}

void serialwait()
{

detachInterrupt(0);//отключаем прерывание
interrupts();
Serial.begin(9600);//активируем прием сообщения
Var="";
time = millis();
while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
delay(20);
delay(200);//ожидаем получения всего сообщения
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
Serial.end();//закрываем сериал соединение
if (Var!=0){//если пришло сообщение
parseParams(Var);
}
attachInterrupt(0, serialwait, RISING);//активируем прерывание
}

void parseParams(String inputString){
String bb=inputString;
if (bb.substring(0,2)=="A1"){//сообщение для контроллера №1
A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
}
// if (bb.substring(0,2)=="A2"){//сообщение для контроллера №2
// A2T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
// A2T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
// }
}

void loop() {
//программа
}

Пример для контроллера Arduino UNO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int d, d2;//задержки
String Var;
 
int pin_inter=9;//not use 13,12,11,10 for ithernet shield
 
void setup() {
Serial.begin(9600);
d=500;
d2=250;
pinMode(pin_inter, OUTPUT);
}
 
void loop() {
//T1 - начало команды 1, 1T - конец команды 1
//T2 - начало команды 2, 2T - конец команды 2
//A1 - Адрес контроллера, которому адресованы команды
send_serial("A1T1B1TT2С2T");
send_serial("A2T1D1TT2С2T");
send_serial("A3T1C1TT2С2T");
send_serial("A4T1E1TT2С2T");
send_serial("A5T1E1TT2С2T");
}
 
void send_serial(String A)//отправляем сообщения контроллерам
{
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(d2);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(A);
delay(d);//задержка для приема сообщения
digitalWrite(pin_inter, LOW);
delay(d2);
}
int d, d2;//задержки
String Var;

int pin_inter=9;//not use 13,12,11,10 for ithernet shield

void setup() {
Serial.begin(9600);
d=500;
d2=250;
pinMode(pin_inter, OUTPUT);
}

void loop() {
//T1 - начало команды 1, 1T - конец команды 1
//T2 - начало команды 2, 2T - конец команды 2
//A1 - Адрес контроллера, которому адресованы команды
send_serial("A1T1B1TT2С2T");
send_serial("A2T1D1TT2С2T");
send_serial("A3T1C1TT2С2T");
send_serial("A4T1E1TT2С2T");
send_serial("A5T1E1TT2С2T");
}

void send_serial(String A)//отправляем сообщения контроллерам
{
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(d2);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(A);
delay(d);//задержка для приема сообщения
digitalWrite(pin_inter, LOW);
delay(d2);
}

2. Двупроводная схема соединения с обратной связью

Алгоритм работы основного контроллера

  1. При включении контроллера активируем Serial соединение.
  2. Подаем сигнал о начале передачи.
  3. Передаем строку для всех контроллеров, указывая номер контроллера, для которого она предназначена.
  4. По прерыванию входим в функцию для анализа ответного сообщения

Алгоритм работы дополнительных контроллеров

  1. Выполняем основную программу, ожидая сигнала о начале передачи.
  2. При появлении сигнала о начале передачи, активируем Serial соединение.
  3. По прерыванию входим в функцию для анализа сообщения
  4. Закрываем Serial соединение
  5. Парсим принятую строку и перезаписываем глобальные переменные, которые будем отправлять обратно.
  6. Подаем сигнал о начале передачи.
  7. Активируем Serial соединение
  8. Передаем строку для основного контроллера.
  9. Закрываем Serial соединение

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

SerialTWHO_net_2.png SerialTWHO_net.png

Пример для Arduino UNO:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
int d, d2;//задержки
String Var;
String
A1T1="0",
A1T2="0",
A2T1="0";
int pin_inter=9;//not use 13,12,11,10 for ithernet shield
 
void setup() {
Serial.begin(9600);
d=500;
d2=250;
attachInterrupt(0, serialwait, RISING);//функция прерывания
pinMode(pin_inter, OUTPUT);
}
 
void loop() {
//T1 - начало команды 1, 1T - конец команды 1
//T2 - начало команды 2, 2T - конец команды 2
//A1 - Адрес контроллера, которому адресованы команды
send_serial("A1T1B1TT2С2T");
send_serial("A2T1D1TT2С2T");
send_serial("A3T1C1TT2С2T");
send_serial("A4T1E1TT2С2T");
send_serial("A5T1E1TT2С2T");
}
 
void send_serial(String A)//отправляем сообщения контроллерам
{
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(d2);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(A);
delay(d);//задержка для приема сообщения
digitalWrite(pin_inter, LOW);
delay(d2);
}
 
void parseParams(String inputString){
String bb=inputString;
if (bb.substring(0,2)=="A1"){//ответ 1 контроллера
A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));
A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));
}
 
if (bb.substring(0,2)=="A2"){//ответ 2 контроллера
A2T1=bb.substring(bb.indexOf("T1")+2,bb.indexOf("1T"));
}
}
 
void serialwait()
{
detachInterrupt(0);//отключаем прерывание
interrupts();
Var="";
time = millis();
while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
delay(20);
delay(200);//ожидаем получения всего сообщения
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
if (Var!=0){//если пришло сообщение
parseParams(Var);
}
attachInterrupt(0, serialwait, RISING);//активируем прерывание
}
int d, d2;//задержки
String Var;
String
A1T1="0",
A1T2="0",
A2T1="0";
int pin_inter=9;//not use 13,12,11,10 for ithernet shield

void setup() {
Serial.begin(9600);
d=500;
d2=250;
attachInterrupt(0, serialwait, RISING);//функция прерывания
pinMode(pin_inter, OUTPUT);
}

void loop() {
//T1 - начало команды 1, 1T - конец команды 1
//T2 - начало команды 2, 2T - конец команды 2
//A1 - Адрес контроллера, которому адресованы команды
send_serial("A1T1B1TT2С2T");
send_serial("A2T1D1TT2С2T");
send_serial("A3T1C1TT2С2T");
send_serial("A4T1E1TT2С2T");
send_serial("A5T1E1TT2С2T");
}

void send_serial(String A)//отправляем сообщения контроллерам
{
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(d2);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(A);
delay(d);//задержка для приема сообщения
digitalWrite(pin_inter, LOW);
delay(d2);
}

void parseParams(String inputString){
String bb=inputString;
if (bb.substring(0,2)=="A1"){//ответ 1 контроллера
A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));
A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));
}

if (bb.substring(0,2)=="A2"){//ответ 2 контроллера
A2T1=bb.substring(bb.indexOf("T1")+2,bb.indexOf("1T"));
}
}

void serialwait()
{
detachInterrupt(0);//отключаем прерывание
interrupts();
Var="";
time = millis();
while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
delay(20);
delay(200);//ожидаем получения всего сообщения
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
if (Var!=0){//если пришло сообщение
parseParams(Var);
}
attachInterrupt(0, serialwait, RISING);//активируем прерывание
}

Пример для Arduino PRO MINI:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
String Var;
String A1T1;//команда 1 для 1 контроллера
String A1T2;//команда 2 для 1 контроллера
//String A2T1;//команда 1 для 2 контроллера
//String A2T2;//команда 2 для 2 контроллера
int pin_inter=13;
int d2=20;
int d=500;
void setup() {
attachInterrupt(0, serialwait, RISING);//определяем функцию по прерыванию
}
 
void serialwait()
{
 
detachInterrupt(0);//отключаем прерывание
interrupts();
Serial.begin(9600);//активируем прием сообщения
Var="";
int time =0;
time = millis();
while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
delay(20);
delay(200);//ожидаем получения всего сообщения
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
Serial.end();//закрываем сериал соединение
if (Var!=0){//если пришло сообщение
parseParams(Var);
}
attachInterrupt(0, serialwait, RISING);//активируем прерывание
}
 
void parseParams(String inputString){
String bb=inputString;
if (bb.substring(0,2)=="A1"){//сообщение для контроллера №1
A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
send_serial(bb.substring(0,2));
}
// if (bb.substring(0,2)=="A2"){//сообщение для контроллера №2
// A2T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
// A2T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
// send_serial(bb.substring(0,2));
// }
}
 
void send_serial(String A)
{
Serial.begin(9600);//активируем передачу сообщения
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(d2);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(Var+"T1");//далее передаем сообщение
Serial.print("22");//значение параметра T1
Serial.print("1TT2");
Serial.print("23");//Значение параметра T2
Serial.print("2T");
delay(d);
digitalWrite(pin_inter, LOW);
delay(d2);
Serial.end();//закрываем сериал соединение
}
 
void loop() {
//программа
}
String Var;
String A1T1;//команда 1 для 1 контроллера
String A1T2;//команда 2 для 1 контроллера
//String A2T1;//команда 1 для 2 контроллера
//String A2T2;//команда 2 для 2 контроллера
int pin_inter=13;
int d2=20;
int d=500;
void setup() {
attachInterrupt(0, serialwait, RISING);//определяем функцию по прерыванию
}

void serialwait()
{

detachInterrupt(0);//отключаем прерывание
interrupts();
Serial.begin(9600);//активируем прием сообщения
Var="";
int time =0;
time = millis();
while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим
delay(20);
delay(200);//ожидаем получения всего сообщения
while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку
Var = Var + (char)(Serial.read());
Serial.end();//закрываем сериал соединение
if (Var!=0){//если пришло сообщение
parseParams(Var);
}
attachInterrupt(0, serialwait, RISING);//активируем прерывание
}

void parseParams(String inputString){
String bb=inputString;
if (bb.substring(0,2)=="A1"){//сообщение для контроллера №1
A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
send_serial(bb.substring(0,2));
}
// if (bb.substring(0,2)=="A2"){//сообщение для контроллера №2
// A2T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1
// A2T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2
// send_serial(bb.substring(0,2));
// }
}

void send_serial(String A)
{
Serial.begin(9600);//активируем передачу сообщения
digitalWrite(pin_inter, HIGH);//сигнал о начале передачи
delay(d2);//задержка для срабатывания прерывания на контроллерах приема
Serial.print(Var+"T1");//далее передаем сообщение
Serial.print("22");//значение параметра T1
Serial.print("1TT2");
Serial.print("23");//Значение параметра T2
Serial.print("2T");
delay(d);
digitalWrite(pin_inter, LOW);
delay(d2);
Serial.end();//закрываем сериал соединение
}

void loop() {
//программа
}

И в заключении видео работы скетчей для двусторонней связи:

 

22 комментс для “Обмен данными между ардуинами. Проводное соединение Ардуин при помощи UART(Serial)

  1. Ответить yuler Июл 11, 2015 20:23

    Доброго дня уважаемые! С этой просьбой помощи я уже который раз обращался разным сайтам по комментарии.
    Видимо я ошибочно отправил не туда куда надо или незнаю порядок обращения. По этому не получив ответ пробую отправит к Вам.
    Посмотрев Ваш сайт я бы хотел решит некоторые предстоящий моих задач с
    Вашей помощи. Я в основном занимаюсь электроникой и программированием
    на C# по узкой направлении для своих нужд. По этому мне легче работать на этой платформе. В основном я
    делал компьютерное управление лабораторных стендов по физике и т.п. Я
    их делал раньше на ЛПТ и ЮСБ портом.
    За основу брал обвертка Атмега16 ЮСБ, из статьи Кухтецского. Я их
    незначительно переделал печатных плат под ДИП корпуса т.к. в моем
    возрасте зрение не позволит не ошибаться в мелких деталях и переделал
    программу ХОСТа под своей нужды. Но они все работали отдельно со
    своими компьютерами. Когда я изучал и делал одну автономную
    лабораторию без компьютера с помощью Ардуино УНО мне понравилось его
    гибкость и легкость перепрограммирования. Поэтому мне поручили сделать
    сеть лабораторных стендов по категориям с одним компьютером.
    Значит у меня задача такая: Это еще предварительный проект но за сжатый срок.
    В классе имеются один компьютер, Ардуино УНО(мастер) и от 6ти до 10ти
    лабораторные стенды. У всех стендах Ардуино нано(слейвы) а также ЖК
    дисплей 16х2. каждый студент выполняет разные виды лаб.работы. На
    каждом стенде находится кнопки для выбора значении, строго
    установленным названием. например: U1. U2.. I1..и.т.д. А в программе я
    их обозначу как переменный st1_u1, это значит стенд1-напряжение1
    и.т.д. Если пятый стенд тогда: U1. U2.. I1..и.т.д. А в программе я их
    обозначу как переменный st5_u1,st5_i1 это значит стенд5. напряжение1,
    ток1 и.т.д.это грубо говоря.
    Кроме этих кнопок на стендах находится еще по одной кнопки которое по
    нажатие эту кнопку нано должен отправлять значении выбранных по
    рабочим кнопкам к компьютеру по rs485. У меня сейчас в наличии Ардуино
    УНО(может быт УНО мне не нужен будет т.к. я думаю можно прямо отправит
    к компьютеру или ошибаюс?), 12 штук Нано и rs485 на дип корпусе.
    В интернете я много вариантов подобных сетей прочитал но немогу
    выбрать один из них т.к. у одного по цене не всилах, у другого принцип
    действия пока не понятно. С интерфейсом rs485 я еще не раза не работал
    но по схеме вижу это помоему лучший вариант. По этому не могу выбирать
    простой и дешевый вариант чтобы на половине пути небыли непредвиденные
    проблемы.
    Условия применения такая: От компьютера до последного стенда
    максимально 10-12м. количества слейвов от 6ти до 12ти шт., линия
    передача rs485, приоритет компонентам дешевизм т.к. учебные заведении
    это не производства, менще количество протянутых проводов желателно на
    rs485 (и еще беспроводной на ик мне понравилас но с протоколом пока
    неизвестно когда количество слейвов больше) и в конце
    помехоустойчивость. Если сможете помочь примерным простым скетчом и организации подключением я был б благодарен Вами. Вед этот проект на благо обшества и образования. С уважением yuler.

    • Ответить Slava Июл 12, 2015 09:50

      Я бы сделал опрос с ПК каждой станции по таймеру.

      И на каждой станции один протокол.

      В статье есть пример такого опроса только вместо мастер контроллера подключайте ПК

  2. Ответить yuler Июл 23, 2015 21:11

    Слава Здравствуйте! Можете более подробно объяснить на счет (опрос с ПК каждой станции по таймеру.И на каждой станции один протокол). Обычно когда я подключал к компьютеру внешнее устройство комп. опознает его как hid или ч.п. и я через dll.ку на платформе СиШарп работаю с ним. А здесь как? Я понял что от ЮСБ D+ и D-
    через МАХ485 соединяю к слейвам и далше какой протокол какая железа?

    • Ответить Slava Июл 28, 2015 15:12

      Из схемы исключаете мастер контроллер. И добавляете преобразователь USB-Serial.
      Вместо Мастер-контроллера у Вас будет ПК. С него через Serial соединение будете посылать команды своим контроллерам.

      • Ответить yuler Июл 28, 2015 15:45

        Спасибо Слава. На днях такой вариант попробую собрать. Если будут какие то проблемы еще раз буду обращаться к Вам. И еще на счет ЮСБ сериале. у меня нет готовый модуль, в место него с одним МАХ485 можно организовать? Если можно тогда можете дать какой то ссылку или простое схемку?
        С уважением yuler.

  3. Ответить Arman Сен 28, 2015 23:09

    всем привет!
    кажется надо добавить
    int time =0;

    B

    -void serialwait

  4. Ответить Arman Сен 30, 2015 02:33

    Доброго времени суток!
    Слава, есть одна идея, думаю многим будет интересна.
    но, так как я с Ардуино только с конца прошлой недели, могу только блинки ледами делать =(
    мог бы я разчитивать на Вашу помощь?
    понятное дело не за спасибо.

  5. Ответить Ruslan Ноя 20, 2015 11:32

    Приветствую! А какая максимальная длина проводов? на 30-40 метрах будет работать?

    • Ответить Slava Ноя 23, 2015 15:02

      10-15 метров, рботают. Если нужно удлинять линии, то лучше воспользоваться конвертером rs232 в rs485

      RS-485
      Максимальная длина одного сегмента сети: 1200 метров.
      В один момент активным может быть только один передатчик.
      Максимальное количество узлов в сети — 256 с учётом магистральных усилителей.
      Характеристика скорость обмена/длина линии связи:
      62,5 кбит/с 1200 м (одна витая пара),
      375 кбит/с 500 м (одна витая пара),
      500 кбит/с,
      1000 кбит/с,
      2400 кбит/с 100 м (две витых пары),
      10000 кбит/с 10 м.

  6. Ответить Володя Фев 12, 2016 14:57

    Здравствуйте, я начинающий ардуинер. Помогите мне решить проблему: мне необходимо подключить два шилда(Ethernet, Motor r3), но они задействуют одинаковые пины. Код уже был готов, но по данной прричине программа не работает. Из-за нежелания задействовать два arduino я хочу узнать, возможно ли каким-либо образом поменять функции пинов на одном из шилдов? Заранее спасибо.

  7. Ответить Анатолий Окт 15, 2016 02:27

    Доброго дня. Спасибо за Ваши работы, многое становится понятным…
    Пожалуйста, если не отвлекаю от рабочего времени, можете помочь со скетчем для данной схемы указанной в ссылке…
    Куда копать, чтобы:
    1. на срабатывание кнопок 1-5 уходило по serial сообщение типа A1T[1-5]11[1-5]
    2. одновременно слушать serial на наличие сообщения, парсер у меня уже есть рабочий…
    сама картинка:
    http://arduino.ru/sites/default/files/u8058/img00124.jpg

  8. Ответить Никита Янв 13, 2017 10:33

    Доброго времени суток. Статья крутая.
    Вопрос такой, будет ли работать если подключать слейвы на горячую.
    Например мастер работает с одним слейвом а я беру и втыкаю еще один слейв в систему(разумеется в заранее подготовленую разводку)? Не будет ли зависаний у мастера?

  9. Ответить Никита Янв 30, 2017 12:20

    Резисторы служат как терминаторы?
    Будет ли работать если в цепи будут только скажем 3 и 2 слейв?

    • Ответить Slava Фев 1, 2017 18:31

      Именно как «Терминаторы»
      Будет работать при исключении слейвов или добавлении новых.

      • Ответить Никтиа Мар 2, 2017 16:20

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

        • Ответить Slava Мар 2, 2017 16:26

          Эти задержки зависят от величины передаваемого сообщения.

          • Ответить НИКИТА Мар 2, 2017 18:57

            Подскажите куда копать. Прекращается прием на слейве секунд через 10 20, помогает только перезагрузка слейва.

            • Ответить Slava Мар 3, 2017 08:51

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

              Для этого сделайте, чтобы ведомый постоянно моргал 13м пином

Добавить комментарий