Попытка индивидуального управления сервоприводами в моем роботе с помощью ввода с клавиатуры

#include<Servo.h> 
Servo ser1;
Servo ser2;
Servo ser3;
Servo ser4;
Servo ser5;
int poser = 0; 
int val; 
int mot;

void setup() {
  Serial.begin(9600); 
  ser1.attach(4);
  ser2.attach(5);
  ser3.attach(6);
  ser4.attach(7);
  ser5.attach(8);
}

void loop() {
    Serial.print("Choose the motor");
      mot=Serial.read();
      switch(mot)
      {
        case 1:
        {
            val = Serial.read();
            if (val == 'd') 
             {
                poser += 1;
                ser1.write(poser);
               delay(15);
             }
           if (val == 'a') 
             {
                poser -= 1; 
                ser1.write(poser);
                delay(15);
             }
           break;
         }
       case 2:
         {
           val = Serial.read();
           if (val == 'd') 
            {
               poser += 1;
               ser2.write(poser);
               delay(15);
            }
           if (val == 'a') 
            {
               poser -= 1; 
               ser2.write(poser);
               delay(15);
            }
           break;
         }
      case 3:
         {
           val = Serial.read();
           if (val == 'd') 
            {
              poser += 1;
              ser3.write(poser);
              delay(15);
            }
          if (val == 'a') 
            {
              poser -= 1; 
              ser3.write(poser);
              delay(15);
            }
          break;
         }
       case 4:
         {
            val = Serial.read();
            if (val == 'd') 
             {
                poser += 1;
                ser4.write(poser);
                delay(15);
             }
           if (val == 'a') 
             {
                poser -= 1; 
                ser4.write(poser);
                delay(15);
             }
           break;
         }
       case 5:
         {
           val = Serial.read();
           if (val == 'd') 
             {
                poser += 1;
                ser4.write(poser);
                delay(15);
             }
           if (val == 'a') 
             {
                poser -= 1; 
                ser4.write(poser);
                delay(15);
             }
           break;
          }
      default:
          {
              Serial.print("Type valid number");
              break;
          }
    }
  }

Код постоянно показывает "Выберите действительный номер типа двигателя", и рука искажается, как только я его загружаю. Может кто-нибудь проверить код и сказать мне, что могло пойти не так?

, 👍1

Обсуждение

Я отредактировал ваш код, в основном добавил отступы, так что теперь ваш код намного понятнее., @Vaibhav


2 ответа


Лучший ответ:

0

Значения, которые вы получаете при чтении, являются символами, а не целыми числами. Вы получите символ «1» или «2», а не целые числа, которые вы сейчас проверяете. В результате ни один из случаев не будет совпадать, и вы всегда окажетесь в блоке кода default:.

Итак, вам нужно изменить оператор case, чтобы он проверял наличие символов. То есть

switch(mot){
        case '1':       // поместите вашу цифру в кавычки
        {

И так по всей программе

,

О, поскольку вы управляете более чем одним сервоприводом, вы можете рассмотреть возможность использования более одной переменной для отслеживания их текущего положения. Если, конечно, вы не хотите, чтобы движение последнего выбранного двигателя перемещалось на одну позицию, смещенную от ранее выбранного двигателя. Если вы не уверены, что я имею в виду, подумайте о значении poser, если я выберу двигатель 1; 20 раз и продвинуть его. Poser будет = 20. Затем выберите мотор 2 и продвиньте его на 1 раз, каково будет значение poser???, @GMc

Да, кажется, я понимаю, что вы имеете в виду. Значение poser будет равно 21. Итак, чтобы уточнить, вы предлагаете мне использовать разные переменные (например: poser1, poser2, poser3 и т. д.) для разных двигателей, верно?, @Aditi

На самом деле я бы предложил использовать массив, но на данный момент сохранение переменных с такими именами является хорошим первым шагом. Если это помогло, примите это как ответ (нажмите на серую галочку рядом с ответом, который помог вам больше всего), @GMc

@aditii, помог ли вам какой-либо из этих ответов? Если это так, пожалуйста, примите ответ, который помог вам больше всего, нажав на маленькую галочку рядом с этим ответом. Принятие ответа — это способ сказать «Спасибо за помощь»., @GMc


0

Я бы посоветовал вам добавить эту строку в свой код.

while(!Serial.available()){;} перед mot = Serial.read();

Это будет удерживать вашу логику до тех пор, пока не будет получен какой-либо ввод от Serial.

То же, что и перед val = Serial.read();.

,