Помогите объединить два и более скетчей в один

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем CasperSimfer, 7 дек 2014.

  1. roni

    roni Нерд

    вот как работает с этом скеча

    Код (C++):
    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода


    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник
     
      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)
     
      myservo.write(10); // указываем первоначальный угол первый сервопривода
                     
    }

    void loop() {
      if(irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if(results.value == 0xFD00FF) {
          if(o_c == 1) { // если забрало открыто(переменная o_c = 1), то...
            myservo.write(100); // ...меняем угол поворота первого сервопривода...
            delay(90);
            myservo.write(90);
             delay(90);        
             myservo.write(80);
             delay(90);
             myservo.write(70);
             delay(90);
             myservo.write(60);
             delay(90);                      
             myservo.write(50);
             delay(90);
             myservo.write(40);
             delay(90);                      
             myservo.write(30);
             delay(90);
             myservo.write(20);
             delay(90);
             myservo.write(10);
            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
             myservo.write(10); // меняем угол поворота первого сервопривода...
             delay(100);
             myservo.write(20);
             delay(100);
             myservo.write(30);
             delay(100);        
             myservo.write(40);
             delay(100);
             myservo.write(50);
             delay(100);
             myservo.write(60);
             delay(100);                      
             myservo.write(70);
             delay(100);
             myservo.write(80);
             delay(100);                      
             myservo.write(90);
             delay(100);
             myservo.write(100);
             delay(100);
             myservo.write(110);
            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
        irrecv.resume(); // продолжаем принимать коды с ИК-приемника
      }
    }
     
  2. roni

    roni Нерд

    пробуи добавить сюда этот скечь или чевото подобное
    Код (C++):
    #include <IRremote.h> // это скачанная библиотека

    int RECEIVE_PIN = 11; //вход ИК приемника

    IRrecv irrecv(RECEIVE_PIN);

    decode_results results;

    //eventTime, для паузы, вместо delay,будем использовать функцию millis.

    unsigned long eventTime=0;

    //индикация таймера

    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.


    void setup(){

    irrecv.enableIRIn(); // включить приемник

    pinMode(L13, OUTPUT); // назначаем пины как выходы


    pinMode(timer, OUTPUT);

    }

    void loop() {



    if (digitalRead(RECEIVE_PIN) == LOW)

    // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);

    eventTime=millis(),digitalWrite(timer, HIGH);

    // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)

    if(millis()-eventTime>100) digitalWrite(timer, LOW)

    // и вЫключаем все

    ,digitalWrite(L13, LOW);



    if (irrecv.decode(&results)) {


    if (results.value == 0xFD807F && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH);



    irrecv.resume();

    }

    }
     
  3. Alex19

    Alex19 Гуру

    День добрый, освободился раньше.
    Вот код
    Код (C++):

    /*
       IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
       An IR detector/demodulator must be connected to the input RECV_PIN.
       Version 0.1 July, 2009
       Copyright 2009 Ken Shirriff
       http://arcfn.com
    */


    #include <IRremote.h>
    #include <Servo.h>

    int RECV_PIN = 11;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    Servo myservo; // переменная для первого сервопривода

    //eventTime, для паузы, вместо delay,будем использовать функцию millis.
    unsigned long eventTime=0;

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    int RECEIVE_PIN = 11; //вход ИК приемника
    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd);

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          Serial.println(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          Serial.println(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }

    void setup()
    {
      Serial.begin(115200);

      irrecv.enableIRIn(); // Start the receiver

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

      pinMode(L13, OUTPUT);
      pinMode(timer, OUTPUT);
    }

    void loop() {
      if (irrecv.decode(&results))
      {
        if (results.value == 0xFDA857 && stepCycle == 0)
        { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH))
        {
          digitalWrite(L13, HIGH);
        }
     
        irrecv.resume();
      }


      if (digitalRead(RECEIVE_PIN) == LOW)
      {
        // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
        eventTime = millis();

        digitalWrite(timer, HIGH);
      }

      // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
      if (millis() - eventTime > 100)
      {
        digitalWrite(timer, LOW);
        digitalWrite(L13, LOW);
      }

      if (stepCycle > 0)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);
      }
    }
     
    Использовал Arduino Mega, мой код отличается от этого, только другими значениями от пульта серва на другом пине. В коде Ваши параметры, 4 пин серва и коды кнопок из примеров. Скетч работает, так же как 2 в отдельности.

    Так же сохранилось странное поведение 1 скетча, как у Вас в оригинале. В начале выставляем на серву 10, потом получаем первую команду, а так как у Вас выставлено o_c в 1, то подаем 100 и уменьшаем до 10. Для последующих все нормально, зачем так сделано не знаю, но полагаю смысл есть, ведь так работает Ваш код с delay.
     

    Вложения:

  4. roni

    roni Нерд

    привет алех :) сеичяс загружу скеч и пробую пушку как будет работать
     
  5. roni

    roni Нерд

    ПРИВЕТ АЛЕХ ! ЗАГРУЗИЛ СКЕЧ ПУШКА ПОДНИМАЕТСЯ И ОТПУСКАЕТСЯ НОРМАЛИНО НО НЕ СТРЕЛЯЕТ:( ТЫ ПРАВ ПРО (странное поведение 1 скетча, как у Вас в оригинале. В начале выставляем на серву 10, потом получаем первую команду, а так как у Вас выставлено o_c в 1, то подаем 100 и уменьшаем до 10)

    ПОЖАЛУСТА МОЖНО УБРАТЬ СТРАНОЕ ПОВЕДЕНИЕ И РЕШАТЬ ПРОБЛЕМУ НА ВТОРОИ КНОПКЕ ПРИ НОЖАТИЕ ЧТОБ ПУШКА СТРЕЛЯЛА
     
  6. roni

    roni Нерд

    Код (C++):
     Serial.begin(9600);
     
  7. roni

    roni Нерд

    Код (C++):
    *
       IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
       An IR detector/demodulator must be connected to the input RECV_PIN.
       Version 0.1 July, 2009
       Copyright 2009 Ken Shirriff
       http://arcfn.com
    */

    #include <IRremote.h>
    #include <Servo.h>

    int RECV_PIN = 11;

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    Servo myservo; // переменная для первого сервопривода

    //eventTime, для паузы, вместо delay,будем использовать функцию millis.
    unsigned long eventTime=0;

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    int RECEIVE_PIN = 11; //вход ИК приемника
    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd);

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          Serial.println(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          Serial.println(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }

    void setup()
    {
      Serial.begin(9600);

      irrecv.enableIRIn(); // Start the receiver

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

      pinMode(L13, OUTPUT);
      pinMode(timer, OUTPUT);
    }

    void loop() {
      if (irrecv.decode(&results))
      {
        if (results.value == 0xFD00FF && stepCycle == 0)
        { // если была нажата кнопка с кодом FD00FF, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH))
        {
          digitalWrite(L13, HIGH);
        }
        irrecv.resume();
      }


      if (digitalRead(RECEIVE_PIN) == LOW)
      {
        // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
        eventTime = millis();

        digitalWrite(timer, HIGH);
      }

      // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
      if (millis() - eventTime > 100)
      {
        digitalWrite(timer, LOW);
        digitalWrite(L13, LOW);
      }

      if (stepCycle > 0)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);
      }
    }
     
  8. Alex19

    Alex19 Гуру

    Что значит не стреляет, 13 пин загорается и горит когда кнопка нажата?
    На этот пин вешаем реле или что Вы используете. Если 13 пин не загорается, то нужно проверить код кнопки, в коде он 0xFD807F.

    Тут все просто меняем o_c на 0.

    Разницы нет, так как в коде это не используется.
     
  9. roni

    roni Нерд

    ПУШКА 1ПРОВОД(КРАСНЫИ +3.3) 2 ПРОВОД(БЕЛЫИ -) И ТРЕТИИ ЗЕЛЕНЫИ, РАБОТАЕТ ТАК ЕСЛИ ЗАМЫКАТТЬ ЗЕЛЕНЫИ С +3,3 ПУШКА СТРЕЛЯЕТ
     
  10. Alex19

    Alex19 Гуру

    У Вас на 13 пине, есть светодиод, на плате он подписан как L.
    При нажатии на кнопку пульта, он загорается?

    Ну смотрите, у Вас питание 3,3V, а с 13 пина подается 5V странная схема.
    Но она работала во 2 Вашем скетче, так, что мелочи.
     
  11. roni

    roni Нерд

    НЕТ Я ПУШКУ СО ВТОРЫМ СКЕЧЕМ НЕ СМОГ ЗДЕЛАТЬ ЧТОБ СТРЕЛЯЛА
     
  12. roni

    roni Нерд

    ДА СВЕТ.МИГАЕТ ТУХ,
     
  13. roni

    roni Нерд

    СОВЕТУИ КАК БУДЕТ ПРАВИЛЬНО,
    ЕСЛИ ЧЕСНО Я ПЛОХО РАЗБИРАЮСЬ В ЕЛЕКТРОНИКЕ
     
  14. Alex19

    Alex19 Гуру

    Отлично, спрашивал не для праздного любопытсва.

    Тогда надо разбираться, что там за элемент управления, маркировка и т.д.

    Если устройство работает от 3.3V, то и управляющий сигнал нужно подавать 3.3V, а еще лучше разобраться с характеристиками. Для этого нужно понизить питание с 5V до 3,3 с 13 пина. И подключить управляющий провод на 13 пин и белый на GND, красный на +3,3V. Понизить напряжение можно с помощью Logic Converter 3.3V - 5V или другими способами, но сам плохо разбираюсь в электронике, поэтому кроме Logic Converter 3.3V - 5V ни чего подсказать не смогу.

    UPD. Вот он Logic Converter 3.3V - 5V.
    [​IMG]
    С 1 стороны подключаем 13 пин и GND (землю от Ардуины), там где 5V. А с другой стороны 3.3V который управляет пушкой и земля общая.
     
  15. roni

    roni Нерд

    ЭТО ПУШКА РАБОТАЛА ОТ ТРЕХ БАТАРЕЕК // АА 1,5 В
     
  16. roni

    roni Нерд

    Я ДУМОЮ МОЖНО И 5 В ПОДОВАТЬ
     
  17. roni

    roni Нерд

    Я СОЕДИНИЛ КРА,-3,3
    БЕЛЫИ - GND
    И ЗЕЛЕНЫИ -13 ПИН
     
  18. Alex19

    Alex19 Гуру

    Батарейки это 4.5V.

    Вопрос сколько ампер потребляет эта пушка. Если не боитесь стабилизатор Arduino, так как 3.3V максимальный ток 50 mA. На 5V на много больше, точно не скажу.

    Как уже сказал, максимальный допустимый ток 3,3V 50 mA, больше спалит стабилизатор на Arduino. Может тогда лучше на 5V. Но Вы делаете это на свой страх и риск.
     
    Последнее редактирование: 10 дек 2016
  19. roni

    roni Нерд

    ГДЕ меняем o_c на 0?
     
  20. Alex19

    Alex19 Гуру

    В объявлении.
    Код (C++):
    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)
     
    Меняем на
    Код (C++):
    int o_c = 0; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)