Сервопривод не хочет правильно работать с потенциометром

Тема в разделе "Arduino & Shields", создана пользователем NikitaBarinov, 8 июн 2014.

  1. NikitaBarinov

    NikitaBarinov Нерд

    Ребят, спасибо тем, кто откликнулся на прошлые мои вопросы, но у меня возник новый. Я "написал" код для сервы, чтобы он работал с потенциометром(код ниже). Как видите, серва должна поворачиваться на 180 градусов, при повороте потенциометра на все 270. Но такого не происходит. Сначала серва поворачивалась на 90 градусов, теперь же на 45. Почему так? Вот еще видео всего процесса.
    Код (Text):
    #include <Servo.h>
    #define POT_MAX_ANGLE 270.0 // макс. угол поворота потенциометра

    Servo myservo;
    void setup() {
      myservo.attach(9);
    }

    void loop() {
      int val = analogRead(A0);
      int angle = int(val / 1024.0 * POT_MAX_ANGLE);
      angle = constrain(angle, 0, 180);
      myservo.write(angle);
    }
     


    P.S. Ребят, я нубяра последний в этом деле. Данная конструкция понадобилась в мое проекте. Без нее никак, поэтому и задаю такие вопросы. Да, гуглил, ответов не нашел :(

    Да, и почему, при подключении питания, серва поворачивается на 45 градусов, а потом опять на 0?
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Начните с определения значений, выдаваемых АЦП в крайних положениях потенциометра.
    Получатся некоторые величины, назовем их условно х1 и х2. Запишите их на бумажку.
    Теперь нужно интервал [х1; х2] сместить так, чтобы он начинался с нуля, т.е. [0; х2-х1].
    Затем нужно посчитать, какое значение соответствует повороту на 1 градус.
    grad = (x2-x1)/180

    Тогда серве нужно будет передать значение, считанное с АЦП и умноженное на "цену" одного градуса.
    angle = (analogRead(PIN) - x1) * grad;

    Соответственно, в программе понадобится объявить константы х1 и grad, а х2 понадобится только при вычислении значения grad.

    Поняли смысл вычислений?
     
  3. NikitaBarinov

    NikitaBarinov Нерд

    Да, только не знаю, как правильно реализовать. Не могли бы написать код, если вам несложно?
    P.S. У потенциометра крайнии значения 0 и 1023
     
  4. NikitaBarinov

    NikitaBarinov Нерд

    Ух ты, кажется нашле ошибку
     
  5. NikitaBarinov

    NikitaBarinov Нерд

    Да, это она! У меня потенциометр подключен к напряжение 3,3, соответственно максимальное значение будет другим. Я его нашел, подставил в код, и теперь все работае! Спасибо, Megakoteyka!
    А теперь не подскажите, почему, при подключении питания, серва поворачивается на 45 градусов?
     
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    Попробуйте в setup написать myservo.write(0);
     
  7. NikitaBarinov

    NikitaBarinov Нерд

    Неа, все равно поварачивается
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Потенциометр при этом в крайнем левом положении стоит (положении минимума)?
     
  9. NikitaBarinov

    NikitaBarinov Нерд

    Да. при любом положении, он поворачивается, при подключении питания
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Тогда возвращаемся к тому, что я написал выше. Какие значения выдает АЦП в крайних положениях потенциометра?
     
  11. NikitaBarinov

    NikitaBarinov Нерд

    0 и 193
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Что-то маловато. Должно быть в идеале от 0 до 1023.
    Смотрите вот так?
    Код (Text):
    int val = analogRead(A0);
    Serial.print(val);
     
  13. NikitaBarinov

    NikitaBarinov Нерд

    Да, знаю. Я ж говорил, что у меня потенциометр подключен к 3,3 Вольтам. Хотя, сейчас сделал проверку повторно, макс. значение сейчас составляет 230
     
  14. NikitaBarinov

    NikitaBarinov Нерд

    Код (Text):
    const int analogInPin = A0;  // потенциометр
    int sensorValue = 0;        // считанное значение


    void setup() {

      Serial.begin(9600);
    }

    void loop() {

      sensorValue = readSensor(10);          

      Serial.print("sensor = " );                    
      Serial.print(sensorValue);    

      delay(50);                  
    }

    int readSensor(int samples){ // samples - сколько раз нужно прочитать сенсор
      unsigned int avg_sum=0;
      for(byte i=0;i<samples;i++){
        avg_sum+=analogRead(analogInPin);
        delay(50); // небольшая пауза между замерами
      }

      return avg_sum/samples;
    }
     
    Загружаю код^ и мониторю
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    А если напрямую почитать, то же самое получается?
     
  16. NikitaBarinov

    NikitaBarinov Нерд

    Я что-то не понял вашего ответа.
     
  17. Megakoteyka

    Megakoteyka Оракул Модератор

    Если смотреть вот так:
    int val = analogRead(A0);
    Serial.print(val);
    Что получится? Опять до 193 в максимальном положении?
    Какой потенциометр используете?
     
  18. NikitaBarinov

    NikitaBarinov Нерд

    Ам, я это дело вставил, в мониторинге ничего
     
  19. NikitaBarinov

    NikitaBarinov Нерд

    Сейчас максимально чисто от батарей 245. От кабеля - 235
     
  20. NikitaBarinov

    NikitaBarinov Нерд

    а использую я вот такой потенциометр http://www.ebay.com/itm/10pcs-B100K...754?pt=LH_DefaultDomain_0&hash=item19d5305472