Последовательная связь с 2 ардуино и одной оптроной

Я только начал работать с ардуино на Tinkercad в школьном задании и обладаю несуществующими электрическими знаниями. Попытался почитать на эту тему, и мне кажется, что я правильно понял некоторые факты, но я все еще не могу заставить их общаться при использовании оптрона. Он отлично работает с кодом, если я соединяю их друг с другом напрямую с помощью контактов tx/rx.

//Код отправителя
char string[5] = {'h', 'e', 'l', 'l', 'o'};
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  Serial.write(string,5);
  delay(1000);
}
//Получение кода arduino

char text[10];

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

void loop()
{
  Serial.readBytes(text,5);
  Serial.println(text);
  delay(1000);
}

Я предполагаю, что я сделал что-то не так, подключив принимающий Arduino, но я не могу найти, что не так. Любая обратная связь очень ценится!

, 👍1

Обсуждение

Как насчет схемы? Вы можете инвертировать сигнал, или он подключен таким образом, что даже 9600 бод/с слишком быстры для него, @KIIV

Попробуйте это, поскольку у вас есть логическая инверсия. Если Arduino подключен к катоду, подключите его к аноду или наоборот. Это вызовет двойную логическую инверсию и вернет сигналы к работе., @Gil


2 ответа


1

Вот схема, которую я бы предложил вам опробовать. Передающий контакт Arduino включит или выключит внутренний инфракрасный светодиод в зависимости от того, находится ли контакт на низком или ВЫСОКОМ уровне. Когда инфракрасный светодиод горит, он включает фототранзистор и производит низкий уровень на приемном выводе arduino.

Светодиод является необязательным, но он дает вам визуальную подсказку о том, получаете ли вы данные или нет.

schematic

,

1

РЕДАКТИРОВАТЬ: хотя OP, возможно, уже давно ушел, я хотел закончить то, что начал, своим ответом.

У меня эта схема отлично работает с двумя UNO (и одним UNO и платой последовательного порта для ПК). По сути, это то же самое, что и в первом ответе @hcheung. Я использовал 4,7K и 10K для R2/R4, и они работали нормально. Я проверил это с помощью этой программы, запущенной на обоих UNO.

    #include <SoftwareSerial.h>

SoftwareSerial SSerial(4,5); // прием, передача

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

}

void loop() { 
  // отображать все, что приходит через последовательный порт программного обеспечения, на мониторе Arduino
  if(SSerial.available()) {
    Serial.write(SSerial.read());
  }
  // отправляем все, что приходит по последовательному порту, в программный последовательный порт
  if(Serial.available()) {
    SSerial.write(Serial.read());  
  }
}

Обратите внимание, что программы используют программный последовательный порт, а Tx и Rx изолированы.

Если вы используете его для аппаратного последовательного порта на двух UNO, будьте осторожны. Во-первых, не вешайте вещи на 0/1 до тех пор, пока программа не загрузится, и мне неясно, сколько вы можете сойти с рук.

Во-вторых, если вы используете простую программу, подобную этой, на обоих UNO, вы быстро увидите, что первые отправленные байты будут пинг-понговыми и вызовут проблемы.

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

void loop() {
  if(Serial.available()){
    Serial.write(Serial.read());
  }
}

Я заметил, что ОП использовал только один конец.

Лично я нашел несколько хламовых коробок 4N25, которые не работали - мне потребовалось немного времени, чтобы понять это. Наконец, я не вижу смысла оптически изолировать два UNO, как я это сделал, например, но это уже другая история.

______ старое сообщение ниже _______________________________

Типичный способ сделать это показан здесь .

// *** Ниже я оставляю исходный текст, но хочу немного отступить. Сегодня я потратил на это несколько часов, и я не доволен результатами или своим пониманием. Если я приду к каким-то стоящим выводам, я их опубликую. Я люблю докапываться до сути вещей, но я был преждевременным. Это просто не работает так, как я ожидал, когда я достигаю скорости 9600 , и мне нужно продолжить расследование. Да, я учитываю взаимодействие UNO 0&1 с USB.

// ***

Преимущество заключается в том, что вы не будете инвертировать линию на принимающей стороне. Выбор R1 и R2 важен. Я использовал R1 = 330 и R2 = 1K, и передача была в порядке на 9600 с использованием мусорной коробки 4N25. Мое тестирование проводилось с одним UNO и после загрузки простой программы.

См. https://github.com/pepaslabs/Electronics/wiki/ Designing-a-TTL-Serial-Opto-Isolator для хорошего обсуждения именно этой темы.

PS: Как уже упоминалось, вы должны были предоставить схему, и вы могли бы использовать измеритель, чтобы увидеть, какие напряжения вы получаете - это хороший шаг к пониманию вещей.

,

Вы подключили Uno2 RX к GND на своей схеме., @hcheung

@hcheung Да, спасибо - очень неаккуратно с моей стороны - исправлено, @DrG