отладочный скеч. почему не работает серво?

Тема в разделе "Arduino & Shields", создана пользователем Hank Hill, 7 сен 2018.

  1. Hank Hill

    Hank Hill Нерд

    Добрый день,

    я пытаюсь создать отладочный скетч, чтобы задавая, с клавиатуры значения 1, 2, 3 или 7,8, 9, изменять положение сервопривода на 1, 5 или 10 градусов.
    т.е постоянно проверяем монитор порта. если нашли там одно из этих значений, то крутим серво и выкладываем новое положение в монитор порта.
    Ниже привожу написанный код. Он данные из порта считывает, новое положение серво обратно выкладывает, но почему-то не крутит сервомотор. Подскажите, пожалуйста, в чем ошибка.
    Правильность подключения проверил. В используемой функции cmd_mv_grab циклы прописал и через for и через while , не работает ни так, ни так.
    Код (C++):


    #include <Servo.h>


    Servo graber;  // создаем объект типа серводвигатель
                   // twelve servo objects can be created on most boards

    String str;   // создаем переменную для хранения считанного из COM порта значения

    int curr_pos ;    // variable to store current servo position
    int new_pos;   // variable to store destination servo position

    int serv_pin=10; // создаем переменную с номером пина к которому подклечен серво

    void setup() {
      Serial.begin(9600);                     // устанавливаем обмен через COM порт со скоростью 9600 бит
      graber.attach(serv_pin);               // подключаем серво к назначенному пину
      curr_pos=graber.read();          // считываем текущее положение
        Serial.print("Current position is: ");
              Serial.println(curr_pos);
        Serial.println("Waiting for command");    
    }

    void loop() {

    // проверяем, есть ли данные в COM порте, если есть , то сохраняем значение в переменную str
            if (Serial.available() > 0) {
                    // read the incoming byte:
                    str = Serial.readString();
                  if (str == "1") {  
                      new_pos=curr_pos-1;}               //уменьшаем значение на 1 единицу
                 
                  if (str == "2") {  
                  new_pos=curr_pos-5;}                  //уменьшаем значение на 5 единиц
       
                  if (str == "3") {
                  new_pos=curr_pos-15;}                  //уменьшаем значение на 15 единиц
       
                  if (str == "7") {  
                  new_pos=curr_pos+1;}                 //увеличиваем значение на 1 единицу
       
                  if (str == "8") {  
                  new_pos=curr_pos+5;}                //увеличиваем значение на 5 единиц
       
                  if (str == "9") {  
                  new_pos=curr_pos+50;}              //увеличиваем значение на 50 единиц
       
               cmd_mv_grab(str);
               }
            }
           
    void cmd_mv_grab(String str)
        {
    if (str == "1" || str == "2" || str == "3") {
      while (curr_pos>=new_pos){
                    graber.write(curr_pos);              // tell servo to go to position in variable 'pos'
                    curr_pos --;
                    delay(25);  }                     // waits 15ms for the servo to reach the position
      }                
                                   
    if (str == "7" || str == "8" || str == "9") {
      for (curr_pos = curr_pos; curr_pos <= new_pos; curr_pos += 1) { // goes from 180 degrees to 0 degrees
        graber.write(curr_pos);              // tell servo to go to position in variable 'pos'
        delay(25);                       // waits 15ms for the servo to reach the position
      }
        }              
      Serial.print("Current position is: ");
              Serial.println(curr_pos);
        curr_pos=new_pos;                        // обновляем значение переменной pos
        delay(2000);        
    }
       
                   
     
     
  2. Un_ka

    Un_ka Гуру

    А сервомашинка до этого работала то других скетчей?
     
  3. Hank Hill

    Hank Hill Нерд

    да, работоспособность и машинки, и подключения я в первую очередь проверил на заведомо рабочем скетче. Все работает
     
  4. vvr

    vvr Инженерище

    как то мудрёно вы написали, так проще
    Код (C++):
    /// ограничение поворотов сервы 10 - 170 гр

    #include <Servo.h>

    const int serv_pin = 6;

    Servo graber;

    int incomingByte = 0;
    int curr_pos = 30;

    void setup()
    {
      Serial.begin(9600);
      graber.attach(serv_pin);
    }

    void loop()
    {
      if (Serial.available() > 0)
      {
        incomingByte = Serial.read();

        if (incomingByte == '1' && curr_pos > 10)
        {
          curr_pos = curr_pos - 1;
        }

        if (incomingByte == '2' && curr_pos > 14)
        {
          curr_pos = curr_pos - 5;
        }

        if (incomingByte == '3' && curr_pos > 24)
        {
          curr_pos = curr_pos - 15;
        }

        if (incomingByte == '7' && curr_pos < 170)
        {
          curr_pos = curr_pos + 1;
        }

        if (incomingByte == '8' && curr_pos < 166)
        {
          curr_pos = curr_pos + 5;
        }

        if (incomingByte == '9' && curr_pos < 156)
        {
          curr_pos = curr_pos + 15;
        }
      }
      graber.write(curr_pos);
    }



     
     
    Hank Hill нравится это.
  5. Hank Hill

    Hank Hill Нерд

    спасибо огромное!
     
  6. corsavec

    corsavec Нерд

    Код (C++):
    #include <Servo.h>  //подключение библиотеки servo


    Servo myservo;  // создание объекта servo для управления мотором
    // на большинстве плат Arduino можно создать 12 servo объектов


    String inputString = "";         // переменная типа string для сохранения входных данных
    boolean stringComplete = false;  // флаг данные получены


    void setup() {
      myservo.attach(9); //выбираем девятый управляющий дискретный выход контроллера для управления моторчиком


      //инициализация последовательного порта:
      Serial.begin(9600);


      // получить 200 байтов и записать в переменную inputString:
      inputString.reserve(200);


      myservo.write(0); //выставляем изначальное положение серво в 0 градусов
    }


    void loop() {
      serialEvent(); //вызов нашей коммуникационной функции


      // печатаем ответ в COM-порт и поворачиваем серво на заданный угол:
      if (stringComplete) {
        Serial.println(inputString);


        myservo.write(inputString.toInt()); //задание положения серво-машинке из полученной команды


        // обнуляем строковую переменную:
        inputString = "";
        stringComplete = false;
      }
    }


    void serialEvent() {
      while (Serial.available()) {
        // получить новый байт данных:
        char inChar = (char)Serial.read();


        // добавить новый байт к строковой переменной inputString:
        inputString += inChar;


        // если входной символ является новой строкой, взвести флаг
        // что бы основной цикл обработал принятую команду:
        if (inChar == '\n') {
          stringComplete = true;
        }


      }
    }
     
    Hank Hill нравится это.
  7. corsavec

    corsavec Нерд

    Вот рабочий скетч с управлением с монитора порта