Добрый день, я пытаюсь создать отладочный скетч, чтобы задавая, с клавиатуры значения 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); }
да, работоспособность и машинки, и подключения я в первую очередь проверил на заведомо рабочем скетче. Все работает
как то мудрёно вы написали, так проще Код (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); }
Код (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; } } }