Контролировать скорость двигателя вибратора с помощью ультразвуковых датчиков

Во-первых, спасибо, что нашли время прочитать мой пост.

Я пытаюсь использовать 3 ультразвуковых датчика для управления 3 вибраторами постоянного тока с использованием ШИМ-выхода Arduino. Знаю, довольно просто, но я только новичок. :)

Вот мой код

int trigpin_1 = 2;
int echopin_1 = 3;
int trigpin_2 = 4;
int echopin_2 = 5;
int trigpin_3 = 6;
int echopin_3 = 7;
int motor_1 = 8;
int motor_2 = 9;
int motor_3 = 10;

void setup() {
  // поместите сюда свой код установки для однократного запуска:
  Serial.begin (9600);
  pinMode(trigpin_1, OUTPUT);
  pinMode(echopin_1, INPUT);
  pinMode(trigpin_2, OUTPUT);
  pinMode(echopin_2, INPUT);
  pinMode(trigpin_3, OUTPUT);
  pinMode(echopin_3, INPUT);
  pinMode(motor_1, OUTPUT);
  pinMode(motor_2, OUTPUT);
  pinMode(motor_3, OUTPUT);
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:

  long duration, distance;
  digitalWrite(trigpin_1, HIGH);
  digitalWrite(trigpin_2, HIGH);
  digitalWrite(trigpin_3, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigpin_1, LOW);
  digitalWrite(trigpin_2, LOW);
  digitalWrite(trigpin_3, LOW);
  duration = pulseIn(echopin_1, HIGH); 
  duration = pulseIn(echopin_2, HIGH);
  duration = pulseIn(echopin_3, HIGH);
  distance = (duration/2) /29.1;
  if (distance > 200)
  {
    analogWrite(motor_1, 0);
    analogWrite(motor_2, 0);
    analogWrite(motor_3, 0);
  }
  else if(200 == distance > 160)
  {
    analogWrite(motor_1, 50);
    analogWrite(motor_2, 50);
    analogWrite(motor_3, 50);
  }
  else if(160 >= distance > 90)
  {
    analogWrite(motor_1, 100);
    analogWrite(motor_2, 100);
    analogWrite(motor_3, 100);
  }
  else if(90 >= distance > 60)
  {
    analogWrite(motor_1, 150);
    analogWrite(motor_2, 150);
    analogWrite(motor_3, 150);
  }
  else if(60 >= distance > 40)
  {
    analogWrite(motor_1, 200);
    analogWrite(motor_2, 200);
    analogWrite(motor_3, 200);
  }
  else if(40 >= distance)
  {
    analogWrite(motor_1, 255);
    analogWrite(motor_2, 255);
    analogWrite(motor_3, 255);
  }

  Serial.print (distance);
  Serial.println (" cm");
  delay(100);
}

здесь соединения

Но проблема в том, что двигатели постоянного тока будут работать постоянно с рабочим циклом 100%. если кто-нибудь сможет мне помочь, буду благодарен

, 👍-1

Обсуждение

Схему подключения очень сложно прочитать. Было бы лучше прочитать, если бы вы перерисовали его встроенным редактором схем., @Ariser

Действительно ли это «if(160 >= distance > 90)» работает так, как задумано в Arduino? Я не верю, что это происходит в любом варианте C. У вас также есть 3 строки 'duration = ...', поэтому вы просто перезаписываете первые 2 последними., @brhans


2 ответа


2

Боюсь, в вашем коде есть некоторые ошибки.

Во-первых, операторы if. Если значения хранятся в порядке убывания, то можно сделать так:

if (distance > 200)
{...}
else if (distance > 160)  // Эта точка не будет достигнута, если значение не меньше 200.
{...}
else if (distance > 100)
{...}

Я думаю, вы пытались сделать следующее:

if (distance < 200 && distance > 160)
{...}

но это не обязательно.

Вы считываете длину импульса в одну переменную, перезаписывая предыдущие значения. Это означает, что вы считываете только датчик 3. Если вы хотите усреднить значения, попробуйте это:

duration = pulseIn(echopin_1, HIGH); 
duration += pulseIn(echopin_2, HIGH); // берем результат и добавляем его к duration.
duration += pulseIn(echopin_3, HIGH);
duration /= 3;   // делим длительность на три и присваиваем результат длительности.

Также я не уверен в расположении ваших датчиков, возможно, они могут мешать друг другу. В этом случае напишите функцию для чтения с датчика и сохранения результатов в массиве.

то есть константа int sensorTriggerPins[] = {2, 4, 6}; константа int sensorEchoPins[] = {3, 5, 7};

long readSensor (const int& triggerPin, const int& eechoPin)
{
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(triggerPin, LOW);
  return pulseIn(echoPin, HIGH); 
}

void setup()
{
   long duration[3]; // Определяем массив из трех элементов.
   for (int sensor = 0; sensor < 3; ++sensor)
   {
      duration[index] = readSensor(sensorTriggerPin[index], sensorEchoPin[index]);
   }
}

Я не знаю, решит ли это все ваши проблемы, но это должно помочь. (Возможно, было бы лучше, если бы вы опубликовали это на форуме Arduino)

,

PS - Вы можете упростить функцию настройки, если будете использовать массивы для назначения выводов, и то же самое можно сделать и с двигателями., @Code Gorilla


0

Вы не хотите использовать выходы GPIO для прямого управления двигателями. Скорее всего, вы сожжете свой Arduino с помощью приведенной вами схемы. Как минимум, вам понадобится использовать транзисторы (которые могут выдерживать токовую нагрузку двигателя) для включения/выключения двигателей.

,