Чего не хватает моему коду, чтобы сервопривод вращался без остановки? Сервопривод должен вращаться на 180 градусов, когда расстояние >= 50 и 0, когда это условие не выполняется

Мой код представляет собой датчик уровня воды, а компонентами являются Arduino Uno, макетная плата, ультразвуковой сервопривод и два светодиода, один из которых красный, а другой зеленый.

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

Когда расстояние составляет <= 50, сервопривод поворачивается на 180 градусов и активирует красный светодиод в противном случае сервопривод переходит в нулевое положение и активирует зеленый светодиод.

Мой код:

#include <Servo.h>
int position = 0;
Servo srv;

const int trigPin = 4;
const int echoPin = 2;
const int ServoPin = 3;
const int green = 5;
const int red = 6;

int durantion;
int distance;

// **************************************//
void setup()
{
 
 Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  srv.attach(ServoPin);
 
}

void loop() {
  
  int duration, distance;
  pinMode(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 distance = pulseIn(echoPin, HIGH);
 distance = duration *30/2500;
  
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");
  
  
  
 if (distance <= 50)
 
{
  digitalWrite(red, HIGH);
  srv.write(180);
   delay(1000);
} 
else 
{
  digitalWrite(green, LOW);
  delay(1000);
  srv.write(0);
}
}



```



[![System][1]][1]


  [1]: https://i.stack.imgur.com/6YXgf.png

, 👍1

Обсуждение

если сервопривод непрерывно вращается без остановки, значит, вам не хватает сервопривода прерывистого движения ... у вас есть сервопривод непрерывного вращения, @jsotola

пожалуйста, подробно опишите, что происходит на самом деле, @jsotola

@jsotola мой сервопривод вращается непрерывно, но я хочу сам контролировать вращение, когда запускаю симуляцию, в которой я использую ультразвуковой датчик и расстояние., @Rafaelle Duarte

Re “расстояние = пульсация (...);”: Вы имеете в виду длительность = пульсация (...);., @Edgar Bonet

непрерывно вращается в одном направлении?, @jsotola

@EdgarBonet Именно так!, @Rafaelle Duarte

если вы хотите, чтобы сервопривод остановился под нужным углом, вам придется купить сервопривод, который способен это сделать, @jsotola

Но я боюсь, что бит 180 градусов и нулевой бит, о которых я упоминал, - это то, чем можно управлять, как я видел в других проектах на Tinkercad. Что такое прерывистое движение, о котором вы упомянули в первом комментарии? @jsotola, @Rafaelle Duarte

@jsotola я имею в виду с точки зрения кода., @Rafaelle Duarte

@EdgarBonet Я собираюсь исправить ошибку, на которую вы указали., @Rafaelle Duarte

если сервопривод вращается в одном направлении без остановки, то это не тот тип сервопривода, который поворачивается на определенный угол и останавливается ... никакое программирование этого не исправит, @jsotola


1 ответ


Лучший ответ:

1

Проверяя вашу программу, я обнаружил две ошибки, ИМХО. Пожалуйста, ознакомьтесь с комментариями в скопированном коде ниже. Тот, на который также указал @EdgarBonet, определенно мешает корректной работе вашей программы. Другой влияет на корректность только в том случае, если значения констант OUTPUT и LOW различаются. Я не знаю, так ли это на самом деле.

Я почти уверен, что непрерывно вращающийся сервопривод не вызван программой. Существует два вида сервоприводов. Один тип, который получает сигнал, указывающий на угол поворота рычагов сервопривода. Другой тип получает тот же сигнал (называемый PWM = широтно-импульсная модуляция) и интерпретирует его как скорость, с которой он непрерывно вращает серворуки.

Если вы используете последний, arduino посылает сигнал типа поворота примерно на 180 °, но сервопривод понимает поворот на полной скорости. Вы ничего не можете сделать программно, чтобы избежать этого.

Существуют обходные пути, такие как создание контура обратной связи с потенциометром, который измеряет угол поворота, или использование стопорных датчиков. Но самый простой способ - это использовать сервопривод, созданный специально для вашего использования. (Непрерывный или стандартный сервопривод, например, для радиоуправляемых автомобилей, радиоуправляемых кораблей, радиоуправляемых самолетов)

Кстати: На картинке, которую вы предоставили, показана симуляция. Если сервопривод в симуляторе вращается непрерывно, возможно, есть свойство, которое вы можете использовать для изменения типа сервопривода с непрерывного на стандартный. ??

#include <Servo.h>

int position = 0;
Servo srv;

const int trigPin = 4;
const int echoPin = 2;
const int ServoPin = 3;
const int green = 5;
const int red = 6;

int durantion;
int distance;

void setup()
{
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  srv.attach(ServoPin); 
}

void loop() 
{
  
  int duration, distance;
  // error: you already set the pinmode to OUTPUT
  // pinMode(trigPin, LOW);
  // perhaps you mean 
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // error: duration or distance ? ;-)
  // distance = pulseIn(echoPin, HIGH);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 30 /2500;
  
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println(" cm");

  if (distance <= 50)
  {
    digitalWrite(red, HIGH);
    srv.write(180);
    // improvement: delay necessary?
    // delay(1000);
  }  
  else 
  {
    digitalWrite(green, LOW);
    // improvement: delay necessary?
    // delay(1000);
    srv.write(0);
  }
}
,