Связь между 2 платами arduino

Я на самом деле не уверен на 100%, как это сделать, но я пытаюсь заставить мой arduino UNO взаимодействовать с моим arduino MEGA. Причина, по которой мне нужно было это сделать, заключалась в том, что я использовал RFID-модуль вместе с TFT-дисплеем, и проблема, с которой я столкнулся, заключалась в том, что на arduino mega им обоим требовался вывод 53. К счастью, у меня есть arduino UNO, поэтому я просто выбрал его вместо дисплея. Я пытаюсь использовать функцию analogWrite() для отправки аналоговых сигналов с моего MEGA на UNO, чтобы TFT-дисплей на UNO мог отображать результаты. UNO также будет считывать аналоговые входы, поступающие от MEGA. Это сработало не очень хорошо. Аналоговые входы отправляются с MEGA, но UNO не принимает их. Я использую вывод PWN на MEGA для отправки аналогового выхода на UNO.

Эта диаграмма показывает, что я имею в виду:

Вот 2 компотента, которые я использую:

https://i.stack.imgur.com/CqXdB.png TFT-дисплей

RFID - технология

Это показывает, как библиотека устанавливает пины. Я всего лишь новичок, поэтому лично я не хочу возиться с библиотекой.

, 👍0

Обсуждение

Используйте последовательный, I2C или SPI. Никогда не пытайтесь проделывать подобные вещи с аналогом, это просто нереально., @Majenko

Как вы их используете? Я совершенно новичок во всем этом., @The_Indestructible_Cat

Начните с поиска в Google некоторых руководств. Здесь нет недостатка., @Majenko

В чем заключалась сделка с контактом 53? Для чего они его использовали? Звучит как SPI, и в этом случае они могут просто поделиться им. Возможно, сначала выяснить это было бы разумнее, и в итоге вы не получите такой запутанный дизайн. Если речь идет не о SPI, то, скорее всего, вы можете переключить один из них на, @Delta_G

Также обратите внимание, что ШИМ-сигнал представляет собой чередование напряжения 5 В и заземления. Это не настоящий аналоговый сигнал. Когда вы попытаетесь прочитать его с помощью другого Arduino, вы не получите аналоговых показаний. Иногда вы получите 0, а иногда 5V., @Delta_G

@Delta_G контакт 53 используется для модуля RFID, @The_Indestructible_Cat

@Delta_G Знаете ли вы вообще, как вы можете отправлять аналоговые сигналы на arduino, потому что есть функция `analogWrite ()', @The_Indestructible_Cat

Вывод 53 - это просто вывод выбора ведомого устройства по умолчанию для SPI. Вы можете выбрать буквально любой вывод вместо 53. В этом нет ничего особенного (если только вы не используете подчиненный режим SPI)., @Majenko

@Majenko Я думаю, что RFID-модуль использует SPI. Проблема в том, что у меня есть дисплей, который использует SPI, и RFID-модуль, который использует SPI, и они оба не могут использовать его одновременно., @The_Indestructible_Cat

Да, они могут. В этом весь смысл SPI. Единственный вывод, который должен быть уникальным, - это вывод SS, все остальные могут быть общими. И вы можете изменить вывод 53 на * любой другой вывод*, @Majenko

У меня есть те модули, которые я использую выше:, @The_Indestructible_Cat

Если у вас есть "экраны", которые крепятся поверх Arduino, то отрежьте вывод 53 от первого верхнего уровня и припаяйте провод оттуда к другому выводу в другом месте. Если у вас нет "экранов", просто подключите вывод выбора ведомого устройства от одного из модулей к другому выводу., @Majenko

@Majenko У меня нет инструментов для этого!, @The_Indestructible_Cat

Затем возьмите инструменты. Это основные инструменты для работы с электроникой. Arduino - это не LEGO®, это электроника. Настоящая электроника., @Majenko

Возьмите провод, который подключается к контакту 53 RFID-модуля, и вставьте его в другое отверстие на Arduino. Посмотрите на цифру рядом с этой дыркой. Прочтите руководство к библиотеке RFID, которую вы используете, и найдите слова "выбор чипа", "конструктор" или "выбор ведомого устройства", и оно подскажет вам, куда вставить только что прочитанный номер., @Majenko

@Majenko, у меня нет шейлдов, я думаю, что в документации RFID конкретно упоминается, что необходимо использовать вывод 53, и, кроме того, это то же самое для TFT-дисплея, @The_Indestructible_Cat

@Majenko На картинке выше показано, что я имею в виду, @The_Indestructible_Cat

RFID не знает и не заботится о том, какой ввод он использует. Заботится только библиотека, и у большинства из них есть определенный способ сообщить ей, какой контакт вы хотите использовать. RTFM для библиотеки, а не RFID., @Majenko

@Majenko Я всего лишь новичок, поэтому лично я не хочу возиться с библиотекой., @The_Indestructible_Cat

Я не говорю вам "возиться" с библиотекой. Я говорю вам, чтобы вы прочитали руководство. Или, по крайней мере, * сообщите нам, какую библиотеку вы используете, чтобы мы могли указать вам на параграф, в котором рассказывается, как использовать другой вывод SS *!, @Majenko

@Majenko Вот библиотека: https://github.com/miguelbalboa/rfid, @The_Indestructible_Cat

Вы видите в таблице контакты на той странице, на которую вы ссылаетесь? Видите маленькую букву "[2]` рядом с выводом 53? Нажмите на нее. Это приведет вас к биту с надписью "Настраиваемый, обычно определяемый как SS_PIN в sketch / program"., @Majenko

