Serial порт

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем TanTall, 18 ноя 2015.

Метки:
  1. TanTall

    TanTall Нуб

    Здравствуйте. Прошу помощи. Подключил к arduino Uno модуль Troyka IMU-сенсор на 10 степеней свободы; так же подключен 3х фазный бесколлекторный двигатель управляемый ШИМ сигналом с arduino.
    ШИМ сигнал изменятся в зависимости от показаний акселерометра.
    Проблема: Система начинает работать только после открытия последовательного порта (в среде разработки) и ввода в него какой нибудь буквы; до того мотор хаотично включается и выключается не реагируя на положение акселерометра. В чем проблема?
    Код (C++):
    // библитоека для работы I²C
    #include <Wire.h>
    #include <Servo.h>
    // библиотека для работы с модулями IMU
    #include <troyka-imu.h>

    // создаём объект для работы с акселерометром
    Accelerometer accel;
    Servo motor;
    int ug=0;

    void setup()
    {
      analogReference(DEFAULT);
      // открываем последовательный порт
      Serial.begin(9600);
      motor.attach(12);
      // пока не появились данные с USB
      while (!Serial.available()) {
        // ждём
      }
      // выводим сообщение о начале инициализации
      Serial.println("Begin init...");
      // инициализация акселерометра
      accel.begin();
      // выводим сообщение об удачной инициализации
      Serial.println("Init completed");
      // устанавливаем чувствительность
      accel.setRange(RANGE_2);
    }

    void loop()
    {


      ug=accel.readX_G();
      int ug2=map(ug,10, 0, 90,0);
      motor.write(ug2);
      Serial.print(ug2);
      Serial.println("");
    }
     
  2. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Код (C++):
    // библитоека для работы I²C
    #include <Wire.h>
    #include <Servo.h>
    // библиотека для работы с модулями IMU
    #include <troyka-imu.h>

    // создаём объект для работы с акселерометром
    Accelerometer accel;
    Servo motor;
    int ug = 0;

    void setup()
    {
      analogReference(DEFAULT);
      // открываем последовательный порт
      Serial.begin(9600);
      motor.attach(12);
      // пока не появились данные с USB
      while (!Serial.available()) {
        // ждём
    // мне кажется, что тут надо что-то написать.
      }
      // выводим сообщение о начале инициализации
      Serial.println("Begin init...");
      // инициализация акселерометра
      accel.begin();
      // выводим сообщение об удачной инициализации
      Serial.println("Init completed");
      // устанавливаем чувствительность
      accel.setRange(RANGE_2);
    }

    void loop()
    {
      ug = accel.readX_G();
      int ug2 = map(ug,10, 0, 90,0);
      motor.write(ug2);
      Serial.print(ug2);
      Serial.println("");
    }
    попробуйте
     
    Последнее редактирование: 18 ноя 2015
  3. Salk

    Salk Гик

    Причина в том, что у Вас код написан так. В скетче Вы явно требуете ожидать чего-либо по USB:
    Вот тут, Вы же сами комментарий и написали:
    Код (C++):
    // пока не появились данные с USB
      while (!Serial.available()) {
        // ждём
      }
    Дальше программа не выполняется, она стоит тут, ждет любого "сообщения" по USB через Serial. Чтобы у вас программа начала сразу выполнятся и не ждала никаких данных по USB, просто удалите этот кусочек кода (выше). Так же можете удалите все, что связано с Serial, если больше не нужно отслеживать выполнение программы.

    Максимус-Бог, а что именно Вы изменили в коде? :)
     
    TanTall нравится это.
  4. TanTall

    TanTall Нуб

    Спасибо!
     
  5. Максимус-Бог

    Максимус-Бог Убийца матрёшек

    Я синтаксис немного изменил.