Связь нескольких ардуино по проводу

k134

✩✩✩✩✩✩✩
8 Июл 2020
35
0
Добрый всем день. Помогите разобраться хочу соеденить несколько плат ардуино вместе но ничего не выходит, руководствуюсь этой статьей https://alexgyver.ru/gyverbus/ , но ничего не происходит.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
@k134, как по мне - то лучше по I2C связывать. Давно проверенный способ. ;)
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
не видя схемы соединения и программ на обоих устройствах вам вряд ли кто поможет.
начинать надо с расстояния между дунями и условий, в которых они находятся.
потом выбирают способ соединения.
 
  • Лойс +1
Реакции: DAK

k134

✩✩✩✩✩✩✩
8 Июл 2020
35
0
Все подключено как описано в статье. В библиотеке есть примеры, ничего не менял, примеры просты и понятны. Но ничего не происходит, то есть обе ардуино стоят и ничего не происходит. Но вообще мне нужно предельно простые действия от этих двух ардуино, одна на другую должна передать сигнал чтобы вторая просто включила или выключила реле.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
914
мне нужно предельно простые действия от этих двух ардуино, одна на другую должна передать сигнал чтобы вторая просто включила или выключила реле.
может просто подавать на вторую ардуину HIGH LOW на пин? HIGH - реле включить, ЛОУ - выключить... как-то так
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
@k134, для этого есть мониторы портов (отладочный вывод в serial). Посмотреть что генерит передающая Ардуино, принимает ли что-нибудь приёмная часть. Может порты неверно выбраны или ничего не посылается в принципе.
 

k134

✩✩✩✩✩✩✩
8 Июл 2020
35
0
@k134, для этого есть мониторы портов (отладочный вывод в serial). Посмотреть что генерит передающая Ардуино, принимает ли что-нибудь приёмная часть. Может порты неверно выбраны или ничего не посылается в принципе.
Всё проверил порты в норме, перепутать не могу ибо только принимающая ардуино подключена к компьютеру. Не знаю как проверить идет ли отправка с первой ардуино вообще

может просто подавать на вторую ардуину HIGH LOW на пин? HIGH - реле включить, ЛОУ - выключить... как-то так
Как с первой ардуино передать сигнал на вторую???
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
В этой статье упомянуты 3 библиотеки. Все 3 не работают ?
Вы , если нужна конечно помощь или совет, не ленитесь, приведите и схему (хоть рукой нарисуйте), и текст программ. Вам это уже @Nikanor, написал.
 

k134

✩✩✩✩✩✩✩
8 Июл 2020
35
0
bus3.jpg
отправка:
// простая функция отправки по GBUS
#include "GBUSmini.h"    // мини-библиотека с лёгкими функциями

#define TX_PIN 4    // пин
#define RX_ADDR 3   // адрес приёмника
#define TX_ADDR 5   // наш адрес

void setup() {
  // ПИН ОБЯЗАТЕЛЬНО PULLUP!!!111
  pinMode(TX_PIN, INPUT_PULLUP);
}

// отправляемая дата (байты)
byte data[] = {12, 34, 56};

void loop() {
  // пин, адрес получателя, адрес отправителя, дата, размер
  GBUS_send(TX_PIN, RX_ADDR, TX_ADDR, data, sizeof(data));
  delay(1000);
}




Прием:
// простой пример приёма данных
#include "GBUSmini.h"  // мини-библиотека с лёгкими функциями

#define RX_PIN 4    // пин
#define RX_ADDR 3   // наш адрес
byte data[6];       // приёмный буфер (байты)

void setup() {
  Serial.begin(9600);

  // ПИН ОБЯЗАТЕЛЬНО PULLUP!!!111
  pinMode(RX_PIN, INPUT_PULLUP);
}

void loop() {
  // ждём приём, если функция вернула отличное от 0 значение
  if (GBUS_read(RX_PIN, RX_ADDR, data, sizeof(data))) {
    // если успешно приняли
    for (byte i = 0; i < sizeof(data); i++) {
      Serial.print(data[i]);
      Serial.print(", ");
    }
    Serial.println();
  }
}
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Какие Ардуино использованы? К каким пинам подключены соединяющие платы провода? К чему приведена схема соединения из статьи? Там не две Ардуино!
 

