Отправка цифрового сигнала с одного arduino на другой

У меня есть один arduino с двумя датчиками приближения, которые посылают два сигнала цифровой записи при обнаружении объекта. Я проверил, чтобы убедиться, что они работают правильно и посылают высокие сигналы только тогда, когда должны. У меня есть второй arduino, который подключен непосредственно к этим двум выходам в виде двух цифровых потоков и печатает независимо от того, высокие они или низкие.

Проблема в том, что, хотя первый arduino не посылает высокий сигнал, цифровые потоки второго arduino показывают высокий уровень. Я попытался вставить резистор 1k или 10k между ними, и это, казалось, просто уменьшило частоту этого, но также уменьшило частоту появления высокого сигнала, когда он действительно был.

Кто-нибудь знает, что я делаю не так?

Соединения:

Код Arduino 2 (датчики):

/*  Два ультразвуковых датчика для обнаружения столкновений
Под углом по передним сторонам

Проверяет наличие объекта и отправляет цифровой сигнал, если расстояние меньше установленного порога
(закончились контакты pwm на основном arduino).
*/

#define LEFT_INPUT 5
#define RIGHT_INPUT 6
#define LEFT_OUTPUT 8
#define RIGHT_OUTPUT 9


// расстояние до остановки
int stopThreshold = 24;  // ~10cm

// vars
long ultraLeft, inchesLeft, cmLeft;
long ultraRight, inchesRight, cmRight;
int objectDetectedLeft, objectDetectedRight;



void Poll_Ultrasonic() 
{
  // слева
  ultraLeft = pulseIn(LEFT_INPUT, HIGH);
  inchesLeft = ultraLeft / 147;
  cmLeft = inchesLeft * 2.54;
  if (cmLeft < stopThreshold)
    objectDetectedLeft = 1;
  else
    objectDetectedLeft = 0;

  // справа
  ultraRight = pulseIn(RIGHT_INPUT, HIGH);
  inchesRight = ultraRight / 147;
  cmRight = inchesRight * 2.54;
  if (cmRight < stopThreshold)             
    objectDetectedRight = 1;
  else
    objectDetectedRight = 0;  
}

void setup()
{
    // Serial monitor
  Serial.begin(9600);
  // pins
  pinMode(LEFT_INPUT, INPUT);
  pinMode(RIGHT_INPUT, INPUT);
  pinMode(LEFT_OUTPUT, OUTPUT);
  pinMode(RIGHT_OUTPUT, OUTPUT); 
}

void loop()
{
  //проверка расстояния, установка флажков
  Poll_Ultrasonic();

  // установить выходные контакты с высоким уровнем обнаружения, выводить сообщения об обнаружении
  if (objectDetectedLeft) {
    digitalWrite(LEFT_OUTPUT, HIGH); 
    Serial.println("\n  LEFT object detected!\n");
  }    
  else
    digitalWrite(LEFT_OUTPUT, LOW);

  if (objectDetectedRight) {
    digitalWrite(RIGHT_OUTPUT, HIGH);
    Serial.println("\n  RIGHT object detected!\n");
  }
  else
    digitalWrite(RIGHT_OUTPUT, LOW);

  // Печать расстояний
  Serial.print("Ультразвуковое расстояние слева: ");
  Serial.print(cmLeft);
  Serial.println("cm");
  Serial.print("Ультразвуковое расстояние справа: ");
  Serial.print(cmRight);
  Serial.println("cm");   
}

Фрагмент кода Arduino 1 (основной):

// Ультразвуковые штифты
#define ULTRA_LEFT 7
#define ULTRA_RIGHT 11

// Ultrasonics
pinMode(ULTRA_LEFT, INPUT);
pinMode(ULTRA_RIGHT, INPUT);

void Poll_Ultrasonic() 
{
  if(digitalRead(ULTRA_LEFT) && digitalRead(ULTRA_RIGHT)) 
    leftOrRight = 2;
  else if (digitalRead(ULTRA_LEFT))
    leftOrRight = -1;
  else if (digitalRead(ULTRA_RIGHT))
    leftOrRight = 1;
  else
    leftOrRight = 0;

  if (leftOrRight)
    objectDetected = 1;  
  else 
    objectDetected = 0; 
}

... 

void StopCar() 
{
  esc.write(90);
  if (leftOrRight == -1)
    Serial.println("Объект обнаружен СЛЕВА! Останавливаюсь".);
  else if (leftOrRight == 1) 
    Serial.println("Объект обнаружен СПРАВА! Останавливаюсь".);
  else if (leftOrRight == 2)
    Serial.println("Объект обнаружен на ОБОИХ! Останавливаюсь".);
  else // никогда не должно дойти до этого
    Serial.println("Инструкция по ультразвуковой отладке: плохое состояние");
}

, 👍1

Обсуждение

На втором arduino вы переключаете контакты в режим ввода с помощью pinMode(); ?, @jose can u c

Я полагаю, у вас есть основания для двух ардуино, соединенных вместе?, @Andrew

У меня правильно установлен режим контакта, но нет, я не соединил земли вместе. Когда я это делаю, это перестает казаться высоким, но даже когда оно должно быть высоким., @Austin

Можете ли вы показать нам код в обоих arduino? Вы говорите, что правильно установили контакт, но вы могли бы установить его в значение INPUT_PULLUP или просто ВВЕСТИ; разница имеет значение., @jose can u c

Основания **должны** быть связаны вместе. Пожалуйста, покажите свою схему., @Edgar Bonet

Без соединенных вместе оснований нет общей точки отсчета. Как второе устройство может узнать, является ли входной сигнал высоким или низким, если он измеряется из другой 0-й точки? Подключите заземление, а затем выясните, почему он не видит высокого сигнала., @Andrew

Хорошо, я опубликую свою схему и код через секунду., @Austin

Вы проверили контакты 8 и 9 Arduino 2 с помощью мультиметра, чтобы убедиться, что они находятся в диапазоне от 0 В до 5 В?, @jose can u c

Да, я проверил мультиметром, и 8,9 контактов изменяются от 0 до ~4,92 В при обнаружении объекта, @Austin

А напряжения на выводах 7 и 11 на Arduino 1 (измерение с помощью заземления счетчика на Arduino 1, а не 2)? Если вы не получаете 0 или 4,92 В, затем измерьте напряжение между двумя концами сигнальных проводов и между двумя заземлениями, попробуйте найти, в чем разница., @Andrew

Покажите немного больше кода из Arduino 1, чтобы мы могли видеть, как вызывается функция Poll_Ultrasonic ()., @jose can u c

Спасибо всем за предложения и комментарии, в которых я нуждался. Я только что понял, что другая проблема заключалась в том, что моя батарея, похоже, использует функцию энергосбережения и очень быстро выключается, но без каких-либо признаков того, что она это делает., @Austin

ОК, начните с подключения светодиода к выходным контактам Arduino 2 .. (надеюсь, он будет светиться). Также измерьте ток на выходных контактах Arduino 2., @Omar Hussein


1 ответ


0

Хорошо , начните с подключения светодиода на выходе 2 контактов Arduino .. ( надеюсь, он будет светиться).

Также измерьте ток на выходных выводах Arduino 2

,