Помогите камрады.

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Max_spacer, 1 мар 2017.

  1. Max_spacer

    Max_spacer Нуб

    Ребята,помогите пожалуйста новичку.есть уно и пять сервоприводов.Необходимо чтобы каждые 10 секунд срабатывало два серва,потом еще два через 20сек а последний серв каждые 15сек.Ну плюс желательно с разной скоростью каждая пара.

    нагуглив я нашел вроде бы код,дополнил его,но по нему все срабатывают одновременно.
    Код (C++):
    #include <Servo.h>
    class Flasher
    {
      // Переменные - члены класса
      // Инициализируются при запуске
      int ledPin; // номер пина со светодиодом
      long OnTime; // время включения в миллисекундах
      long OffTime; // время, когда светодиод выключен
      // Текущее состояние
      int ledState; // состояние ВКЛ/ВЫКЛ
      unsigned long previousMillis; // последний момент смены состояния
      // Конструктор создает экземпляр Flasher и инициализирует
      // переменные-члены класса и состояние
      public:
      Flasher(int pin, long on, long off)
      {
        ledPin = pin;
        pinMode(ledPin, OUTPUT);
        OnTime = on;
        OffTime = off;
        ledState = LOW;
        previousMillis = 0;
      }
      void Update()
      {
        // выясняем не настал ли момент сменить состояние светодиода
        unsigned long currentMillis = millis(); // текущее время в миллисекундах
        if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
        {
          ledState = LOW; // выключаем
          previousMillis = currentMillis; // запоминаем момент времени
          digitalWrite(ledPin, ledState); // реализуем новое состояние
        }
        else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
        {
          ledState = HIGH; // выключаем
          previousMillis = currentMillis ; // запоминаем момент времени
          digitalWrite(ledPin, ledState); // реализуем новое состояние
        }
      }
    };
    class Sweeper
    {
      Servo servo; // сервопривод
      int pos; // текущее положение сервы
      int increment; // увеличиваем перемещение на каждом шаге
      int updateInterval; // промежуток времени между обновлениями
      unsigned long lastUpdate; // последнее обновление положения
      int upwait;
      public:
      Sweeper(int interval,int wait)
      {
        updateInterval = interval;
        increment = 1;
        upwait = wait;
      }
      void Attach(int pin)
      {
        servo.attach(pin);
      }
      void Detach()
      {
        servo.detach();
      }
      void Update()
      {
        if((millis() - lastUpdate) > updateInterval) // время обновлять
        {
          lastUpdate = millis();
          pos += increment;
          servo.write(pos);
          Serial.println(pos);
          if ((pos >= 100) || (pos <= 0)) // конец вращения
          {
            delay(upwait);
            // обратное направление
            increment = -increment;
          }
        }
      }
    };

    Flasher led3(13, 200, 222);

    Sweeper sweeper1(20,5000);
    Sweeper sweeper2(20,10000);
    Sweeper sweeper3(20,10000);
    Sweeper sweeper4(20,20000);
    Sweeper sweeper5(20,20000);

    void setup()
    {
      Serial.begin(9600);
    sweeper1.Attach(6);
    sweeper2.Attach(10);
    sweeper3.Attach(9);
    sweeper4.Attach(8);
    sweeper5.Attach(7);
    }
    void loop()
    {

     sweeper1.Update();
    sweeper2.Update();
    sweeper3.Update();
    sweeper4.Update();
    sweeper5.Update();
      led3.Update();
    }
    по темам пошарив не наткнулся.
    тыкните ежель пропустил где то
    Спасибо за любую помощь.
     
  2. rkit

    rkit Гуру

    Пропустили написание кода, который делает то, что вам надо? Тут ничего даже близкого нету.
     
  3. Max_spacer

    Max_spacer Нуб

    это код был который их всех вместе двигал.
    сейчас я такой вот сделал но он не компилиться
    на 49 строке- в серво,апдейт
    exit status 1
    '((Cl_servo*)this)->Cl_servo::servo' does not have class type


    code=cpp]
    Код (Text):

    #include <Servo.h>


    class Cl_servo {
      public:
        Servo servo(byte _pin, int _time_run, int _time_stop); // сервопривод
        void setup();
        void loop();
      private:
        byte pin;
        bool run;// 1 движемся    /0 стоим
        int time_run; // в
        int time_stop;
        int pos; // текущее положение сервы
        int pos_step = 1; // увеличиваем перемещение на каждом шаге
        unsigned long past = 0; // последнее обновление положения
        unsigned long past_step = 0; // последнее обновление положения
        int time_step = 100; // промежуток времени между обновлениями


    Cl_servo::Cl_servo(byte _pin, int _time_run, int _time_stop) {
      pin = _pin;
      time_run = _time_run;
      time_stop = _time_stop;
      pos_step = 1;
    }

    void Cl_servo::setup(int pin) {
      servo.attach(pin);
    }

    void Cl_servo::Update() {
      if (!run  && millis() - past >= time_stop) {
        run = 1;
        past = millis();
      }
      if (run) {
        if (millis() - past >= time_run) {
          run = 0;
          past = millis();
        }
        else if (millis() - past_step >= time_step) { // время обновлять
          past_step = millis();
          pos += pos_step;
          if (pos >= 100 || pos <= 0) {
            pos_step = - pos_step;
            pos += pos_step;
          }
          servo.write(pos);
          Serial.println(pos);
        }
      }
    }
    };

    // #1 сервы
    const byte servo1_pin = 2;
    const byte servo2_pin = 3;
    const byte servo3_pin = 4;
    const byte servo4_pin = 5;
    const byte servo5_pin = 6;
    Cl_servo Device1(servo1_pin, 5000, 20);
    Cl_servo Device2(servo2_pin, 10000, 20);
    Cl_servo Device3(servo3_pin, 10000, 20);
    Cl_servo Device4(servo4_pin, 20000, 20);
    Cl_servo Device5(servo5_pin, 20000, 20);

    void setup() {
      Serial.begin(9600);
      // #1 сервы
      Device1.setup();
      Device2.setup();
      Device3.setup();
      Device4.setup();
      Device5.setup();
    }

    void loop() {
      // #1 сервы
      Device1.Update();
      Device2.Update();
      Device3.Updatep();
      Device4.Update();
      Device5.Updatep();
    }
     
    [/code]
     
    Последнее редактирование: 1 мар 2017
  4. mcureenab

    mcureenab Гуру

    В объявлении класса заявлены три функции:
    Код (C++):
    class Cl_servo {
      public:
        Servo servo(byte _pin, int _time_run, int _time_stop); // сервопривод
        void setup();
        void loop();
    Ни одна из них не реализована. Даже функция setup объявлена без параметра, а реализована с параметром

    Код (C++):
    void Cl_servo::setup(int pin) {
    Остальные реализации функций не объявлены в спецификации.

    Код (C++):
    Cl_servo::Cl_servo(byte _pin, int _time_run, int _time_stop) {
    Код (C++):
    void Cl_servo::Update() {
    В функции loop прописаны вызовы двух методов при том что Updatep вообще никак не описан

    Код (C++):
      Device2.Update();
      Device3.Updatep();