Dev9tiU

✩✩✩✩✩✩✩
16 Фев 2021
6
1
Имеются две нано, леонардо и mightycore для 644.
Использовал SoftUART и GBUS и однопроводной интерфейс.
если просто открыть пример и потестить все работает. но стоит внедрить код который читает 8 каналов ацп , фильтрует значения и делает небольшой математический расчетик и настроить все на прием-передачу (параметр FULL) то передачи нет. иногда проскакивает чтото но всетаки теряются почти все пакеты.
неужели данная библиотека так чувствительна к небольшим задержкам?
а вообще как следует отправлять запросы и принимать данные?
моя преследуемая цель:
Имеется центральное устройство которое делает запрос на переферийное устройство скажем раз в секнду
переферийное устройство приняв запрос шлет пакет(ы) с данными (8 чисел в формате float)
имеется также второе переферийное устройство на которое запросы отправляются в 4 раза чаще
второе устройство также в ответ шлет 2 числа в формате float и 4 в формате int

перетыкал все примеры но данные не проходят ни так ни эдак.
да и примеров както маловато хотя на сайте обещано очень много примеров

естественно номера пинов, подтяжки, адреса все проверено
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Во-первых, нужно оптимизировать объем передачи. Штатный АЦП имеет всего 3 значащих цифры точности, зачем его упаковывать в 4-байтный double? Точность выше первоначальной Вы всё равно не получите!
Во-вторых, аналоговое чтение занимает 113 мкс в норме, 8 шт.= 0,9мс, при этом прерывания стопятся. Уверен, что с оптимизацией расчётов Вы также не церемонились, как и запуском сбора данных по расписанию, а не сколько влезет. А теперь давайте посчитаем необходимую скорость передачи в идеальных условиях для идеализированного однопроводного интерфейса:
5 запросов центра по 3 байта = 15 байт/сек
ответ первой периферии 2+8*4=34 байта/сек
ответ второй периферии (2+2*4+4*2)*4=72 байта/сек
Или 121 байт = 968 бит, которые передаются, как правило, двумя интервалами (0,52 мс / интервал). Т.е. аналоговое чтение, если запущено несинхронизированно с передачей данных, блокирует один из битов передачи. В зависимости от используемой библиотеки это может означать отсутствие подтверждения готовности к приему и передающая Ардуино просто не начинает это делать.
Короче, сделать можно всё, но переходить нужно на двухпроводную архитектуру и жёстко оптимизировать код с профилированием моментов запретов прерываний.
 

Dev9tiU

✩✩✩✩✩✩✩
16 Фев 2021
6
1
вот в чем дело... хоть я и положил опрос ацп и математику в отдельную функцию видимо надо синхронизировать.
функция вызывается 2 раза в секунду. и про флоат както не подумал. пусть флоатом занимается первое устройство.
вообще в целом это должна получиться система управления электровелосипедом.
1е "боровой компьютер" управляет двигателем и занимается индикацией и защитой
2е кулонометр. считает сколько потрачено заряда батареи (LiFePO4 по напряжению судить об уровне заряда сложно. нужен электросчетчик)
3е контроллер батареи. занимается измерением напряжения на каждой ячейке и балансировкой
за неимением быстрого доступа к разным микросхемам и деталям собирается на том что есть.
без кан шины и внешних ацп/мультиплексоров
 

k134

✩✩✩✩✩✩✩
8 Июл 2020
35
0
А какой длинны провода могут быть??? Я разобрался с протоколом i2c и вот пока провода короткие типа 20см всё работает без проблем, а как только провод использую более 5 метров одна или обе ардуины зависают через 5-10 часов по разному бывает
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
я тестировал i2c на 4 метра - может работать. Но помехи будут сильно влиять. И еще скорость (частота) тоже будет влиять.
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Надо понижать скорость передачи, протокол I2C это предусматривает. Передача должна осуществляться по балансным линиям, лучше по разным для данных и синхронизациям. Подключать стоит через драйверы шины или к выделенным пинам Ардуино.
 

