Как управлять состоянием кнопки
Экстремальный новичок здесь ... Я использую Arduino Uno и PCA9685 16 Ch. Плата драйвера для управления сервоприводами с помощью кнопки и светодиодной обратной связи. Когда я нажимаю кнопку, сервопривод двигается, но когда я отпускаю кнопку, сервопривод возвращается в исходное положение. Я бы хотел, чтобы когда я нажимаю кнопку один раз, сервопривод перемещался и удерживал свое положение. Когда я снова нажимаю кнопку, возвращаюсь в исходное положение. Заранее спасибо за помощь.
Вот скетч:
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int buttonPin0 = 2; // Можно добавить столько кнопок, сколько нужно
int ledPin0C = 3; // C обозначает закрытую позицию стрелочного перевода
int ledPin0T = 4; // T обозначает брошенное положение стрелочного перевода
int buttonState0 = 0;
int buttonPin1 = 5;
int ledPin1C = 6;
int ledPin1T = 7;
int buttonState1 = 0;
void setup() {
Serial.begin(9600);
Serial.println("pca9685_TurnoutFinal!");
pwm.begin();
pwm.setPWMFreq(60);
delay(30);
pinMode(ledPin0C, OUTPUT);
pinMode(ledPin0T, OUTPUT);
pinMode(buttonPin0, INPUT);
pinMode(ledPin1C, OUTPUT);
pinMode(ledPin1T, OUTPUT);
pinMode(buttonPin1, INPUT);
}
void loop() {
///////////
buttonState0 = digitalRead(buttonPin0);
if (buttonState0 == HIGH) {
pwm.setPWM(0, 0, 370);
digitalWrite(ledPin0T, LOW);
digitalWrite(ledPin0C, HIGH);
}
else {
pwm.setPWM(0, 0, 285);
digitalWrite(ledPin0C, LOW);
digitalWrite(ledPin0T, HIGH);
}
//////////
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 == HIGH) {
pwm.setPWM(1, 0, 370);
digitalWrite(ledPin1T, LOW);
digitalWrite(ledPin1C, HIGH);
}
else {
pwm.setPWM(1, 0, 285);
digitalWrite(ledPin1C, LOW);
digitalWrite(ledPin1T, HIGH);
}
//////////
}
@Wayne Hensley, 👍-1
1 ответ
▲ 0
Код в цикле всегда выполняется, поэтому, когда вы отпускаете кнопку, код видит это как digitalRead(btn) = HIGH.
Вам нужна переменная состояния, чтобы знать, где в данный момент находится двигатель. Что-то вроде этого:
boolean state = false;
int oldButton = HIGH;
void loop() {
delay(20); // достаточно для устранения дребезга большинства кнопок
int newButton = digitalRead(buttonPin0);
if (oldButton == HIGH && newButton == LOW) { // только когда кнопка меняется с "отпущена" на "нажата"
state = !state;
// сообщаем сервоприводу, куда идти
if (state) {
pwm.setPWM(0, 0, 370);
} else {
pwm.setPWM(0, 0, 285);
}
}
oldButton = newButton;
}
,
@Mark Peterson
Смотрите также:
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Как заставить сервопривод вращаться на угол больше 180°
- Пповорот сервопривода на 90 градусов
- Как синхронно управлять двумя сервоприводами?
- Ошибка "Servo" does not name a type
- Библиотека плавного сервоуправления
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
Спасибо... Попробую разобраться, куда он идет., @Wayne Hensley
Также учитывайте дребезг кнопок., @Michel Keijzers
Мишель, не могли бы вы подробнее рассказать о подпрыгивании кнопок?, @Wayne Hensley
Не обращайте внимания на Мишеля ... Я немного почитал и теперь знаю, что это такое ... не уверен, повлияет ли это на мой проект, но еще раз спасибо, что сообщили мне об этом., @Wayne Hensley