Прерывание сервопривода с помощью датчика силы

Я впервые имею дело с Arduino, и у меня есть школьное задание. У меня есть сервопривод и датчик силы. Когда "1" (символ, а не целое число) вводится в последовательный монитор, сервопривод должен повернуться на 180 градусов, но может быть прерван, когда датчик силы отправляет значение, скажем, больше 300. И при вводе "0" сервопривод возвращается в исходное положение. Я очень старался понять это.

В основном мне нужно выйти из цикла, когда аналоговое значение превышает 300.

вот мой код:

#include <Servo.h>
Servo myservo;

int initpos; //начальное положение сервопривода перед разверткой (не меняется)
int angle; //используется для хранения значения угла сервопривода (это изменяется)
char code; //значение, введенное в последовательный монитор
int force; //значение аналогового датчика силы

void setup() 
{
  initpos = 10;
  Serial.begin(9600);
  myservo.attach(4);

  myservo.write(170); // делает сервопривод (абсолютно бесполезен для моего проекта, но я оставил его там)
  delay(500);         //
  myservo.write(10);  //
  delay(500);         //

  code = Serial.read(); 


}

void loop() 
{

  if(Serial.available())
  {


    angle = initpos;
    force = analogRead(A1);
    Serial.println(force);

    for(angle = 0; angle < 180; angle += 1)
    {
      if (code == "1" and force <= 300)
      {
        angle += 1;
        Serial.print(code);
        myservo.write(angle);
      }

      else if(code == "0")
      {
        myservo.write(initpos);
      }
    }

  }
}

любая помощь приветствуется, и если уже есть тема по этому вопросу, пожалуйста, перенаправьте меня туда

, 👍1

Обсуждение

спросите себя: «когда выполняется код в setup()?» и «когда выполняется код в loop()?», @jsotola


1 ответ


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

1

Я написал этот код без доступа к компилятору, так что могут быть ошибки. Используйте это как идею, как решить квест. Надеюсь, комментарии будут полезны. Не стесняйтесь спрашивать, если вы не понимаете или поправьте меня, если вы видите ошибку.

#include <Servo.h>

Servo myservo;

// конечные положения сервопривода
// объявлены как постоянные значения
const int minPos = 10; 
const int maxPos = 180; 

int servoAngle;

int force;
char code;

void setup() 
{
  Serial.begin(9600);

  myservo.attach(4);
  // перемещаем сервопривод в minPos
  // или что хотите/нужно
  servoAngle = minPos;
  myservo.write( servoAngle ); 

  // PPK: сделайте код максимально простым -> развертка удалена

  // PPK: удален - здесь это не имеет смысла
  // код = Serial.read();
}

void loop() 
{
  // PPK: здесь вы проверяете, доступны ли данные (я добавил "> 0")
  if( Serial.available() > 0 )
  {
    // PPK: но вы не прочитали данные
    // Давай сделаем это
    char newCode = Serial.read(); 
    If ( newCode == '0' || newCode == '1' )
    {
      // только "0" и "1" являются допустимыми кодами
      code = newCode;
    }
  }

  if ( code == '0' && servoAngle > minPos )      
  {
    servoAngle--;
    myservo.write( servoAngle );
  }
  else if ( code == '1' && servoAngle < maxPos )
  {
    force = analogRead( A1 );
    Serial.println( force );
    if ( force > 300 )
    {
      servoAngle--;

      // PPK: следующая строка необходима, только если вы хотите
      // сервопривод движется к минимальному положению
      // если сила > 300 обнаружено
      // удалите строку, если хотите
      // удерживаем сервопривод в положении, где
      // сила превышает 300
      code = '0':
    }
    else
    {
      servoAngle++;
    }
    myservo.write( servoAngle );
  }
  // небольшая задержка для замедления сервопривода
  // удалите его, если хотите
  delay( 10 );
}

ОБНОВЛЕНО

Если вы собираетесь остановить сервопривод, если force > 300 можно добавить флаг, указывающий на исключительное состояние.

#include <Servo.h>

Servo myservo;

const int minPos = 10; 
const int maxPos = 180; 

int servoAngle;

int force;
char code;
int flagServoStopped = 0;

void setup() 
{
  Serial.begin(9600);

  myservo.attach(4);
  servoAngle = minPos;
  myservo.write( servoAngle ); 
}

void loop() 
{
  if( Serial.available() > 0 )
  {
    char newCode = Serial.read(); 
    If ( newCode == '0' || newCode == '1' )
    {
      code = newCode;
    }
  }

  if ( flagServoStopped == 1 && code == '1' )
  {
    // Сервопривод заморожен до тех пор, пока установлен флаг остановки и
    // вы не ввели '0'.
    // выйти из цикла
    return;
  }

  // в случае `code = '0'` сброс флага, если он установлен.
  flagServoStopped = 0;

  if ( code == '0' && servoAngle > minPos )      
  {
    servoAngle--;
    myservo.write( servoAngle );
  }
  else if ( code == '1' && servoAngle < maxPos )
  {
    force = analogRead( A1 );
    Serial.println( force );
    if ( force > 300 )
    {
      flagServoStopped = 1;
    }
    else
    {
      servoAngle++;
      myservo.write( servoAngle );
    }
  }
  delay( 10 );
}
,

Привет, спасибо за вашу помощь, это здорово! (не знаю, если вы видели мой предыдущий комментарий, он вводил в заблуждение). К сожалению, ожидается, что сервопривод остановится, когда «force > 300» и дождется «0»., @Kiz0

@ Kiz0 Я изменил код в соответствии с вашим последним комментарием., @Peter Paul Kiefer

Спасибо за помощь! Это отлично работает и сэкономило мне часы в моем проекте! :), @Kiz0