Михаил Херсон

✩✩✩✩✩✩✩
5 Мар 2021
1
0
Доброго времени суток! Вопрос к к автору, что получилось в итоге? У меня похожая задача, необходимо дублировать мнемосхему 12 каналов, другими словами с стороны передатчика 12 дискретных входов, ну а у приемника 12 выходов на светодиоды, связать надо двухжильным проводом 25-30 метров, скорость вообще не важна. В сети поискал ничего похожего не нашел, вроде должно быть просто, но не понятно.
 

Nikanor

★★✩✩✩✩✩
1 Окт 2020
178
51
похабычь двумя постами выше ссылку дал.
читайте и осваивайте.
 

k134

✩✩✩✩✩✩✩
8 Июл 2020
35
0
Доброго времени суток! Вопрос к к автору, что получилось в итоге? У меня похожая задача, необходимо дублировать мнемосхему 12 каналов, другими словами с стороны передатчика 12 дискретных входов, ну а у приемника 12 выходов на светодиоды, связать надо двухжильным проводом 25-30 метров, скорость вообще не важна. В сети поискал ничего похожего не нашел, вроде должно быть просто, но не понятно.
Да имеено так я сдела так как гласит урок поссылке всё заработало. Главное соблюдать схему подключения. Правда я ещё разбираюсь но данные уже передаются

Отправка мега 2560
C++:
// Пример отправки и приёма структуры через Serial
// ОТПРАВИТЕЛЬ
// Ардуины соединены так:
// отправитель D11 -> приёмник D10
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A14, A15); // RX, TX
const uint8_t     PIN_direction_TX_RX = A13;
struct Str {
  byte val_b;
  int val_i;
  long val_l;
  float val_f;
};
void setup() {
  Serial.begin(9600);
  mySerial.begin(4000);
  pinMode(PIN_direction_TX_RX,   OUTPUT);    // устанавливаем режим работы вывода PIN_direction_TX_RX, как "выход"
  digitalWrite(PIN_direction_TX_RX, LOW);
}
void loop() {
  digitalWrite(PIN_direction_TX_RX, HIGH); // переводим модуль в режим передачи данных
    delay(1);
   // буфер на отправку
  Str buf;
  // заполняем
  buf.val_b = 22;
  buf.val_i = 29;
  buf.val_l = 123456;
  buf.val_f = 123.456;
  // отправляем родным write()
  // указываем ему буфер-структуру, но приводим тип к byte*
  // размер можно указать через sizeof()
  mySerial.write((byte*)&buf, sizeof(buf));
 
    delay(1);
    digitalWrite(PIN_direction_TX_RX, LOW);
  delay(2000);
}

Прием нано

C++:
// Пример отправки и приёма структуры через Serial
// ПРИЁМНИК
// Ардуины соединены так:
// приёмник D10 -> отправитель D11
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
const uint8_t     PIN_direction_TX_RX = 9;
// структура для приёма
// должна соответствовать отпраляемой
struct Str {
  byte val_b;
  int val_i;
  long val_l;
  float val_f;
};
// создаём саму структуру
Str buf;
void setup() {
  Serial.begin(9600);
  mySerial.begin(4000);
  pinMode(PIN_direction_TX_RX,   OUTPUT);    // устанавливаем режим работы вывода PIN_direction_TX_RX, как "выход"
  digitalWrite(PIN_direction_TX_RX, LOW);    // устанавливаем уровень логического «0» на выводе PIN_direction_TX_RX (переводим модуль в режим приёма данных)
}
void loop() {
  digitalWrite(PIN_direction_TX_RX, LOW);
  // читаем родным методом readBytes()
  // указываем ему буфер-структуру, но приводим тип к byte*
  // размер можно указать через sizeof()
  if (mySerial.readBytes((byte*)&buf, sizeof(buf))) {
    Serial.println(buf.val_b);
    Serial.println(buf.val_i);
    Serial.println(buf.val_l);
    Serial.println(buf.val_f);
  }
}


Урок по UART https://alexgyver.ru/lessons/parsing/