Датчик шума (Troyka-модуль) управление микросервоприводом

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Majormaks1204, 24 авг 2016.

  1. Majormaks1204

    Majormaks1204 Нуб

    Доброго времени суток уважаемые форумчане,специалисты и начинающие!Обращаюсь к Вам за помощью,ибо "терпелка" у меня кончилась...Нахожусь в самом начале этого сложного пути,с большим жизненным опытом и крайне скудными знаниями,так что не судите строго...Стоит задача(поставлена самому себе):подключить три микро сервопривода (SG90-1 шт, FS90-2 шт.) к Arduino UNO (Amperka.ru),с целью управления вращением 2-х сервоприводов с помощью сигнала с датчика шума (Troyka-модуль),а третьим с помощью команд библиотеки "Servo.h",то есть в самостоятельном режиме.Сервоприводы,управляемые библиотекой servo,прекрасно работают(было дребезжание,поставил "Multiservo Shield",все замечательно.Датчик шума,подключенный через "Troyka Shield" к Arduino,прекрасно отрабатывает пример из Amperka ВИКИ "tooLoud" (свечение светодиода при превышении порога громкости),а так же пример из IDE "AnalogReadSerial"(выдает в серийный порт повышенные значения при фиксации шума).В общем, все по отдельности работает.Теперь самое страшное:установил Multiservo Shield на плату Arduino uno.Подвел питание к PWR+ и PWR- от импульсного блока питания 5 В,1000 мА.Подключил один сервопривод к трехпроводному контакту SVG 7,для работы в самостоятельном режиме от Multiservo Shield.Два других сервопривода подключил к SVG D7 и D8,для управления с Arduino. Датчик шума к SVG D5.Так как знания программирования на любых существующих языках, на уровне низких либо отсутствующих, собирал "с миру по нитке". Загрузилось,заработало,да не то...
    Код (C++):
    [code]
    #include <Wire.h>
    #include <Servo.h>
    #include <Multiservo.h>
    #define LOUDNESS_SENSOR_PIN 5  // Датчик громкости подключён к 5
    #define TRESHOLD            400 // Устанавливаем порог србатывания
     
     Servo arduino_servoX;
     Servo arduino_servoY;
     Multiservo multi_servo;
     
     
     void setup()
    {
      arduino_servoX.attach(7);
      arduino_servoY.attach(8);
      multi_servo.attach(7);
     
     
     
      arduino_servoX.write(0); //ставим вал под 0
      arduino_servoY.write(0); //ставим вал под 0
      multi_servo.write(0); //ставим вал под 0
    }
     
     void loop()
    {
       
       // Считаем текущее значение громкости
      int loudness = analogRead(LOUDNESS_SENSOR_PIN);
     
      // Если громкость выше пороговой..
      if (loudness > TRESHOLD)
     
       arduino_servoX.write(0); //ставим вал под 0
       delay(100); //ждем десятую секунды
       arduino_servoX.write(135); //ставим вал под 135

      delay(100); //ждем десятую секунды

       arduino_servoX.write(0); //ставим вал под 0
       
      delay(100); //ждем десятую секунды
      arduino_servoX.write(135); //ставим вал под 135

      arduino_servoY.write(0); //ставим вал под 0
      delay(100); //ждем десятую секунды
       arduino_servoY.write(90); //ставим вал под 90
      delay(100); //ждем десятую секунды
       arduino_servoY.write(0);
        delay(100); //ждем десятую секунды
       arduino_servoY.write(90); //ставим вал под 90

      multi_servo .write(0); //ставим вал под 0

     delay(10000); //ждем 10 секунд

      multi_servo.write(135); //ставим вал под 135

      delay(100); //ждем десятую секунды

      multi_servo.write(0); //ставим вал под 0

      delay(100); //ждем десятую секунды

      multi_servo.write(135); //ставим вал под 135

      delay(100); //ждем десятую секунды

      multi_servo.write(0); //ставим вал под 0

      delay(10000); //ждем 10 секунд

      multi_servo.write(135); //ставим вал под 135

      delay(100); //ждем десятую секунды
     
     
     
    }

    Сервоприводы работают согласно полученному в коде заданию,Отрабатывают установленные углы в установленные промежутки времени.На датчик шума не реагируют,вернее он на них не влияет.Сервопривод подключенный к Multiservo, как и задумано, в самостоятельном режиме все отрабатывает.Два сервопривода (задуманные как работающие от датчика),срабатывают после отработавшего свой цикл Multiservo.Догадываюсь что,не прописано как снимается сигнал с датчика и как передается на servo.А так же не правильно составлены действия для самих servo.Ведь по задумке:один сервопривод работает постоянно,два  других срабатывают по сигналу с датчика во время работы первого.У меня получается,что работают по очереди.
     Помогите пожалуйста решить данную задачу!? Кто чем сможет.
    СПАСИБО!!!
     
  2. vvr

    vvr Инженерище

    у вас в коде столько делев, что тормозить будет по полному
    а зачем для серв две бибилиотеки
    стандартной вполне достаточно
     
  3. Majormaks1204

    Majormaks1204 Нуб

    Спасибо Большое , что так быстро откликнулись!Попробовал исправить,согласно Вашему совету.Выяснилось что библиотеки нужны все.Без "servo.h" не декларируются servoX и servoY,подключенные к контактам D7,D8(т.е к arduino). Без "Multiservo.h"-сервопривод подключенный к контакту 7 Multiservo.Shield.Почему так подключил сервоприводы?Была мысля:"раз датчик шума подсоединяю к контактам arduino,то и сервоприводы управляемые им нужно подключать к контактам arduino.Как вариант попробовал с помощью dettach,задать им сначала отключенное состояние,чтоб при получении превышения порога шума,задать attach.Но так нельзя...
    Пробовал "выгрызть" что нибудь из "войны с соседом с перфоратором" и "кодового замка",от IDE одна ругань и все красное.Видимо все таки Iskra и Arduino Uno разные вещи...
     
  4. Majormaks1204

    Majormaks1204 Нуб

    Уважаемый vvr!Так пока не удалось решить задачку...Отказался от Multiservo Shielda.Так как с сервоприводами он работает,а на датчик не реагирует...может так и задумано...не критично.Подключил два сервопривода через Troyka Shield и датчик шума,за две недели наконец то "родил" скетч .
    Код (C++):
    [code]
    #include <Servo.h>
    Servo servo;
    Servo myservo;
    int threshold = 300;
    int volume;

    void setup()
    {
    Serial.begin(9600); // For debugging
    pinMode(A5, INPUT); // вход
    pinMode(8, OUTPUT);// выход
    pinMode(11,OUTPUT);//выход
    servo.attach (8); // серва из порта 8
    myservo.attach (11);// серва из 11 порта

    }

    void loop()
    {
    volume = analogRead(A5);
    Serial.println(volume);
    delay(30);

    if(volume>=threshold){
    servo.write (90); // если звук громкий то поворот на 90 градусов
    myservo.write(90);
    delay ( 200);
    servo.write (0);
    myservo.write(0);
    delay ( 200);
    }
    else{
    servo.write (0) ; // если нет звука то находится в нуле
    myservo.write(0);
    }
    }

     
    [/code]
    При одинаковых углах и задержках,все замечательно работает.Ставлю разные углы и задержки-кавардак.Так понимаю,что при малых задержках,да еще и получая сигналы от датчика,получаются накладки.А у меня еще сложнее задача:один сервопривод,получая сигналы от датчика отрабатывает углы,а второй в это время стоит в "0",и только при низком сигнале(ниже порогового),первый сервопривод встает в "0",а второй оживает,отрабатывает угол 180 с задержкой 3000 мс и встает в "0",до следующей "потери"сигнала.Вообще от одного контроллера возможно это сделать?или он не сможет разобраться?
     
  5. Vad33

    Vad33 Капитан-оригинал

    Попробуйте существенно увеличить задержки 4-10 раз.
    Добейтесь устойчивой работы. А уж потом уменьшайте.
     
  6. Majormaks1204

    Majormaks1204 Нуб

    К сожалению,это ничего не дает...Да,получил асинхронность работы сервоприводов,с одновременным началом конечно (от датчика все-таки).Получил дребезжание привода с большей задержкой.В плане практики конечно полезно...Но...но и пришел к такому выводу,что я изначально для работы второго сервопривода ориентировался на показания датчика,а мне нужно на положение привода и время,которое он занимает это положение.Т.е, сервопривод по сигналу с датчика отрабатывает углы.Сигнал пропал-встал в "0".Если находиться в этом положении более 2000 мс, второй привод поворачивается на 180 с задержкой 3000 мс и встает в "0"...и ждет следующего пришествия.Я так понимаю,что нужно создать переменную или две,записывать туда значения угла и времени с первого сервопривода.При получении нужного результата,получить действие...
    Но не могу найти подсказки,аналога,намека.Причем первый сервопривод должен работать именно так:от датчика,90 градусов,задержка 200.
     
  7. Vad33

    Vad33 Капитан-оригинал

    Вы же все сами расписали! Какие еще нужны подсказки и намеки ???
     
  8. Majormaks1204

    Majormaks1204 Нуб

    Вот за это уже СПАСИБО!!!Уважаемый Vad33!Если конечно вы не иронизируете...По крайней мере,буду знать что на верном пути и сделать это все таки возможно.На самом деле уже появилась мысля,еще одну плату подключать к этому процессу...Будем копать...Спасибо!
     
  9. Majormaks1204

    Majormaks1204 Нуб

    Всем Большое спасибо!Тему закрываю.Задача решена !