РЕШЕНО Проблема с управлением сервоприводом постоянного вращения.

Тема в разделе "Arduino & Shields", создана пользователем dats, 13 май 2023.

Статус темы:
Закрыта.
  1. dats

    dats Нуб

    Здравствуйте, ввиду недостаточных познаний не понимаю как в данную программу внедрить какой-либо датчик. Необходимо чтобы после поворота сервопривод находился в ожидании сигнала с датчика (ИК, датчика освещённости).
    http://wiki.amperka.ru/articles:servo-pdm-continuous-rotation#примеры_работы_для_arduino [QUOTE
    // Библиотека с расширенными функциями для работы с Servo
    #include <AmperkaServo.h>
    // Создаём объект для работы с сервомоторами
    AmperkaServo servo;
    // Задаём имя пина, к которому подключён сервопривод
    constexpr uint8_t SERVO_PIN = 9;
    void setup() {
    servo.attach(SERVO_PIN, 544, 2400);
    }
    void loop() {
    // Задаём максимальную скорость вращения по часовой стрелке CW
    servo.writeSpeed(255);
    // Ждём 3 секунды
    delay(3000);
    // Останавливаем сервопривод
    servo.writeSpeed(0);
    // Ждём 1 секунду
    delay(1000);
    // Задаём максимальную скорость вращения против часовой стрелки CCW
    servo.writeSpeed(-255);
    // Ждём 3 секунды
    delay(3000);
    // Останавливаем сервопривод
    servo.writeSpeed(0);
    // Ждём 1 секунду
    delay(1000);
    }
    ][/QUOTE]
     
  2. Airbus

    Airbus Радиохулиган Модератор

    Все очень просто. Сначала в Вашем посте втавить правильно код.
    Далее подключить библиотеку для работы с IR датчиком. Далее в коде—если принят конкретный сигнал от IR датчика то делаем что то. Типа так
    Код (Text):
    #include "IRremote.h" // подключаем библиотеку для ик датчика

    IRrecv irrecv(5); // указываем пин, к которому подключен ик датчик
    decode_results results;

    void setup() {
       irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
       Serial.begin(9600); // подключаем Serial так для контроля
      pinMode(13,OUTPUT); // пин 13 будет выходом (англ. «output»)
    }

    void loop() {
       if (irrecv.decode(&results)) // если данные пришли выполняем команды
       {
          Serial.println(results.value); // отправляем полученные данные на порт
     
          if (results.value == 16718055) {// можно делать что угодно здеся
          digitalWrite(13,HIGH); //например включить led
       }
          if (results.value == 16724175) { // тута тоже можно делать все
          digitalWrite(13,LOW); //например выключить его нах
       }
          irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
       }
    }
     
    Последнее редактирование: 13 май 2023
    dats нравится это.
  3. dats

    dats Нуб

    Спасибо. Данный код с амперки нормально работает. По скорости и по времени включения сервы можно достаточно точно отрегулировать. её вращение на нужное число оборотов. В данную программу мне надо вписать любой датчик или кнопку. Далее я смогу понять, что надо доделать.
     
  4. dats

    dats Нуб

    Может и получится.
     
  5. dats

    dats Нуб

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

    //#include <Servo.h>
    #include <AmperkaServo.h>
    #define SERVO_PIN 9
    #define SENSOR_L_PIN 3
    #define SENSOR_R_PIN 4
    #define ANGLE_L 0
    #define ANGLE_R 0
    #define LEFT 0
    #define RIGHT 1
    AmperkaServo servo;
    Servo myservo; // create servo object to control a servo
    bool CurrentState = RIGHT;

    // S E T U P ===============
    void setup() {
    servo.attach(SERVO_PIN);
    myservo.write(ANGLE_R); // set BEFORE attach to avoid jerk
    //myservo.attach(SERVO_PIN); // attaches the servo
    pinMode(SENSOR_L_PIN, INPUT);
    pinMode(SENSOR_R_PIN, INPUT);

    servo.writeSpeed(25);
    delay(3000);
    servo.writeSpeed(0);
    } // end of setup

    // L O O P ==================
    void loop() {
    if (CurrentState == RIGHT && digitalRead(SENSOR_L_PIN) == LOW) { // LOW is ON!


    CurrentState = LEFT;
    myservo.attach(SERVO_PIN);
    myservo.write(ANGLE_L);
    delay(0);
    myservo.detach();
    servo.writeSpeed(-20);
    delay(3000);
    servo.writeSpeed(0);
    } // end if swithch

    if (CurrentState == LEFT && digitalRead(SENSOR_R_PIN) == LOW) { // LOW is ON!
    CurrentState = RIGHT;

    myservo.attach(SERVO_PIN);
    myservo.write(ANGLE_R);
    delay(0);
    myservo.detach();
    servo.writeSpeed(20);
    delay(3000);
    servo.writeSpeed(0);
    } // end if swithch
    } // end of loop
     
    Последнее редактирование модератором: 14 май 2023
Статус темы:
Закрыта.