Сервопривод не работает в цикле «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, поэтому буду признателен за любую помощь. Также прилагается схема установки.

Любая помощь будет оценена по достоинству.

Спасибо!

, 👍-1

Обсуждение

Можете ли вы, пожалуйста, сделать схему цепи, используя предоставленные инструменты?, @Joe S

для (я = 175; я >= 25175; я = я - 2) {, @Juraj

Это была опечатка в коде, который я вставил ранее. Я снова вставил исправленный и обновленный код., @Kv07

@JoeS Я обновил принципиальную схему с помощью TinkerCad для вашей справки., @Kv07

Попробуйте использовать delay вместо delayMicroSeconds. Я не думаю, что 0,25 мс достаточно для того, чтобы сервопривод переместился даже на несколько градусов., @Chad G

@ChadG Это сработало! Сервопривод теперь работает отлично. У меня есть один вопрос: когда я подключаю сервопривод и светодиод RGB к общему заземлению на макетной плате, сервопривод продолжает жужжать, даже при 90 градусах. Но когда я подключаю его к отдельному контакту GND на Uno, он работает достаточно хорошо, без дрожания до 25 градусов. В чем может быть причина?, @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