Официальный сайт компании Arduino по адресу arduino.cc
Управление двумя двигателями в разных режимах. Помогите найти ошибку
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Есть два мотора, подключенных к ардуино. Нужно обучить их работать по 4 разным алгоритмам при отправке на вход определенных кодов. Написал прогу, но компилятор ругается. Не могразобраться в чем проблема. С программированием начал разбираться несколько дней назад, поэтому если ответы будут в формате "для чайника")
Компилятор вот что говорит:
5: error: expected constructor, destructor, or type conversion before ';' token
motorOnThenOff();
АНАЛОГИЧНО ДЛЯ СТРОК 7, 8, 9
In function 'void loop()':
37: error: a function-definition is not allowed here before '{' token
void serialSpeed() {
АНАЛОГИЧНО ДЛЯ СТРОК 44, 51, 67, 87
63: error: 'motorPin1' was not declared in this scope
digitalWrite(motorPin1, LOW); // выключить мотор
114: error: expected '}' at end of input
} // закрытие циклической функции loop
114: error: expected '}' at end of input
114: error: expected '}' at end of input
exit status 1
expected constructor, destructor, or type conversion before ';' token
int MotorPin1 = 9; // объявление переменной для первого мотора int MotorPin2 = 8; // объявление переменной для второго мотора int val; // переменная для хранения значения, присылаемого в Serial void setup() { Serial.begin(9600); // инициализируем Serial порт на работу со скоростью 9600 бод pinMode(MotorPin1, OUTPUT); // установка пина мотора 1 как выходного pinMode(MotorPin2, OUTPUT); // установка пина мотора 2 как выходного } void loop() { motorOnThenOff(); motorOnThenOffWithSpeed(); motorAcceleration(); serialSpeed(); if (Serial.available() > 0) { // если что-то пришло в Serial-порт val = Serial.parseInt(); // то записать это значение в переменную val /* значения (номер мотора|номер режима|состояние выхода): 111/110 - вкл/выкл 1 мотора в режим Вибро 121/120 - вкл/выкл 1 мотора в режим Пульс 131/130 - вкл/выкл 1 мотора в режим Пульс+ 141/140 - вкл/выкл 1 мотора в режим Волна 211/210 - вкл/выкл 2 мотора в режим Вибро 221/220 - вкл/выкл 2 мотора в режим Пульс 231/230 - вкл/выкл 2 мотора в режим Пульс+ 241/240 - вкл/выкл 2 мотора в режим Волна */ switch (val) { // проверяем содержимое val case 111: // если пришел код 111 void serialSpeed() { int Speed111 = 230; // скорость мотора (0-255) analogWrite(motorPin1, Speed111); // включаем мотор на скорости «Speed111» } break; // выход из switch case 110: // -------/------- 110 void serialSpeed() { int Speed110 = 0; // скорость мотора (0-255) analogWrite(motorPin1, Speed110); // включаем мотор на скорости «Speed110» } break; // выход из switch case 121: // -------/------- 121 void motorOnThenOff() { int onTime121 = 100; // миллисекунд для вращения мотора int offTime121 = 100; // миллисекунд для простаивания мотора digitalWrite(motorPin1, HIGH); // включить мотор — максимальная скорость delay(onTime121); // задержка, для продолжения вращения digitalWrite(motorPin1, LOW); // выключить мотор delay(offTime121); // задержка, для простаивания мотора } break; // выход из switch case 120: digitalWrite(motorPin1, LOW); // выключить мотор break; // выход из switch case 131: void motorOnThenOffWithSpeed() { int Speed1311 = 230; // скорость «Speed1» 0 (остановка), 255 (полный ход) int Time1311 = 2000; // время «Time1» в миллисекундах int Speed1312 = 120; // скорость «Speed2» 0 (остановка), 255 (полный ход) int Time1312 = 2000; // время «Time2» в миллисекундах analogWrite(motorPin1, Speed1311); // включаем мотор на скорости «Speed1» delay(Time1311); // продолжаем вращение заданное время analogWrite(motorPin1, Speed1312); // включаем мотор на скорость «Speed2» delay(Time1312); // продолжаем, заданное время «Time2» } break; // выход из switch case 130: digitalWrite(motorPin1, LOW); // выключить мотор break; // выход из switch case 141: void motorAcceleration() { int speed; int delayTime = 10; // пауза между шагом увеличения скорости for (speed = 0; speed <= 255; speed++) { // шаг, увеличение на единицу analogWrite(motorPin1, speed); // установка новой скорости delay(delayTime); // пауза } for (speed = 255; speed >= 0; speed--) { analogWrite(motorPin, speed); // установка новой скорости delay(delayTime); // пауза } } break; // выход из switch case 140: digitalWrite(motorPin1, LOW); // выключить мотор break; // выход из switch /* аналогичный блок для второго мотора */ } } // закрытие if } // закрытие циклической функции loop
Благодаря Гуглу есть подозрение что дело во вложенных функциях. Если это так, то каким образом можно развести эту схему?
Можно узнать, это Вы сами все сочинили или подсмотрели где-то?
Зачем Вам эти вложенные функции, просто выполнять код в case не достаточно?
Если Вы пользуетесь Arduino IDE, то включите в настройках русский язык интерфейса, что бы ошибки и предупреждения были на русском.
Написал прогу,
С прогами всегда так. В следующий раз программу пишите.
каким образом можно развести эту схему?
ПРочитайте любую книгу по языку, на котором Вы пытаетесь писать, прежде чем что-то писать и тем более задавать вопросы.
Списко книг нужен или сами нагуглите?
Можно узнать, это Вы сами все сочинили или подсмотрели где-то?
Зачем Вам эти вложенные функции, просто выполнять код в case не достаточно?
Если Вы пользуетесь Arduino IDE, то включите в настройках русский язык интерфейса, что бы ошибки и предупреждения были по-русски.
Это творчество сочинено наполовину. За основу было взято несколько примеров из сети и на их базе состряпан этот. Со своим скудным багажом знаний пока не готов с чистого листа проги писать)
Насчет выполнения кода в case можно поподробнее? Я бы с удовольствием упростил эту "простыню".
Наверно логика понятна, что хотел изобразить: на вход идет трехзначное число, где первая цифра - номер мотора, вторая - режим работы, третья - состояние (вкл/выкл), case сравнивает входящий код и включает тот или иной режим.
Переключил на русский, но по-прежнему сами ошибки пишет на английском.
ПРочитайте любую книгу по языку, на котором Вы пытаетесь писать, прежде чем что-то писать и тем более задавать вопросы.
Списко книг нужен или сами нагуглите?
Я только и делаю всю неделю, что читаю книжки и смотрю видео с объяснениями. Однако прочитать и понять это разные вещи. То что в этом скетче написано для знающих может быть плевым делом, а мне далось с большим трудом. Уже несколько дней не могу разобраться в проблеме, поэтому и обратился за помощью. Буду благодарен, если кто-то даст дельный совет
Буду благодарен, если кто-то даст дельный совет
Самый дельный совет - прочитать книжку. Не смотреть видео, а именно спокойно прочитать книжку.
Тогда хотя бы подскажите в какой именно книжке посмотреть и в какую сторону копать? И предположение насчет вложенных функций (что их не должно быть) верное?
Встроенных функций здесь вообще не бывает (нечто подобное есть в последних стандартах, но не так и не для этого, не берите в голову, считайте, что их не бывает).
Книжка - http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
Встроенных функций здесь вообще не бывает (нечто подобное есть в последних стандартах, но не так и не для этого, не берите в голову, считайте, что их не бывает).
Книжка - http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf
спасибо, ухожу во взрывание собственного мозга программированием еще на неделю
motorPin1 и MotorPin1 - это две совершено разные переменные....
И поэтому :
int MotorPin1 = 9;
digitalWrite(motorPin1, LOW);
motorPin1' was not declared in this scope
Блин, точно, невнимательность. Спасибо, поправлю. Минус одна ошибка
097 analogWrite(motorPin, speed); // установка новой скорости
motorOnThenOff();
motorOnThenOffWithSpeed();
motorAcceleration();
serialSpeed();
Читайте : http://arduino.ru/Reference/FunctionDeclaration
Насчет выполнения кода в case можно поподробнее? Я бы с удовольствием упростил эту "простыню".
Кстати, переменные типа SpeedXXX, onTimeXXX, offTimeXXX и т. п., можно убрать из кода, а вместо них передавать в функции числовые значения.
Моторы управляются по отдельности или оба вместе? Если вместе, то просто после вызова digitalWrite(motorPin1, ...) добавте digitalWrite(motorPin2, ...).
097 analogWrite(motorPin, speed); // установка новой скорости
+
motorOnThenOff();
motorOnThenOffWithSpeed();
motorAcceleration();
serialSpeed();
Читайте : http://arduino.ru/Reference/FunctionDeclaration
пол часа пытался въехать в то, что написано по ссылке - не смог... много раз перечитал, но так и не понял для чего повторно записывается функция, если результат еще в первом проходе цикла уже получен. похоже это как раз и есть затык, понимание которого прольет свет на ошибки в исходном скетче
Кстати, переменные типа SpeedXXX, onTimeXXX, offTimeXXX и т. п., можно убрать из кода, а вместо них передавать в функции числовые значения.
Моторы управляются по отдельности или оба вместе? Если вместе, то просто после вызова digitalWrite(motorPin1, ...) добавте digitalWrite(motorPin2, ...).
По нескольким причинам выносил переменные: код проще для восприятия показался в таком виде, так же будет необходимость менять эти значения для коррекции работы режимов. В таком формате показалось проще их будет найти. Ну и совсем высший пилотаж для меня - вывести регулировку этих значений (пока даже в мыслях нет как это реализовывать, разобраться бы со статическими значениями)
Моторы управляются раздельно и в произвольных сочетаниях, поэтому для второго двигателя планировался аналогичный блок с другими кодами для управления