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

Я хочу изменить свой код, чтобы серводвигатель двигался только в течение времени, в течение которого к датчику прикасаются, и немедленно прекращал движение, когда к датчику больше не прикасаются. Код, который у меня есть, перемещает датчик от 0 до 90 и обратно. Это движение завершается, даже когда вы убираете палец. Я хочу, чтобы это было так, что если вы уберете палец до того, как сервопривод достигнет 90 градусов, сервопривод остановится. И сервопривод снова запускается к 90, когда возобновляется касание. Это код, который у меня сейчас есть:

//при высоком уровне сигнала датчик нажимается

#include <Servo.h>

Servo myservo;  // создаем сервообъект для управления сервоприводом
int pos = 0;    // переменная для хранения положения сервопривода
int sensor=11; //инициализирует компонент для цифровых контактов arduino
led=13;

void setup() {
        myservo.attach(9);
        pinMode(led,OUTPUT);
        pinMode(sensor,INPUT);
        Serial.begin(9600);
}

void loop() {

        int value=digitalRead(sensor);
        if(value == HIGH){
                digitalWrite(led, HIGH);
                for (pos = 0; pos <= 90; pos += 1) {
                        myservo.write(pos);              // сообщаем сервоприводу перейти в положение
                        variable 'pos'
                                delay(15);                       // ждем 15 мс, пока сервопривод не достигнет
                        position
                }
                for (pos = 90; pos >= 0; pos -= 1) { // переход от 90 градусов к 0 градусам
                        myservo.write(pos);              // сообщаем сервоприводу перейти в положение
                        variable 'pos'
                                delay(15);
                }
                Serial.println("TOUCHED ");
        }else{
                digitalWrite(led, LOW);

                Serial.println("NOT TOUCHED ");
                delay(500);
        }
}

, 👍1

Обсуждение

Вы можете проверить кнопку в цикле for, пока сервопривод движется. Выход из цикла for с помощью «break», если кнопка отпущена. Когда вы сделаете это и добавите в скетч больше элементов, код станет сложнее поддерживать. Другой вариант — переписать свой скетч и использовать миллис, начните с примера: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay, @Jot

Леонардо, я рекомендую вам неблокирующую «совместную многозадачность». Начните с учебника «Блинк без задержки», на который вам указал @Jot. Здесь я написал еще несколько продвинутых примеров: https://stackoverflow.com/questions/50028821/best-way-to-read-from-a-sensor-that-doesnt-have-interrupt-pin-and- требует-некоторые/50032992#50032992 и здесь: https://arduinoprosto.ru/q/75932/calculating-amp-hrs-of-a-solar-panel/75937#75937. Вы можете изучить мой код, чтобы увидеть, как я это делаю. Примечание: это начало создания планировщика, результатом которого в конечном итоге станет базовая операционная система., @Gabriel Staples


1 ответ


1

Чтобы решить вашу проблему, вам нужно сделать крошечный шаг в программировании в реальном времени. Большинство программ Arduino имеют дело с одной проблемой или действием за раз. Ваш простой поворот для прерывания и действия «я хочу, чтобы это было так, что если вы уберете палец до того, как сервопривод достигнет 90 градусов, где сервопривод остановится», требует, чтобы вы постоянно контролировали ввод (сенсорный переключатель) при изменении выхода (следующий сервопривод). положение).

Вы можете сделать это двумя способами. Вы можете использовать прерывания, чтобы информировать вас об изменении состояния сенсорного переключателя. Это сложно. Многим трудно представить себе, что могло бы произойти, если бы их программа была прервана в любой и во всех возможных точках ее выполнения. Ошибка здесь может привести к неожиданным результатам.

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

,