Прерывание сервопривода с помощью датчика силы
Я впервые имею дело с 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);
}
}
}
}
любая помощь приветствуется, и если уже есть тема по этому вопросу, пожалуйста, перенаправьте меня туда
@Kiz0, 👍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
- код для автоматической двери
- Управление серводвигателем с помощью сенсорного датчика
- Как использовать фотодиод для arduino?
- Почему задержка более 64 миллисекунд останавливает вращение серводвигателя? Я не использую «Servo.h», вместо этого я просто управляю длиной импульса.
- Как запрограммировать 2 ультразвуковых датчика, один на серводвигателе и один прикрепленный на передней стороне автомобиля?
- Сделать систему с ультразвуковым датчиком и сервоприводом
- Светодиоды Arduino Nano TX и RX не загораются во время загрузки
- Почему мой сервопривод и ультразвуковой датчик не работают вместе?
спросите себя: «когда выполняется код в setup()?» и «когда выполняется код в loop()?», @jsotola