Проблема с сервоприводами

Тема в разделе "Arduino & Shields", создана пользователем full noob, 9 июн 2016.

  1. full noob

    full noob Нуб

    Добрый день, форумчане. Прошу о помощи с моим первым проектом,так что возможны какие-то глупые вопросы.
    Имеем: штекер на джек 3,5, подключенный к ардуино, 4 сервопривода и 2 светодиода. Смысл устройства: джек подключается к источнику музыки, ардуино получает сигналы, меняет их слегка и передает в сервы, чтобы они поворачивались на разные углы, а светодиоды моргали в такт. Программа максимально простая и честно стащена с просторов интернетов, слегка измененная. Сервы, как известно, довольно прожорливы, потому подглядев один из проектов, нашла Крону и думала питать через нее. Однако, видимо, волтаж слишком велик или же еще чего, но сервы отказываются работать нормально. При подключении третей сервы они почти замирают. Одна из серв, даже если ее подключить в одиночку и вовсе просто вертит рычаг по кругу. Отсюда вопросы:
    1. Чем запитать сервы? Возможно 4 обычными батарейками?
    2. Возможно есть смысл купить какой-то шилд?
    3. Или же косяк кроется в коде? Приложу его на всякий случай.

    Буду благодарна любым рекомендациям и советам.

    Код (C++):
    /*
      Make a Servo Move to Sound.
       This example code is in the public domain.
       2012 by Cenk Özdemir
    */

    // for servo stuff we include the servo library
    #include <Servo.h>
    // creating a servo object
    Servo myservo1;
    Servo myservo2;
    Servo myservo3;
    Servo myservo4;

    // Some Varuables we need
    int ServoPinHand1 = 8;
    int ServoPinHand2 = 9;
    int ServoPinLeg1 = 10;
    int ServoPinLeg2 = 11;
    int SoundInPinLeft = A0;
    int SoundInPinRight = A1;
    int LedPin1 = 2;
    int LedPin2 = 3;
    int  val = 0;
    int  va2 = 0;
    // the setup routine runs once when you press reset:
    void setup() {
      // initialize

        myservo1.attach(ServoPinHand1);
        myservo2.attach(ServoPinHand2);
        myservo3.attach(ServoPinLeg1);
        myservo4.attach(ServoPinLeg2);
         pinMode(SoundInPinLeft, INPUT);
         pinMode(SoundInPinRight, INPUT);
         pinMode(LedPin1, OUTPUT);
         pinMode(LedPin2, OUTPUT);
    }

    // the loop routine runs over and over again forever:
    void loop() {
      // read the input on analog pin 0:
      int sensorValueLeftLeg = analogRead(SoundInPinLeft);
      int sensorValueRightLeg = analogRead(SoundInPinLeft);
      int sensorValueLeftHand = analogRead(SoundInPinRight);
      int sensorValueRightHand = analogRead(SoundInPinRight);
    // we Maop a nother value of this for LED that can be a integer betwen 0..255
      int LEDValue = map(sensorValueRightHand,0,150,0,255);
      // We Map it here down to the possible range of servo moovment.
      sensorValueLeftLeg = map(sensorValueLeftLeg,0,150,0,180);
      sensorValueRightLeg = map(sensorValueRightLeg,0,150,0,180);
      sensorValueLeftHand = map(sensorValueLeftHand,0,150,0,180);
      sensorValueRightHand = map(sensorValueRightHand,0,150,0,180);
      // note normaly the 512 is 1023 becouse of analog reading shud go so far, but i changed that to get better readings.
    myservo1.write(90);
    myservo2.write(90);
    myservo3.write(90);
    myservo4.write(90);

    // setting the servo into standard position
      int MoveDelayValueLeftHand = map(sensorValueLeftHand,0,255,0,sensorValueLeftHand);
      int MoveDelayValueRightHand = map(sensorValueRightHand,0,255,0,sensorValueRightHand);
      int MoveDelayValueLeftLeg = map(sensorValueLeftLeg,0,255,0,sensorValueLeftLeg);
      int MoveDelayValueRightLeg = map(sensorValueRightLeg,0,255,0,sensorValueRightLeg);
      // maping the same reading a little bit more down to calculate the time your servo gets to make the one Move
    if (sensorValueLeftHand > 33)
    if (sensorValueRightHand > 33)
    if (sensorValueLeftLeg > 33)
    if (sensorValueRightLeg > 33){ // to cut off some static readings only if the reading gets higher then 33 it begings to work
       delay(1);  // a static delay to smooth things out...
    // now move the servo to our mapped reading
      myservo1.write(sensorValueLeftHand);
      myservo2.write(sensorValueRightHand);
      myservo3.write(sensorValueLeftLeg);
      myservo4.write(sensorValueRightLeg);
      // turn led on with the calculated value for it
    val = analogRead(SoundInPinRight);
      analogWrite(LedPin1, val * 111);
    va2 = analogRead(SoundInPinLeft);
      analogWrite(LedPin2, va2 * 111);
             // and do that move in this delay time
     
      delay(MoveDelayValueRightHand);
       delay(MoveDelayValueLeftHand);
         delay(MoveDelayValueRightLeg);
       delay(MoveDelayValueLeftLeg);
    }// Done. now we close that part.
       // turn off the led again.
          analogWrite(LedPin1, 0);
          analogWrite(LedPin2, 0);
          // and this repeats all the time.
    }
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    никогда. Никогда. НИКОГДА! Не используйте Кроны для питания электроники.
    Аксиома. Примите как есть.
     
  3. full noob

    full noob Нуб

    Оно, может, и так. Я учту. Говорю же - видела в одной и статей подобное питание на 3 сервы, подумала, что и тут сработает. В таком случае вопрос в том, чем именно питать?
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    блок питания на 5-9 В 1А, либо 4 батарейки последовательно (чем толще, тем дольше будет работать), либо два аккумулятора 18650 последовательно.
     
  5. full noob

    full noob Нуб

    последовательно - т.е. включенные в общий отсек и подключенные к сервам, например, через макетку?
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    да
    [​IMG]
    P.S. На картинке не показано питание самой Arduino.
     
  7. full noob

    full noob Нуб

    Питание самой ардуино планируется оставить от пк, так что не страшно.
    Куплю отсек и протестирую, спасибо огромное за грамотный, понятный и столь быстрый ответ. Добра Вам.
    upd: все заработало, благодарю за помощь еще раз! и как выяснилось, одна серва тупила не просто так, а она оказалась постоянного вращения, просто продавец не удосужился это указать
     
    Последнее редактирование: 9 июн 2016