Сервопривод, работающий при хлопке

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем gepard, 14 окт 2012.

  1. gepard

    gepard Нуб

    Надо чтобы серва поворачивалась при хлопке, и чтобы поворачивалась в другую сторону при повторном хлопке. А у меня она просто крутится в разные стороны:)

    #include <Servo.h>
    Servo v;
    int servopin = 9;
    int mic =5;
    boolean run = false;
    void setup()
    {
    Serial.begin(9600);
    v.attach(servopin);
    }
    void loop()
    {
    Serial.println(analogRead(mic));
    delay(1000);
    int val = analogRead(mic);
    if ((val >= 100) && run == false)
    {
    v.write(180);
    run = !run;
    delay(1000);
    }
    if ((val >=2) && run == true)
    {
    v.write(o);
    run = !run;
    delay(1000);
    }
     
  2. Unixon

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

    И правильно делает, что крутится. У вас же условия поворота влево и вправо одновременно выполняются, первый if создает все условия для срабатывания второго.
     
  3. gepard

    gepard Нуб

    Спасибо. А как это исправить? delay поставить?
     
  4. Unixon

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

    Логику работы нужно исправлять. Ну представьте себя микроконтроллером и попытайтесь выполнить эту программу пошагово, сразу увидите неладное :)

    Ну, смотрите:

    изначально run==false

    int val = analogRead(mic);

    допустим мы прочитали val >= 100, тогда
    вот этот кусок сработает

    if ((val >= 100) && run == false)
    {
    v.write(180);
    run = !run;
    delay(1000);
    }

    после него будет run==true и серва повернута в одну сторону
    и тут же сработает второй кусок, т.к. первый поменял run и оставил val как есть

    if ((val >=2) && run == true)
    {
    v.write(o);
    run = !run;
    delay(1000);
    }

    и серва тут же повернется в обратную сторону.
     
  5. Unixon

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

    На самом деле, вы хотели сделать что-о подобное:

    Код (Text):

    #include <Servo.h>
     
    Servo v;
    int servopin = 9;
    int mic =5;
    boolean run = false;
     
    void setup()
    {
     Serial.begin(9600);
     v.attach(servopin);
    }
     
    void loop()
    {
     int val = analogRead(mic);
     Serial.println(val);
     if (val >= 100)
     {
      run = !run;
      delay(1000);
      if (run)
      {
       v.write(180);
      }
      else
      {
       v.write(0);
      }
     }
     delay(100);
    }
     
     
  6. gepard

    gepard Нуб

    Спасибо!
     
  7. gepard

    gepard Нуб

    А как понять эту кнструкцию? Получается что если val>= 0, сначало run cтанет true, потом выполнится первое действие. А при повторении цикла run станет false и все равно будет выполнятся первое дейтвие?
    Объясните пожалуйти нубу)
    if (val >= 100)
    {
    run = !run;
    delay(1000);
    if (run)
    {
    v.write(180);
    }
    else
    {
    v.write(0);
    }
     
  8. Unixon

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

    Из вашего исходника я понял, что переменная run содержит состояние "вкл"-"выкл". Если это не так, прошу прокомментировать предназначение этой переменной.
     
  9. gepard

    gepard Нуб

    Спасибо! я сделал:
    Код (Text):
    #include <Servo.h>
     
     
    Servo v;
    int servopin = 9;
    int mic =5;
    boolean run = 0;
    void setup()
    {
    Serial.begin(9600);
    v.attach(servopin);
    }
     
    void loop()
    { int val = analogRead(mic);
        Serial.println(val);
        delay(10);
      if (val>=200)
      switch (run) {
        case 0:
        v.write(180);
        run=!run;
        break;
        delay(1000);
        case 1:
        v.write(0);
        run=!run;
        delay(100);
        break;
      }
    }

    Еще один вопрос)) Можно ли как стабилизировать микрофон, а то после врашение сарва, значение микрофона подымается?
     
  10. Код (Text):
    Можно ли как стабилизировать микрофон, а то после врашение сарва, значение микрофона подымается?
    Дык значение микрофона и должно подниматься, ведь серва-то жужжит - издаёт звук! :)