Последовательная связь с 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, но я не могу найти, что не так. Любая обратная связь очень ценится!
@Funtad, 👍1
Обсуждение2 ответа
Вот схема, которую я бы предложил вам опробовать. Передающий контакт Arduino включит или выключит внутренний инфракрасный светодиод в зависимости от того, находится ли контакт на низком или ВЫСОКОМ уровне. Когда инфракрасный светодиод горит, он включает фототранзистор и производит низкий уровень на приемном выводе arduino.
Светодиод является необязательным, но он дает вам визуальную подсказку о том, получаете ли вы данные или нет.
РЕДАКТИРОВАТЬ: хотя 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
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Как использовать Serial.setTimeout()
- Аппаратная последовательная библиотека Arduino с поддержкой управления потоком rts/cts
- Отправить структуру через Serial
- Передавать данные структуры во внешнюю структуру через serial?
- Мост I2C-UART в виде прорыва или в корпусе DIP
- Может ли Arduino Leonardo одновременно использовать USB-порт и последовательные контакты RX TX?
- Последовательная связь между несколькими устройствами (или ардуино)
Как насчет схемы? Вы можете инвертировать сигнал, или он подключен таким образом, что даже 9600 бод/с слишком быстры для него, @KIIV
Попробуйте это, поскольку у вас есть логическая инверсия. Если Arduino подключен к катоду, подключите его к аноду или наоборот. Это вызовет двойную логическую инверсию и вернет сигналы к работе., @Gil