Добрый всем день. Помогите разобраться хочу соеденить несколько плат ардуино вместе но ничего не выходит, руководствуюсь этой статьей https://alexgyver.ru/gyverbus/ , но ничего не происходит.
может просто подавать на вторую ардуину HIGH LOW на пин? HIGH - реле включить, ЛОУ - выключить... как-то такмне нужно предельно простые действия от этих двух ардуино, одна на другую должна передать сигнал чтобы вторая просто включила или выключила реле.
Всё проверил порты в норме, перепутать не могу ибо только принимающая ардуино подключена к компьютеру. Не знаю как проверить идет ли отправка с первой ардуино вообще@k134, для этого есть мониторы портов (отладочный вывод в serial). Посмотреть что генерит передающая Ардуино, принимает ли что-нибудь приёмная часть. Может порты неверно выбраны или ничего не посылается в принципе.
Как с первой ардуино передать сигнал на вторую???может просто подавать на вторую ардуину HIGH LOW на пин? HIGH - реле включить, ЛОУ - выключить... как-то так
// простая функция отправки по 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();
}
}
А как устроить связь на 20 метров?я тестировал i2c на 4 метра - может работать. Но помехи будут сильно влиять. И еще скорость (частота) тоже будет влиять.
Подскажите направление? Что будет более стоикое к помехам и проще в обращенииНужен другой протокол. Проводной или без проводной. На выборе
Спасибо!!! буду пробовать
Да имеено так я сдела так как гласит урок поссылке всё заработало. Главное соблюдать схему подключения. Правда я ещё разбираюсь но данные уже передаютсяДоброго времени суток! Вопрос к к автору, что получилось в итоге? У меня похожая задача, необходимо дублировать мнемосхему 12 каналов, другими словами с стороны передатчика 12 дискретных входов, ну а у приемника 12 выходов на светодиоды, связать надо двухжильным проводом 25-30 метров, скорость вообще не важна. В сети поискал ничего похожего не нашел, вроде должно быть просто, но не понятно.
// Пример отправки и приёма структуры через 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);
}
// Пример отправки и приёма структуры через 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);
}
}