Во всех примерах есть #define SS_PIN ..."в них вы можете изменить вывод, который хотите использовать вместо 53. В конструкторе есть MFRC522 mfrc522 (SS_PIN, RST_PIN)`, куда вы можете поместить любые номера контактов, которые вам нравятся (или просто переопределить макросы, чтобы они были чем-то другим)., @Majenko


2 ответа


Лучший ответ:

1

Вы можете использовать интерфейс I2C.

TX:

// Мастер записи проводов
// автор : Николас Замбетти <http://www.zambetti.com >

// Демонстрирует использование библиотеки Wire
// Записывает данные на подчиненное устройство I2C/TWI
// См. Пример "Проводного подчиненного приемника" для использования с этим

// Создано 29 марта 2006 года

// Этот пример кода находится в общественном достоянии.


#include <Wire.h>

void setup() {
  Wire.begin(); // присоединиться к шине i2c (адрес необязателен для master)
}

byte x = 0;

void loop() {
  Wire.beginTransmission(8); // передача на устройство #8
  Wire.write("x is ");        // отправляет пять байт
  Wire.write(x);              // отправляет один байт
  Wire.endTransmission();    // прекратить передачу

  x++;
  delay(500);
}

RX:

// Проводной подчиненный приемник
// автор : Николас Замбетти <http://www.zambetti.com >

// Демонстрирует использование библиотеки Wire
// Получает данные как подчиненное устройство I2C/ TWI
// Обратитесь к примеру "Мастер записи проводов" для использования с этим

// Создано 29 марта 2006 года

// Этот пример кода находится в общественном достоянии.


#include <Wire.h>

void setup() {
  Wire.begin(8);                // присоединиться к шине i2c с адресом #8
  Wire.onReceive(receiveEvent); // событие регистрации
  Serial.begin(9600);           // запустить последовательный для вывода
}

void loop() {
  delay(100);
}

// функция, которая выполняется всякий раз, когда данные поступают от ведущего
// эта функция зарегистрирована как событие, см. раздел настройка()
void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // перебираем все
    char c = Wire.read(); // получаем байт в виде символа
    Serial.print(c);         // вывести символ
  }
  int x = Wire.read();    // получить байт как целое число
  Serial.println(x);         // вывести целое число
}

Схема:

Image by Dronebot Workshop; check out their tutorial for more info: https://dronebotworkshop.com/i2c-arduino-arduino/

Изображение от Dronebot Workshop; ознакомьтесь с их руководством для получения дополнительной информации: https://dronebotworkshop.com/i2c-arduino-arduino /

,

Это прекрасно! Большое вам спасибо! :), @The_Indestructible_Cat

Добро пожаловать!, @DragonflyRobotics

Что такое часть адреса 8?, @The_Indestructible_Cat

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

Разве вывод RX не является выводом 0, а вывод TX - выводом 1, или наоборот?, @The_Indestructible_Cat

Можете ли вы показать схему, которая показывает это? Это могло бы помочь мне лучше понять., @The_Indestructible_Cat

Да, так что это проводная библиотека, которая может не использовать последовательный ввод. Я включу схему в ответ., @DragonflyRobotics

Может ли он работать с разными платами? Я использую arduino MEGA и arduino UNO, @The_Indestructible_Cat

Да, для mega, прямо рядом с последовательными контактами, есть контакты SDA и SCL. Используй их. Кроме того, не забудьте соединить оба их основания вместе, иначе это НЕ сработает., @DragonflyRobotics

Есть ли у вас потенциально схема с использованием mega и uno? (Я совсем новичок в arduino), @The_Indestructible_Cat

Я включил схему в ответ., @DragonflyRobotics

Что делать, если вы хотите только одностороннюю связь, @The_Indestructible_Cat

Это один из способов. Один из них - TX, а другой - RX., @DragonflyRobotics


1

Пин 53 - это просто контакт "slave select" по умолчанию. В этом нет ничего особенного. Вы можете использовать любой другой пин в качестве ведомого выбора, если это позволяют библиотеки для ваших устройств (ознакомьтесь с документацией и руководствами по этим библиотекам).

Вы не можете передавать информацию с помощью analogWrite(), поскольку она на самом деле не является аналоговой (это PWM), а analog в любом случае не имеет достаточного определения для надежного представления более чем нескольких дискретных значений.

,

Я понимаю, что я здесь позже, но: как мастер AVR SPI, вы не можете допустить, чтобы ваш SS-ввод был низким в качестве входного сигнала. Таким образом, если вы выбрали что-то другое, кроме 53 (или SS в AVR в целом), в качестве подчиненной строки выбора, вы все равно захотите установить 53 как OUTPUT , или INPUT_PULLUP, или INPUT и подтянуть его извне. В противном случае вы можете быть выведены из основного режима из-за шума на выводе. Не то чтобы это противоречило вашему основному тезису, но вот еще одна вещь, о которой следует помнить, которая является особенной в 53 / SS в отношении SPI master., @timemage