Как использовать два ультразвуковых датчика для управления двигателем 5 Вольт?

Я подключил к макетной плате два ультразвуковых датчика, а также установил двигатель на 5 В. Я также установил диод и установил обычную настройку. Я легко могу управлять мотором с помощью одного датчика.

Я хочу, чтобы двигатель работал, скажем, со скоростью 100, как только я его запущу:

  • Первый датчик следует использовать для медленного замедления двигателя, когда перед ним находится объект.
  • Второй датчик следует использовать для медленного ускорения двигателя, когда перед ним находится объект.

Я не хочу, чтобы скорость возвращалась к 100 после удаления объекта. Скорость должна оставаться той же, в зависимости от того, какой датчик использовался.

Если мне нужно что-то уточнить, сообщите мне в комментариях.

Код

int motorPin = 9;
int trigPin = 13;
int echoPin = 12;
int trigPin2 = 5;
int echoPin2 = 4;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(motorPin, OUTPUT);
}

void loop() {
  int duration, distance;
  digitalWrite (trigPin, HIGH);
  delayMicroseconds (1000);
  digitalWrite (trigPin, LOW);
  duration = pulseIn (echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 20) {  // Расстояние от датчика
    analogWrite (motorPin, 50);
  } else {
    int duration, distance;
    digitalWrite (trigPin2, HIGH);
    delayMicroseconds (1000);
    digitalWrite (trigPin2, LOW);
    duration = pulseIn (echoPin2, HIGH);
    distance = (duration/2) / 29.1;
    if (distance > 20) {  // Расстояние от датчика
      analogWrite (motorPin, 150);
    }
    if  (distance > 20) {  // Расстояние от датчика
      Serial.println("Out of range");
    } else {
      Serial.print(distance);
     Serial.println(" cm");
    }
    delay(500);
  }
}

, 👍5

Обсуждение

"100" — это половина скорость?, @Anonymous Penguin

хм, максимум 225, так что я предполагаю, что половинная скорость должна быть около 112. но да, в моей концепции это половинная скорость, @Master Ivin ChickenSheep

Что вы хотите, чтобы произошло, если оба объекта одновременно находились спереди и сзади робота? Эту проблему можно решить, если вы запишете все возможные комбинации, то есть, насколько я понимаю, 4 комбинации., @Adel Bibi

Что ж, чего я хочу, когда два объекта сохранялись одновременно, так это того, чтобы скорость становилась нормальной (по умолчанию), как в 100., @Master Ivin ChickenSheep

Есть ли то же самое, но с Raspberry Pi и HAT-расширением/драйвером PWM от adafruit? Тот же ультразвуковой датчик и один мотор. Я пытаюсь увеличить скорость двигателя, когда что-то близко к двигателю (также в обратном направлении), и поддерживать работу двигателя вперед, как обычно, если объект находится далеко., @user1642131


1 ответ


1

Это очень просто с помощью инструкции map(). Вот код, который вы могли бы использовать (не стесняйтесь изменять значения):

int speed = 112 + map(distance, 0, 20, 0, 112) - map(distance2, 0, 20, 0, 112);

Так что если бы оба датчика давали одинаковые значения, они бы смещали друг друга. Чтобы это работало, если объект удален, вы могли бы просто использовать последнее значение distance/distance_2 и обновить другое.


Одной из проблем этого подхода является то, что если линия преобразования объекта не перпендикулярна линии пингов, то значение будет:

10 → 11 → 12 → 13 → 14 → 15 → 16 → 17 → 18 → 19 → 20 → [Вне диапазона]

Я добавил несколько красивых анимаций, чтобы показать вам, что я имею в виду:

Перпендикулярно:

Коллинеарно:


Насколько я понимаю, это то, что вы хотите:

int motorPin = 9;
int trigPin = 13;
int echoPin = 12;
int trigPin2 = 5;
int echoPin2 = 4;
int postdist = 112;
int postdist2 = 112;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
  pinMode(motorPin, OUTPUT);
}

void loop() {
  //Первое чтение
  int duration, distance;
  digitalWrite (trigPin, HIGH);
  delayMicroseconds (1000);
  digitalWrite (trigPin, LOW);
  duration = pulseIn (echoPin, HIGH);
  distance = (duration/2) / 29.1;
  int ltol = postdist - 5;
  int htol = postdist + 5;
  if (distance > 20 || !(distance > ltol && distance < htol)) {  // Расстояние от датчика
    Serial.println("Out of range");
    distance = postdist;
  }
  //Второе чтение
  int duration2, distance2;
  digitalWrite (trigPin2, HIGH);
  delayMicroseconds (1000);
  digitalWrite (trigPin2, LOW);
  duration2 = pulseIn (echoPin2, HIGH);
  distance2 = (duration2/2) / 29.1;
  int ltol2 = postdist2 - 5;
  int htol2 = postdist2 + 5;
  if (distance2 > 20 || !(distance2 > ltol2 && distance2 < htol2)) {  // Расстояние от датчика
    Serial.println("Out of range");
    distance2 = postdist2;
  }
  //Математика:
  Serial.print("Distances-1: ");
  Serial.print(distance);
  Serial.print(" cm 2: ");
  Serial.print("Distances-1: ");
  Serial.print(distance2);
  Serial.println(" cm");
  postdist = distance;
  postdist2 = distance2;
  int speed = 112 + map(distance, 0, 20, 0, 112) - map(distance2, 0, 20, 0, 112); 
  if(speed < 60) {speed = 60;} //Измените 60 в соответствии с вашими требованиями к минимальному порогу
  analogWrite (motorPin, speed);
  Serial.print("Motor Speed: ");
  Serial.println(speed);
  delay(500);
}

Список изменений: забыл отредактировать postdist/postdist2 в конце цикла, добавил минимальный порог, предотвратил очень небольшие изменения напряжения, чтобы поддерживать напряжение стабильным и предотвращать шум.

,

Спасибо за помощь. Всякий раз, когда я пытаюсь сделать так, как вы написали выше, мотор ведет себя странно. Странно, он просто внезапно перестает работать, а затем снова начинает работать., @Master Ivin ChickenSheep

Можете ли вы подтвердить, что вы используете транзистор для управления двигателем (не подключайте его напрямую к выводу Arduino)? Кроме того, вам следует использовать диод обратного хода параллельно с ним., @jfpoilpret

Да, я использую транзистор и диод., @Master Ivin ChickenSheep

[Создан чат](http://chat.stackexchange.com/rooms/14000/discussion-between-anno-and-masterivinchickensheep), @Anonymous Penguin