Управление двумя двигателями в разных режимах. Помогите найти ошибку

workspace
Offline
Зарегистрирован: 04.10.2016

Есть два мотора, подключенных к ардуино. Нужно обучить их работать по 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

 

workspace
Offline
Зарегистрирован: 04.10.2016

Благодаря Гуглу есть подозрение что дело во вложенных функциях. Если это так, то каким образом можно развести эту схему?

fogary
Offline
Зарегистрирован: 05.03.2016

Можно узнать, это Вы сами все сочинили или подсмотрели где-то?

Зачем Вам эти вложенные функции, просто выполнять код в case не достаточно?

Если Вы пользуетесь Arduino IDE, то включите в настройках русский язык интерфейса, что бы ошибки и предупреждения были на русском.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

workspace пишет:

Написал прогу,

С прогами всегда так. В следующий раз программу пишите.

workspace пишет:

каким образом можно развести эту схему?

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

Списко книг нужен или сами нагуглите?

workspace
Offline
Зарегистрирован: 04.10.2016

fogary пишет:

Можно узнать, это Вы сами все сочинили или подсмотрели где-то?

Зачем Вам эти вложенные функции, просто выполнять код в case не достаточно?

Если Вы пользуетесь Arduino IDE, то включите в настройках русский язык интерфейса, что бы ошибки и предупреждения были по-русски.

Это творчество сочинено наполовину. За основу было взято несколько примеров из сети и на их базе состряпан этот. Со своим скудным багажом знаний пока не готов с чистого листа проги писать)

Насчет выполнения кода в case можно поподробнее? Я бы с удовольствием упростил эту "простыню".

Наверно логика понятна, что хотел изобразить: на вход идет трехзначное число, где первая цифра - номер мотора, вторая - режим работы, третья - состояние (вкл/выкл), case сравнивает входящий код и включает тот или иной режим.

Переключил на русский, но по-прежнему сами ошибки пишет на английском.

workspace
Offline
Зарегистрирован: 04.10.2016

ЕвгенийП пишет:

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

Списко книг нужен или сами нагуглите?

Я только и делаю всю неделю, что читаю книжки и смотрю видео с объяснениями. Однако прочитать и понять это разные вещи. То что в этом скетче написано для знающих может быть плевым делом, а мне далось с большим трудом. Уже несколько дней не могу разобраться в проблеме, поэтому и обратился за помощью. Буду благодарен, если кто-то даст дельный совет

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

workspace пишет:

 Буду благодарен, если кто-то даст дельный совет

Самый дельный совет - прочитать книжку. Не смотреть видео, а именно спокойно прочитать книжку.

workspace
Offline
Зарегистрирован: 04.10.2016

Тогда хотя бы подскажите в какой именно книжке посмотреть и в какую сторону копать? И предположение насчет вложенных функций (что их не должно быть) верное?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Встроенных функций здесь вообще не бывает (нечто подобное есть в последних стандартах, но не так и не для этого, не берите в голову, считайте, что их не бывает).

Книжка - http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

workspace
Offline
Зарегистрирован: 04.10.2016

ЕвгенийП пишет:

Встроенных функций здесь вообще не бывает (нечто подобное есть в последних стандартах, но не так и не для этого, не берите в голову, считайте, что их не бывает).

Книжка - http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

спасибо, ухожу во взрывание собственного мозга программированием еще на неделю

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

motorPin1 и MotorPin1 - это две совершено разные переменные....

И поэтому  :

int MotorPin1 = 9;

digitalWrite(motorPin1, LOW);

motorPin1' was not declared in this scope

workspace
Offline
Зарегистрирован: 04.10.2016

trembo пишет:
motorPin1 и MotorPin1 - это две совершено разные переменные....

Блин, точно, невнимательность. Спасибо, поправлю. Минус одна ошибка

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

097 analogWrite(motorPin, speed); // установка новой скорости

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

  motorOnThenOff();
  motorOnThenOffWithSpeed();
  motorAcceleration();
  serialSpeed();

Читайте :   http://arduino.ru/Reference/FunctionDeclaration

fogary
Offline
Зарегистрирован: 05.03.2016

workspace пишет:

Насчет выполнения кода в case можно поподробнее? Я бы с удовольствием упростил эту "простыню".

void loop() {
    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
        int Speed111 = 230;                 // скорость мотора (0-255)
        analogWrite(motorPin1, Speed111);   // включаем мотор на скорости «Speed111»
        break;                                // выход из switch
      case 110:                               // -------/------- 110
        int Speed110 = 0;                   // скорость мотора (0-255)
        analogWrite(motorPin1, Speed110);   // включаем мотор на скорости «Speed110»
        break;                                // выход из switch
      case 121:                               // -------/------- 121
        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:
        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:
        int speed;
        int delayTime = 10;                       // пауза между шагом увеличения скорости
        for (speed = 0; speed <= 255; speed++) {  // шаг, увеличение на единицу
          analogWrite(motorPin1, speed);          // установка новой скорости
          delay(delayTime);                       // пауза
        }
        for (speed = 255; speed >= 0; speed--) {
          analogWrite(motorPin1, speed);           // установка новой скорости
          delay(delayTime);                       // пауза
        }
        break;                                      // выход из switch
      case 140:
        digitalWrite(motorPin1, LOW);           // выключить мотор
        break;                                  // выход из switch
    }
  }                                           // закрытие if
}                                             // закрытие циклической функции loop

Кстати, переменные типа SpeedXXX, onTimeXXX, offTimeXXX и т. п., можно убрать из кода, а вместо них передавать в функции числовые значения.

Моторы управляются по отдельности или оба вместе? Если вместе, то просто после вызова digitalWrite(motorPin1, ...) добавте digitalWrite(motorPin2, ...).

workspace
Offline
Зарегистрирован: 04.10.2016

trembo пишет:

097 analogWrite(motorPin, speed); // установка новой скорости

+

trembo пишет:

  motorOnThenOff();
  motorOnThenOffWithSpeed();
  motorAcceleration();
  serialSpeed();

Читайте :   http://arduino.ru/Reference/FunctionDeclaration

пол часа пытался въехать в то, что написано по ссылке - не смог... много раз перечитал, но так и не понял для чего повторно записывается функция, если результат еще в первом проходе цикла уже получен. похоже это как раз и есть затык, понимание которого прольет свет на ошибки в исходном скетче

 

fogary пишет:

Кстати, переменные типа SpeedXXX, onTimeXXX, offTimeXXX и т. п., можно убрать из кода, а вместо них передавать в функции числовые значения.

Моторы управляются по отдельности или оба вместе? Если вместе, то просто после вызова digitalWrite(motorPin1, ...) добавте digitalWrite(motorPin2, ...).

По нескольким причинам выносил переменные: код проще для восприятия показался в таком виде, так же будет необходимость менять эти значения для коррекции работы режимов. В таком формате показалось проще их будет найти. Ну и совсем высший пилотаж для меня - вывести регулировку этих значений (пока даже в мыслях нет как это реализовывать, разобраться бы со статическими значениями)

Моторы управляются раздельно и в произвольных сочетаниях, поэтому для второго двигателя планировался аналогичный блок с другими кодами для управления