Сервопривод не работает в цикле «for», запущенном в цикле «if»
Это мой первый вопрос на StackExchange. Я относительно новичок в Arduino и пытаюсь разобраться с компонентами и функционалом.
У меня есть светодиод RGB, подключенный к моей макетной плате с подключенным сервоприводом. Светодиод почему-то светится только красным и оранжевым (почему?), поэтому я исправил свой код в соответствии с поведением светодиода. Код запрашивает у пользователя цвет, и в зависимости от этого сервопривод должен вращаться вместе со светодиодом, загорающимся. Мой сервопривод хорошо работает только в диапазоне 25-165 градусов. Код выглядит так:
Вот код:
# include<Servo.h>
int i;
Servo n1;
String color;
void setup(){
Serial.begin(9600);
n1.attach(6);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(6,OUTPUT);
}
void loop(){
Serial.println("Enter color: ");
while(Serial.available()==0){
}
color=Serial.readString();
if (color=="red"){
digitalWrite(2,HIGH);
for (i=25;i<=165;i=i+5){
n1.write(i);
delayMicroseconds(250);
//}
n1.write(25);
delay(2500);
digitalWrite(2,LOW);
}
}else if (color=="orange"){
digitalWrite(3,HIGH);
for (i=165;i>=25;i=i-2){
n1.write(i);
delayMicroseconds(250);
}
n1.write(25);
delay(2500);
digitalWrite(3,LOW);
}
}
Поэтому, по сути, когда Красный включен, я хочу, чтобы Сервопривод перешел от 25 до 165 и вернулся к 25, и наоборот для Оранжевого. Но сервопривод ведет себя двумя способами;
1.Когда первым вводится красный, он поворачивается на некоторый угол (я думаю, 25) и остается там, программа даже не зацикливается на дальнейшем вводе цвета в течение длительного периода. Затем, какой бы ввод ни был, сервопривод перестает вращаться, работает только светодиод.
2. Когда первым вводится оранжевый, он снова поворачивается на тот же угол, что и красный, и слегка жужжит, но ввод принимается, и сервопривод остается неподвижным. Я смоделировал ту же установку и код в схемах TinkerCad, и поведение было таким же, так что особых проблем с оборудованием не возникло.
Я сравнительно недавно начал понимать принципы работы и основы Arduino, поэтому буду признателен за любую помощь. Также прилагается схема установки.
Любая помощь будет оценена по достоинству.
Спасибо!
@Kv07, 👍-1
Обсуждение1 ответ
Этот раздел кода никогда не запустится. Цикл for говорит, что i начинается со 175, и пока i>=25175, выполните n1.write(i) и вычтите 2 из i каждый раз, когда это происходит.
for (i = 175; i >= 25175; i = i - 2) {
n1.write(i);
}
На странице примера сервопривода arduino n1.write() должен быть только от 0 до 180, так как это угол, под которым находится сервопривод. Так что вы переходите от 175 до 180, и он не двинется дальше этого.
//angle: значение для записи в сервопривод, от 0 до 180
#include <Servo.h>
Servo myservo;
void setup()
{
myservo.attach(9);
myservo.write(90); // установить сервопривод в среднюю точку
}
void loop() {}
Конечно, должно быть 25, а не 25175. Это ошибка копирования и вставки, не требующая объяснений., @Juraj
На самом деле, это не та ошибка, которая создает проблему. Как вы сказали, это ошибка копирования и вставки., @Kv07
https://arduinoprosto.ru/q/53814/47552 Это фактически исправленная версия вопроса., @Kv07
Я обновил код в вопросе, но он по-прежнему не соответствует последовательности цикла for., @Kv07
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Как заставить сервопривод вращаться на угол больше 180°
- Пповорот сервопривода на 90 градусов
- Как синхронно управлять двумя сервоприводами?
- Ошибка "Servo" does not name a type
- Библиотека плавного сервоуправления
- Подключение Arduino к сервоприводу с внешним источником питания
- Мой сервопривод не работает плавно
Можете ли вы, пожалуйста, сделать схему цепи, используя предоставленные инструменты?, @Joe S
для (я = 175; я >= 25175; я = я - 2) {
, @JurajЭто была опечатка в коде, который я вставил ранее. Я снова вставил исправленный и обновленный код., @Kv07
@JoeS Я обновил принципиальную схему с помощью TinkerCad для вашей справки., @Kv07
Попробуйте использовать delay вместо delayMicroSeconds. Я не думаю, что 0,25 мс достаточно для того, чтобы сервопривод переместился даже на несколько градусов., @Chad G
@ChadG Это сработало! Сервопривод теперь работает отлично. У меня есть один вопрос: когда я подключаю сервопривод и светодиод RGB к общему заземлению на макетной плате, сервопривод продолжает жужжать, даже при 90 градусах. Но когда я подключаю его к отдельному контакту GND на Uno, он работает достаточно хорошо, без дрожания до 25 градусов. В чем может быть причина?, @Kv07